From fcc3e414cf43a1110e8126bf1bcfb95a8ecddb76 Mon Sep 17 00:00:00 2001 From: stephendeoca Date: Mon, 17 Feb 2025 15:47:01 -0800 Subject: [PATCH 1/2] Updated latest version to 1.12.1 --- ...tableau.extensions.1.11.1-pre.1.min.js.map | 1 + lib/previous/tableau.extensions.1.11.1.js | 19982 +++++++++++++++ lib/previous/tableau.extensions.1.11.1.min.js | 2 + ...ableau.extensions.1.12.0-pre.16.min.js.map | 0 .../tableau.extensions.1.12.0.js | 0 .../tableau.extensions.1.12.0.min.js | 0 ...tableau.extensions.1.12.1-pre.1.min.js.map | 1 + lib/tableau.extensions.1.12.1.js | 20141 ++++++++++++++++ lib/tableau.extensions.1.12.1.min.js | 2 + lib/tableau.extensions.1.latest.js | 12 +- lib/tableau.extensions.1.latest.min.js | 4 +- package.json | 2 +- 12 files changed, 40139 insertions(+), 8 deletions(-) create mode 100644 lib/previous/tableau.extensions.1.11.1-pre.1.min.js.map create mode 100644 lib/previous/tableau.extensions.1.11.1.js create mode 100644 lib/previous/tableau.extensions.1.11.1.min.js rename lib/{ => previous}/tableau.extensions.1.12.0-pre.16.min.js.map (100%) rename lib/{ => previous}/tableau.extensions.1.12.0.js (100%) rename lib/{ => previous}/tableau.extensions.1.12.0.min.js (100%) create mode 100644 lib/tableau.extensions.1.12.1-pre.1.min.js.map create mode 100644 lib/tableau.extensions.1.12.1.js create mode 100644 lib/tableau.extensions.1.12.1.min.js diff --git a/lib/previous/tableau.extensions.1.11.1-pre.1.min.js.map b/lib/previous/tableau.extensions.1.11.1-pre.1.min.js.map new file mode 100644 index 00000000..e3abdc26 --- /dev/null +++ b/lib/previous/tableau.extensions.1.11.1-pre.1.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tableau.extensions.1.11.1-pre.1.min.js","mappings":"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","sources":["webpack://tableau/../../node_modules/core-js/es/array/find.js","webpack://tableau/../../node_modules/core-js/es/array/from.js","webpack://tableau/../../node_modules/core-js/es/map/index.js","webpack://tableau/../../node_modules/core-js/es/number/is-integer.js","webpack://tableau/../../node_modules/core-js/es/number/is-nan.js","webpack://tableau/../../node_modules/core-js/es/number/parse-float.js","webpack://tableau/../../node_modules/core-js/es/number/parse-int.js","webpack://tableau/../../node_modules/core-js/es/object/assign.js","webpack://tableau/../../node_modules/core-js/es/object/entries.js","webpack://tableau/../../node_modules/core-js/es/object/set-prototype-of.js","webpack://tableau/../../node_modules/core-js/es/promise/index.js","webpack://tableau/../../node_modules/core-js/internals/a-callable.js","webpack://tableau/../../node_modules/core-js/internals/a-constructor.js","webpack://tableau/../../node_modules/core-js/internals/a-possible-prototype.js","webpack://tableau/../../node_modules/core-js/internals/add-to-unscopables.js","webpack://tableau/../../node_modules/core-js/internals/an-instance.js","webpack://tableau/../../node_modules/core-js/internals/an-object.js","webpack://tableau/../../node_modules/core-js/internals/array-from.js","webpack://tableau/../../node_modules/core-js/internals/array-includes.js","webpack://tableau/../../node_modules/core-js/internals/array-iteration.js","webpack://tableau/../../node_modules/core-js/internals/array-slice.js","webpack://tableau/../../node_modules/core-js/internals/array-species-constructor.js","webpack://tableau/../../node_modules/core-js/internals/array-species-create.js","webpack://tableau/../../node_modules/core-js/internals/call-with-safe-iteration-closing.js","webpack://tableau/../../node_modules/core-js/internals/check-correctness-of-iteration.js","webpack://tableau/../../node_modules/core-js/internals/classof-raw.js","webpack://tableau/../../node_modules/core-js/internals/classof.js","webpack://tableau/../../node_modules/core-js/internals/clear-error-stack.js","webpack://tableau/../../node_modules/core-js/internals/collection-strong.js","webpack://tableau/../../node_modules/core-js/internals/collection.js","webpack://tableau/../../node_modules/core-js/internals/copy-constructor-properties.js","webpack://tableau/../../node_modules/core-js/internals/correct-prototype-getter.js","webpack://tableau/../../node_modules/core-js/internals/create-iterator-constructor.js","webpack://tableau/../../node_modules/core-js/internals/create-non-enumerable-property.js","webpack://tableau/../../node_modules/core-js/internals/create-property-descriptor.js","webpack://tableau/../../node_modules/core-js/internals/create-property.js","webpack://tableau/../../node_modules/core-js/internals/define-iterator.js","webpack://tableau/../../node_modules/core-js/internals/descriptors.js","webpack://tableau/../../node_modules/core-js/internals/document-create-element.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-browser.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-ios-pebble.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-ios.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-node.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-webos-webkit.js","webpack://tableau/../../node_modules/core-js/internals/engine-user-agent.js","webpack://tableau/../../node_modules/core-js/internals/engine-v8-version.js","webpack://tableau/../../node_modules/core-js/internals/entry-unbind.js","webpack://tableau/../../node_modules/core-js/internals/enum-bug-keys.js","webpack://tableau/../../node_modules/core-js/internals/error-stack-installable.js","webpack://tableau/../../node_modules/core-js/internals/export.js","webpack://tableau/../../node_modules/core-js/internals/fails.js","webpack://tableau/../../node_modules/core-js/internals/freezing.js","webpack://tableau/../../node_modules/core-js/internals/function-apply.js","webpack://tableau/../../node_modules/core-js/internals/function-bind-context.js","webpack://tableau/../../node_modules/core-js/internals/function-call.js","webpack://tableau/../../node_modules/core-js/internals/function-name.js","webpack://tableau/../../node_modules/core-js/internals/function-uncurry-this.js","webpack://tableau/../../node_modules/core-js/internals/get-built-in.js","webpack://tableau/../../node_modules/core-js/internals/get-iterator-method.js","webpack://tableau/../../node_modules/core-js/internals/get-iterator.js","webpack://tableau/../../node_modules/core-js/internals/get-method.js","webpack://tableau/../../node_modules/core-js/internals/global.js","webpack://tableau/../../node_modules/core-js/internals/has-own-property.js","webpack://tableau/../../node_modules/core-js/internals/hidden-keys.js","webpack://tableau/../../node_modules/core-js/internals/host-report-errors.js","webpack://tableau/../../node_modules/core-js/internals/html.js","webpack://tableau/../../node_modules/core-js/internals/ie8-dom-define.js","webpack://tableau/../../node_modules/core-js/internals/indexed-object.js","webpack://tableau/../../node_modules/core-js/internals/inherit-if-required.js","webpack://tableau/../../node_modules/core-js/internals/inspect-source.js","webpack://tableau/../../node_modules/core-js/internals/install-error-cause.js","webpack://tableau/../../node_modules/core-js/internals/internal-metadata.js","webpack://tableau/../../node_modules/core-js/internals/internal-state.js","webpack://tableau/../../node_modules/core-js/internals/is-array-iterator-method.js","webpack://tableau/../../node_modules/core-js/internals/is-array.js","webpack://tableau/../../node_modules/core-js/internals/is-callable.js","webpack://tableau/../../node_modules/core-js/internals/is-constructor.js","webpack://tableau/../../node_modules/core-js/internals/is-forced.js","webpack://tableau/../../node_modules/core-js/internals/is-integral-number.js","webpack://tableau/../../node_modules/core-js/internals/is-object.js","webpack://tableau/../../node_modules/core-js/internals/is-pure.js","webpack://tableau/../../node_modules/core-js/internals/is-symbol.js","webpack://tableau/../../node_modules/core-js/internals/iterate.js","webpack://tableau/../../node_modules/core-js/internals/iterator-close.js","webpack://tableau/../../node_modules/core-js/internals/iterators-core.js","webpack://tableau/../../node_modules/core-js/internals/iterators.js","webpack://tableau/../../node_modules/core-js/internals/length-of-array-like.js","webpack://tableau/../../node_modules/core-js/internals/microtask.js","webpack://tableau/../../node_modules/core-js/internals/native-promise-constructor.js","webpack://tableau/../../node_modules/core-js/internals/native-symbol.js","webpack://tableau/../../node_modules/core-js/internals/native-weak-map.js","webpack://tableau/../../node_modules/core-js/internals/new-promise-capability.js","webpack://tableau/../../node_modules/core-js/internals/normalize-string-argument.js","webpack://tableau/../../node_modules/core-js/internals/number-parse-float.js","webpack://tableau/../../node_modules/core-js/internals/number-parse-int.js","webpack://tableau/../../node_modules/core-js/internals/object-assign.js","webpack://tableau/../../node_modules/core-js/internals/object-create.js","webpack://tableau/../../node_modules/core-js/internals/object-define-properties.js","webpack://tableau/../../node_modules/core-js/internals/object-define-property.js","webpack://tableau/../../node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack://tableau/../../node_modules/core-js/internals/object-get-own-property-names-external.js","webpack://tableau/../../node_modules/core-js/internals/object-get-own-property-names.js","webpack://tableau/../../node_modules/core-js/internals/object-get-own-property-symbols.js","webpack://tableau/../../node_modules/core-js/internals/object-get-prototype-of.js","webpack://tableau/../../node_modules/core-js/internals/object-is-prototype-of.js","webpack://tableau/../../node_modules/core-js/internals/object-keys-internal.js","webpack://tableau/../../node_modules/core-js/internals/object-keys.js","webpack://tableau/../../node_modules/core-js/internals/object-property-is-enumerable.js","webpack://tableau/../../node_modules/core-js/internals/object-set-prototype-of.js","webpack://tableau/../../node_modules/core-js/internals/object-to-array.js","webpack://tableau/../../node_modules/core-js/internals/object-to-string.js","webpack://tableau/../../node_modules/core-js/internals/ordinary-to-primitive.js","webpack://tableau/../../node_modules/core-js/internals/own-keys.js","webpack://tableau/../../node_modules/core-js/internals/path.js","webpack://tableau/../../node_modules/core-js/internals/perform.js","webpack://tableau/../../node_modules/core-js/internals/promise-resolve.js","webpack://tableau/../../node_modules/core-js/internals/redefine-all.js","webpack://tableau/../../node_modules/core-js/internals/redefine.js","webpack://tableau/../../node_modules/core-js/internals/require-object-coercible.js","webpack://tableau/../../node_modules/core-js/internals/set-global.js","webpack://tableau/../../node_modules/core-js/internals/set-species.js","webpack://tableau/../../node_modules/core-js/internals/set-to-string-tag.js","webpack://tableau/../../node_modules/core-js/internals/shared-key.js","webpack://tableau/../../node_modules/core-js/internals/shared-store.js","webpack://tableau/../../node_modules/core-js/internals/shared.js","webpack://tableau/../../node_modules/core-js/internals/species-constructor.js","webpack://tableau/../../node_modules/core-js/internals/string-multibyte.js","webpack://tableau/../../node_modules/core-js/internals/string-trim.js","webpack://tableau/../../node_modules/core-js/internals/task.js","webpack://tableau/../../node_modules/core-js/internals/to-absolute-index.js","webpack://tableau/../../node_modules/core-js/internals/to-indexed-object.js","webpack://tableau/../../node_modules/core-js/internals/to-integer-or-infinity.js","webpack://tableau/../../node_modules/core-js/internals/to-length.js","webpack://tableau/../../node_modules/core-js/internals/to-object.js","webpack://tableau/../../node_modules/core-js/internals/to-primitive.js","webpack://tableau/../../node_modules/core-js/internals/to-property-key.js","webpack://tableau/../../node_modules/core-js/internals/to-string-tag-support.js","webpack://tableau/../../node_modules/core-js/internals/to-string.js","webpack://tableau/../../node_modules/core-js/internals/try-to-string.js","webpack://tableau/../../node_modules/core-js/internals/uid.js","webpack://tableau/../../node_modules/core-js/internals/use-symbol-as-uid.js","webpack://tableau/../../node_modules/core-js/internals/well-known-symbol.js","webpack://tableau/../../node_modules/core-js/internals/whitespaces.js","webpack://tableau/../../node_modules/core-js/modules/es.aggregate-error.js","webpack://tableau/../../node_modules/core-js/modules/es.array.find.js","webpack://tableau/../../node_modules/core-js/modules/es.array.from.js","webpack://tableau/../../node_modules/core-js/modules/es.array.iterator.js","webpack://tableau/../../node_modules/core-js/modules/es.map.js","webpack://tableau/../../node_modules/core-js/modules/es.number.is-integer.js","webpack://tableau/../../node_modules/core-js/modules/es.number.is-nan.js","webpack://tableau/../../node_modules/core-js/modules/es.number.parse-float.js","webpack://tableau/../../node_modules/core-js/modules/es.number.parse-int.js","webpack://tableau/../../node_modules/core-js/modules/es.object.assign.js","webpack://tableau/../../node_modules/core-js/modules/es.object.entries.js","webpack://tableau/../../node_modules/core-js/modules/es.object.set-prototype-of.js","webpack://tableau/../../node_modules/core-js/modules/es.object.to-string.js","webpack://tableau/../../node_modules/core-js/modules/es.promise.all-settled.js","webpack://tableau/../../node_modules/core-js/modules/es.promise.any.js","webpack://tableau/../../node_modules/core-js/modules/es.promise.finally.js","webpack://tableau/../../node_modules/core-js/modules/es.promise.js","webpack://tableau/../../node_modules/core-js/modules/es.string.iterator.js","webpack://tableau/../../node_modules/guid/guid.js","webpack://tableau/./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/FilterChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauSheetEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ConnectedServer.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/SettingsImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/UIImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Dashboard.js","webpack://tableau/./lib/src/ExtensionsApi/Models/DashboardObject.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Parameter.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Sheet.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Workbook.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Worksheet.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/DashboardContent.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Environment.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Extensions.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Settings.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/UI.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js","webpack://tableau/./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js","webpack://tableau/../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.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-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js","webpack://tableau/../api-external-contract-js/lib/src/SharedApiExternalContract.js","webpack://tableau/../api-internal-contract-js/lib/src/JsApiInternalContract.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/DataTypeConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Enums.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Notifications.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Parameters.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Verbs.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/AskDataInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/PulseInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/VqlInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.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-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/VersionTranslations.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js","webpack://tableau/../api-shared-js/lib/src/ApiShared.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/ApiVersion.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/ConnectionSummary.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/DataSource.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EventListenerManager.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Field.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/LogicalTable.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/FilterModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Point.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/GetDataService.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/TableSummary.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/TableauError.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/Deferred.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/Param.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/VersionNumber.js","webpack://tableau/../api-shared-js/lib/src/VersionedExternalApiDispatcher.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/version.js","webpack://tableau/webpack/bootstrap","webpack://tableau/webpack/runtime/define property getters","webpack://tableau/webpack/runtime/global","webpack://tableau/webpack/runtime/hasOwnProperty shorthand","webpack://tableau/webpack/runtime/make namespace object","webpack://tableau/./lib/src/ExtensionsApi.js"],"sourcesContent":["require('../../modules/es.array.find');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('Array', 'find');\n","require('../../modules/es.string.iterator');\nrequire('../../modules/es.array.from');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Array.from;\n","require('../../modules/es.array.iterator');\nrequire('../../modules/es.map');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.string.iterator');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Map;\n","require('../../modules/es.number.is-integer');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Number.isInteger;\n","require('../../modules/es.number.is-nan');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Number.isNaN;\n","require('../../modules/es.number.parse-float');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Number.parseFloat;\n","require('../../modules/es.number.parse-int');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Number.parseInt;\n","require('../../modules/es.object.assign');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.assign;\n","require('../../modules/es.object.entries');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.entries;\n","require('../../modules/es.object.set-prototype-of');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.setPrototypeOf;\n","require('../../modules/es.aggregate-error');\nrequire('../../modules/es.array.iterator');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.promise');\nrequire('../../modules/es.promise.all-settled');\nrequire('../../modules/es.promise.any');\nrequire('../../modules/es.promise.finally');\nrequire('../../modules/es.string.iterator');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Promise;\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar TypeError = global.TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw TypeError(tryToString(argument) + ' is not a function');\n};\n","var global = require('../internals/global');\nvar isConstructor = require('../internals/is-constructor');\nvar tryToString = require('../internals/try-to-string');\n\nvar TypeError = global.TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n if (isConstructor(argument)) return argument;\n throw TypeError(tryToString(argument) + ' is not a constructor');\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar String = global.String;\nvar TypeError = global.TypeError;\n\nmodule.exports = function (argument) {\n if (typeof argument == 'object' || isCallable(argument)) return argument;\n throw TypeError(\"Can't set \" + String(argument) + ' as a prototype');\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","var global = require('../internals/global');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar TypeError = global.TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw TypeError('Incorrect invocation');\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar String = global.String;\nvar TypeError = global.TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw TypeError(String(argument) + ' is not an object');\n};\n","'use strict';\nvar global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar isConstructor = require('../internals/is-constructor');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar Array = global.Array;\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var IS_CONSTRUCTOR = isConstructor(this);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined);\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = getIterator(O, iteratorMethod);\n next = iterator.next;\n result = IS_CONSTRUCTOR ? new this() : [];\n for (;!(step = call(next, iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = lengthOfArrayLike(O);\n result = IS_CONSTRUCTOR ? new this(length) : Array(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = uncurryThis([].push);\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var IS_FILTER_REJECT = TYPE == 7;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that);\n var length = lengthOfArrayLike(self);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push(target, value); // filterReject\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterReject` method\n // https://github.com/tc39/proposal-array-filtering\n filterReject: createMethod(7)\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis([].slice);\n","var global = require('../internals/global');\nvar isArray = require('../internals/is-array');\nvar isConstructor = require('../internals/is-constructor');\nvar isObject = require('../internals/is-object');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar Array = global.Array;\n\n// a part of `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","var arraySpeciesConstructor = require('../internals/array-species-constructor');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\n};\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","var global = require('../internals/global');\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar Object = global.Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar arraySlice = require('../internals/array-slice');\n\nvar replace = uncurryThis(''.replace);\nvar split = uncurryThis(''.split);\nvar join = uncurryThis([].join);\n\nvar TEST = (function (arg) { return String(Error(arg).stack); })('zxcasd');\nvar V8_OR_CHAKRA_STACK_ENTRY = /\\n\\s*at [^:]*:[^\\n]*/;\nvar IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);\nvar IS_FIREFOX_OR_SAFARI_STACK = /@[^\\n]*\\n/.test(TEST) && !/zxcasd/.test(TEST);\n\nmodule.exports = function (stack, dropEntries) {\n if (typeof stack != 'string') return stack;\n if (IS_V8_OR_CHAKRA_STACK) {\n while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');\n } else if (IS_FIREFOX_OR_SAFARI_STACK) {\n return join(arraySlice(split(stack, '\\n'), dropEntries), '\\n');\n } return stack;\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar create = require('../internals/object-create');\nvar redefineAll = require('../internals/redefine-all');\nvar bind = require('../internals/function-bind-context');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/define-iterator');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n index: create(null),\n first: undefined,\n last: undefined,\n size: 0\n });\n if (!DESCRIPTORS) that.size = 0;\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n var previous, index;\n // change existing entry\n if (entry) {\n entry.value = value;\n // create new entry\n } else {\n state.last = entry = {\n index: index = fastKey(key, true),\n key: key,\n value: value,\n previous: previous = state.last,\n next: undefined,\n removed: false\n };\n if (!state.first) state.first = entry;\n if (previous) previous.next = entry;\n if (DESCRIPTORS) state.size++;\n else that.size++;\n // add to index\n if (index !== 'F') state.index[index] = entry;\n } return that;\n };\n\n var getEntry = function (that, key) {\n var state = getInternalState(that);\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return state.index[index];\n // frozen object case\n for (entry = state.first; entry; entry = entry.next) {\n if (entry.key == key) return entry;\n }\n };\n\n redefineAll(Prototype, {\n // `{ Map, Set }.prototype.clear()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.clear\n // https://tc39.es/ecma262/#sec-set.prototype.clear\n clear: function clear() {\n var that = this;\n var state = getInternalState(that);\n var data = state.index;\n var entry = state.first;\n while (entry) {\n entry.removed = true;\n if (entry.previous) entry.previous = entry.previous.next = undefined;\n delete data[entry.index];\n entry = entry.next;\n }\n state.first = state.last = undefined;\n if (DESCRIPTORS) state.size = 0;\n else that.size = 0;\n },\n // `{ Map, Set }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.delete\n // https://tc39.es/ecma262/#sec-set.prototype.delete\n 'delete': function (key) {\n var that = this;\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.next;\n var prev = entry.previous;\n delete state.index[entry.index];\n entry.removed = true;\n if (prev) prev.next = next;\n if (next) next.previous = prev;\n if (state.first == entry) state.first = next;\n if (state.last == entry) state.last = prev;\n if (DESCRIPTORS) state.size--;\n else that.size--;\n } return !!entry;\n },\n // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.foreach\n // https://tc39.es/ecma262/#sec-set.prototype.foreach\n forEach: function forEach(callbackfn /* , that = undefined */) {\n var state = getInternalState(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var entry;\n while (entry = entry ? entry.next : state.first) {\n boundFunction(entry.value, entry.key, this);\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n }\n },\n // `{ Map, Set}.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.has\n // https://tc39.es/ecma262/#sec-set.prototype.has\n has: function has(key) {\n return !!getEntry(this, key);\n }\n });\n\n redefineAll(Prototype, IS_MAP ? {\n // `Map.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-map.prototype.get\n get: function get(key) {\n var entry = getEntry(this, key);\n return entry && entry.value;\n },\n // `Map.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-map.prototype.set\n set: function set(key, value) {\n return define(this, key === 0 ? 0 : key, value);\n }\n } : {\n // `Set.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-set.prototype.add\n add: function add(value) {\n return define(this, value = value === 0 ? 0 : value, value);\n }\n });\n if (DESCRIPTORS) defineProperty(Prototype, 'size', {\n get: function () {\n return getInternalState(this).size;\n }\n });\n return Constructor;\n },\n setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {\n var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.entries\n // https://tc39.es/ecma262/#sec-map.prototype.keys\n // https://tc39.es/ecma262/#sec-map.prototype.values\n // https://tc39.es/ecma262/#sec-map.prototype-@@iterator\n // https://tc39.es/ecma262/#sec-set.prototype.entries\n // https://tc39.es/ecma262/#sec-set.prototype.keys\n // https://tc39.es/ecma262/#sec-set.prototype.values\n // https://tc39.es/ecma262/#sec-set.prototype-@@iterator\n defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {\n setInternalState(this, {\n type: ITERATOR_NAME,\n target: iterated,\n state: getInternalCollectionState(iterated),\n kind: kind,\n last: undefined\n });\n }, function () {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var entry = state.last;\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n // get next entry\n if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n // or finish the iteration\n state.target = undefined;\n return { value: undefined, done: true };\n }\n // return step by kind\n if (kind == 'keys') return { value: entry.key, done: false };\n if (kind == 'values') return { value: entry.value, done: false };\n return { value: [entry.key, entry.value], done: false };\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // `{ Map, Set }.prototype[@@species]` accessors\n // https://tc39.es/ecma262/#sec-get-map-@@species\n // https://tc39.es/ecma262/#sec-get-set-@@species\n setSpecies(CONSTRUCTOR_NAME);\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]);\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n uncurriedNativeMethod(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n uncurriedNativeMethod(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n var REPLACE = isForced(\n CONSTRUCTOR_NAME,\n !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n }))\n );\n\n if (REPLACE) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.enable();\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n // eslint-disable-next-line no-new -- required for testing\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, NativePrototype);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","var hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar toPropertyKey = require('../internals/to-property-key');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPropertyKey(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n redefine(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n } else {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return call(nativeIterator, this); };\n }\n }\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n }\n Iterators[NAME] = defaultIterator;\n\n return methods;\n};\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","module.exports = typeof window == 'object';\n","var userAgent = require('../internals/engine-user-agent');\nvar global = require('../internals/global');\n\nmodule.exports = /ipad|iphone|ipod/i.test(userAgent) && global.Pebble !== undefined;\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /web0s(?!.*chrome)/i.test(userAgent);\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","var global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (CONSTRUCTOR, METHOD) {\n return uncurryThis(global[CONSTRUCTOR].prototype[METHOD]);\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var fails = require('../internals/fails');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = !fails(function () {\n var error = Error('a');\n if (!('stack' in error)) return true;\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7));\n return error.stack !== 7;\n});\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar bind = FunctionPrototype.bind;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var call = Function.prototype.call;\n\nmodule.exports = call.bind ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","var FunctionPrototype = Function.prototype;\nvar bind = FunctionPrototype.bind;\nvar call = FunctionPrototype.call;\nvar callBind = bind && bind.bind(call);\n\nmodule.exports = bind ? function (fn) {\n return fn && callBind(call, fn);\n} : function (fn) {\n return fn && function () {\n return call.apply(fn, arguments);\n };\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n","var classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar TypeError = global.TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw TypeError(tryToString(argument) + ' is not iterable');\n};\n","var aCallable = require('../internals/a-callable');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return func == null ? undefined : aCallable(func);\n};\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","module.exports = {};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length == 1 ? console.error(a) : console.error(a, b);\n }\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- requied for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar Object = global.Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split(it, '') : Object(it);\n} : Object;\n","var isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n isCallable(NewTarget = dummy.constructor) &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\n// `InstallErrorCause` abstract operation\n// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause\nmodule.exports = function (O, options) {\n if (isObject(options) && 'cause' in options) {\n createNonEnumerableProperty(O, 'cause', options.cause);\n }\n};\n","var $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar REQUIRED = false;\nvar METADATA = uid('meta');\nvar id = 0;\n\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + id++, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar enable = function () {\n meta.enable = function () { /* empty */ };\n REQUIRED = true;\n var getOwnPropertyNames = getOwnPropertyNamesModule.f;\n var splice = uncurryThis([].splice);\n var test = {};\n test[METADATA] = 1;\n\n // prevent exposing of metadata key\n if (getOwnPropertyNames(test).length) {\n getOwnPropertyNamesModule.f = function (it) {\n var result = getOwnPropertyNames(it);\n for (var i = 0, length = result.length; i < length; i++) {\n if (result[i] === METADATA) {\n splice(result, i, 1);\n break;\n }\n } return result;\n };\n\n $({ target: 'Object', stat: true, forced: true }, {\n getOwnPropertyNames: getOwnPropertyNamesExternalModule.f\n });\n }\n};\n\nvar meta = module.exports = {\n enable: enable,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = uncurryThis(store.get);\n var wmhas = uncurryThis(store.has);\n var wmset = uncurryThis(store.set);\n set = function (it, metadata) {\n if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n wmset(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget(store, it) || {};\n };\n has = function (it) {\n return wmhas(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) == 'Array';\n};\n","// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = function (argument) {\n return typeof argument == 'function';\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar empty = [];\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.exec(noop);\n\nvar isConstructorModern = function (argument) {\n if (!isCallable(argument)) return false;\n try {\n construct(noop, empty, argument);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nvar isConstructorLegacy = function (argument) {\n if (!isCallable(argument)) return false;\n switch (classof(argument)) {\n case 'AsyncFunction':\n case 'GeneratorFunction':\n case 'AsyncGeneratorFunction': return false;\n // we can't check .prototype since constructors produced by .bind haven't it\n } return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n};\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n var called;\n return isConstructorModern(isConstructorModern.call)\n || !isConstructorModern(Object)\n || !isConstructorModern(function () { called = true; })\n || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var isObject = require('../internals/is-object');\n\nvar floor = Math.floor;\n\n// `IsIntegralNumber` abstract operation\n// https://tc39.es/ecma262/#sec-isintegralnumber\n// eslint-disable-next-line es/no-number-isinteger -- safe\nmodule.exports = Number.isInteger || function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","var isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","module.exports = false;\n","var global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Object = global.Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it));\n};\n","var global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar TypeError = global.TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal', condition);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","var call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n redefine(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","var toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","var global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_IOS_PEBBLE = require('../internals/engine-is-ios-pebble');\nvar IS_WEBOS_WEBKIT = require('../internals/engine-is-webos-webkit');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898\n if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n // workaround of WebKit ~ iOS Safari 10.1 bug\n promise.constructor = Promise;\n then = bind(promise.then, promise);\n notify = function () {\n then(flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n // strange IE + webpack dev server bug - use .bind(global)\n macrotask = bind(macrotask, global);\n notify = function () {\n macrotask(flush);\n };\n }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n};\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol();\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap));\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aCallable(resolve);\n this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var toString = require('../internals/to-string');\n\nmodule.exports = function (argument, $default) {\n return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);\n};\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar charAt = uncurryThis(''.charAt);\nvar n$ParseFloat = global.parseFloat;\nvar Symbol = global.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar FORCED = 1 / n$ParseFloat(whitespaces + '-0') !== -Infinity\n // MS Edge 18- broken with boxed symbols\n || (ITERATOR && !fails(function () { n$ParseFloat(Object(ITERATOR)); }));\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\nmodule.exports = FORCED ? function parseFloat(string) {\n var trimmedString = trim(toString(string));\n var result = n$ParseFloat(trimmedString);\n return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result;\n} : n$ParseFloat;\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar $parseInt = global.parseInt;\nvar Symbol = global.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar hex = /^[+-]?0x/i;\nvar exec = uncurryThis(hex.exec);\nvar FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22\n // MS Edge 18- broken with boxed symbols\n || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); }));\n\n// `parseInt` method\n// https://tc39.es/ecma262/#sec-parseint-string-radix\nmodule.exports = FORCED ? function parseInt(string, radix) {\n var S = trim(toString(string));\n return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10));\n} : $parseInt;\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar call = require('../internals/function-call');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\n// eslint-disable-next-line es/no-object-assign -- safe\nvar $assign = Object.assign;\n// eslint-disable-next-line es/no-object-defineproperty -- required for testing\nvar defineProperty = Object.defineProperty;\nvar concat = uncurryThis([].concat);\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !$assign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line es/no-symbol -- safe\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n","/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","var global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar TypeError = global.TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","/* eslint-disable es/no-object-getownpropertynames -- safe */\nvar classof = require('../internals/classof-raw');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar arraySlice = require('../internals/array-slice');\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return $getOwnPropertyNames(it);\n } catch (error) {\n return arraySlice(windowNames);\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && classof(it) == 'Window'\n ? getWindowNames(it)\n : $getOwnPropertyNames(toIndexedObject(it));\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","var global = require('../internals/global');\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar Object = global.Object;\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof Object ? ObjectPrototype : null;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","/* eslint-disable no-proto -- safe */\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\nvar propertyIsEnumerable = uncurryThis($propertyIsEnumerable);\nvar push = uncurryThis([].push);\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable(O, key)) {\n push(result, TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.es/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.es/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar TypeError = global.TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var name = options && options.name !== undefined ? options.name : key;\n var state;\n if (isCallable(value)) {\n if (String(name).slice(0, 7) === 'Symbol(') {\n name = '[' + String(name).replace(/^Symbol\\(([^)]*)\\)/, '$1') + ']';\n }\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n createNonEnumerableProperty(value, 'name', name);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof name == 'string' ? name : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nvar TypeError = global.TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var global = require('../internals/global');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(global, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !hasOwn(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.19.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\n});\n","var anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = toString(requireObjectCoercible($this));\n if (TYPE & 1) string = replace(string, ltrim, '');\n if (TYPE & 2) string = replace(string, rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","var global = require('../internals/global');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar Dispatch = global.Dispatch;\nvar Function = global.Function;\nvar MessageChannel = global.MessageChannel;\nvar String = global.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar location, defer, channel, port;\n\ntry {\n // Deno throws a ReferenceError on `location` access without `--location` flag\n location = global.location;\n} catch (error) { /* empty */ }\n\nvar run = function (id) {\n if (hasOwn(queue, id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(String(id), location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(fn) {\n var args = arraySlice(arguments, 1);\n queue[++counter] = function () {\n apply(isCallable(fn) ? fn : Function(fn), undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(port.postMessage, port);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (\n global.addEventListener &&\n isCallable(global.postMessage) &&\n !global.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- safe\n return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number);\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var global = require('../internals/global');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar Object = global.Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TypeError = global.TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","var toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var global = require('../internals/global');\nvar classof = require('../internals/classof');\n\nvar String = global.String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return String(argument);\n};\n","var global = require('../internals/global');\n\nvar String = global.String;\n\nmodule.exports = function (argument) {\n try {\n return String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar symbolFor = Symbol && Symbol['for'];\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {\n var description = 'Symbol.' + name;\n if (NATIVE_SYMBOL && hasOwn(Symbol, name)) {\n WellKnownSymbolsStore[name] = Symbol[name];\n } else if (USE_SYMBOL_AS_UID && symbolFor) {\n WellKnownSymbolsStore[name] = symbolFor(description);\n } else {\n WellKnownSymbolsStore[name] = createWellKnownSymbol(description);\n }\n } return WellKnownSymbolsStore[name];\n};\n","// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar create = require('../internals/object-create');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar clearErrorStack = require('../internals/clear-error-stack');\nvar installErrorCause = require('../internals/install-error-cause');\nvar iterate = require('../internals/iterate');\nvar normalizeStringArgument = require('../internals/normalize-string-argument');\nvar ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');\n\nvar Error = global.Error;\nvar push = [].push;\n\nvar $AggregateError = function AggregateError(errors, message /* , options */) {\n var that = isPrototypeOf(AggregateErrorPrototype, this) ? this : create(AggregateErrorPrototype);\n var options = arguments.length > 2 ? arguments[2] : undefined;\n if (setPrototypeOf) {\n that = setPrototypeOf(new Error(undefined), getPrototypeOf(that));\n }\n createNonEnumerableProperty(that, 'message', normalizeStringArgument(message, ''));\n if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(that, 'stack', clearErrorStack(that.stack, 1));\n installErrorCause(that, options);\n var errorsArray = [];\n iterate(errors, push, { that: errorsArray });\n createNonEnumerableProperty(that, 'errors', errorsArray);\n return that;\n};\n\nif (setPrototypeOf) setPrototypeOf($AggregateError, Error);\nelse copyConstructorProperties($AggregateError, Error);\n\nvar AggregateErrorPrototype = $AggregateError.prototype = create(Error.prototype, {\n constructor: createPropertyDescriptor(1, $AggregateError),\n message: createPropertyDescriptor(1, ''),\n name: createPropertyDescriptor(1, 'AggregateError')\n});\n\n// `AggregateError` constructor\n// https://tc39.es/ecma262/#sec-aggregate-error-constructor\n$({ global: true }, {\n AggregateError: $AggregateError\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.es/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n // eslint-disable-next-line es/no-array-from -- required for testing\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.es/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Map` constructor\n// https://tc39.es/ecma262/#sec-map-objects\ncollection('Map', function (init) {\n return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","var $ = require('../internals/export');\nvar isIntegralNumber = require('../internals/is-integral-number');\n\n// `Number.isInteger` method\n// https://tc39.es/ecma262/#sec-number.isinteger\n$({ target: 'Number', stat: true }, {\n isInteger: isIntegralNumber\n});\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.es/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare -- NaN check\n return number != number;\n }\n});\n","var $ = require('../internals/export');\nvar parseFloat = require('../internals/number-parse-float');\n\n// `Number.parseFloat` method\n// https://tc39.es/ecma262/#sec-number.parseFloat\n// eslint-disable-next-line es/no-number-parsefloat -- required for testing\n$({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, {\n parseFloat: parseFloat\n});\n","var $ = require('../internals/export');\nvar parseInt = require('../internals/number-parse-int');\n\n// `Number.parseInt` method\n// https://tc39.es/ecma262/#sec-number.parseint\n// eslint-disable-next-line es/no-number-parseint -- required for testing\n$({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, {\n parseInt: parseInt\n});\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\n// eslint-disable-next-line es/no-object-assign -- required for testing\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n$({ target: 'Object', stat: true }, {\n setPrototypeOf: setPrototypeOf\n});\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\n// `Promise.allSettled` method\n// https://tc39.es/ecma262/#sec-promise.allsettled\n$({ target: 'Promise', stat: true }, {\n allSettled: function allSettled(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'fulfilled', value: value };\n --remaining || resolve(values);\n }, function (error) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'rejected', reason: error };\n --remaining || resolve(values);\n });\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\nvar PROMISE_ANY_ERROR = 'No one promise resolved';\n\n// `Promise.any` method\n// https://tc39.es/ecma262/#sec-promise.any\n$({ target: 'Promise', stat: true }, {\n any: function any(iterable) {\n var C = this;\n var AggregateError = getBuiltIn('AggregateError');\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var errors = [];\n var counter = 0;\n var remaining = 1;\n var alreadyResolved = false;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyRejected = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyResolved = true;\n resolve(value);\n }, function (error) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyRejected = true;\n errors[index] = error;\n --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));\n });\n });\n --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar fails = require('../internals/fails');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\nvar redefine = require('../internals/redefine');\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromise && fails(function () {\n NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.es/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = isCallable(onFinally);\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n\n// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromise)) {\n var method = getBuiltIn('Promise').prototype['finally'];\n if (NativePromise.prototype['finally'] !== method) {\n redefine(NativePromise.prototype, 'finally', method, { unsafe: true });\n }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_BROWSER = require('../internals/engine-is-browser');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar NativePromisePrototype = NativePromise && NativePromise.prototype;\nvar PromiseConstructor = NativePromise;\nvar PromisePrototype = NativePromisePrototype;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\n\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar SUBCLASSING = false;\n\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor);\n var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor);\n // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // We can't detect it synchronously, so just check versions\n if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromisePrototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = new PromiseConstructor(function (resolve) { resolve(1); });\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;\n if (!SUBCLASSING) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT;\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && isCallable(then = it.then) ? then : false;\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n call(then, result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n call(task, global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n call(task, global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n call(then, value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromisePrototype);\n aCallable(executor);\n call(Internal, this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n PromisePrototype = PromiseConstructor.prototype;\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromisePrototype, {\n // `Promise.prototype.then` method\n // https://tc39.es/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reactions = state.reactions;\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;\n reaction.fail = isCallable(onRejected) && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n reactions[reactions.length] = reaction;\n if (state.state != PENDING) notify(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.es/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && isCallable(NativePromise) && NativePromisePrototype !== Object.prototype) {\n nativeThen = NativePromisePrototype.then;\n\n if (!SUBCLASSING) {\n // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs\n redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n call(nativeThen, that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`\n redefine(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true });\n }\n\n // make `.constructor === Promise` work for native promise-based APIs\n try {\n delete NativePromisePrototype.constructor;\n } catch (error) { /* empty */ }\n\n // make `instanceof Promise` work for native promise-based APIs\n if (setPrototypeOf) {\n setPrototypeOf(NativePromisePrototype, PromisePrototype);\n }\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.es/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n call(capability.reject, undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.es/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.es/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call($promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.es/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n iterate(iterable, function (promise) {\n call($promiseResolve, C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: toString(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","(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) {\n stylesheet.deleteRule(stylesheet.cssRules.length - 1);\n }\n formattingModel.formattingSheets.map(function (currentFormattingSheet) {\n _this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet);\n });\n };\n ExtensionsImpl.prototype.applyFormattingSheetToStyleSheet = function (currentFormattingSheet, stylesheet) {\n var styleInfo = '';\n var 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 var selector = '.' + currentFormattingSheet.classNameKey;\n var rule = selector + ' { ' + styleInfo + ' }';\n stylesheet.insertRule(rule, stylesheet.cssRules.length);\n };\n ExtensionsImpl.prototype.initializeWorkbookFormattingChangedEventCallback = function (dispatcher) {\n var _this = this;\n var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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, function () { return true; }, function (eventFormatting) {\n if (eventFormatting) {\n _this.initializeTableauFonts(dispatcher, eventFormatting);\n _this.applyAllFormatting(eventFormatting);\n }\n });\n };\n ExtensionsImpl.prototype.initializeTableauFonts = function (dispatcher, workbookFormatting) {\n var _a;\n var _this = this;\n var fontNames = __spreadArrays(BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, TableauBookFontNameConstants_1.SupportedTableauFontFaces);\n workbookFormatting.formattingSheets.forEach(function (formattingSheet) {\n if (formattingSheet.cssProperties.fontFamily) {\n fontNames.push(formattingSheet.cssProperties.fontFamily);\n }\n });\n if (fontNames.length > 0) {\n var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.FontNameListItems] = fontNames, _a);\n dispatcher\n .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters)\n .then(function (response) {\n _this.loadFonts(response.result);\n })\n .catch();\n }\n };\n ExtensionsImpl.prototype.loadFonts = function (fonts) {\n var _this = this;\n fonts.forEach(function (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 ExtensionsImpl.prototype.initializeDashboardContent = function (info, sheetPath) {\n // sheets are always active for Extensions\n var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true);\n var dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId);\n var dashboard = new Dashboard_1.Dashboard(dashboardImpl);\n return new DashboardContent_1.DashboardContent(dashboard);\n };\n ExtensionsImpl.prototype.initializeWorksheetContent = function (info) {\n var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific\n true);\n var worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent\n null);\n var worksheet = new Worksheet_1.Worksheet(worksheetImpl);\n return new WorksheetContent_1.WorksheetContent(worksheet);\n };\n ExtensionsImpl.prototype.initializeSettings = function (settingsInfo) {\n var settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo);\n return new Settings_1.Settings(settingsImpl);\n };\n ExtensionsImpl.prototype.initializeContextMenuCallbacks = function (contextMenuFunctions) {\n var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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, function () {\n // Let through any context menu event, these are already filtered on api-core\n // based on the extension locator.\n return true;\n }, function (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 ExtensionsImpl.prototype.loadTableauFonts = function (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 ExtensionsImpl.prototype.loadBentonSansFonts = function (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 return ExtensionsImpl;\n}());\nexports.ExtensionsImpl = ExtensionsImpl;\n//# sourceMappingURL=ExtensionsImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar 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 */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nvar LegacyInternalApiDispatcherHolder;\n(function (LegacyInternalApiDispatcherHolder) {\n /**\n * @param options\n */\n function getDesktopDispatcherPromise(options) {\n var _a;\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 (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) {\n window.__tableauDesktopDispatcher\n .then(function (dispatcherFactory) {\n var 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 || (exports.LegacyInternalApiDispatcherHolder = {}));\n//# sourceMappingURL=LegacyInternalApiDispatcherHolder.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar TableauEvent_1 = require(\"../Events/TableauEvent\");\nvar ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nvar SettingsChangedEvent = /** @class */ (function (_super) {\n __extends(SettingsChangedEvent, _super);\n function SettingsChangedEvent(_newSettings) {\n var _this = _super.call(this, Contract.TableauEventType.SettingsChanged) || this;\n _this._newSettings = _newSettings;\n return _this;\n }\n Object.defineProperty(SettingsChangedEvent.prototype, \"newSettings\", {\n get: function () {\n return this._newSettings;\n },\n enumerable: true,\n configurable: true\n });\n return SettingsChangedEvent;\n}(TableauEvent_1.TableauEvent));\nvar SettingsImpl = /** @class */ (function () {\n function SettingsImpl(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 SettingsImpl.prototype.erase = function (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 SettingsImpl.prototype.get = function (key) {\n api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key');\n return this._currentSettings[key];\n };\n SettingsImpl.prototype.getAll = function () {\n // Returns a mutable copy of the settings\n return Object.assign({}, this._currentSettings);\n };\n Object.defineProperty(SettingsImpl.prototype, \"isModified\", {\n get: function () {\n return this._isModified;\n },\n enumerable: true,\n configurable: true\n });\n SettingsImpl.prototype.saveAsync = function () {\n var _this = this;\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 var settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"SettingsService\" /* SettingsService */);\n return settingsService.saveSettingsAsync(this._currentSettings).then(function (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 }, function (reason) {\n _this._saveInProgress = false;\n return Promise.reject(reason);\n });\n };\n SettingsImpl.prototype.set = function (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 SettingsImpl.prototype.initializeEvents = function () {\n var _this = this;\n var results = new Array();\n var notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n var settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, function () { return true; }, function (event) {\n _this._currentSettings = event.newSettings;\n settingsChangedEvent.triggerEvent(function () { return new SettingsChangedEvent(event.newSettings); });\n });\n results.push(settingsChangedEvent);\n return results;\n };\n SettingsImpl.prototype.initializeSettings = function (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 SettingsImpl.prototype.verifySettingsAreUnlocked = function () {\n if (this._saveInProgress) {\n throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS);\n }\n };\n SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.';\n return SettingsImpl;\n}());\nexports.SettingsImpl = SettingsImpl;\n//# sourceMappingURL=SettingsImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nvar UIImpl = /** @class */ (function () {\n function UIImpl() {\n }\n UIImpl.prototype.displayDialogAsync = function (url, payload, options) {\n var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* UIService */);\n var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n return new Promise(function (resolve, reject) {\n uiService\n .displayDialogAsync(url, payload || '', options)\n .then(function () {\n var unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, function () {\n // Let through any dialog update event\n return true;\n }, function (event) {\n if (event.isCloseEvent) {\n if (event.closePayload === undefined) {\n throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined');\n }\n resolve(event.closePayload);\n }\n else {\n reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.'));\n }\n unregisterFn();\n });\n })\n .catch(function (error) {\n reject(error);\n });\n });\n };\n UIImpl.prototype.closeDialog = function (payload) {\n var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* UIService */);\n uiService.closeDialog(payload);\n };\n return UIImpl;\n}());\nexports.UIImpl = UIImpl;\n//# sourceMappingURL=UIImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar DashboardLayoutChangedEvent_1 = require(\"../Events/DashboardLayoutChangedEvent\");\nvar WorkbookFormattingChangedEvent_1 = require(\"../Events/WorkbookFormattingChangedEvent\");\nvar ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nvar DashboardObject_1 = require(\"./DashboardObject\");\nvar Sheet_1 = require(\"./Sheet\");\nvar Worksheet_1 = require(\"./Worksheet\");\nvar Dashboard = /** @class */ (function (_super) {\n __extends(Dashboard, _super);\n function Dashboard(_dashboardImpl) {\n var _this = _super.call(this, _dashboardImpl) || this;\n _this._dashboardImpl = _dashboardImpl;\n _dashboardImpl.initializeWithPublicInterfaces();\n _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); });\n return _this;\n }\n Object.defineProperty(Dashboard.prototype, \"worksheets\", {\n get: function () {\n return this._dashboardImpl.worksheetsImpl.map(function (worksheetImpl) {\n return new Worksheet_1.Worksheet(worksheetImpl);\n });\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Dashboard.prototype, \"objects\", {\n get: function () {\n return this._dashboardImpl.objects.map(function (dashboardObjectImpl) {\n return new DashboardObject_1.DashboardObject(dashboardObjectImpl);\n });\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Dashboard.prototype, \"activeDashboardObjectId\", {\n get: function () {\n return this._dashboardImpl.activeDashboardObjectId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Dashboard.prototype, \"activeDashboardName\", {\n get: function () {\n return this._dashboardImpl.activeDashboardName;\n },\n enumerable: true,\n configurable: true\n });\n Dashboard.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) {\n return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap);\n };\n Dashboard.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) {\n return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap);\n };\n Dashboard.prototype.getDashboardObjectById = function (dashboardObjectId) {\n var zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId);\n return zone && new DashboardObject_1.DashboardObject(zone);\n };\n Dashboard.prototype.initializeEvents = function () {\n var _this = this;\n var results = new Array();\n // Initializing events and registering notification service\n var notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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 var dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, function () { return true; }, function (event) {\n var dashboardObjectChanges = _this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName);\n dashboardLayoutChangedEvent.triggerEvent(function () { return new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges); });\n });\n results.push(dashboardLayoutChangedEvent);\n var workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function () { return true; }, function (eventFormatting) {\n workbookFormattingChangedEvent.triggerEvent(function () { return new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting); });\n });\n results.push(workbookFormattingChangedEvent);\n return results;\n };\n Dashboard.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) {\n return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray);\n };\n Dashboard.prototype.replayAnimationAsync = function (replaySpeed) {\n return this._dashboardImpl.replayAnimationAsync(replaySpeed);\n };\n Dashboard.prototype.getFiltersAsync = function () {\n return this._dashboardImpl.getFiltersAsync();\n };\n Dashboard.prototype.applyFilterAsync = function (fieldName, values, updateType, options) {\n return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options);\n };\n return Dashboard;\n}(Sheet_1.Sheet));\nexports.Dashboard = Dashboard;\n//# sourceMappingURL=Dashboard.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dashboard_1 = require(\"./Dashboard\");\nvar Worksheet_1 = require(\"./Worksheet\");\n/**\n * Implementation of the dashboard objects - the zones in a dashboard.\n */\nvar DashboardObject = /** @class */ (function () {\n function DashboardObject(_dashboardObjectImpl) {\n this._dashboardObjectImpl = _dashboardObjectImpl;\n }\n Object.defineProperty(DashboardObject.prototype, \"dashboard\", {\n get: function () {\n return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"type\", {\n get: function () {\n return this._dashboardObjectImpl.type;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"position\", {\n get: function () {\n return this._dashboardObjectImpl.position;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"size\", {\n get: function () {\n return this._dashboardObjectImpl.size;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"worksheet\", {\n get: function () {\n if (this._dashboardObjectImpl.worksheetImpl) {\n return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl);\n }\n return undefined;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"name\", {\n get: function () {\n return this._dashboardObjectImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"isFloating\", {\n get: function () {\n return this._dashboardObjectImpl.isFloating;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"isVisible\", {\n get: function () {\n return this._dashboardObjectImpl.isVisible;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"id\", {\n get: function () {\n return this._dashboardObjectImpl.id;\n },\n enumerable: true,\n configurable: true\n });\n return DashboardObject;\n}());\nexports.DashboardObject = DashboardObject;\n//# sourceMappingURL=DashboardObject.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar ParameterChangedEvent_1 = require(\"../Events/ParameterChangedEvent\");\nvar 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 */\nvar Parameter = /** @class */ (function (_super) {\n __extends(Parameter, _super);\n function Parameter(parameterImpl, sheet) {\n var _this = _super.call(this) || this;\n _this.parameterImpl = parameterImpl;\n // Initialize our event handling for this class\n _this.initializeEvents(sheet).forEach(function (e) { return _this.addNewEventType(e); });\n return _this;\n }\n Object.defineProperty(Parameter.prototype, \"name\", {\n get: function () {\n return this.parameterImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Parameter.prototype, \"currentValue\", {\n get: function () {\n return this.parameterImpl.currentValue;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Parameter.prototype, \"dataType\", {\n get: function () {\n return this.parameterImpl.dataType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Parameter.prototype, \"allowableValues\", {\n get: function () {\n return this.parameterImpl.allowableValues;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Parameter.prototype, \"id\", {\n get: function () {\n return this.parameterImpl.id;\n },\n enumerable: true,\n configurable: true\n });\n Parameter.prototype.changeValueAsync = function (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 Parameter.prototype.initializeEvents = function (sheet) {\n var _this = this;\n api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet');\n var results = new Array();\n var notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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 var parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, function (model) {\n var fieldName = model;\n return fieldName === _this.parameterImpl.id;\n }, function (fieldName) {\n parameterEvent.triggerEvent(function () { return new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet); });\n });\n results.push(parameterEvent);\n return results;\n };\n return Parameter;\n}(api_shared_js_1.EventListenerManager));\nexports.Parameter = Parameter;\n//# sourceMappingURL=Parameter.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar Parameter_1 = require(\"./Parameter\");\nvar Sheet = /** @class */ (function (_super) {\n __extends(Sheet, _super);\n function Sheet(_sheetImpl) {\n var _this = _super.call(this) || this;\n _this._sheetImpl = _sheetImpl;\n return _this;\n }\n Object.defineProperty(Sheet.prototype, \"name\", {\n get: function () {\n return this._sheetImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Sheet.prototype, \"sheetType\", {\n get: function () {\n return this._sheetImpl.sheetType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Sheet.prototype, \"size\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n Sheet.prototype.isValidSize = function (size) {\n var testSize = size;\n if (testSize.width !== undefined && testSize.height !== undefined) {\n return true;\n }\n return false;\n };\n Sheet.prototype.findParameterAsync = function (parameterName) {\n var _this = this;\n return this._sheetImpl.findParameterAsync(parameterName).then(function (parameterImpl) {\n if (parameterImpl) {\n return new Promise(function (resolve) { return resolve(new Parameter_1.Parameter(parameterImpl, _this)); });\n }\n else {\n return new Promise(function (resolve) { return resolve(undefined); });\n }\n });\n };\n Sheet.prototype.getParametersAsync = function () {\n var _this = this;\n return this._sheetImpl.getParametersAsync().then(function (parametersImpl) {\n return parametersImpl.map(function (parameterImpl) {\n return new Parameter_1.Parameter(parameterImpl, _this);\n });\n });\n };\n return Sheet;\n}(api_shared_js_1.EventListenerManager));\nexports.Sheet = Sheet;\n//# sourceMappingURL=Sheet.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Workbook = /** @class */ (function () {\n function Workbook(_workbookImpl) {\n this._workbookImpl = _workbookImpl;\n }\n Workbook.prototype.getAllDataSourcesAsync = function () {\n return this._workbookImpl.getAllDataSourcesAsync();\n };\n return Workbook;\n}());\nexports.Workbook = Workbook;\n//# sourceMappingURL=Workbook.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar FilterChangedEvent_1 = require(\"../Events/FilterChangedEvent\");\nvar MarksSelectedEvent_1 = require(\"../Events/MarksSelectedEvent\");\nvar SummaryDataChangedEvent_1 = require(\"../Events/SummaryDataChangedEvent\");\nvar ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nvar Dashboard_1 = require(\"./Dashboard\");\nvar Sheet_1 = require(\"./Sheet\");\nvar Worksheet = /** @class */ (function (_super) {\n __extends(Worksheet, _super);\n function Worksheet(_worksheetImpl) {\n var _this = _super.call(this, _worksheetImpl) || this;\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(function (e) { return _this.addNewEventType(e); });\n return _this;\n }\n Object.defineProperty(Worksheet.prototype, \"parentDashboard\", {\n get: function () {\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 enumerable: true,\n configurable: true\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 Worksheet.prototype.initializeEvents = function () {\n var _this = this;\n var results = new Array();\n var notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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 var marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, function (model) {\n var visualId = model;\n return _this.visualIdsAreEqual(visualId, _this._worksheetImpl.visualId);\n }, function () { return marksEvent.triggerEvent(function () { return new MarksSelectedEvent_1.MarksSelectedEvent(_this); }); });\n var filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, function (model) {\n var filterEventResponse = model;\n return _this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet;\n }, function (event) {\n filterEvent.triggerEvent(function () { return new FilterChangedEvent_1.FilterChangedEvent(_this, event.fieldName, event.fieldId); });\n });\n var summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, function (model) {\n var summaryDataEventResponse = model;\n return _this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet;\n }, function (event) {\n summaryDataEvent.triggerEvent(function () { return new SummaryDataChangedEvent_1.SummaryDataChangedEvent(_this); });\n });\n results.push(marksEvent);\n results.push(filterEvent);\n results.push(summaryDataEvent);\n return results;\n };\n Worksheet.prototype.applyFilterAsync = function (fieldName, values, updateType, options) {\n return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options);\n };\n Worksheet.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) {\n return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions);\n };\n Worksheet.prototype.applyHierarchicalFilterAsync = function (fieldName, values, updateType, options) {\n return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options);\n };\n Worksheet.prototype.applyRelativeDateFilterAsync = function (fieldName, options) {\n return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options);\n };\n Worksheet.prototype.clearFilterAsync = function (fieldName) {\n return this._worksheetImpl.clearFilterAsync(fieldName);\n };\n Worksheet.prototype.getDataSourcesAsync = function () {\n return this._worksheetImpl.getDataSourcesAsync();\n };\n Worksheet.prototype.getFiltersAsync = function () {\n return this._worksheetImpl.getFiltersAsync();\n };\n Worksheet.prototype.getSelectedMarksAsync = function () {\n return this._worksheetImpl.getSelectedMarksAsync();\n };\n Worksheet.prototype.getHighlightedMarksAsync = function () {\n return this._worksheetImpl.getHighlightedMarksAsync();\n };\n Worksheet.prototype.getSummaryDataAsync = function (options) {\n return this._worksheetImpl.getSummaryDataAsync(options);\n };\n Worksheet.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) {\n return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options);\n };\n Worksheet.prototype.getSummaryColumnsInfoAsync = function () {\n return this._worksheetImpl.getSummaryColumnsInfoAsync();\n };\n Worksheet.prototype.getUnderlyingDataAsync = function (options) {\n console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' +\n 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync');\n return this._worksheetImpl.getUnderlyingDataAsync(options);\n };\n Worksheet.prototype.getUnderlyingTablesAsync = function () {\n return this._worksheetImpl.getUnderlyingTablesAsync();\n };\n Worksheet.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) {\n return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options);\n };\n Worksheet.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) {\n return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options);\n };\n Worksheet.prototype.getVisualSpecificationAsync = function () {\n return this._worksheetImpl.getVisualSpecificationAsync();\n };\n Worksheet.prototype.clearSelectedMarksAsync = function () {\n return this._worksheetImpl.clearSelectedMarksAsync();\n };\n Worksheet.prototype.selectMarksByIDAsync = function (marksInfo, updateType) {\n return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType);\n };\n Worksheet.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) {\n return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType);\n };\n Worksheet.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) {\n return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType);\n };\n Worksheet.prototype.annotateMarkAsync = function (mark, annotationText) {\n return this._worksheetImpl.annotateMarkAsync(mark, annotationText);\n };\n Worksheet.prototype.getAnnotationsAsync = function () {\n return this._worksheetImpl.getAnnotationsAsync();\n };\n Worksheet.prototype.removeAnnotationAsync = function (annotation) {\n return this._worksheetImpl.removeAnnotationAsync(annotation);\n };\n Worksheet.prototype.hoverTupleAsync = function (hoveredTuple, tooltip) {\n return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip);\n };\n Worksheet.prototype.selectTuplesAsync = function (selectedTuples, selectOption, tooltip) {\n return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip);\n };\n Worksheet.prototype.visualIdsAreEqual = function (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 return Worksheet;\n}(Sheet_1.Sheet));\nexports.Worksheet = Worksheet;\n//# sourceMappingURL=Worksheet.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar DashboardContent = /** @class */ (function () {\n function DashboardContent(_dashboard) {\n this._dashboard = _dashboard;\n }\n Object.defineProperty(DashboardContent.prototype, \"dashboard\", {\n get: function () {\n return this._dashboard;\n },\n enumerable: true,\n configurable: true\n });\n return DashboardContent;\n}());\nexports.DashboardContent = DashboardContent;\n//# sourceMappingURL=DashboardContent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar ConnectedServer_1 = require(\"../Impl/ConnectedServer\");\nvar 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 */\nvar Environment = /** @class */ (function () {\n function Environment(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._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting);\n this._language = extensionEnvironment.extensionLanguage;\n this._country = extensionEnvironment.extensionCountry;\n this._locale = extensionEnvironment.extensionLocale;\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 // 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 Object.defineProperty(Environment.prototype, \"apiVersion\", {\n get: function () {\n return this._apiVersion;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"context\", {\n get: function () {\n return this._context;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"workbookFormatting\", {\n get: function () {\n return this._formatting;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"language\", {\n get: function () {\n return this._language;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"country\", {\n get: function () {\n return this._country;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"locale\", {\n get: function () {\n return this._locale;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"mode\", {\n get: function () {\n return this._mode;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"operatingSystem\", {\n get: function () {\n return this._operatingSystem;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"tableauVersion\", {\n get: function () {\n return this._tableauVersion;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"uniqueUserId\", {\n get: function () {\n return this._uniqueUserId;\n },\n enumerable: true,\n configurable: true\n });\n return Environment;\n}());\nexports.Environment = Environment;\n//# sourceMappingURL=Environment.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the external Extensions namespace.\n */\nvar Extensions = /** @class */ (function () {\n function Extensions(extensionImpl) {\n this.extensionImpl = extensionImpl;\n this.extensionImpl = extensionImpl;\n }\n Object.defineProperty(Extensions.prototype, \"dashboardContent\", {\n get: function () {\n return this.extensionImpl.dashboardContent;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"worksheetContent\", {\n get: function () {\n return this.extensionImpl.worksheetContent;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"environment\", {\n get: function () {\n return this.extensionImpl.environment;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"settings\", {\n get: function () {\n return this.extensionImpl.settings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"ui\", {\n get: function () {\n return this.extensionImpl.ui;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"workbook\", {\n get: function () {\n return this.extensionImpl.workbook;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"dashboardObjectId\", {\n get: function () {\n return this.extensionImpl.extensionZoneId;\n },\n enumerable: true,\n configurable: true\n });\n Extensions.prototype.initializeAsync = function (contextMenuCallbacks) {\n return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then();\n };\n Extensions.prototype.initializeDialogAsync = function () {\n return this.extensionImpl.initializeAsync(true);\n };\n Extensions.prototype.createVizImageAsync = function (inputSpec) {\n return this.extensionImpl.createVizImageAsync(inputSpec);\n };\n Extensions.prototype.setClickThroughAsync = function (clickThroughEnabled) {\n return this.extensionImpl.setClickThroughAsync(clickThroughEnabled);\n };\n return Extensions;\n}());\nexports.Extensions = Extensions;\n//# sourceMappingURL=Extensions.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\n/**\n * Implementation of the external settings namespace.\n */\nvar Settings = /** @class */ (function (_super) {\n __extends(Settings, _super);\n function Settings(_settingsImpl) {\n var _this = _super.call(this) || this;\n _this._settingsImpl = _settingsImpl;\n // Initialize our event handling for this class\n _this._settingsImpl.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); });\n return _this;\n }\n Settings.prototype.erase = function (key) {\n this._settingsImpl.erase(key);\n };\n Settings.prototype.get = function (key) {\n return this._settingsImpl.get(key);\n };\n Settings.prototype.getAll = function () {\n return this._settingsImpl.getAll();\n };\n Object.defineProperty(Settings.prototype, \"isModified\", {\n get: function () {\n return this._settingsImpl.isModified;\n },\n enumerable: true,\n configurable: true\n });\n Settings.prototype.saveAsync = function () {\n return this._settingsImpl.saveAsync();\n };\n Settings.prototype.set = function (key, value) {\n this._settingsImpl.set(key, value);\n };\n return Settings;\n}(api_shared_js_1.EventListenerManager));\nexports.Settings = Settings;\n//# sourceMappingURL=Settings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the external UI namespace.\n */\nvar UI = /** @class */ (function () {\n function UI(_impl) {\n this._impl = _impl;\n }\n UI.prototype.displayDialogAsync = function (url, payload, options) {\n return this._impl.displayDialogAsync(url, payload, options);\n };\n UI.prototype.closeDialog = function (payload) {\n this._impl.closeDialog(payload);\n };\n return UI;\n}());\nexports.UI = UI;\n//# sourceMappingURL=UI.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar WorkbookFormattingEnvUtil = /** @class */ (function () {\n function WorkbookFormattingEnvUtil() {\n }\n WorkbookFormattingEnvUtil.convertToWorkbookFormatting = function (workbookFormattingModel) {\n if (!workbookFormattingModel) {\n return undefined;\n }\n else {\n var formattingMap = workbookFormattingModel.formattingSheets.map(function (currentFormattingSheet) {\n var formattingSheet = {\n classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey),\n cssProperties: {\n fontFamily: currentFormattingSheet.cssProperties.fontFamily,\n fontSize: currentFormattingSheet.cssProperties.fontSize,\n fontWeight: currentFormattingSheet.cssProperties.fontWeight,\n fontStyle: currentFormattingSheet.cssProperties.fontStyle,\n textDecoration: currentFormattingSheet.cssProperties.textDecoration,\n color: currentFormattingSheet.cssProperties.color,\n },\n };\n return formattingSheet;\n });\n var result = {\n formattingSheets: formattingMap,\n };\n return result;\n }\n };\n return WorkbookFormattingEnvUtil;\n}());\nexports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil;\n//# sourceMappingURL=WorkbookFormattingEnvUtil.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar WorksheetContent = /** @class */ (function () {\n function WorksheetContent(_worksheet) {\n this._worksheet = _worksheet;\n }\n Object.defineProperty(WorksheetContent.prototype, \"worksheet\", {\n get: function () {\n return this._worksheet;\n },\n enumerable: true,\n configurable: true\n });\n return WorksheetContent;\n}());\nexports.WorksheetContent = WorksheetContent;\n//# sourceMappingURL=WorksheetContent.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar InitializationServiceImpl = /** @class */ (function (_super) {\n __extends(InitializationServiceImpl, _super);\n function InitializationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(InitializationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"InitializationService\" /* InitializationService */;\n },\n enumerable: true,\n configurable: true\n });\n InitializationServiceImpl.prototype.initializeDashboardExtensionsAsync = function (isExtensionDialog, contextMenuIds) {\n var _a;\n var params = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'initializeDashboardExtensionsAsync',\n _a[api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds] = contextMenuIds,\n _a[api_internal_contract_js_1.ParameterId.IsExtensionDialog] = isExtensionDialog,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then(function (response) {\n // TODO - Validate return value\n var result = response.result;\n return result;\n });\n };\n return InitializationServiceImpl;\n}(api_shared_js_1.ServiceImplBase));\nexports.InitializationServiceImpl = InitializationServiceImpl;\n//# sourceMappingURL=InitializationServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar SettingsServiceImpl = /** @class */ (function (_super) {\n __extends(SettingsServiceImpl, _super);\n function SettingsServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(SettingsServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"SettingsService\" /* SettingsService */;\n },\n enumerable: true,\n configurable: true\n });\n SettingsServiceImpl.prototype.saveSettingsAsync = function (settings) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveSettingsAsync',\n _a[api_internal_contract_js_1.ParameterId.SettingsValues] = settings,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then(function (value) {\n var 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 return SettingsServiceImpl;\n}(api_shared_js_1.ServiceImplBase));\nexports.SettingsServiceImpl = SettingsServiceImpl;\n//# sourceMappingURL=SettingsServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar DEFAULT_DIALOG_HEIGHT = 400; // in pixels\nvar DEFAULT_DIALOG_WIDTH = 600; // in pixels\nvar DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window;\nvar UIServiceImpl = /** @class */ (function (_super) {\n __extends(UIServiceImpl, _super);\n function UIServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(UIServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"UIService\" /* UIService */;\n },\n enumerable: true,\n configurable: true\n });\n UIServiceImpl.prototype.displayDialogAsync = function (url, payload, options) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'displayDialogAsync',\n _a[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = url,\n _a[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload,\n _a);\n var h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT;\n var w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH;\n var 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(function (response) {\n var 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 UIServiceImpl.prototype.closeDialog = function (payload) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'closeDialog',\n _a);\n if (payload) {\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload;\n }\n return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(function () {\n return;\n });\n };\n UIServiceImpl.prototype.setClickThroughAsync = function (clickThroughEnabled, extensionZoneId) {\n var _a;\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 var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.ExtensionZoneId] = extensionZoneId,\n _a[api_internal_contract_js_1.ParameterId.ClickThroughEnabled] = clickThroughEnabled,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(function () {\n return;\n });\n };\n return UIServiceImpl;\n}(api_shared_js_1.ServiceImplBase));\nexports.UIServiceImpl = UIServiceImpl;\n//# sourceMappingURL=UIServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar InitializationServiceImpl_1 = require(\"./Impl/InitializationServiceImpl\");\nvar SettingsServiceImpl_1 = require(\"./Impl/SettingsServiceImpl\");\nvar UIServiceImpl_1 = require(\"./Impl/UIServiceImpl\");\nvar 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}\nexports.registerAllExtensionsServices = registerAllExtensionsServices;\nfunction registerInitializationExtensionsServices(dispatcher) {\n api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId));\n}\nexports.registerInitializationExtensionsServices = registerInitializationExtensionsServices;\n//# sourceMappingURL=RegisterAllExtensionsServices.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExtensionsRegistryId = 0;\n//# sourceMappingURL=ServiceRegistryUtil.js.map","\"use strict\";\n// This file re-exports everything which is part of the extensions api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./ExternalContract/Embedding/AskDataInterfaces\"));\nvar Enums_1 = require(\"./ExternalContract/Embedding/Enums\");\nexports.ApiMenuType = Enums_1.ApiMenuType;\nexports.CrosstabFileFormat = Enums_1.CrosstabFileFormat;\nexports.DeviceType = Enums_1.DeviceType;\nexports.EmbeddingErrorCodes = Enums_1.EmbeddingErrorCodes;\nexports.EmbeddingTableauEventType = Enums_1.TableauEventType;\nexports.FileFormats = Enums_1.FileFormats;\nexports.PrintOrientation = Enums_1.PrintOrientation;\nexports.PrintPageSize = Enums_1.PrintPageSize;\nexports.PrintScaling = Enums_1.PrintScaling;\nexports.SheetSizeBehavior = Enums_1.SheetSizeBehavior;\nexports.TableauDialogType = Enums_1.TableauDialogType;\nexports.Toolbar = Enums_1.Toolbar;\n__export(require(\"./ExternalContract/Embedding/PulseInterfaces\"));\n__export(require(\"./ExternalContract/Embedding/VizInterfaces\"));\n__export(require(\"./ExternalContract/Embedding/WebComponentInterfaces\"));\n__export(require(\"./SharedApiExternalContract\"));\n//# sourceMappingURL=EmbeddingApiExternalContract.js.map","\"use strict\";\n// This file re-exports everything which is part of the extensions api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Tableau_1 = require(\"./ExternalContract/Extensions/Namespaces/Tableau\");\nexports.ErrorCodes = Tableau_1.ErrorCodes;\nexports.ExtensionContext = Tableau_1.ExtensionContext;\nexports.ExtensionMode = Tableau_1.ExtensionMode;\nexports.TableauEventType = Tableau_1.TableauEventType;\nexports.VizImageEncodingType = Tableau_1.VizImageEncodingType;\nexports.VizImagePaletteType = Tableau_1.VizImagePaletteType;\nexports.VizImageSizeSettingAlignmentType = Tableau_1.VizImageSizeSettingAlignmentType;\nexports.VizImageSizeSettingType = Tableau_1.VizImageSizeSettingType;\nexports.VizImageSortDirectionType = Tableau_1.VizImageSortDirectionType;\n__export(require(\"./SharedApiExternalContract\"));\n//# sourceMappingURL=ExtensionsApiExternalContract.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 */\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./EmbeddingApiExternalContract\"));\n__export(require(\"./ExtensionsApiExternalContract\"));\n//# sourceMappingURL=ExternalContract.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.AskDataAttributes = {}));\n//# sourceMappingURL=AskDataInterfaces.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 });\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 || (exports.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 || (exports.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 * 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 * @NotImplemented\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 || (exports.EmbeddingErrorCodes = {}));\n/**\n * Formats available to use with displayStaticImage in @VizInterfaces\n */\nvar FileFormats;\n(function (FileFormats) {\n FileFormats[\"PDF\"] = \"pdf\";\n FileFormats[\"PNG\"] = \"png\";\n})(FileFormats = exports.FileFormats || (exports.FileFormats = {}));\nvar PrintOrientation;\n(function (PrintOrientation) {\n PrintOrientation[\"Portrait\"] = \"portrait\";\n PrintOrientation[\"Landscape\"] = \"landscape\";\n})(PrintOrientation = exports.PrintOrientation || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.ToolbarButtons = {}));\nvar Toolbar;\n(function (Toolbar) {\n Toolbar[\"Top\"] = \"top\";\n Toolbar[\"Bottom\"] = \"bottom\";\n Toolbar[\"Hidden\"] = \"hidden\";\n})(Toolbar = exports.Toolbar || (exports.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 || (exports.SheetSizeBehavior = {}));\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\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})(TableauEventType = exports.TableauEventType || (exports.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 || (exports.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 || (exports.TableauDialogType = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 = exports.PulseAttributes || (exports.PulseAttributes = {}));\n//# sourceMappingURL=PulseInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.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 || (exports.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 || (exports.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})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {}));\nvar VizChildElementAttributes;\n(function (VizChildElementAttributes) {\n VizChildElementAttributes[\"Field\"] = \"field\";\n VizChildElementAttributes[\"Value\"] = \"value\";\n VizChildElementAttributes[\"Name\"] = \"name\";\n})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {}));\n//# sourceMappingURL=VizInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.WebComponentAttributes = {}));\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})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {}));\nvar WebComponentChildElementAttributes;\n(function (WebComponentChildElementAttributes) {\n WebComponentChildElementAttributes[\"Field\"] = \"field\";\n WebComponentChildElementAttributes[\"Value\"] = \"value\";\n WebComponentChildElementAttributes[\"Name\"] = \"name\";\n})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {}));\n//# sourceMappingURL=WebComponentInterfaces.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 var 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 extenion.\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 var ExtensionContext;\n (function (ExtensionContext) {\n ExtensionContext[\"Desktop\"] = \"desktop\";\n ExtensionContext[\"Server\"] = \"server\";\n })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {}));\n /**\n * The mode in which the Extensions is currently running.\n */\n var ExtensionMode;\n (function (ExtensionMode) {\n ExtensionMode[\"Authoring\"] = \"authoring\";\n ExtensionMode[\"Viewing\"] = \"viewing\";\n })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {}));\n /**\n * Represents the type of event that can be listened for.\n */\n var TableauEventType;\n (function (TableauEventType) {\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 [[Parameter]] objects. */\n TableauEventType[\"ParameterChanged\"] = \"parameter-changed\";\n /** Settings have been changed for this extension. You can use this event type with [[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 })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {}));\n /**\n * Enum that represents the data type of encodings for createVizImageAsync.\n * @since 1.6.0\n */\n var 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 var 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 var 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 var 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 var 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 });\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 || (exports.SharedErrorCodes = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\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 var AnalyticsObjectType;\n (function (AnalyticsObjectType) {\n AnalyticsObjectType[\"Cluster\"] = \"cluster\";\n AnalyticsObjectType[\"Forecast\"] = \"forecast\";\n AnalyticsObjectType[\"TrendLine\"] = \"trend-line\";\n })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {}));\n var AnnotationType;\n (function (AnnotationType) {\n AnnotationType[\"Mark\"] = \"mark\";\n AnnotationType[\"Point\"] = \"point\";\n AnnotationType[\"Area\"] = \"area\";\n })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {}));\n var ColumnType;\n (function (ColumnType) {\n ColumnType[\"Discrete\"] = \"discrete\";\n ColumnType[\"Continuous\"] = \"continuous\";\n })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {}));\n var 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 = Tableau.ClassNameKey || (Tableau.ClassNameKey = {}));\n /**\n * What the object represents in a dashboard.\n */\n var 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 var 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 var 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 var 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 var 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 var DialogStyle;\n (function (DialogStyle) {\n DialogStyle[\"Window\"] = \"window\";\n DialogStyle[\"Modal\"] = \"modal\";\n DialogStyle[\"Modeless\"] = \"modeless\";\n })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {}));\n var 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 var 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 var 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 var 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 var 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 var 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 var 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 var 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 var 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 /**\n * An enumeration describing the different types of allowable values.\n * This is used for restricting the domain of a parameter\n */\n var 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 var 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 = Tableau.PeriodType || (Tableau.PeriodType = {}));\n var 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 var 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 {@link Worksheet.selectTuplesAsync} method.\n */\n var 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 var SheetType;\n (function (SheetType) {\n SheetType[\"Dashboard\"] = \"dashboard\";\n SheetType[\"Story\"] = \"story\";\n SheetType[\"Worksheet\"] = \"worksheet\";\n })(SheetType = Tableau.SheetType || (Tableau.SheetType = {}));\n var SortDirection;\n (function (SortDirection) {\n SortDirection[\"Increasing\"] = \"increasing\";\n SortDirection[\"Decreasing\"] = \"decreasing\";\n })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {}));\n var 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 var 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 var 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 = __assign({}, DashboardObjectVisibilityType);\n})(Tableau || (Tableau = {}));\nmodule.exports = Tableau;\n//# sourceMappingURL=Tableau.js.map","\"use strict\";\n// This file re-exports everything which is part of the shared api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./ExternalContract/Shared/Enums\"));\nvar Tableau_1 = require(\"./ExternalContract/Shared/Namespaces/Tableau\");\nexports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType;\nexports.AnnotationType = Tableau_1.AnnotationType;\nexports.ClassNameKey = Tableau_1.ClassNameKey;\nexports.ColumnType = Tableau_1.ColumnType;\nexports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange;\nexports.DashboardObjectType = Tableau_1.DashboardObjectType;\nexports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType;\nexports.DataType = Tableau_1.DataType;\nexports.DateRangeType = Tableau_1.DateRangeType;\nexports.DialogStyle = Tableau_1.DialogStyle;\nexports.EncodingType = Tableau_1.EncodingType;\nexports.FieldAggregationType = Tableau_1.FieldAggregationType;\nexports.FieldRoleType = Tableau_1.FieldRoleType;\nexports.FilterDomainType = Tableau_1.FilterDomainType;\nexports.FilterNullOption = Tableau_1.FilterNullOption;\nexports.FilterType = Tableau_1.FilterType;\nexports.FilterUpdateType = Tableau_1.FilterUpdateType;\nexports.HierarchicalLevelSelectionState = Tableau_1.HierarchicalLevelSelectionState;\nexports.IncludeDataValuesOption = Tableau_1.IncludeDataValuesOption;\nexports.MarkType = Tableau_1.MarkType;\nexports.ParameterValueType = Tableau_1.ParameterValueType;\nexports.PeriodType = Tableau_1.PeriodType;\nexports.QuickTableCalcType = Tableau_1.QuickTableCalcType;\nexports.ReplaySpeedType = Tableau_1.ReplaySpeedType;\nexports.SelectOptions = Tableau_1.SelectOptions;\nexports.SelectionUpdateType = Tableau_1.SelectionUpdateType;\nexports.SheetType = Tableau_1.SheetType;\nexports.SortDirection = Tableau_1.SortDirection;\nexports.TrendLineModelType = Tableau_1.TrendLineModelType;\nexports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType;\n//# sourceMappingURL=SharedApiExternalContract.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 */\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// The following polyfills are needed for IE11\nrequire(\"core-js/es/number/is-integer\");\nrequire(\"core-js/es/number/is-nan\");\nrequire(\"core-js/es/object/assign\");\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.\nvar internalContractVersion = require(\"../internal-contract-version.json\");\nexports.INTERNAL_CONTRACT_VERSION = internalContractVersion;\n__export(require(\"./contract/DataTypeConverter\"));\n__export(require(\"./contract/Enums\"));\n__export(require(\"./contract/Notifications\"));\n__export(require(\"./contract/Parameters\"));\n__export(require(\"./contract/Verbs\"));\n__export(require(\"./interface/AskDataInterface\"));\n__export(require(\"./interface/PulseInterface\"));\n__export(require(\"./interface/VqlInterface\"));\n__export(require(\"./messaging/CrossFrameMessenger\"));\n__export(require(\"./messaging/interface/MessageTypes\"));\n__export(require(\"./versioning/VersionConverterFactory\"));\n__export(require(\"./versioning/external/ExternalIdentityVersionConverter\"));\n__export(require(\"./versioning/external/ExternalVersionConverterFactory\"));\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 });\nvar Enums_1 = require(\"./Enums\");\nvar DataTypeConverter = /** @class */ (function () {\n function DataTypeConverter() {\n }\n DataTypeConverter.isSpecial = function (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 DataTypeConverter.parseBoolean = function (booleanString) {\n // boolean values come to us as 'true'|'false'\n var normalizedBoolean = booleanString.toLowerCase();\n return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true';\n };\n // tslint:disable-next-line:no-any\n DataTypeConverter.parseNumber = function (valueAsString) {\n var value = Number(valueAsString);\n return isNaN(value) ? this.specialValueIndicator : value;\n };\n DataTypeConverter.parseDate = function (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 var value = new Date(dateAsString);\n return Number.isNaN(value.getTime()) ? null : value;\n };\n DataTypeConverter.parseDateTime = function (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 var formattedDateString = dateAsString.replace(' ', 'T').concat('Z');\n var value = new Date(formattedDateString);\n return Number.isNaN(value.getTime()) ? null : value;\n };\n // tslint:disable-next-line:no-any\n DataTypeConverter.convertValueAsStringToValue = function (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 DataTypeConverter.convertValueToNativeValue = function (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 DataTypeConverter.convertStringValueToNativeValue = function (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 DataTypeConverter.specialValueIndicator = '%null%';\n return DataTypeConverter;\n}());\nexports.DataTypeConverter = DataTypeConverter;\n//# sourceMappingURL=DataTypeConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ExtensionContext;\n(function (ExtensionContext) {\n ExtensionContext[\"Desktop\"] = \"desktop\";\n ExtensionContext[\"Server\"] = \"server\";\n ExtensionContext[\"Unknown\"] = \"unknown\";\n})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {}));\nvar ExtensionMode;\n(function (ExtensionMode) {\n ExtensionMode[\"Authoring\"] = \"authoring\";\n ExtensionMode[\"Viewing\"] = \"viewing\";\n ExtensionMode[\"Unknown\"] = \"unknown\";\n})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {}));\nvar AnnotateEnum;\n(function (AnnotateEnum) {\n AnnotateEnum[\"Mark\"] = \"mark\";\n AnnotateEnum[\"Point\"] = \"point\";\n AnnotateEnum[\"Area\"] = \"area\";\n})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {}));\nvar ColumnType;\n(function (ColumnType) {\n ColumnType[\"Discrete\"] = \"discrete\";\n ColumnType[\"Continuous\"] = \"continuous\";\n})(ColumnType = exports.ColumnType || (exports.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 || (exports.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 || (exports.DataType = {}));\nvar DialogStyle;\n(function (DialogStyle) {\n DialogStyle[\"Window\"] = \"window\";\n DialogStyle[\"Modal\"] = \"modal\";\n DialogStyle[\"Modeless\"] = \"modeless\";\n})(DialogStyle = exports.DialogStyle || (exports.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 || (exports.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 || (exports.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 || (exports.FieldAggregationType = {}));\nvar FieldRoleType;\n(function (FieldRoleType) {\n FieldRoleType[\"Dimension\"] = \"dimension\";\n FieldRoleType[\"Measure\"] = \"measure\";\n FieldRoleType[\"Unknown\"] = \"unknown\";\n})(FieldRoleType = exports.FieldRoleType || (exports.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 || (exports.FilterUpdateType = {}));\nvar SheetType;\n(function (SheetType) {\n SheetType[\"Dashboard\"] = \"dashboard\";\n SheetType[\"Story\"] = \"story\";\n SheetType[\"Worksheet\"] = \"worksheet\";\n})(SheetType = exports.SheetType || (exports.SheetType = {}));\nvar DomainRestrictionType;\n(function (DomainRestrictionType) {\n DomainRestrictionType[\"All\"] = \"all\";\n DomainRestrictionType[\"List\"] = \"list\";\n DomainRestrictionType[\"Range\"] = \"range\";\n})(DomainRestrictionType = exports.DomainRestrictionType || (exports.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 = exports.DateStepPeriod || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.ExtensionDialogResult = {}));\n// Enumeration for ApiShowData table id sentinels.\nvar ApiShowDataTableSentinel;\n(function (ApiShowDataTableSentinel) {\n // find the one logical table - used in version compatibility check for getUnderlyingDataTable and getLogicalDataTable commands\n ApiShowDataTableSentinel[\"SingleTableId\"] = \"single-table-id-sentinel\";\n ApiShowDataTableSentinel[\"SingleTableCaption\"] = \"Single table id sentinel\";\n})(ApiShowDataTableSentinel = exports.ApiShowDataTableSentinel || (exports.ApiShowDataTableSentinel = {}));\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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.EncodingType = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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[\"FilterChanged\"] = \"filter-changed\";\n NotificationId[\"FirstVizSizeKnown\"] = \"first-viz-size-known\";\n NotificationId[\"ParameterChanged\"] = \"parameter-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[\"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 || (exports.NotificationId = {}));\n//# sourceMappingURL=Notifications.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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[\"CategoricalDomain\"] = \"categorical-domain\";\n ParameterId[\"ClickThroughEnabled\"] = \"click-through-enabled\";\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[\"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[\"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[\"ExtensionDialogPayload\"] = \"extension-dialog-payload\";\n ParameterId[\"ExtensionDialogResult\"] = \"extension-dialog-result\";\n ParameterId[\"ExtensionDialogStyle\"] = \"extension-dialog-style\";\n ParameterId[\"ExtensionDialogUrl\"] = \"extension-dialog-url\";\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[\"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[\"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[\"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[\"IsExcludeMode\"] = \"is-exclude\";\n ParameterId[\"IsExtensionDialog\"] = \"is-extension-dialog\";\n ParameterId[\"JoinDescription\"] = \"join-description\";\n ParameterId[\"LogicalTableId\"] = \"logical-table-id\";\n ParameterId[\"LogicalTableInfoList\"] = \"logical-table-info-list\";\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[\"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[\"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[\"TooltipContext\"] = \"tooltip-context\";\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 || (exports.ParameterId = {}));\n//# sourceMappingURL=Parameters.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Declare this key type and export the NotificationId to make this behave like a string enum.\n//\n// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put\n// new ones, and merge conflicts.\nvar VerbId;\n(function (VerbId) {\n VerbId[\"ActivateNextStoryPoint\"] = \"activate-next-story-point\";\n VerbId[\"ActivatePreviousStoryPoint\"] = \"activate-previous-story-point\";\n VerbId[\"ActivateSheet\"] = \"activateSheet\";\n VerbId[\"ActivateStoryPoint\"] = \"activate-story-point\";\n VerbId[\"AppendExternalMenuItem\"] = \"append-external-menu-item\";\n VerbId[\"ApplyCategoricalFilter\"] = \"categorical-filter\";\n VerbId[\"ApplyRangeFilter\"] = \"range-filter\";\n VerbId[\"ApplyRelativeDateFilter\"] = \"apply-relative-date-Filter\";\n VerbId[\"Authenticate\"] = \"authenticate\";\n VerbId[\"BlockExtension\"] = \"block-extension\";\n VerbId[\"ChangeParameterValue\"] = \"change-parameter-value\";\n VerbId[\"ChangeSharedFilter\"] = \"change-shared-filter\";\n VerbId[\"ClearFilter\"] = \"clear-filter\";\n VerbId[\"ClearSelectedMarks\"] = \"clear-selected-marks\";\n VerbId[\"CloseDialog\"] = \"close-dialog\";\n VerbId[\"CreateAnnotation\"] = \"create-annotation\";\n VerbId[\"DashboardCategoricalFilter\"] = \"dashboard-categorical-filter\";\n VerbId[\"DisplayDialog\"] = \"display-dialog\";\n VerbId[\"DownloadWorkbook\"] = \"download-workbook\";\n VerbId[\"ExecuteExternalMenuItem\"] = \"execute-external-menu-item\";\n VerbId[\"ExportCrosstab\"] = \"export-crosstab\";\n VerbId[\"ExportCrosstabCsvDownload\"] = \"export-crosstab-csv-download\";\n VerbId[\"ExportCrosstabExcelDownload\"] = \"export-crosstab-excel-download\";\n VerbId[\"ExportData\"] = \"export-data\";\n VerbId[\"ExportDataDownload\"] = \"export-data-download\";\n VerbId[\"ExportImage\"] = \"export-image\";\n VerbId[\"ExportPdf\"] = \"export-pdf\";\n VerbId[\"ExportPdfDownload\"] = \"export-pdf-download\";\n VerbId[\"ExportPowerpoint\"] = \"export-powerpoint\";\n VerbId[\"ExportPowerpointDownload\"] = \"export-powerpoint-download\";\n VerbId[\"FindParameter\"] = \"find-parameter\";\n VerbId[\"GetActiveTables\"] = \"get-active-tables\";\n VerbId[\"GetAllDataSources\"] = \"get-all-data-sources\";\n VerbId[\"GetAnnotations\"] = \"get-annotations\";\n VerbId[\"GetCategoricalDomain\"] = \"get-categorical-domain\";\n VerbId[\"GetConnectionDescriptionSummaries\"] = \"get-connection-description-summaries\";\n VerbId[\"GetCurrentSrc\"] = \"get-current-src\";\n VerbId[\"GetCustomViews\"] = \"get-custom-views\";\n VerbId[\"GetDashboardFilters\"] = \"get-dashboard-filters\";\n VerbId[\"GetDataSource\"] = \"get-datasource\";\n VerbId[\"GetDataSourceData\"] = \"get-datasource-data\";\n VerbId[\"GetDataSources\"] = \"get-data-sources\";\n VerbId[\"GetDataSummaryData\"] = \"get-summary-data\";\n VerbId[\"GetDataSummaryDataReader\"] = \"get-summary-data-reader\";\n VerbId[\"GetDataTableReaderPage\"] = \"get-data-table-reader-page\";\n VerbId[\"GetEmbeddingAbstractQueryWithDataModel\"] = \"get-embedding-abstract-query-with-data-model\";\n VerbId[\"GetEmbeddingClientInfo\"] = \"get-embedding-client-info\";\n VerbId[\"GetVizStateWithDataModel\"] = \"get-viz-state-with-data-model\";\n VerbId[\"GetExportCrosstabSheetMap\"] = \"get-export-crosstab-sheet-map\";\n VerbId[\"GetExportPdfOptions\"] = \"get-export-pdf-options\";\n VerbId[\"GetField\"] = \"get-field\";\n VerbId[\"GetFieldAndDataSource\"] = \"get-field-and-datasource\";\n VerbId[\"GetVisualSpecification\"] = \"get-visual-specification\";\n VerbId[\"GetFilters\"] = \"get-filters\";\n VerbId[\"GetFonts\"] = \"get-fonts\";\n VerbId[\"GetHighlightedMarks\"] = \"get-highlighted-marks\";\n VerbId[\"GetJoinDescription\"] = \"get-join-description\";\n VerbId[\"GetLogicalTableData\"] = \"get-logical-table-data\";\n VerbId[\"GetLogicalTableDataReader\"] = \"get-logical-table-data-reader\";\n VerbId[\"GetLogicalTables\"] = \"get-logical-tables\";\n VerbId[\"GetParametersForSheet\"] = \"get-parameters-for-sheet\";\n VerbId[\"GetRangeDomain\"] = \"get-range-domain\";\n VerbId[\"GetSelectedMarks\"] = \"get-selected-marks\";\n VerbId[\"GetSharedFilter\"] = \"get-shared-filter\";\n VerbId[\"GetUnderlyingData\"] = \"get-underlying-data\";\n VerbId[\"GetUnderlyingTableData\"] = \"get-underlying-table-data\";\n VerbId[\"GetUnderlyingTableDataReader\"] = \"get-underlying-table-data-reader\";\n VerbId[\"GetUnderlyingTables\"] = \"get-underlying-tables\";\n VerbId[\"HierarchicalFilter\"] = \"hierachical-filter\";\n VerbId[\"InitializeExtension\"] = \"initialize-extension\";\n VerbId[\"MoveAndResizeZones\"] = \"move-and-resize-zones\";\n VerbId[\"RaiseHoverTupleNotification\"] = \"raise-hover-tuple-notification\";\n VerbId[\"RaiseSelectTuplesNotification\"] = \"raise-select-tuples-notification\";\n VerbId[\"Redo\"] = \"redo\";\n VerbId[\"RefreshDataSource\"] = \"refresh-data-source\";\n VerbId[\"ReleaseDataTableReader\"] = \"release-data-table-reader\";\n VerbId[\"RemoveAnnotation\"] = \"remove-annotation\";\n VerbId[\"RemoveCustomView\"] = \"remove-custom-view\";\n VerbId[\"RemoveExternalMenuItem\"] = \"remove-external-menu-item\";\n VerbId[\"RenameExternalMenu\"] = \"rename-external-menu\";\n VerbId[\"ReplayAnimation\"] = \"replay-animation\";\n VerbId[\"RevertStoryPoint\"] = \"revert-story-point\";\n VerbId[\"RevertWorkbook\"] = \"revert-workbook\";\n VerbId[\"SaveExtensionSettings\"] = \"save-extension-settings\";\n VerbId[\"SaveWorkbookAsCustomView\"] = \"save-workbook-as-custom-view\";\n VerbId[\"SelectByValue\"] = \"select-by-value\";\n VerbId[\"SetActiveCustomViewAsDefault\"] = \"set-active-custom-view-as-default\";\n VerbId[\"SetAutoUpdate\"] = \"set-auto-update\";\n VerbId[\"SetClickThrough\"] = \"set-click-through\";\n VerbId[\"SetVizStateWithDataModel\"] = \"set-viz-state-with-data-model\";\n VerbId[\"SetSheetSize\"] = \"set-sheet-size\";\n VerbId[\"SetZoneVisibility\"] = \"set-zone-visibility\";\n VerbId[\"Share\"] = \"share\";\n VerbId[\"ShowCustomView\"] = \"show-custom-view\";\n VerbId[\"TestConversionVerb\"] = \"test-conversion-verb\";\n VerbId[\"Undo\"] = \"undo\";\n VerbId[\"UpdateCustomView\"] = \"update-custom-view\";\n VerbId[\"VizAPI\"] = \"viz-api\";\n})(VerbId = exports.VerbId || (exports.VerbId = {}));\n//# sourceMappingURL=Verbs.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.AskDataOptionNames = {}));\n//# sourceMappingURL=AskDataInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PulseOptionNames;\n(function (PulseOptionNames) {\n PulseOptionNames[\"embed\"] = \"embed\";\n PulseOptionNames[\"token\"] = \"token\";\n PulseOptionNames[\"disableExploreFilter\"] = \"disableExploreFilter\";\n PulseOptionNames[\"ApiExternalVersion\"] = \":apiExternalVersion\";\n PulseOptionNames[\"ApiInternalVersion\"] = \":apiInternalVersion\";\n PulseOptionNames[\"PulseWebComponent\"] = \":pulseWebComponent\";\n})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {}));\n//# sourceMappingURL=PulseInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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\"] = \":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[\"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 || (exports.VizOptionNames = {}));\n//# sourceMappingURL=VqlInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar guid = require(\"guid\");\nvar JsApiInternalContract_1 = require(\"../JsApiInternalContract\");\nvar CrossFramePreparedMessage_1 = require(\"./CrossFramePreparedMessage\");\nvar MessageTypeChecks_1 = require(\"./MessageTypeChecks\");\nvar 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 */\nvar CrossFrameMessenger = /** @class */ (function () {\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 function CrossFrameMessenger(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 CrossFrameMessenger.prototype.startListening = function () {\n var _this = this;\n // Check if we already are listening, if not, hook up a message listener\n if (!this.unregisterFunction) {\n var boundHandler_1 = this.onMessageReceived.bind(this);\n this.thisWindow.addEventListener('message', boundHandler_1, true);\n this.unregisterFunction = function () { return _this.thisWindow.removeEventListener('message', boundHandler_1, true); };\n }\n };\n CrossFrameMessenger.prototype.stopListening = function () {\n // Stop listening if we have started listening\n if (this.unregisterFunction) {\n this.unregisterFunction();\n this.unregisterFunction = undefined;\n }\n };\n CrossFrameMessenger.prototype.setInitializeMessageHandler = function (handler) {\n this.initializeMessageHandler = handler;\n };\n CrossFrameMessenger.prototype.setCommandResponseMessageHandler = function (handler) {\n this.commandResponseMessageHandler = handler;\n };\n CrossFrameMessenger.prototype.setCommandMessageHandler = function (handler) {\n this.commandMessageHandler = handler;\n };\n CrossFrameMessenger.prototype.setNotificationMessageHandler = function (handler) {\n this.notificationMessageHandler = handler;\n };\n CrossFrameMessenger.prototype.setHandshakeMessageHandler = function (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 CrossFrameMessenger.prototype.prepareInitializationMessage = function (apiVersion, crossFrameVersion, options) {\n var 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 CrossFrameMessenger.prototype.prepareCommandMessage = function (verbId, parameters) {\n var 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 CrossFrameMessenger.prototype.prepareCommandResponseMessage = function (commandGuid, data, error) {\n var 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 CrossFrameMessenger.prototype.prepareNotificationMessage = function (notificationId, data) {\n var 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 CrossFrameMessenger.prototype.prepareAckMessage = function () {\n var 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 CrossFrameMessenger.prototype.prepareMessage = function (msg) {\n if (!this.otherWindow || !this.otherWindowOrigin) {\n throw 'Other window not initialized, cannot dispatch messages';\n }\n var 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 CrossFrameMessenger.prototype.onMessageReceived = function (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 var message = event.data;\n if (!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 (!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 (!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 (!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 (!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 (!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 CrossFrameMessenger.prototype.setOtherWindow = function (otherWindow) {\n this.otherWindow = otherWindow;\n };\n CrossFrameMessenger.prototype.setOtherWindowOrigin = function (origin) {\n this.otherWindowOrigin = origin;\n };\n return CrossFrameMessenger;\n}());\nexports.CrossFrameMessenger = CrossFrameMessenger;\n//# sourceMappingURL=CrossFrameMessenger.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the PreparedMessage interface used to post messages between\n * two frames using window.postMessage\n */\nvar CrossFramePreparedMessage = /** @class */ (function () {\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 function CrossFramePreparedMessage(_message, _target, _origin) {\n this._message = _message;\n this._target = _target;\n this._origin = _origin;\n }\n Object.defineProperty(CrossFramePreparedMessage.prototype, \"messageGuid\", {\n get: function () {\n return this._message.msgGuid;\n },\n enumerable: true,\n configurable: true\n });\n CrossFramePreparedMessage.prototype.send = function () {\n this._target.postMessage(this._message, this._origin);\n return this;\n };\n return CrossFramePreparedMessage;\n}());\nexports.CrossFramePreparedMessage = CrossFramePreparedMessage;\n//# sourceMappingURL=CrossFramePreparedMessage.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar guid = require(\"guid\");\nvar Notifications_1 = require(\"../contract/Notifications\");\nvar MessageTypes_1 = require(\"./interface/MessageTypes\");\nvar 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 var 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 var 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}\nexports.isMessage = isMessage;\nfunction isVersion(versionNumber) {\n if (!versionNumber) {\n return false;\n }\n var 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}\nexports.isVersion = isVersion;\nfunction isInitMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var 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}\nexports.isInitMessage = isInitMessage;\nfunction isCommandResponseMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var 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}\nexports.isCommandResponseMessage = isCommandResponseMessage;\nfunction isCommandMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var 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}\nexports.isCommandMessage = isCommandMessage;\nfunction isNotificationMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var 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}\nexports.isNotificationMessage = isNotificationMessage;\nfunction isHandshakeMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var handshakeMessage = message;\n if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) {\n return false;\n }\n return true;\n}\nexports.isHandshakeMessage = isHandshakeMessage;\n//# sourceMappingURL=MessageTypeChecks.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.MessageType = {}));\n//# sourceMappingURL=MessageTypes.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar IdentityVersionConverter = /** @class */ (function () {\n function IdentityVersionConverter() {\n }\n IdentityVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) {\n return {\n verb: verb,\n parameters: parameters,\n };\n };\n IdentityVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) {\n return executeResponse;\n };\n IdentityVersionConverter.prototype.downgradeNotification = function (notification) {\n return notification;\n };\n return IdentityVersionConverter;\n}());\nexports.IdentityVersionConverter = IdentityVersionConverter;\n//# sourceMappingURL=IdentityVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar StackingVersionConverter = /** @class */ (function () {\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 function StackingVersionConverter(_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 /**\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 StackingVersionConverter.fromData = function (externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) {\n return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations);\n };\n StackingVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) {\n // Perform the upgrade of the verb and parameters to the level that platform is using\n var upgraded = { verb: verb, parameters: parameters };\n for (var _i = 0, _a = this._upgradeExecuteTranslations; _i < _a.length; _i++) {\n var upgradeTranslation = _a[_i];\n upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters);\n }\n return upgraded;\n };\n StackingVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) {\n // Downgrade the response to what the external module is expecting\n var downgraded = executeResponse;\n for (var _i = 0, _a = this._downgradeExecuteTranslations; _i < _a.length; _i++) {\n var downgradeTranslation = _a[_i];\n downgraded = downgradeTranslation(downgraded);\n }\n return downgraded;\n };\n StackingVersionConverter.prototype.downgradeNotification = function (notification) {\n // Downgrade the notification to what the external module is expecting\n var downgraded = notification;\n for (var _i = 0, _a = this._downgradeNotificationTranslations; _i < _a.length; _i++) {\n var downgradeTranslation = _a[_i];\n downgraded = downgradeTranslation(downgraded);\n }\n return downgraded;\n };\n return StackingVersionConverter;\n}());\nexports.StackingVersionConverter = StackingVersionConverter;\n//# sourceMappingURL=StackingVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar IdentityVersionConverter_1 = require(\"./IdentityVersionConverter\");\nvar StackingVersionConverter_1 = require(\"./StackingVersionConverter\");\nvar 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}\nexports.VersionLessThan = VersionLessThan;\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}\nexports.VersionEqualTo = VersionEqualTo;\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: [],\n },\n};\nexports.ExecuteMinorDowngrades = {\n 1: {\n 5: [VersionTranslations_1.DowngradeWorksheetNames],\n 9: [],\n },\n};\nexports.NotificationMinorDowngrades = {\n 1: {\n 9: [],\n 10: [VersionTranslations_1.DowngradeFlipboardZoneID],\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}\nexports.CreateVersionConverter = CreateVersionConverter;\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 var externalMajorVersion = externalVersion.major;\n var externalMinorVersion = externalVersion.minor;\n var 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 var neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades);\n var neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades);\n var 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}\nexports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators;\nfunction GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) {\n var neededTranslations = [];\n for (var major = externalMajorVersion; major <= platformMajorVersion; major++) {\n if (major in majorMinorTranslators) {\n var start = major === externalMajorVersion ? externalMinorVersion : 0;\n var maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major]));\n for (var minor = start; minor <= maximumMinorVersion; minor++) {\n if (minor in majorMinorTranslators[major]) {\n neededTranslations.push.apply(neededTranslations, majorMinorTranslators[major][minor]);\n }\n }\n }\n }\n return neededTranslations;\n}\nfunction GetMaximumMinorIndex(minorVersions) {\n return minorVersions.map(function (a) { return Number(a); }).reduce(function (a, b) { return (a > b ? a : b); });\n}\nexports.GetMaximumMinorIndex = GetMaximumMinorIndex;\n//# sourceMappingURL=VersionConverterFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar 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 var bootstrapInfo = executeResponse.result;\n if (bootstrapInfo.extensionDashboardInfo !== undefined) {\n bootstrapInfo.extensionDashboardInfo.zones.forEach(function (zone) {\n if (zone.sheetInfo) {\n zone.name = zone.sheetInfo.name;\n }\n });\n }\n return executeResponse;\n}\nexports.DowngradeWorksheetNames = DowngradeWorksheetNames;\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 var visualModel = notification.data;\n if (visualModel.flipboardZoneID === undefined) {\n visualModel.flipboardZoneID = 0;\n }\n }\n return notification;\n}\nexports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID;\n//# sourceMappingURL=VersionTranslations.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar ExternalIdentityVersionConverter = /** @class */ (function () {\n function ExternalIdentityVersionConverter() {\n }\n ExternalIdentityVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) {\n return {\n verb: verb,\n parameters: parameters,\n };\n };\n ExternalIdentityVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) {\n return executeResponse;\n };\n ExternalIdentityVersionConverter.prototype.upgradeNotification = function (notification) {\n return notification;\n };\n return ExternalIdentityVersionConverter;\n}());\nexports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter;\n//# sourceMappingURL=ExternalIdentityVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar ExternalStackingVersionConverter = /** @class */ (function () {\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 function ExternalStackingVersionConverter(_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 ExternalStackingVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) {\n // Perform the downgrade of the verb and parameters to the level that platform is using\n var downgraded = { verb: verb, parameters: parameters };\n for (var _i = 0, _a = this._downgradeExecuteCallTranslations; _i < _a.length; _i++) {\n var downgradeTranslation = _a[_i];\n downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters);\n }\n return downgraded;\n };\n ExternalStackingVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) {\n // Perform the upgrade of the response to what the external module is expecting\n var upgraded = executeResponse;\n for (var _i = 0, _a = this._upgradeExecuteReturnTranslations; _i < _a.length; _i++) {\n var upgradeTranslation = _a[_i];\n upgraded = upgradeTranslation(upgraded, verb, parameters);\n }\n return upgraded;\n };\n ExternalStackingVersionConverter.prototype.upgradeNotification = function (notification) {\n // Perform the upgrade of notification to what the external module is expecting\n var upgraded = notification;\n for (var _i = 0, _a = this._upgradeNotificationTranslations; _i < _a.length; _i++) {\n var upgradeNotification = _a[_i];\n upgraded = upgradeNotification(upgraded);\n }\n return upgraded;\n };\n return ExternalStackingVersionConverter;\n}());\nexports.ExternalStackingVersionConverter = ExternalStackingVersionConverter;\n//# sourceMappingURL=ExternalStackingVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar VersionConverterFactory_1 = require(\"../VersionConverterFactory\");\nvar ExternalIdentityVersionConverter_1 = require(\"./ExternalIdentityVersionConverter\");\nvar ExternalStackingVersionConverter_1 = require(\"./ExternalStackingVersionConverter\");\nvar ExternalVersionTranslations_1 = require(\"./ExternalVersionTranslations\");\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: [],\n 13: [ExternalVersionTranslations_1.DowngradeUnderlyingTableDataAsync, ExternalVersionTranslations_1.DowngradeLogicalTableDataAsync],\n },\n};\nexports.ExecuteMinorUpgradeReturnExternal = {\n 1: {\n 9: [ExternalVersionTranslations_1.UpgradeDataTableTypes],\n 29: [ExternalVersionTranslations_1.UpgradeDataTableRowsAndColumns],\n },\n};\nexports.ExecuteMinorUpgradeNotification = {\n 1: {\n 9: [],\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}\nexports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter;\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 var externalMajorVersion = externalVersion.major;\n var platformMajorVersion = platformVersion.major;\n var 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 || 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 var neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades);\n var neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades);\n var 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}\nexports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators;\nfunction GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) {\n var neededTranslations = [];\n if (platformMajorVersion in majorMinorTranslators) {\n var start = platformMinorVersion;\n var maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion]));\n for (var minor = start; minor <= maximumMinorVersion; minor++) {\n if (minor in majorMinorTranslators[platformMajorVersion]) {\n neededTranslations.push.apply(neededTranslations, majorMinorTranslators[platformMajorVersion][minor]);\n }\n }\n }\n return neededTranslations;\n}\n//# sourceMappingURL=ExternalVersionConverterFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar JsApiInternalContract_1 = require(\"../../JsApiInternalContract\");\n// 1.2 -> 1.0 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';\n/**\n * Prior to 2019.2 (internal-contract v1.9), DataValue.value were all strings.\n * Go through all DataValue objects. If we have a string, but the type should not be a string,\n * convert it to the correct type. The type of DataValue.value is 'any' in the contract, so\n * this change doesn't need any updates to classes or types.\n */\nfunction UpgradeDataTableTypes(executeResponse, verb, parameters) {\n if (!executeResponse) {\n return executeResponse;\n }\n var oldUnderlyingDataTable = executeResponse.result;\n if (oldUnderlyingDataTable.data !== undefined && oldUnderlyingDataTable.isSummary !== undefined) {\n convertDataValues(oldUnderlyingDataTable.data);\n return executeResponse;\n }\n var oldSelectedMarksTable = executeResponse.result;\n if (oldSelectedMarksTable.data !== undefined && Array.isArray(oldSelectedMarksTable.data)) {\n oldSelectedMarksTable.data.forEach(function (marksTable) {\n convertDataValues(marksTable);\n });\n return executeResponse;\n }\n return executeResponse;\n}\nexports.UpgradeDataTableTypes = UpgradeDataTableTypes;\n/**\n * Prior to 2020.2 (internal-contract v1.13 and older), worksheet.getUnderlyingTableDataAsync doesn't exist.\n * Map it to the older GetUnderlyingData verb and validate the the logical table Id.\n **/\nfunction DowngradeUnderlyingTableDataAsync(verb, parameters) {\n if (verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData) {\n validateParametersForObjectModel(verb, parameters);\n verb = JsApiInternalContract_1.VerbId.GetUnderlyingData;\n }\n return {\n verb: verb,\n parameters: parameters,\n };\n}\nexports.DowngradeUnderlyingTableDataAsync = DowngradeUnderlyingTableDataAsync;\n/**\n * Prior to 2020.2 (internal-contract v1.13 and older), datasource.getLogicalTableDataAsync doesn't exist.\n * Map it to the older GetDataSourceData verb and validate the the logical table Id.\n **/\nfunction DowngradeLogicalTableDataAsync(verb, parameters) {\n if (verb === JsApiInternalContract_1.VerbId.GetLogicalTableData) {\n validateParametersForObjectModel(verb, parameters);\n verb = JsApiInternalContract_1.VerbId.GetDataSourceData;\n }\n return {\n verb: verb,\n parameters: parameters,\n };\n}\nexports.DowngradeLogicalTableDataAsync = DowngradeLogicalTableDataAsync;\nfunction convertDataValues(table) {\n // dataTable is a two-dimensional array of data. First index is the row, second is the column.\n if (table === undefined || table.dataTable === undefined || !Array.isArray(table.dataTable)) {\n return;\n }\n table.dataTable.forEach(function (row) {\n row.forEach(function (dataValue, columnIndex) {\n var value = dataValue.value;\n if (value !== null) {\n dataValue.value = JsApiInternalContract_1.DataTypeConverter.convertValueAsStringToValue(value, table.headers[columnIndex].dataType);\n }\n });\n });\n}\n// ToDo: TFS1069027 Refactor input verbs & parameters in api-internal-contract Upgrade/Downgrade framework\nfunction validateParametersForObjectModel(verb, parameters) {\n if (parameters[JsApiInternalContract_1.ParameterId.LogicalTableId] !== JsApiInternalContract_1.ApiShowDataTableSentinel.SingleTableId) {\n throw new Error(\"Invalid logical table id passed to \" + verb + \".\");\n }\n}\n/**\n * Prior to 2021.2 (internal-contract v1.29 and below), getSummaryDataAsync did not support maxRows,\n * and any get...DataAsync did not support columnsToIncludeById.\n * Trim result to maxRows if it is included in the parameters for getSummaryDataAsync\n * Trim columns to columnsToInclude if included in the parameters for any get...DataAsync\n */\nfunction UpgradeDataTableRowsAndColumns(executeResponse, verb, parameters) {\n if (isGetSummaryDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.MaxRows]) {\n executeResponse = adjustDataRowLength(executeResponse, parameters[JsApiInternalContract_1.ParameterId.MaxRows]);\n }\n if (isGetTableDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]) {\n executeResponse = adjustDataColumns(executeResponse, parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]);\n }\n return executeResponse;\n}\nexports.UpgradeDataTableRowsAndColumns = UpgradeDataTableRowsAndColumns;\nfunction isGetSummaryDataVerb(verb) {\n return verb === JsApiInternalContract_1.VerbId.GetDataSummaryData;\n}\nfunction isGetTableDataVerb(verb) {\n return (verb === JsApiInternalContract_1.VerbId.GetDataSummaryData ||\n verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData ||\n verb === JsApiInternalContract_1.VerbId.GetLogicalTableData ||\n verb === JsApiInternalContract_1.VerbId.GetDataSourceData ||\n verb === JsApiInternalContract_1.VerbId.GetUnderlyingData);\n}\nfunction adjustDataRowLength(executeResponse, maxRows) {\n var underlyingDataTable = executeResponse.result;\n if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable)) {\n return executeResponse;\n }\n if (maxRows > 0 && maxRows < underlyingDataTable.data.dataTable.length) {\n underlyingDataTable.data.dataTable.length = maxRows;\n }\n return executeResponse;\n}\nfunction adjustDataColumns(executeResponse, columnsToInclude) {\n if (columnsToInclude.length === 0) {\n return executeResponse;\n }\n // verify that we have a valid UnderlyingDataTable\n var underlyingDataTable = executeResponse.result;\n if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable) || !Array.isArray(underlyingDataTable.data.headers)) {\n return executeResponse;\n }\n // 1. filter the headers to only columnsToInclude\n // 2. use the new headers to filter all rows\n // 3. update the indices in our new headers\n var newHeaders = underlyingDataTable.data.headers.filter(function (header, index) {\n return columnsToInclude.find(function (name) { return name === header.fieldName; });\n });\n underlyingDataTable.data.dataTable.forEach(function (row, index) {\n underlyingDataTable.data.dataTable[index] = row.filter(function (value, valueIndex) { return newHeaders.findIndex(function (header) { return header.index === valueIndex; }) !== -1; });\n });\n var newIndex = 0;\n underlyingDataTable.data.headers = newHeaders.map(function (header) {\n header.index = newIndex++;\n return header;\n });\n return executeResponse;\n}\n//# sourceMappingURL=ExternalVersionTranslations.js.map","\"use strict\";\n// Export everything which had been previously in the api-shared module\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ApiVersion_1 = require(\"./ApiShared/ApiVersion\");\nexports.ApiVersion = ApiVersion_1.ApiVersion;\n__export(require(\"./ApiShared/CrossFrame/CrossFrameBootstrap\"));\nvar CrossFrameDispatcher_1 = require(\"./ApiShared/CrossFrame/CrossFrameDispatcher\");\nexports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher;\nvar DataSource_1 = require(\"./ApiShared/DataSource\");\nexports.DataSource = DataSource_1.DataSource;\nvar ExternalToInternalEnumMappings_1 = require(\"./ApiShared/EnumMappings/ExternalToInternalEnumMappings\");\nexports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings;\nvar InternalToExternalEnumMappings_1 = require(\"./ApiShared/EnumMappings/InternalToExternalEnumMappings\");\nexports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings;\nvar EventListenerManager_1 = require(\"./ApiShared/EventListenerManager\");\nexports.EventListenerManager = EventListenerManager_1.EventListenerManager;\nvar Field_1 = require(\"./ApiShared/Field\");\nexports.Field = Field_1.Field;\nvar CustomViewImpl_1 = require(\"./ApiShared/Impl/CustomViewImpl\");\nexports.CustomViewImpl = CustomViewImpl_1.CustomViewImpl;\nvar DashboardImpl_1 = require(\"./ApiShared/Impl/DashboardImpl\");\nexports.DashboardImpl = DashboardImpl_1.DashboardImpl;\nvar DashboardObjectImpl_1 = require(\"./ApiShared/Impl/DashboardObjectImpl\");\nexports.DashboardObjectImpl = DashboardObjectImpl_1.DashboardObjectImpl;\nvar DataSourceImpl_1 = require(\"./ApiShared/Impl/DataSourceImpl\");\nexports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl;\nvar ParameterImpl_1 = require(\"./ApiShared/Impl/ParameterImpl\");\nexports.ParameterImpl = ParameterImpl_1.ParameterImpl;\nvar SheetImpl_1 = require(\"./ApiShared/Impl/SheetImpl\");\nexports.SheetImpl = SheetImpl_1.SheetImpl;\nvar SheetInfoImpl_1 = require(\"./ApiShared/Impl/SheetInfoImpl\");\nexports.SheetInfoImpl = SheetInfoImpl_1.SheetInfoImpl;\nvar SingleEventManagerImpl_1 = require(\"./ApiShared/Impl/SingleEventManagerImpl\");\nexports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl;\nvar StoryImpl_1 = require(\"./ApiShared/Impl/StoryImpl\");\nexports.StoryImpl = StoryImpl_1.StoryImpl;\nvar StoryPointImpl_1 = require(\"./ApiShared/Impl/StoryPointImpl\");\nexports.StoryPointImpl = StoryPointImpl_1.StoryPointImpl;\nvar StoryPointInfoImpl_1 = require(\"./ApiShared/Impl/StoryPointInfoImpl\");\nexports.StoryPointInfoImpl = StoryPointInfoImpl_1.StoryPointInfoImpl;\nvar WorkbookImpl_1 = require(\"./ApiShared/Impl/WorkbookImpl\");\nexports.WorkbookImpl = WorkbookImpl_1.WorkbookImpl;\nvar WorksheetImpl_1 = require(\"./ApiShared/Impl/WorksheetImpl\");\nexports.WorksheetImpl = WorksheetImpl_1.WorksheetImpl;\nvar Point_1 = require(\"./ApiShared/Point\");\nexports.Point = Point_1.Point;\n__export(require(\"./ApiShared/Services/RegisterAllSharedServices\"));\n__export(require(\"./ApiShared/Services/ServiceRegistry\"));\nvar ClientInfoServiceImpl_1 = require(\"./ApiShared/Services/impl/ClientInfoServiceImpl\");\nexports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl;\nvar NotificationServiceImpl_1 = require(\"./ApiShared/Services/impl/NotificationServiceImpl\");\nexports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl;\nvar NotificationServiceImplBase_1 = require(\"./ApiShared/Services/impl/NotificationServiceImplBase\");\nexports.NotificationServiceImplBase = NotificationServiceImplBase_1.NotificationServiceImplBase;\nexports.Registration = NotificationServiceImplBase_1.Registration;\nvar ServiceImplBase_1 = require(\"./ApiShared/Services/impl/ServiceImplBase\");\nexports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase;\nvar SizeServiceImpl_1 = require(\"./ApiShared/Services/impl/SizeServiceImpl\");\nexports.SizeServiceImpl = SizeServiceImpl_1.SizeServiceImpl;\nvar StoryActivationServiceImpl_1 = require(\"./ApiShared/Services/impl/StoryActivationServiceImpl\");\nexports.StoryActivationServiceImpl = StoryActivationServiceImpl_1.StoryActivationServiceImpl;\nvar TableauError_1 = require(\"./ApiShared/TableauError\");\nexports.TableauError = TableauError_1.TableauError;\nvar Deferred_1 = require(\"./ApiShared/Utils/Deferred\");\nexports.Deferred = Deferred_1.Deferred;\nvar ErrorHelpers_1 = require(\"./ApiShared/Utils/ErrorHelpers\");\nexports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers;\nvar ExportHelpers_1 = require(\"./ApiShared/Utils/ExportHelpers\");\nexports.ExportHelpers = ExportHelpers_1.ExportHelpers;\nvar SheetUtils_1 = require(\"./ApiShared/Utils/SheetUtils\");\nexports.SheetUtils = SheetUtils_1.SheetUtils;\nvar VersionNumber_1 = require(\"./ApiShared/VersionNumber\");\nexports.VersionNumber = VersionNumber_1.VersionNumber;\nvar VersionedExternalApiDispatcher_1 = require(\"./VersionedExternalApiDispatcher\");\nexports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher;\n//# sourceMappingURL=ApiShared.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar VersionNumber_1 = require(\"./VersionNumber\");\n/**\n * This is the singleton wrapper of VersionNumber\n */\nvar ApiVersion = /** @class */ (function () {\n function ApiVersion() {\n }\n Object.defineProperty(ApiVersion, \"Instance\", {\n /**\n * Gets the singleton instance of the version number.\n */\n get: function () {\n return ApiVersion._instance;\n },\n enumerable: true,\n configurable: true\n });\n ApiVersion.SetVersionNumber = function (numString, isAlpha) {\n ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha);\n };\n return ApiVersion;\n}());\nexports.ApiVersion = ApiVersion;\n//# sourceMappingURL=ApiVersion.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a connection summary.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nvar ConnectionSummary = /** @class */ (function () {\n function ConnectionSummary(_connectionInfo) {\n this._connectionInfo = _connectionInfo;\n }\n Object.defineProperty(ConnectionSummary.prototype, \"name\", {\n get: function () {\n return this._connectionInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ConnectionSummary.prototype, \"id\", {\n get: function () {\n return this._connectionInfo.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ConnectionSummary.prototype, \"serverURI\", {\n get: function () {\n return this._connectionInfo.serverURI;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ConnectionSummary.prototype, \"type\", {\n get: function () {\n return this._connectionInfo.type;\n },\n enumerable: true,\n configurable: true\n });\n return ConnectionSummary;\n}());\nexports.ConnectionSummary = ConnectionSummary;\n//# sourceMappingURL=ConnectionSummary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar 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(function (resolve, reject) {\n var 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 var messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*');\n // Prepare to send an initialization message to the parent frame\n var 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 var dispatcherFactory = function () { return 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}\nexports.doCrossFrameBootstrap = doCrossFrameBootstrap;\n//# sourceMappingURL=CrossFrameBootstrap.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar 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 */\nvar CrossFrameDispatcher = /** @class */ (function () {\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 function CrossFrameDispatcher(_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 CrossFrameDispatcher.prototype.execute = function (verb, parameters) {\n var _this = this;\n // To execute a verb, we first prepare a command message and then define a promise.\n var preparedMessage = this._messenger.prepareCommandMessage(verb, parameters);\n var promise = new Promise(function (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 CrossFrameDispatcher.prototype.registerNotificationHandler = function (handler) {\n this._notificationHandlers.push(handler);\n };\n CrossFrameDispatcher.prototype.unregisterNotificationHandler = function (handler) {\n this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; });\n };\n ////// End InternalApiDispatcher implementation\n CrossFrameDispatcher.prototype.onCommandResponse = function (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 var 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 CrossFrameDispatcher.prototype.onNotification = function (notificationMessage) {\n // Go through each notification handler we have registered and let them know a notification came in\n for (var _i = 0, _a = this._notificationHandlers; _i < _a.length; _i++) {\n var handler = _a[_i];\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 return CrossFrameDispatcher;\n}());\nexports.CrossFrameDispatcher = CrossFrameDispatcher;\n//# sourceMappingURL=CrossFrameDispatcher.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar DataSource = /** @class */ (function () {\n function DataSource(_dataSourceImpl) {\n this._dataSourceImpl = _dataSourceImpl;\n }\n Object.defineProperty(DataSource.prototype, \"name\", {\n get: function () {\n return this._dataSourceImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"id\", {\n get: function () {\n return this._dataSourceImpl.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"fields\", {\n get: function () {\n return this._dataSourceImpl.fields;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"extractUpdateTime\", {\n get: function () {\n return this._dataSourceImpl.extractUpdateTime;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"isExtract\", {\n get: function () {\n return this._dataSourceImpl.isExtract;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"isPublished\", {\n get: function () {\n return this._dataSourceImpl.isPublished;\n },\n enumerable: true,\n configurable: true\n });\n DataSource.prototype.publishedUrl = function () {\n return this._dataSourceImpl.publishedUrl();\n };\n DataSource.prototype.refreshAsync = function () {\n return this._dataSourceImpl.refreshAsync();\n };\n DataSource.prototype.getActiveTablesAsync = function () {\n console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.');\n return this._dataSourceImpl.getActiveTablesAsync();\n };\n DataSource.prototype.getConnectionSummariesAsync = function () {\n return this._dataSourceImpl.getConnectionSummariesAsync();\n };\n DataSource.prototype.getUnderlyingDataAsync = function (options) {\n console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' +\n 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.');\n return this._dataSourceImpl.getUnderlyingDataAsync(options);\n };\n DataSource.prototype.getLogicalTablesAsync = function () {\n return this._dataSourceImpl.getLogicalTablesAsync();\n };\n DataSource.prototype.getLogicalTableDataAsync = function (logicalTableId, options) {\n return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options);\n };\n DataSource.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) {\n return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options);\n };\n return DataSource;\n}());\nexports.DataSource = DataSource;\n//# sourceMappingURL=DataSource.js.map","\"use strict\";\nvar _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar 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 */\nvar ExternalToInternalEnumMappings = /** @class */ (function () {\n function ExternalToInternalEnumMappings() {\n }\n ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter((_a = {},\n _a[api_external_contract_js_1.FilterDomainType.Relevant] = api_internal_contract_js_1.FilterDomainType.Relevant,\n _a[api_external_contract_js_1.FilterDomainType.Database] = api_internal_contract_js_1.FilterDomainType.Database,\n _a));\n ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter((_b = {},\n _b[api_external_contract_js_1.FilterNullOption.AllValues] = api_internal_contract_js_1.FilterNullOption.AllValues,\n _b[api_external_contract_js_1.FilterNullOption.NonNullValues] = api_internal_contract_js_1.FilterNullOption.NonNullValues,\n _b[api_external_contract_js_1.FilterNullOption.NullValues] = api_internal_contract_js_1.FilterNullOption.NullValues,\n _b));\n ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_c = {},\n _c[api_external_contract_js_1.FilterUpdateType.Add] = api_internal_contract_js_1.FilterUpdateType.Add,\n _c[api_external_contract_js_1.FilterUpdateType.All] = api_internal_contract_js_1.FilterUpdateType.All,\n _c[api_external_contract_js_1.FilterUpdateType.Remove] = api_internal_contract_js_1.FilterUpdateType.Remove,\n _c[api_external_contract_js_1.FilterUpdateType.Replace] = api_internal_contract_js_1.FilterUpdateType.Replace,\n _c));\n ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter((_d = {},\n _d[api_external_contract_js_1.ZoneVisibilityType.Show] = true,\n _d[api_external_contract_js_1.ZoneVisibilityType.Hide] = false,\n _d));\n ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter((_e = {},\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 _e[api_external_contract_js_1.ReplaySpeedType.Slow] = 2.0,\n _e[api_external_contract_js_1.ReplaySpeedType.Normal] = 1.0,\n _e[api_external_contract_js_1.ReplaySpeedType.Fast] = 0.5,\n _e));\n ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {},\n _f[api_external_contract_js_1.SheetType.Dashboard] = api_internal_contract_js_1.SheetType.Dashboard,\n _f[api_external_contract_js_1.SheetType.Worksheet] = api_internal_contract_js_1.SheetType.Worksheet,\n _f[api_external_contract_js_1.SheetType.Story] = api_internal_contract_js_1.SheetType.Story,\n _f));\n ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter((_g = {},\n _g[api_external_contract_js_1.IncludeDataValuesOption.AllValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues,\n _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,\n _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues] = api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly,\n _g));\n ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter((_h = {},\n _h[api_external_contract_js_1.PeriodType.Years] = api_internal_contract_js_1.DateStepPeriod.Years,\n _h[api_external_contract_js_1.PeriodType.Quarters] = api_internal_contract_js_1.DateStepPeriod.Quarters,\n _h[api_external_contract_js_1.PeriodType.Months] = api_internal_contract_js_1.DateStepPeriod.Months,\n _h[api_external_contract_js_1.PeriodType.Weeks] = api_internal_contract_js_1.DateStepPeriod.Weeks,\n _h[api_external_contract_js_1.PeriodType.Days] = api_internal_contract_js_1.DateStepPeriod.Days,\n _h[api_external_contract_js_1.PeriodType.Hours] = api_internal_contract_js_1.DateStepPeriod.Hours,\n _h[api_external_contract_js_1.PeriodType.Minutes] = api_internal_contract_js_1.DateStepPeriod.Minutes,\n _h[api_external_contract_js_1.PeriodType.Seconds] = api_internal_contract_js_1.DateStepPeriod.Seconds,\n _h));\n ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_j = {},\n _j[api_external_contract_js_1.DateRangeType.Last] = api_internal_contract_js_1.DateRangeType.Last,\n _j[api_external_contract_js_1.DateRangeType.LastN] = api_internal_contract_js_1.DateRangeType.LastN,\n _j[api_external_contract_js_1.DateRangeType.Next] = api_internal_contract_js_1.DateRangeType.Next,\n _j[api_external_contract_js_1.DateRangeType.NextN] = api_internal_contract_js_1.DateRangeType.NextN,\n _j[api_external_contract_js_1.DateRangeType.Current] = api_internal_contract_js_1.DateRangeType.Current,\n _j[api_external_contract_js_1.DateRangeType.ToDate] = api_internal_contract_js_1.DateRangeType.ToDate,\n _j));\n ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter((_k = {},\n _k[api_external_contract_js_1.DialogStyle.Window] = api_internal_contract_js_1.DialogStyle.Window,\n _k[api_external_contract_js_1.DialogStyle.Modal] = api_internal_contract_js_1.DialogStyle.Modal,\n _k[api_external_contract_js_1.DialogStyle.Modeless] = api_internal_contract_js_1.DialogStyle.Modeless,\n _k));\n return ExternalToInternalEnumMappings;\n}());\nexports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings;\n/* tslint:enable:typedef */\n//# sourceMappingURL=ExternalToInternalEnumMappings.js.map","\"use strict\";\nvar _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar 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 */\nvar InternalToExternalEnumMappings = /** @class */ (function () {\n function InternalToExternalEnumMappings() {\n }\n InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter((_a = {},\n _a[api_internal_contract_js_1.ExtensionContext.Desktop] = api_external_contract_js_1.ExtensionContext.Desktop,\n _a[api_internal_contract_js_1.ExtensionContext.Server] = api_external_contract_js_1.ExtensionContext.Server,\n _a));\n InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter((_b = {},\n _b[api_internal_contract_js_1.ExtensionMode.Authoring] = api_external_contract_js_1.ExtensionMode.Authoring,\n _b[api_internal_contract_js_1.ExtensionMode.Viewing] = api_external_contract_js_1.ExtensionMode.Viewing,\n _b));\n InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter((_c = {},\n _c[api_internal_contract_js_1.ColumnType.Continuous] = api_external_contract_js_1.ColumnType.Continuous,\n _c[api_internal_contract_js_1.ColumnType.Discrete] = api_external_contract_js_1.ColumnType.Discrete,\n _c));\n InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter((_d = {},\n _d[api_internal_contract_js_1.FieldAggregationType.Attr] = api_external_contract_js_1.FieldAggregationType.Attr,\n _d[api_internal_contract_js_1.FieldAggregationType.Avg] = api_external_contract_js_1.FieldAggregationType.Avg,\n _d[api_internal_contract_js_1.FieldAggregationType.Collect] = api_external_contract_js_1.FieldAggregationType.Collect,\n _d[api_internal_contract_js_1.FieldAggregationType.Count] = api_external_contract_js_1.FieldAggregationType.Count,\n _d[api_internal_contract_js_1.FieldAggregationType.Countd] = api_external_contract_js_1.FieldAggregationType.Countd,\n _d[api_internal_contract_js_1.FieldAggregationType.Day] = api_external_contract_js_1.FieldAggregationType.Day,\n _d[api_internal_contract_js_1.FieldAggregationType.End] = api_external_contract_js_1.FieldAggregationType.End,\n _d[api_internal_contract_js_1.FieldAggregationType.Hour] = api_external_contract_js_1.FieldAggregationType.Hour,\n _d[api_internal_contract_js_1.FieldAggregationType.InOut] = api_external_contract_js_1.FieldAggregationType.InOut,\n _d[api_internal_contract_js_1.FieldAggregationType.Kurtosis] = api_external_contract_js_1.FieldAggregationType.Kurtosis,\n _d[api_internal_contract_js_1.FieldAggregationType.Max] = api_external_contract_js_1.FieldAggregationType.Max,\n _d[api_internal_contract_js_1.FieldAggregationType.Mdy] = api_external_contract_js_1.FieldAggregationType.Mdy,\n _d[api_internal_contract_js_1.FieldAggregationType.Median] = api_external_contract_js_1.FieldAggregationType.Median,\n _d[api_internal_contract_js_1.FieldAggregationType.Min] = api_external_contract_js_1.FieldAggregationType.Min,\n _d[api_internal_contract_js_1.FieldAggregationType.Minute] = api_external_contract_js_1.FieldAggregationType.Minute,\n _d[api_internal_contract_js_1.FieldAggregationType.MonthYear] = api_external_contract_js_1.FieldAggregationType.MonthYear,\n _d[api_internal_contract_js_1.FieldAggregationType.None] = api_external_contract_js_1.FieldAggregationType.None,\n _d[api_internal_contract_js_1.FieldAggregationType.Qtr] = api_external_contract_js_1.FieldAggregationType.Qtr,\n _d[api_internal_contract_js_1.FieldAggregationType.Quart1] = api_external_contract_js_1.FieldAggregationType.Quart1,\n _d[api_internal_contract_js_1.FieldAggregationType.Quart3] = api_external_contract_js_1.FieldAggregationType.Quart3,\n _d[api_internal_contract_js_1.FieldAggregationType.Second] = api_external_contract_js_1.FieldAggregationType.Second,\n _d[api_internal_contract_js_1.FieldAggregationType.Skewness] = api_external_contract_js_1.FieldAggregationType.Skewness,\n _d[api_internal_contract_js_1.FieldAggregationType.Stdev] = api_external_contract_js_1.FieldAggregationType.Stdev,\n _d[api_internal_contract_js_1.FieldAggregationType.Stdevp] = api_external_contract_js_1.FieldAggregationType.Stdevp,\n _d[api_internal_contract_js_1.FieldAggregationType.Sum] = api_external_contract_js_1.FieldAggregationType.Sum,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncDay] = api_external_contract_js_1.FieldAggregationType.TruncDay,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncHour] = api_external_contract_js_1.FieldAggregationType.TruncHour,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncMinute] = api_external_contract_js_1.FieldAggregationType.TruncMinute,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncMonth] = api_external_contract_js_1.FieldAggregationType.TruncMonth,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncQtr] = api_external_contract_js_1.FieldAggregationType.TruncQtr,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncSecond] = api_external_contract_js_1.FieldAggregationType.TruncSecond,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncWeek] = api_external_contract_js_1.FieldAggregationType.TruncWeek,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncYear] = api_external_contract_js_1.FieldAggregationType.TruncYear,\n _d[api_internal_contract_js_1.FieldAggregationType.User] = api_external_contract_js_1.FieldAggregationType.User,\n _d[api_internal_contract_js_1.FieldAggregationType.Var] = api_external_contract_js_1.FieldAggregationType.Var,\n _d[api_internal_contract_js_1.FieldAggregationType.Varp] = api_external_contract_js_1.FieldAggregationType.Varp,\n _d[api_internal_contract_js_1.FieldAggregationType.Week] = api_external_contract_js_1.FieldAggregationType.Week,\n _d[api_internal_contract_js_1.FieldAggregationType.Weekday] = api_external_contract_js_1.FieldAggregationType.Weekday,\n _d[api_internal_contract_js_1.FieldAggregationType.Year] = api_external_contract_js_1.FieldAggregationType.Year,\n _d));\n InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter((_e = {},\n _e[api_internal_contract_js_1.FieldRoleType.Dimension] = api_external_contract_js_1.FieldRoleType.Dimension,\n _e[api_internal_contract_js_1.FieldRoleType.Measure] = api_external_contract_js_1.FieldRoleType.Measure,\n _e[api_internal_contract_js_1.FieldRoleType.Unknown] = api_external_contract_js_1.FieldRoleType.Unknown,\n _e));\n InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {},\n _f[api_internal_contract_js_1.SheetType.Dashboard] = api_external_contract_js_1.SheetType.Dashboard,\n _f[api_internal_contract_js_1.SheetType.Story] = api_external_contract_js_1.SheetType.Story,\n _f[api_internal_contract_js_1.SheetType.Worksheet] = api_external_contract_js_1.SheetType.Worksheet,\n _f));\n InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter((_g = {},\n _g[api_internal_contract_js_1.DashboardObjectType.Extension] = api_external_contract_js_1.DashboardObjectType.Extension,\n _g[api_internal_contract_js_1.DashboardObjectType.Blank] = api_external_contract_js_1.DashboardObjectType.Blank,\n _g[api_internal_contract_js_1.DashboardObjectType.Image] = api_external_contract_js_1.DashboardObjectType.Image,\n _g[api_internal_contract_js_1.DashboardObjectType.Legend] = api_external_contract_js_1.DashboardObjectType.Legend,\n _g[api_internal_contract_js_1.DashboardObjectType.PageFilter] = api_external_contract_js_1.DashboardObjectType.PageFilter,\n _g[api_internal_contract_js_1.DashboardObjectType.ParameterControl] = api_external_contract_js_1.DashboardObjectType.ParameterControl,\n _g[api_internal_contract_js_1.DashboardObjectType.QuickFilter] = api_external_contract_js_1.DashboardObjectType.QuickFilter,\n _g[api_internal_contract_js_1.DashboardObjectType.Text] = api_external_contract_js_1.DashboardObjectType.Text,\n _g[api_internal_contract_js_1.DashboardObjectType.Title] = api_external_contract_js_1.DashboardObjectType.Title,\n _g[api_internal_contract_js_1.DashboardObjectType.WebPage] = api_external_contract_js_1.DashboardObjectType.WebPage,\n _g[api_internal_contract_js_1.DashboardObjectType.Worksheet] = api_external_contract_js_1.DashboardObjectType.Worksheet,\n _g));\n InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter((_h = {},\n _h[api_internal_contract_js_1.DataType.Bool] = api_external_contract_js_1.DataType.Bool,\n _h[api_internal_contract_js_1.DataType.Date] = api_external_contract_js_1.DataType.Date,\n _h[api_internal_contract_js_1.DataType.DateTime] = api_external_contract_js_1.DataType.DateTime,\n _h[api_internal_contract_js_1.DataType.Float] = api_external_contract_js_1.DataType.Float,\n _h[api_internal_contract_js_1.DataType.Int] = api_external_contract_js_1.DataType.Int,\n _h[api_internal_contract_js_1.DataType.String] = api_external_contract_js_1.DataType.String,\n _h));\n InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_j = {},\n _j[api_internal_contract_js_1.FilterUpdateType.Add] = api_external_contract_js_1.FilterUpdateType.Add,\n _j[api_internal_contract_js_1.FilterUpdateType.All] = api_external_contract_js_1.FilterUpdateType.All,\n _j[api_internal_contract_js_1.FilterUpdateType.Remove] = api_external_contract_js_1.FilterUpdateType.Remove,\n _j[api_internal_contract_js_1.FilterUpdateType.Replace] = api_external_contract_js_1.FilterUpdateType.Replace,\n _j));\n InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter((_k = {},\n _k[api_internal_contract_js_1.DomainRestrictionType.All] = api_external_contract_js_1.ParameterValueType.All,\n _k[api_internal_contract_js_1.DomainRestrictionType.List] = api_external_contract_js_1.ParameterValueType.List,\n _k[api_internal_contract_js_1.DomainRestrictionType.Range] = api_external_contract_js_1.ParameterValueType.Range,\n _k));\n InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter((_l = {},\n _l[api_internal_contract_js_1.DateStepPeriod.Years] = api_external_contract_js_1.PeriodType.Years,\n _l[api_internal_contract_js_1.DateStepPeriod.Quarters] = api_external_contract_js_1.PeriodType.Quarters,\n _l[api_internal_contract_js_1.DateStepPeriod.Months] = api_external_contract_js_1.PeriodType.Months,\n _l[api_internal_contract_js_1.DateStepPeriod.Weeks] = api_external_contract_js_1.PeriodType.Weeks,\n _l[api_internal_contract_js_1.DateStepPeriod.Days] = api_external_contract_js_1.PeriodType.Days,\n _l[api_internal_contract_js_1.DateStepPeriod.Hours] = api_external_contract_js_1.PeriodType.Hours,\n _l[api_internal_contract_js_1.DateStepPeriod.Minutes] = api_external_contract_js_1.PeriodType.Minutes,\n _l[api_internal_contract_js_1.DateStepPeriod.Seconds] = api_external_contract_js_1.PeriodType.Seconds,\n _l));\n InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_m = {},\n _m[api_internal_contract_js_1.DateRangeType.Current] = api_external_contract_js_1.DateRangeType.Current,\n _m[api_internal_contract_js_1.DateRangeType.Last] = api_external_contract_js_1.DateRangeType.Last,\n _m[api_internal_contract_js_1.DateRangeType.LastN] = api_external_contract_js_1.DateRangeType.LastN,\n _m[api_internal_contract_js_1.DateRangeType.Next] = api_external_contract_js_1.DateRangeType.Next,\n _m[api_internal_contract_js_1.DateRangeType.NextN] = api_external_contract_js_1.DateRangeType.NextN,\n _m[api_internal_contract_js_1.DateRangeType.ToDate] = api_external_contract_js_1.DateRangeType.ToDate,\n _m));\n InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter((_o = {},\n _o[api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED] = api_external_contract_js_1.ErrorCodes.APINotInitialized,\n _o[api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR] = api_external_contract_js_1.ErrorCodes.VisibilityError,\n _o), api_external_contract_js_1.ErrorCodes.InternalError);\n InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter((_p = {},\n _p[api_internal_contract_js_1.FilterType.Categorical] = api_external_contract_js_1.FilterType.Categorical,\n _p[api_internal_contract_js_1.FilterType.Range] = api_external_contract_js_1.FilterType.Range,\n _p[api_internal_contract_js_1.FilterType.RelativeDate] = api_external_contract_js_1.FilterType.RelativeDate,\n _p[api_internal_contract_js_1.FilterType.Hierarchical] = api_external_contract_js_1.FilterType.Hierarchical,\n _p));\n InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter((_q = {},\n _q[\"tableau-dashboard-title\" /* DashboardTitle */] = api_external_contract_js_1.ClassNameKey.DashboardTitle,\n _q[\"tableau-story-title\" /* StoryTitle */] = api_external_contract_js_1.ClassNameKey.StoryTitle,\n _q[\"tableau-tooltip\" /* Tooltip */] = api_external_contract_js_1.ClassNameKey.Tooltip,\n _q[\"tableau-worksheet\" /* Worksheet */] = api_external_contract_js_1.ClassNameKey.Worksheet,\n _q[\"tableau-worksheet-title\" /* WorksheetTitle */] = api_external_contract_js_1.ClassNameKey.WorksheetTitle,\n // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed\n _q['dashboard-title'] = api_external_contract_js_1.ClassNameKey.DashboardTitle,\n _q['story-title'] = api_external_contract_js_1.ClassNameKey.StoryTitle,\n _q['tooltip'] = api_external_contract_js_1.ClassNameKey.Tooltip,\n _q['worksheet'] = api_external_contract_js_1.ClassNameKey.Worksheet,\n _q['worksheet-title'] = api_external_contract_js_1.ClassNameKey.WorksheetTitle,\n _q));\n InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter((_r = {},\n _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected,\n _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected,\n _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected,\n _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected,\n _r));\n InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter((_s = {},\n _s[api_internal_contract_js_1.AnnotateEnum.Area] = api_external_contract_js_1.AnnotationType.Area,\n _s[api_internal_contract_js_1.AnnotateEnum.Mark] = api_external_contract_js_1.AnnotationType.Mark,\n _s[api_internal_contract_js_1.AnnotateEnum.Point] = api_external_contract_js_1.AnnotationType.Point,\n _s));\n InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter((_t = {},\n _t[api_internal_contract_js_1.MarkType.Area] = api_external_contract_js_1.MarkType.Area,\n _t[api_internal_contract_js_1.MarkType.Bar] = api_external_contract_js_1.MarkType.Bar,\n _t[api_internal_contract_js_1.MarkType.Circle] = api_external_contract_js_1.MarkType.Circle,\n _t[api_internal_contract_js_1.MarkType.GanttBar] = api_external_contract_js_1.MarkType.GanttBar,\n _t[api_internal_contract_js_1.MarkType.Heatmap] = api_external_contract_js_1.MarkType.Heatmap,\n _t[api_internal_contract_js_1.MarkType.Line] = api_external_contract_js_1.MarkType.Line,\n _t[api_internal_contract_js_1.MarkType.Map] = api_external_contract_js_1.MarkType.Map,\n _t[api_internal_contract_js_1.MarkType.Pie] = api_external_contract_js_1.MarkType.Pie,\n _t[api_internal_contract_js_1.MarkType.Polygon] = api_external_contract_js_1.MarkType.Polygon,\n _t[api_internal_contract_js_1.MarkType.Shape] = api_external_contract_js_1.MarkType.Shape,\n _t[api_internal_contract_js_1.MarkType.Square] = api_external_contract_js_1.MarkType.Square,\n _t[api_internal_contract_js_1.MarkType.Text] = api_external_contract_js_1.MarkType.Text,\n _t[api_internal_contract_js_1.MarkType.VizExtension] = api_external_contract_js_1.MarkType.VizExtension,\n _t));\n return InternalToExternalEnumMappings;\n}());\nexports.InternalToExternalEnumMappings = InternalToExternalEnumMappings;\n/* tslint:enable:typedef */\n//# sourceMappingURL=InternalToExternalEnumMappings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar 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 */\nvar EventListenerManager = /** @class */ (function () {\n function EventListenerManager() {\n this._eventListenerManagers = {};\n }\n EventListenerManager.prototype.addEventListener = function (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 EventListenerManager.prototype.removeEventListener = function (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 EventListenerManager.prototype.addNewEventType = function (eventManager) {\n this._eventListenerManagers[eventManager.eventType] = eventManager;\n };\n return EventListenerManager;\n}());\nexports.EventListenerManager = EventListenerManager;\n//# sourceMappingURL=EventListenerManager.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ErrorHelpers_1 = require(\"./Utils/ErrorHelpers\");\nvar Field = /** @class */ (function () {\n function Field(_fieldImpl) {\n this._fieldImpl = _fieldImpl;\n }\n Object.defineProperty(Field.prototype, \"name\", {\n get: function () {\n return this._fieldImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"id\", {\n get: function () {\n return this._fieldImpl.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"description\", {\n get: function () {\n return this._fieldImpl.description;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"dataType\", {\n get: function () {\n return this._fieldImpl.dataType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"aggregation\", {\n get: function () {\n return this._fieldImpl.aggregation;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"dataSource\", {\n get: function () {\n return this._fieldImpl.dataSource;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"role\", {\n get: function () {\n return this._fieldImpl.role;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isHidden\", {\n get: function () {\n return this._fieldImpl.isHidden;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isGenerated\", {\n get: function () {\n return this._fieldImpl.isGenerated;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isCalculatedField\", {\n get: function () {\n return this._fieldImpl.isCalculatedField;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"columnType\", {\n get: function () {\n throw ErrorHelpers_1.ErrorHelpers.apiNotImplemented('Field.columnType');\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isCombinedField\", {\n get: function () {\n return this._fieldImpl.isCombinedField;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isPresentOnPublishedDatasource\", {\n get: function () {\n return this._fieldImpl.isPresentOnPublishedDatasource;\n },\n enumerable: true,\n configurable: true\n });\n return Field;\n}());\nexports.Field = Field;\n//# sourceMappingURL=Field.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ApiShared_1 = require(\"../../ApiShared\");\nvar CustomViewImpl = /** @class */ (function () {\n function CustomViewImpl(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 Object.defineProperty(CustomViewImpl.prototype, \"luid\", {\n get: function () {\n return this._luid;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n set: function (name) {\n this._name = name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"shared\", {\n get: function () {\n return this._shared;\n },\n set: function (shared) {\n this._shared = shared;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"isDefault\", {\n get: function () {\n return this._isDefault;\n },\n set: function (isDefault) {\n this._isDefault = isDefault;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"ownerName\", {\n get: function () {\n return this._ownerName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"url\", {\n get: function () {\n return this._url;\n },\n enumerable: true,\n configurable: true\n });\n CustomViewImpl.prototype.saveAsync = function () {\n var service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService(\"viz-service\" /* Viz */);\n return service.saveAsync(this);\n };\n return CustomViewImpl;\n}());\nexports.CustomViewImpl = CustomViewImpl;\n//# sourceMappingURL=CustomViewImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nvar Point_1 = require(\"../Point\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar DashboardObjectImpl_1 = require(\"./DashboardObjectImpl\");\nvar SheetImpl_1 = require(\"./SheetImpl\");\nvar SheetInfoImpl_1 = require(\"./SheetInfoImpl\");\nvar WorksheetImpl_1 = require(\"./WorksheetImpl\");\nvar DashboardImpl = /** @class */ (function (_super) {\n __extends(DashboardImpl, _super);\n function DashboardImpl(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId) {\n if (_activeDashboardObjectId === void 0) { _activeDashboardObjectId = 0; }\n var _this = _super.call(this, _sheetInfo, _registryId) || this;\n _this._zones = _zones;\n _this._sheetPath = _sheetPath;\n _this._parentStoryPointImpl = _parentStoryPointImpl;\n _this._activeDashboardObjectId = _activeDashboardObjectId;\n return _this;\n }\n Object.defineProperty(DashboardImpl.prototype, \"worksheetsImpl\", {\n get: function () {\n return this._worksheetsImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardImpl.prototype, \"objects\", {\n get: function () {\n return this._objects;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardImpl.prototype, \"parentStoryPoint\", {\n get: function () {\n return this._parentStoryPointImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardImpl.prototype, \"activeDashboardObjectId\", {\n get: function () {\n return this._activeDashboardObjectId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardImpl.prototype, \"activeDashboardName\", {\n get: function () {\n return this._sheetPath.sheetName;\n },\n enumerable: true,\n configurable: true\n });\n DashboardImpl.prototype.initializeWithPublicInterfaces = function () {\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 (var _i = 0, _a = this._zones; _i < _a.length; _i++) {\n var zone = _a[_i];\n var worksheetImpl = undefined;\n var zoneSize = { width: zone.width, height: zone.height };\n // As the dashboard is active, all other zones in the dashboard are inactive.\n var isActive = false;\n if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) {\n var worksheetName = '';\n var worksheetUrl = '';\n var 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 var sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl);\n var 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 this._worksheetsImpl.push(worksheetImpl);\n }\n var zonePoint = new Point_1.Point(zone.x, zone.y);\n var dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false\n zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true\n zone.zoneId);\n this._objects.push(dashboardObjectImpl);\n this.zoneMap.set(zone.zoneId, dashboardObjectImpl);\n }\n };\n DashboardImpl.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) {\n var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"zone-service\" /* Zone */);\n return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap);\n };\n DashboardImpl.prototype.getDashboardObjectById = function (dashboardObjectId) {\n return this.zoneMap.get(dashboardObjectId);\n };\n DashboardImpl.prototype.updateZones = function (newZones, newActiveZoneId, newActiveDashboardName) {\n var _this = this;\n if (newActiveZoneId === void 0) { newActiveZoneId = 0; }\n if (newActiveDashboardName === void 0) { newActiveDashboardName = ''; }\n // getting previous dashboard objects, active zone ID and active dashboard name\n var oldDashboardObjects = this._objects;\n var oldZoneMap = this.zoneMap;\n var oldActiveZoneId = this._activeDashboardObjectId;\n var 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 var newDashboardObjects = this._objects;\n var newZoneMap = this.zoneMap;\n // initializing map for changes\n var zoneChanges = new Map();\n // comparing old dashboard objects with new ones\n oldDashboardObjects.forEach(function (oldObject) {\n var 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 var 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(function (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 DashboardImpl.prototype.addChange = function (zoneId, zoneChanges, change) {\n if (!zoneChanges.has(zoneId)) {\n zoneChanges.set(zoneId, []);\n }\n zoneChanges.get(zoneId).push(change);\n };\n DashboardImpl.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) {\n var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"zone-service\" /* Zone */);\n return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray);\n };\n DashboardImpl.prototype.replayAnimationAsync = function (replaySpeed) {\n var animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"animation-service\" /* Animation */);\n return animationService.replayAsync(replaySpeed);\n };\n DashboardImpl.prototype.getFiltersAsync = function () {\n this.verifyActiveSheetOrEmbeddedInActiveStoryPoint();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getDashboardFiltersAsync();\n };\n DashboardImpl.prototype.applyFilterAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* 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 DashboardImpl.prototype.getWorksheetNamesFromZones = function () {\n var worksheetNames = [];\n for (var _i = 0, _a = this._zones; _i < _a.length; _i++) {\n var zone = _a[_i];\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 var worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name;\n worksheetNames.push(worksheetName);\n }\n return worksheetNames;\n };\n DashboardImpl.prototype.verifyActiveSheetOrEmbeddedInActiveStoryPoint = function () {\n var isRootAndActiveDashboard = this.active;\n var 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 return DashboardImpl;\n}(SheetImpl_1.SheetImpl));\nexports.DashboardImpl = DashboardImpl;\n//# sourceMappingURL=DashboardImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar DashboardObjectImpl = /** @class */ (function () {\n function DashboardObjectImpl(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id) {\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 }\n Object.defineProperty(DashboardObjectImpl.prototype, \"dashboardImpl\", {\n get: function () {\n return this._dashboardImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"type\", {\n get: function () {\n return this._type;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"position\", {\n get: function () {\n return this._position;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"size\", {\n get: function () {\n return this._size;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"worksheetImpl\", {\n get: function () {\n return this._worksheetImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"isFloating\", {\n get: function () {\n return this._isFloating;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"isVisible\", {\n get: function () {\n return this._isVisible;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"id\", {\n get: function () {\n return this._id;\n },\n enumerable: true,\n configurable: true\n });\n return DashboardObjectImpl;\n}());\nexports.DashboardObjectImpl = DashboardObjectImpl;\n//# sourceMappingURL=DashboardObjectImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar ConnectionSummary_1 = require(\"../ConnectionSummary\");\nvar Field_1 = require(\"../Field\");\nvar LogicalTable_1 = require(\"../LogicalTable\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableSummary_1 = require(\"../TableSummary\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar FieldImpl_1 = require(\"./FieldImpl\");\nvar DataSourceImpl = /** @class */ (function () {\n function DataSourceImpl(_dataSourceInfo, _registryId) {\n var _this = this;\n this._dataSourceInfo = _dataSourceInfo;\n this._registryId = _registryId;\n this._fields = _dataSourceInfo.fields.map(function (fieldModel) {\n var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, _this);\n return new Field_1.Field(fieldImpl);\n });\n }\n Object.defineProperty(DataSourceImpl.prototype, \"name\", {\n get: function () {\n return this._dataSourceInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"id\", {\n get: function () {\n return this._dataSourceInfo.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"extractUpdateTime\", {\n get: function () {\n return this._dataSourceInfo.extractUpdateTime;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"fields\", {\n get: function () {\n return this._fields;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"isExtract\", {\n get: function () {\n return this._dataSourceInfo.isExtract;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"isPublished\", {\n get: function () {\n return this._dataSourceInfo.isPublished;\n },\n enumerable: true,\n configurable: true\n });\n DataSourceImpl.prototype.publishedUrl = function () {\n return this._dataSourceInfo.publishedUrl;\n };\n DataSourceImpl.prototype.getMaxPageRowLimit = function () {\n return 10000;\n };\n DataSourceImpl.prototype.refreshAsync = function () {\n var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.refreshAsync(this._dataSourceInfo.id);\n };\n DataSourceImpl.prototype.getConnectionSummariesAsync = function () {\n var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then(function (summaries) {\n return summaries.map(function (summary) { return new ConnectionSummary_1.ConnectionSummary(summary); });\n });\n };\n DataSourceImpl.prototype.getActiveTablesAsync = function () {\n var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then(function (tableInfos) {\n return tableInfos.map(function (tableInfo) { return new TableSummary_1.TableSummary(tableInfo); });\n });\n };\n DataSourceImpl.prototype.getUnderlyingDataAsync = function (options) {\n var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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 DataSourceImpl.prototype.getLogicalTableDataAsync = function (logicalTableId, options) {\n var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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 DataSourceImpl.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) {\n var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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 DataSourceImpl.prototype.initializeWithPublicInterfaces = function (dataSource) {\n ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource');\n this._fields = this._dataSourceInfo.fields.map(function (fieldModel) {\n var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource);\n return new Field_1.Field(fieldImpl);\n });\n };\n DataSourceImpl.prototype.getLogicalTablesAsync = function () {\n var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getLogicalTablesAsync(this.id).then(function (logicalTableInfos) {\n return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); });\n });\n };\n return DataSourceImpl;\n}());\nexports.DataSourceImpl = DataSourceImpl;\n//# sourceMappingURL=DataSourceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nvar FieldImpl = /** @class */ (function () {\n function FieldImpl(_fieldInfo, _parentDataSource) {\n this._fieldInfo = _fieldInfo;\n this._parentDataSource = _parentDataSource;\n }\n Object.defineProperty(FieldImpl.prototype, \"name\", {\n get: function () {\n return this._fieldInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"id\", {\n get: function () {\n return this._fieldInfo.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"description\", {\n get: function () {\n return this._fieldInfo.description;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"dataType\", {\n get: function () {\n var _a;\n return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : api_external_contract_js_1.DataType.Unknown);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"aggregation\", {\n get: function () {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"dataSource\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"role\", {\n get: function () {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isHidden\", {\n get: function () {\n return this._fieldInfo.isHidden;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isGenerated\", {\n get: function () {\n return this._fieldInfo.isGenerated;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isCalculatedField\", {\n get: function () {\n return this._fieldInfo.isCalculatedField;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isCombinedField\", {\n get: function () {\n return this._fieldInfo.isCombinedField;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isPresentOnPublishedDatasource\", {\n get: function () {\n return this._fieldInfo.isPresentOnPublishedDatasource;\n },\n enumerable: true,\n configurable: true\n });\n return FieldImpl;\n}());\nexports.FieldImpl = FieldImpl;\n//# sourceMappingURL=FieldImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar DataValueFactory_1 = require(\"../Utils/DataValueFactory\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar Param_1 = require(\"../Utils/Param\");\nvar ParameterImpl = /** @class */ (function () {\n function ParameterImpl(parameterInfo, _registryId) {\n this._registryId = _registryId;\n this.setParameterInfo(parameterInfo);\n }\n Object.defineProperty(ParameterImpl.prototype, \"name\", {\n get: function () {\n return this._parameterInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ParameterImpl.prototype, \"currentValue\", {\n get: function () {\n return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ParameterImpl.prototype, \"dataType\", {\n get: function () {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ParameterImpl.prototype, \"id\", {\n get: function () {\n return this._globalFieldName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ParameterImpl.prototype, \"allowableValues\", {\n get: function () {\n return this._allowableValues;\n },\n enumerable: true,\n configurable: true\n });\n ParameterImpl.prototype.changeValueAsync = function (newValue) {\n var _this = this;\n ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue');\n var coercedValue = Param_1.Param.serializeParameterValue(newValue);\n var parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then(function (parameterInfo) {\n _this.setParameterInfo(parameterInfo);\n return _this.currentValue;\n });\n };\n ParameterImpl.prototype.setParameterInfo = function (parameterInfo) {\n this._parameterInfo = parameterInfo;\n this._globalFieldName = parameterInfo.fieldName;\n var type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType);\n var listValues;\n var minValue;\n var maxValue;\n var stepSize;\n var dateStepPeriod;\n if (type === api_external_contract_js_1.ParameterValueType.List) {\n var values = parameterInfo.allowableValues || [];\n listValues = values.map(function (val) { return 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 return ParameterImpl;\n}());\nexports.ParameterImpl = ParameterImpl;\n//# sourceMappingURL=ParameterImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar Param_1 = require(\"../Utils/Param\");\nvar SheetUtils_1 = require(\"../Utils/SheetUtils\");\nvar SheetImpl = /** @class */ (function () {\n function SheetImpl(_sheetInfoImpl, _registryId) {\n this._sheetInfoImpl = _sheetInfoImpl;\n this._registryId = _registryId;\n }\n Object.defineProperty(SheetImpl.prototype, \"name\", {\n get: function () {\n return this._sheetInfoImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"sheetType\", {\n get: function () {\n return this._sheetInfoImpl.sheetType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"sheetPath\", {\n get: function () {\n return this._sheetInfoImpl.sheetPath;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"size\", {\n get: function () {\n return this._sheetInfoImpl.sheetSize;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"hidden\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"active\", {\n get: function () {\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: function (active) {\n if (this._sheetInfoImpl.isActive !== undefined) {\n this._sheetInfoImpl.active = active;\n }\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"index\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"url\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n SheetImpl.prototype.getSheetSize = function () {\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 SheetImpl.prototype.findParameterAsync = function (parameterName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName');\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return service.findParameterByNameAsync(parameterName);\n };\n SheetImpl.prototype.getParametersAsync = function () {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return service.getParametersForSheetAsync(this.sheetPath);\n };\n SheetImpl.prototype.changeSizeAsync = function (newSize) {\n var _this = this;\n var invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter');\n if (!newSize || !newSize.behavior) {\n throw invalidSizeError;\n }\n var partialSheetSize = this.normalizeSheetSize(newSize);\n var 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 var processedNewSize = this.processNewSize(partialSheetSize);\n var sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"size-service\" /* Size */);\n return sizeService.changeSizeAsync(this.name, processedNewSize).then(function () {\n var clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(_this._registryId).getService(\"client-info-service\" /* ClientInfo */);\n return clientInfoService.getClientInfoAsync().then(function (bootstrapInfo) {\n var sheet = bootstrapInfo.publishedSheets.find(function (s) { return 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 var sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint);\n _this._sheetInfoImpl.sheetSize = sheetSize;\n return sheetSize;\n });\n });\n };\n SheetImpl.prototype.normalizeSheetSize = function (newSize) {\n var behavior = newSize.behavior;\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior');\n var minSize = SheetImpl.parseDimensions(newSize.minSize);\n var maxSize = SheetImpl.parseDimensions(newSize.maxSize);\n return { behavior: behavior, minSize: minSize, maxSize: maxSize };\n };\n SheetImpl.prototype.processNewSize = function (newSize) {\n var _a, _b, _c, _d;\n var behavior = newSize.behavior, minSizeMaybe = newSize.minSize, maxSizeMaybe = newSize.maxSize;\n var hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width);\n var hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height);\n var hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width);\n var hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height);\n var hasValidMinSize = hasMinWidth && hasMinHeight;\n var hasValidMaxSize = hasMaxWidth && hasMaxHeight;\n switch (behavior) {\n case Contract.SheetSizeBehavior.Automatic: {\n return { behavior: 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 var 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: behavior, maxSize: 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 var 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: behavior, minSize: 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 var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n var 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: behavior, minSize: minSize, maxSize: maxSize };\n }\n case Contract.SheetSizeBehavior.Exactly: {\n if (minSizeMaybe && maxSizeMaybe) {\n if (hasValidMinSize && hasValidMaxSize) {\n var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n var 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: behavior, minSize: minSize, maxSize: maxSize };\n }\n if (hasValidMinSize) {\n var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n return { behavior: behavior, minSize: minSize, maxSize: minSize };\n }\n if (hasValidMaxSize) {\n var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n return { behavior: behavior, minSize: maxSize, 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 SheetImpl.parseDimensions = function (size) {\n var empty = { width: undefined, height: undefined };\n if (!size) {\n return empty;\n }\n var _a = Param_1.Param.tryParseNumber(size.width), widthParsed = _a.success, parsedWidth = _a.parsed;\n var _b = Param_1.Param.tryParseNumber(size.height), heightParsed = _b.success, parsedHeight = _b.parsed;\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 return SheetImpl;\n}());\nexports.SheetImpl = SheetImpl;\n//# sourceMappingURL=SheetImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar SheetInfoImpl = /** @class */ (function () {\n function SheetInfoImpl(_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 Object.defineProperty(SheetInfoImpl.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n set: function (sheetName) {\n this._name = sheetName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"sheetSize\", {\n get: function () {\n return this._sheetSize;\n },\n set: function (value) {\n this._sheetSize = value;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"sheetType\", {\n get: function () {\n return this._sheetType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"sheetPath\", {\n get: function () {\n return {\n sheetName: this.name,\n isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard,\n };\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"index\", {\n get: function () {\n return this._index;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"isActive\", {\n get: function () {\n return this._isActive;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"active\", {\n set: function (active) {\n this._isActive = active;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"isHidden\", {\n get: function () {\n return this._isHidden;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"url\", {\n get: function () {\n return this._url;\n },\n enumerable: true,\n configurable: true\n });\n return SheetInfoImpl;\n}());\nexports.SheetInfoImpl = SheetInfoImpl;\n//# sourceMappingURL=SheetInfoImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar SingleEventManagerImpl = /** @class */ (function () {\n function SingleEventManagerImpl(eventType) {\n this._eventType = eventType;\n this._handlers = [];\n }\n Object.defineProperty(SingleEventManagerImpl.prototype, \"eventType\", {\n get: function () {\n return this._eventType;\n },\n enumerable: true,\n configurable: true\n });\n SingleEventManagerImpl.prototype.addEventListener = function (handler) {\n var _this = this;\n this._handlers.push(handler);\n return function () { return _this.removeEventListener(handler); };\n };\n SingleEventManagerImpl.prototype.removeEventListener = function (handler) {\n var beforeCount = this._handlers.length;\n this._handlers = this._handlers.filter(function (h) { return h !== handler; });\n return beforeCount > this._handlers.length;\n };\n SingleEventManagerImpl.prototype.triggerEvent = function (eventGenerator) {\n for (var _i = 0, _a = this._handlers; _i < _a.length; _i++) {\n var handler = _a[_i];\n try {\n var 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 return SingleEventManagerImpl;\n}());\nexports.SingleEventManagerImpl = SingleEventManagerImpl;\n//# sourceMappingURL=SingleEventManagerImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar ShortLivedDeferred_1 = require(\"../Utils/ShortLivedDeferred\");\nvar SheetImpl_1 = require(\"./SheetImpl\");\nvar StoryPointImpl_1 = require(\"./StoryPointImpl\");\nvar StoryPointInfoImpl_1 = require(\"./StoryPointInfoImpl\");\nvar StoryImpl = /** @class */ (function (_super) {\n __extends(StoryImpl, _super);\n function StoryImpl(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) {\n var _this = _super.call(this, _sheetInfoImpl, _registryId) || this;\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 return _this;\n }\n StoryImpl.prototype.initializeStory = function (storyModel) {\n var _this = this;\n storyModel.storyPoints.forEach(function (storyPointModel) {\n var isActive = storyPointModel.index === storyModel.activeStoryPointIndex;\n var 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 StoryImpl.prototype.updateStoryInfo = function (index, storyPointModel) {\n if (!this._storyPointInfoImpls) {\n return;\n }\n var 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 StoryImpl.prototype.updateStory = function (storyPointModel) {\n var _this = this;\n if (!this._storyPointInfoImpls) {\n return;\n }\n this._storyPointInfoImpls.forEach(function (storyPointInfoImpl) {\n var 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 Object.defineProperty(StoryImpl.prototype, \"activeStoryPoint\", {\n get: function () {\n return this._activeStoryPointImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryImpl.prototype, \"storyPointsInfo\", {\n get: function () {\n return this._storyPointInfoImpls;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryImpl.prototype, \"isActive\", {\n get: function () {\n return this._sheetInfoImpl.active;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryImpl.prototype, \"isHidden\", {\n get: function () {\n return !!this._sheetInfoImpl.isHidden;\n },\n enumerable: true,\n configurable: true\n });\n StoryImpl.prototype.activateNextStoryPointAsync = function () {\n if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n var promise = this._deferred.getNewPromiseOrThrowIfBusy();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activateNextStoryPointAsync();\n return promise;\n };\n StoryImpl.prototype.activatePreviousStoryPointAsync = function () {\n if (this._activeStoryPointImpl.index === 0) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n var promise = this._deferred.getNewPromiseOrThrowIfBusy();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activatePreviousStoryPointAsync();\n return promise;\n };\n StoryImpl.prototype.activateStoryPointAsync = function (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 var promise = this._deferred.getNewPromiseOrThrowIfBusy();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activateStoryPointAsync(index);\n return promise;\n };\n StoryImpl.prototype.revertStoryPointAsync = function (index) {\n var _this = this;\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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n return service.revertStoryPointAsync(index).then(function (response) {\n _this.updateStoryInfo(response.index, response);\n var storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, _this);\n return storyPointInfoImpl;\n });\n };\n StoryImpl.prototype.clearPendingPromises = function () {\n if (this._deferred) {\n this._deferred.reject('All pending promises cleared');\n }\n };\n return StoryImpl;\n}(SheetImpl_1.SheetImpl));\nexports.StoryImpl = StoryImpl;\n//# sourceMappingURL=StoryImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar SheetUtils_1 = require(\"../Utils/SheetUtils\");\nvar DashboardImpl_1 = require(\"./DashboardImpl\");\nvar SheetInfoImpl_1 = require(\"./SheetInfoImpl\");\nvar WorksheetImpl_1 = require(\"./WorksheetImpl\");\nvar StoryPointImpl = /** @class */ (function () {\n function StoryPointImpl(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) {\n this._storyPointInfoImpl = _storyPointInfoImpl;\n if (containedSheetInfo) {\n this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId);\n }\n }\n Object.defineProperty(StoryPointImpl.prototype, \"index\", {\n get: function () {\n return this._storyPointInfoImpl.index;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"caption\", {\n get: function () {\n return this._storyPointInfoImpl.caption;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"active\", {\n get: function () {\n return this._storyPointInfoImpl.active;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"updated\", {\n get: function () {\n return this._storyPointInfoImpl.updated;\n },\n set: function (updated) {\n this._storyPointInfoImpl.updated = updated;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"parentStory\", {\n get: function () {\n return this._storyPointInfoImpl.parentStory;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"containedSheet\", {\n get: function () {\n return this._containedSheetImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"storyPointId\", {\n get: function () {\n return this._storyPointInfoImpl.storyPointId;\n },\n enumerable: true,\n configurable: true\n });\n StoryPointImpl.prototype.createContainedSheet = function (containedSheetInfo, sheetInfos, registryId) {\n var containedSheetIdx = -1;\n var publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos);\n var containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize();\n var isContainedSheetHidden = publishedSheetInfo === undefined;\n var containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : '';\n // Contained sheets aren't active - the containing sheet is active.\n var containedSheetActive = false;\n var containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl);\n var sheetImpl;\n switch (containedSheetInfoImpl.sheetType) {\n case Contract.SheetType.Worksheet: {\n var 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 var 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 return StoryPointImpl;\n}());\nexports.StoryPointImpl = StoryPointImpl;\n//# sourceMappingURL=StoryPointImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar StoryPointInfoImpl = /** @class */ (function () {\n function StoryPointInfoImpl(_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 Object.defineProperty(StoryPointInfoImpl.prototype, \"caption\", {\n get: function () {\n return this._caption;\n },\n set: function (caption) {\n this._caption = caption;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"index\", {\n get: function () {\n return this._index;\n },\n set: function (index) {\n this._index = index;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"storyPointId\", {\n get: function () {\n return this._storyPointId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"active\", {\n get: function () {\n return this._active;\n },\n set: function (isActive) {\n this._active = isActive;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"updated\", {\n get: function () {\n return this._updated;\n },\n set: function (isUpdated) {\n this._updated = isUpdated;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"parentStory\", {\n get: function () {\n return this._parentStoryImpl;\n },\n enumerable: true,\n configurable: true\n });\n return StoryPointInfoImpl;\n}());\nexports.StoryPointInfoImpl = StoryPointInfoImpl;\n//# sourceMappingURL=StoryPointInfoImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar WorkbookImpl = /** @class */ (function () {\n function WorkbookImpl() {\n }\n return WorkbookImpl;\n}());\nexports.WorkbookImpl = WorkbookImpl;\n//# sourceMappingURL=WorkbookImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar DataSource_1 = require(\"../DataSource\");\nvar LogicalTable_1 = require(\"../LogicalTable\");\nvar GetDataService_1 = require(\"../Services/GetDataService\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar DataSourceImpl_1 = require(\"./DataSourceImpl\");\nvar SheetImpl_1 = require(\"./SheetImpl\");\nvar WorksheetImpl = /** @class */ (function (_super) {\n __extends(WorksheetImpl, _super);\n function WorksheetImpl(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl) {\n var _this = _super.call(this, sheetInfoImpl, _registryId) || this;\n _this._visualId = _visualId;\n _this._parentDashboardImpl = _parentDashboardImpl;\n _this._parentStoryPointImpl = _parentStoryPointImpl;\n return _this;\n }\n Object.defineProperty(WorksheetImpl.prototype, \"parentDashboard\", {\n get: function () {\n return this._parentDashboardImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WorksheetImpl.prototype, \"parentStoryPoint\", {\n get: function () {\n return this._parentStoryPointImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WorksheetImpl.prototype, \"visualId\", {\n get: function () {\n return this._visualId;\n },\n enumerable: true,\n configurable: true\n });\n WorksheetImpl.prototype.getMaxPageRowLimit = function () {\n return 10000;\n };\n WorksheetImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) {\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType');\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options);\n };\n WorksheetImpl.prototype.applyRangeFilterAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions);\n };\n WorksheetImpl.prototype.applyHierarchicalFilterAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options);\n };\n WorksheetImpl.prototype.clearFilterAsync = function (fieldName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.clearFilterAsync(this.visualId, fieldName);\n };\n WorksheetImpl.prototype.applyRelativeDateFilterAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options);\n };\n WorksheetImpl.prototype.getDataSourcesAsync = function () {\n var _this = this;\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getDataSourcesAsync(this.visualId).then(function (result) {\n var dataSchema = result;\n var worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[_this.name];\n var dataSources = [];\n // First, add the primary datasource. By convention, it comes first in the returned array.\n var primaryId = worksheetDataSourceInfo.primaryDataSource;\n dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[primaryId]));\n // Then, loop through any secondary data sources and add them.\n for (var _i = 0, _a = worksheetDataSourceInfo.referencedDataSourceList; _i < _a.length; _i++) {\n var secondaryId = _a[_i];\n if (secondaryId !== primaryId) {\n dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId]));\n }\n }\n return dataSources;\n });\n };\n WorksheetImpl.prototype.getFiltersAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getFiltersAsync(this.visualId);\n };\n WorksheetImpl.prototype.getSelectedMarksAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getSelectedMarksAsync(this.visualId);\n };\n WorksheetImpl.prototype.getHighlightedMarksAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getHighlightedMarksAsync(this.visualId);\n };\n WorksheetImpl.prototype.getSummaryDataAsync = function (options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.getVisualSpecificationAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* VisualModel */);\n return service.getVisualSpecificationAsync(this.visualId);\n };\n WorksheetImpl.prototype.getSummaryColumnsInfoAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getSummaryColumnsInfoAsync(this.visualId);\n };\n WorksheetImpl.prototype.getUnderlyingDataAsync = function (options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.getUnderlyingTablesAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getUnderlyingTablesAsync(this.visualId).then(function (logicalTableInfos) {\n return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); });\n });\n };\n WorksheetImpl.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.clearSelectedMarksAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.clearSelectedMarksAsync(this.visualId);\n };\n WorksheetImpl.prototype.selectMarksByValueAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType);\n };\n WorksheetImpl.prototype.selectMarksByIdAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType);\n };\n WorksheetImpl.prototype.annotateMarkAsync = function (mark, annotationText) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark');\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.annotateMarkAsync(this.visualId, mark, annotationText);\n };\n WorksheetImpl.prototype.getAnnotationsAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.getAnnotationsAsync(this.visualId);\n };\n WorksheetImpl.prototype.removeAnnotationAsync = function (annotation) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation');\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.removeAnnotationAsync(this.visualId, annotation);\n };\n WorksheetImpl.prototype.appendContextMenuAsync = function (targetMenu, config) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config);\n };\n WorksheetImpl.prototype.removeContextMenuAsync = function (targetMenu, menuItemId) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId);\n };\n WorksheetImpl.prototype.executeContextMenuAsync = function (targetMenu, menuItemId) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId);\n };\n WorksheetImpl.prototype.renameContextMenuAsync = function (targetMenu, menuHeader, menuDescription) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription);\n };\n WorksheetImpl.prototype.hoverTupleAsync = function (hoveredTuple, tooltip) {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, \"hoverTupleAsync is not supported in dashboard extensions\"));\n }\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip);\n };\n WorksheetImpl.prototype.selectTuplesAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip);\n };\n WorksheetImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) {\n var dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId);\n var dataSource = new DataSource_1.DataSource(dataSourceImpl);\n dataSourceImpl.initializeWithPublicInterfaces(dataSource);\n return dataSource;\n };\n WorksheetImpl.prototype.verifyActiveSheet = function () {\n var isRootAndActiveWorksheet = this.active;\n var isInsideActiveDashboard = this.isInsideActiveDashboard();\n var 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 WorksheetImpl.prototype.isInsideActiveStoryPoint = function () {\n return this._parentStoryPointImpl && this._parentStoryPointImpl.active;\n };\n WorksheetImpl.prototype.isInsideActiveDashboard = function () {\n return this._parentDashboardImpl && this._parentDashboardImpl.active;\n };\n WorksheetImpl.prototype.isInsideDashboardExtension = function () {\n return this._parentDashboardImpl !== null;\n };\n return WorksheetImpl;\n}(SheetImpl_1.SheetImpl));\nexports.WorksheetImpl = WorksheetImpl;\n//# sourceMappingURL=WorksheetImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a logical table.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nvar LogicalTable = /** @class */ (function () {\n function LogicalTable(_logicalTable) {\n this._logicalTable = _logicalTable;\n }\n Object.defineProperty(LogicalTable.prototype, \"id\", {\n get: function () {\n return this._logicalTable.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(LogicalTable.prototype, \"caption\", {\n get: function () {\n return this._logicalTable.caption;\n },\n enumerable: true,\n configurable: true\n });\n return LogicalTable;\n}());\nexports.LogicalTable = LogicalTable;\n//# sourceMappingURL=LogicalTable.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar Filter = /** @class */ (function () {\n function Filter(_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 Object.defineProperty(Filter.prototype, \"worksheetName\", {\n get: function () {\n return this._worksheetName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Filter.prototype, \"fieldName\", {\n get: function () {\n return this._fieldName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Filter.prototype, \"fieldId\", {\n get: function () {\n return this._fieldId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Filter.prototype, \"filterType\", {\n get: function () {\n return this._filterType;\n },\n enumerable: true,\n configurable: true\n });\n Filter.prototype.getFieldAsync = function () {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getFieldAsync(this._fieldId);\n };\n Filter.prototype.getAppliedWorksheetsAsync = function () {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId);\n };\n Filter.prototype.setAppliedWorksheetsAsync = function (applyToWorksheets) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets');\n var uniqueWorksheets = new Set(applyToWorksheets);\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets));\n };\n return Filter;\n}());\nexports.Filter = Filter;\nvar CategoricalFilter = /** @class */ (function (_super) {\n __extends(CategoricalFilter, _super);\n function CategoricalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) {\n var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this;\n _this._appliedValues = _appliedValues;\n _this._isExcludeMode = _isExcludeMode;\n _this._isAllSelected = _isAllSelected;\n return _this;\n }\n Object.defineProperty(CategoricalFilter.prototype, \"isAllSelected\", {\n get: function () {\n return this._isAllSelected;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CategoricalFilter.prototype, \"appliedValues\", {\n get: function () {\n return this._appliedValues;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CategoricalFilter.prototype, \"isExcludeMode\", {\n get: function () {\n return this._isExcludeMode;\n },\n enumerable: true,\n configurable: true\n });\n CategoricalFilter.prototype.getDomainAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType);\n };\n return CategoricalFilter;\n}(Filter));\nexports.CategoricalFilter = CategoricalFilter;\nvar HierarchicalDataValue = /** @class */ (function () {\n function HierarchicalDataValue(_value, _hierarchicalPath, _level) {\n this._value = _value;\n this._hierarchicalPath = _hierarchicalPath;\n this._level = _level;\n }\n Object.defineProperty(HierarchicalDataValue.prototype, \"value\", {\n get: function () {\n return this._value;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalDataValue.prototype, \"hierarchicalPath\", {\n get: function () {\n return this._hierarchicalPath;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalDataValue.prototype, \"level\", {\n get: function () {\n return this._level;\n },\n enumerable: true,\n configurable: true\n });\n return HierarchicalDataValue;\n}());\nexports.HierarchicalDataValue = HierarchicalDataValue;\nvar HierarchicalLevelDetail = /** @class */ (function () {\n function HierarchicalLevelDetail(_name, _levelSelectionState) {\n this._name = _name;\n this._levelSelectionState = _levelSelectionState;\n }\n Object.defineProperty(HierarchicalLevelDetail.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalLevelDetail.prototype, \"levelSelectionState\", {\n get: function () {\n return this._levelSelectionState;\n },\n enumerable: true,\n configurable: true\n });\n return HierarchicalLevelDetail;\n}());\nexports.HierarchicalLevelDetail = HierarchicalLevelDetail;\nvar HierarchicalFilter = /** @class */ (function (_super) {\n __extends(HierarchicalFilter, _super);\n function HierarchicalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) {\n var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this;\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 return _this;\n }\n HierarchicalFilter.prototype.getDomainAsync = function (domainType) {\n throw new Error('Method not implemented.');\n };\n Object.defineProperty(HierarchicalFilter.prototype, \"dimensionName\", {\n get: function () {\n return this._dimensionName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"hierarchyCaption\", {\n get: function () {\n return this._hierarchyCaption;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"numberOfLevels\", {\n get: function () {\n return this._numberOfLevels;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"levelDetails\", {\n get: function () {\n return this._levelDetails;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"isAllSelected\", {\n get: function () {\n return this._isAllSelected;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"appliedValues\", {\n get: function () {\n return this._appliedValues;\n },\n enumerable: true,\n configurable: true\n });\n return HierarchicalFilter;\n}(Filter));\nexports.HierarchicalFilter = HierarchicalFilter;\nvar RangeFilter = /** @class */ (function (_super) {\n __extends(RangeFilter, _super);\n function RangeFilter(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) {\n var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this;\n _this._min = _min;\n _this._max = _max;\n _this._includeNullValues = _includeNullValues;\n return _this;\n }\n Object.defineProperty(RangeFilter.prototype, \"minValue\", {\n get: function () {\n return this._min;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RangeFilter.prototype, \"maxValue\", {\n get: function () {\n return this._max;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RangeFilter.prototype, \"includeNullValues\", {\n get: function () {\n return this._includeNullValues;\n },\n enumerable: true,\n configurable: true\n });\n RangeFilter.prototype.getDomainAsync = function (domainType) {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* 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 return RangeFilter;\n}(Filter));\nexports.RangeFilter = RangeFilter;\nvar RelativeDateFilter = /** @class */ (function (_super) {\n __extends(RelativeDateFilter, _super);\n function RelativeDateFilter(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) {\n var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this;\n _this._anchorDate = _anchorDate;\n _this._periodType = _periodType;\n _this._rangeType = _rangeType;\n _this._rangeN = _rangeN;\n return _this;\n }\n Object.defineProperty(RelativeDateFilter.prototype, \"anchorDate\", {\n get: function () {\n return this._anchorDate;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RelativeDateFilter.prototype, \"periodType\", {\n get: function () {\n return this._periodType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RelativeDateFilter.prototype, \"rangeType\", {\n get: function () {\n return this._rangeType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RelativeDateFilter.prototype, \"rangeN\", {\n get: function () {\n return this._rangeN;\n },\n enumerable: true,\n configurable: true\n });\n return RelativeDateFilter;\n}(Filter));\nexports.RelativeDateFilter = RelativeDateFilter;\nvar CategoricalDomain = /** @class */ (function () {\n function CategoricalDomain(_values, _domainType) {\n this._values = _values;\n this._domainType = _domainType;\n }\n Object.defineProperty(CategoricalDomain.prototype, \"values\", {\n get: function () {\n return this._values;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CategoricalDomain.prototype, \"type\", {\n get: function () {\n return this._domainType;\n },\n enumerable: true,\n configurable: true\n });\n return CategoricalDomain;\n}());\nexports.CategoricalDomain = CategoricalDomain;\nvar RangeDomain = /** @class */ (function () {\n function RangeDomain(_min, _max, _domainType) {\n this._min = _min;\n this._max = _max;\n this._domainType = _domainType;\n }\n Object.defineProperty(RangeDomain.prototype, \"type\", {\n get: function () {\n return this._domainType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RangeDomain.prototype, \"min\", {\n get: function () {\n return this._min;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RangeDomain.prototype, \"max\", {\n get: function () {\n return this._max;\n },\n enumerable: true,\n configurable: true\n });\n return RangeDomain;\n}());\nexports.RangeDomain = RangeDomain;\n//# sourceMappingURL=FilterModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar DataTable = /** @class */ (function () {\n function DataTable(_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 Object.defineProperty(DataTable.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"data\", {\n get: function () {\n return this._data;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"columns\", {\n get: function () {\n return this._columns;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"marksInfo\", {\n get: function () {\n return this._marksInfo;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"totalRowCount\", {\n get: function () {\n return this._totalRowCount;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"isTotalRowCountLimited\", {\n get: function () {\n return this._isTotalRowCountLimited;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"isSummaryData\", {\n get: function () {\n return this._isSummaryData;\n },\n enumerable: true,\n configurable: true\n });\n return DataTable;\n}());\nexports.DataTable = DataTable;\nvar MarkInfo = /** @class */ (function () {\n function MarkInfo(_type, _color, _tupleId) {\n this._type = _type;\n this._color = _color;\n this._tupleId = _tupleId;\n }\n Object.defineProperty(MarkInfo.prototype, \"type\", {\n get: function () {\n return this._type;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MarkInfo.prototype, \"color\", {\n get: function () {\n return this._color;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MarkInfo.prototype, \"tupleId\", {\n get: function () {\n return this._tupleId;\n },\n enumerable: true,\n configurable: true\n });\n return MarkInfo;\n}());\nexports.MarkInfo = MarkInfo;\nvar Column = /** @class */ (function () {\n function Column(_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 Object.defineProperty(Column.prototype, \"fieldName\", {\n get: function () {\n return this._fieldName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Column.prototype, \"fieldId\", {\n get: function () {\n return this._fieldId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Column.prototype, \"dataType\", {\n get: function () {\n return this._dataType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Column.prototype, \"isReferenced\", {\n get: function () {\n return this._isReferenced;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Column.prototype, \"index\", {\n get: function () {\n return this._index;\n },\n enumerable: true,\n configurable: true\n });\n return Column;\n}());\nexports.Column = Column;\nvar DataValue = /** @class */ (function () {\n /* tslint:disable:no-any */\n function DataValue(_value, _nativeValue, _formattedValue) {\n this._value = _value;\n this._nativeValue = _nativeValue;\n this._formattedValue = _formattedValue;\n }\n Object.defineProperty(DataValue.prototype, \"value\", {\n get: function () {\n return this._value;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataValue.prototype, \"nativeValue\", {\n get: function () {\n return this._nativeValue;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataValue.prototype, \"formattedValue\", {\n get: function () {\n return this._formattedValue;\n },\n enumerable: true,\n configurable: true\n });\n return DataValue;\n}());\nexports.DataValue = DataValue;\n//# sourceMappingURL=GetDataModels.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};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar DataTableReader = /** @class */ (function () {\n function DataTableReader(_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 Object.defineProperty(DataTableReader.prototype, \"totalRowCount\", {\n get: function () {\n return this._totalRowCount;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTableReader.prototype, \"pageCount\", {\n get: function () {\n return this._pageCount;\n },\n enumerable: true,\n configurable: true\n });\n DataTableReader.prototype.getPageAsync = function (pageNumber) {\n ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount);\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getPageAsync(this._id, pageNumber, this._pageRowCount);\n };\n DataTableReader.prototype.getAllPagesAsync = function (maxRows) {\n return __awaiter(this, void 0, void 0, function () {\n var firstPage, rowsRequested, pagesRequested, pagesToFetch, isDataLimited, remainingData, i, page, fullData;\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this.getPageAsync(0)];\n case 1:\n firstPage = _b.sent();\n maxRows = maxRows || this.totalRowCount;\n rowsRequested = Math.min(maxRows, this.totalRowCount);\n pagesRequested = Math.ceil(rowsRequested / this._pageRowCount);\n pagesToFetch = Math.min(pagesRequested, 400);\n isDataLimited = pagesToFetch < pagesRequested;\n remainingData = [];\n i = 1;\n _b.label = 2;\n case 2:\n if (!(i < pagesToFetch)) return [3 /*break*/, 5];\n return [4 /*yield*/, this.getPageAsync(i)];\n case 3:\n page = _b.sent();\n remainingData.push(page.data);\n _b.label = 4;\n case 4:\n i++;\n return [3 /*break*/, 2];\n case 5:\n fullData = (_a = firstPage.data).concat.apply(_a, remainingData);\n // This slices the array only if maxRows has been set and is less than totalRowCount\n fullData.length = rowsRequested;\n return [2 /*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 });\n };\n DataTableReader.prototype.releaseAsync = function () {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.releaseAsync(this._id);\n };\n return DataTableReader;\n}());\nexports.DataTableReader = DataTableReader;\n//# sourceMappingURL=GetDataTableReaderModels.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Selection Model.\n */\nvar SelectionModel = /** @class */ (function () {\n function SelectionModel() {\n }\n return SelectionModel;\n}());\nexports.SelectionModel = SelectionModel;\n/**\n * Value based selection model. Meant for hierarchical, range and categorical selections.\n */\nvar ValueSelectionModel = /** @class */ (function (_super) {\n __extends(ValueSelectionModel, _super);\n function ValueSelectionModel() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.selectValues = [];\n return _this;\n }\n return ValueSelectionModel;\n}(SelectionModel));\nexports.ValueSelectionModel = ValueSelectionModel;\n/**\n * Hierarchical value selection model\n */\nvar HierarchicalSelectionModel = /** @class */ (function (_super) {\n __extends(HierarchicalSelectionModel, _super);\n function HierarchicalSelectionModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return HierarchicalSelectionModel;\n}(ValueSelectionModel));\nexports.HierarchicalSelectionModel = HierarchicalSelectionModel;\n/**\n * Range based value selection model\n */\nvar RangeSelectionModel = /** @class */ (function (_super) {\n __extends(RangeSelectionModel, _super);\n function RangeSelectionModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return RangeSelectionModel;\n}(SelectionModel));\nexports.RangeSelectionModel = RangeSelectionModel;\n/**\n * Dimension value selection model\n */\nvar DimensionSelectionModel = /** @class */ (function (_super) {\n __extends(DimensionSelectionModel, _super);\n function DimensionSelectionModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return DimensionSelectionModel;\n}(ValueSelectionModel));\nexports.DimensionSelectionModel = DimensionSelectionModel;\n/**\n * Tuple based selection model\n */\nvar TupleSelectionModel = /** @class */ (function () {\n function TupleSelectionModel() {\n this.objectIds = [];\n }\n return TupleSelectionModel;\n}());\nexports.TupleSelectionModel = TupleSelectionModel;\n/**\n * Container class to populate all the selection models when parsing input\n */\nvar SelectionModelsContainer = /** @class */ (function () {\n function SelectionModelsContainer() {\n this.hierModelArr = [];\n this.dimModelArr = [];\n this.quantModelArr = [];\n }\n return SelectionModelsContainer;\n}());\nexports.SelectionModelsContainer = SelectionModelsContainer;\nvar SelectTuplesInteractionModel = /** @class */ (function () {\n function SelectTuplesInteractionModel(visualIdPresModel, tupleIds, selectOptions, tooltipContext) {\n if (tupleIds === void 0) { tupleIds = []; }\n this.visualIdPresModel = visualIdPresModel;\n this.tupleIds = tupleIds;\n this.selectOptions = selectOptions;\n this.tooltipContext = tooltipContext;\n }\n return SelectTuplesInteractionModel;\n}());\nexports.SelectTuplesInteractionModel = SelectTuplesInteractionModel;\nvar HoverTupleInteractionModel = /** @class */ (function () {\n function HoverTupleInteractionModel(visualIdPresModel, tupleId, tooltipContext) {\n this.visualIdPresModel = visualIdPresModel;\n this.tupleId = tupleId;\n this.tooltipContext = tooltipContext;\n }\n return HoverTupleInteractionModel;\n}());\nexports.HoverTupleInteractionModel = HoverTupleInteractionModel;\n//# sourceMappingURL=SelectionModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Point = /** @class */ (function () {\n function Point(_x, _y) {\n this._x = _x;\n this._y = _y;\n }\n Object.defineProperty(Point.prototype, \"x\", {\n get: function () {\n return this._x;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Point.prototype, \"y\", {\n get: function () {\n return this._y;\n },\n enumerable: true,\n configurable: true\n });\n return Point;\n}());\nexports.Point = Point;\n//# sourceMappingURL=Point.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.GetDataType = {}));\n//# sourceMappingURL=GetDataService.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ServiceRegistry_1 = require(\"./ServiceRegistry\");\nvar AnimationServiceImpl_1 = require(\"./impl/AnimationServiceImpl\");\nvar AnnotationServiceImpl_1 = require(\"./impl/AnnotationServiceImpl\");\nvar DataSourceServiceImpl_1 = require(\"./impl/DataSourceServiceImpl\");\nvar ExportServiceImpl_1 = require(\"./impl/ExportServiceImpl\");\nvar ExternalContextMenuServiceImpl_1 = require(\"./impl/ExternalContextMenuServiceImpl\");\nvar FilterServiceImpl_1 = require(\"./impl/FilterServiceImpl\");\nvar GetDataServiceImpl_1 = require(\"./impl/GetDataServiceImpl\");\nvar NotificationServiceImpl_1 = require(\"./impl/NotificationServiceImpl\");\nvar ParametersServiceImpl_1 = require(\"./impl/ParametersServiceImpl\");\nvar SelectionServiceImpl_1 = require(\"./impl/SelectionServiceImpl\");\nvar SizeServiceImpl_1 = require(\"./impl/SizeServiceImpl\");\nvar VisualModelServiceImpl_1 = require(\"./impl/VisualModelServiceImpl\");\nvar VizServiceImpl_1 = require(\"./impl/VizServiceImpl\");\nvar ZoneServiceImpl_1 = require(\"./impl/ZoneServiceImpl\");\nfunction registerAllSharedServices(dispatcher, registryId, platformVersion) {\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, platformVersion));\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}\nexports.registerAllSharedServices = registerAllSharedServices;\n//# sourceMappingURL=RegisterAllSharedServices.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nwindow.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {};\nvar ServiceRegistryImpl = /** @class */ (function () {\n function ServiceRegistryImpl() {\n this._services = {};\n }\n ServiceRegistryImpl.prototype.registerService = function (service) {\n this._services[service.serviceName] = service;\n };\n ServiceRegistryImpl.prototype.getService = function (serviceName) {\n if (!this._services.hasOwnProperty(serviceName)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, \"Service not registered: \" + serviceName);\n }\n return this._services[serviceName];\n };\n return ServiceRegistryImpl;\n}());\n/**\n * Static class used for getting access to the single instance\n * of the ApiServiceRegistry associated with the registryId.\n *\n * Extensions by design don't need to store/access multiple service registries. Their single instance of ServiceRegistry is\n * stored/access with registryId = 0.\n *\n * Whereas Embedding needs to be aware of which ServiceRegistry to use when there are multiple vizzes embedded.\n * An example of how window.__tableauApiServiceRegistry will look when there are two vizzes: { 0 : ServiceRegistry, 1 : ServiceRegistry}\n * where registry ID of 0 & 1 refers to viz's internal identifier (which is generated by VizManager).\n */\nvar ApiServiceRegistry = /** @class */ (function () {\n // Private to avoid anyone constructing this\n function ApiServiceRegistry() {\n }\n /**\n * Gets the singleton instance of the ServiceRegistry\n */\n ApiServiceRegistry.get = function (registryId) {\n if (!window.__tableauApiServiceRegistry || !window.__tableauApiServiceRegistry[registryId]) {\n ApiServiceRegistry.setInstance(registryId, new ServiceRegistryImpl());\n }\n if (!window.__tableauApiServiceRegistry[registryId]) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed');\n }\n return window.__tableauApiServiceRegistry[registryId];\n };\n /**\n * Helper method that sets the service registry instance for the corresponding registryId. Can be used by unit tests\n *\n * @param {ServiceRegistry} serviceRegistry The new registry\n */\n ApiServiceRegistry.setInstance = function (registryId, serviceRegistry) {\n if (!window.__tableauApiServiceRegistry) {\n window.__tableauApiServiceRegistry = {};\n }\n window.__tableauApiServiceRegistry[registryId] = serviceRegistry;\n };\n /**\n * Only used by unit tests\n */\n ApiServiceRegistry.clearRegistry = function () {\n window.__tableauApiServiceRegistry = {};\n };\n return ApiServiceRegistry;\n}());\nexports.ApiServiceRegistry = ApiServiceRegistry;\n//# sourceMappingURL=ServiceRegistry.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar AnimationServiceImpl = /** @class */ (function (_super) {\n __extends(AnimationServiceImpl, _super);\n function AnimationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(AnimationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"animation-service\" /* Animation */;\n },\n enumerable: true,\n configurable: true\n });\n AnimationServiceImpl.prototype.replayAsync = function (replaySpeed) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.ReplaySpeed] = 1.0,\n _a);\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(function (response) {\n return;\n });\n };\n return AnimationServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.AnimationServiceImpl = AnimationServiceImpl;\n//# sourceMappingURL=AnimationServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nvar SelectionModels_1 = require(\"../../Models/SelectionModels\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar AnnotationServiceImpl = /** @class */ (function (_super) {\n __extends(AnnotationServiceImpl, _super);\n function AnnotationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(AnnotationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"annotation-service\" /* Annotation */;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Method to annotate a mark on the given worksheet.\n *\n * @param visualId\n * @param mark\n * @param annotationText\n */\n AnnotationServiceImpl.prototype.annotateMarkAsync = function (visualId, mark, annotationText) {\n var _a;\n var selectionModelContainer = this.parseMarkSelectionIds([mark]);\n var dummyTargetPoint = { x: 0, y: 0 };\n var formattedText = \"\" + annotationText + \"\";\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'annotateMarkAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.AnnotateEnum] = api_internal_contract_js_1.AnnotateEnum.Mark,\n _a[api_internal_contract_js_1.ParameterId.TargetPoint] = dummyTargetPoint,\n _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection],\n _a[api_internal_contract_js_1.ParameterId.FormattedText] = formattedText,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then(function (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 AnnotationServiceImpl.prototype.getAnnotationsAsync = function (visualId) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAnnotationsAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then(function (response) {\n var 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 AnnotationServiceImpl.prototype.removeAnnotationAsync = function (visualId, annotation) {\n var _a;\n var selectionModelContainer = this.parseAnnotationSelectionIds([annotation]);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeAnnotationAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection],\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then(function (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 AnnotationServiceImpl.prototype.parseMarkSelectionIds = function (marks) {\n var ids = [];\n var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n marks.forEach(function (mark) {\n var 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 var 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 AnnotationServiceImpl.prototype.parseAnnotationSelectionIds = function (annotations) {\n var ids = [];\n var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n annotations.forEach(function (annotation) {\n var 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 var 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 AnnotationServiceImpl.prototype.mapAnnotation = function (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 AnnotationServiceImpl.prototype.annotationFilterMap = function (annotations) {\n var _this = this;\n var annotationInfos = annotations.map(function (annotation) { return _this.mapAnnotation(annotation); });\n return annotationInfos;\n };\n return AnnotationServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.AnnotationServiceImpl = AnnotationServiceImpl;\n//# sourceMappingURL=AnnotationServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ClientInfoServiceImpl = /** @class */ (function (_super) {\n __extends(ClientInfoServiceImpl, _super);\n function ClientInfoServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ClientInfoServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"client-info-service\" /* ClientInfo */;\n },\n enumerable: true,\n configurable: true\n });\n ClientInfoServiceImpl.prototype.getClientInfoAsync = function () {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getClientInfoAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var clientInfo = response.result;\n return clientInfo;\n });\n };\n return ClientInfoServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ClientInfoServiceImpl = ClientInfoServiceImpl;\n//# sourceMappingURL=ClientInfoServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar InternalContract = require(\"@tableau/api-internal-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar DataSource_1 = require(\"../../DataSource\");\nvar Field_1 = require(\"../../Field\");\nvar DataSourceImpl_1 = require(\"../../Impl/DataSourceImpl\");\nvar FieldImpl_1 = require(\"../../Impl/FieldImpl\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nexports.SENTINEL_LOGICAL_TABLE_INFO = {\n id: InternalContract.ApiShowDataTableSentinel.SingleTableId,\n caption: InternalContract.ApiShowDataTableSentinel.SingleTableCaption,\n};\n// The minimum platform version when Object Model was supported\nvar platformVersionObjectModelSupport = { major: 1, minor: 20, fix: 1 };\nvar DataSourceServiceImpl = /** @class */ (function (_super) {\n __extends(DataSourceServiceImpl, _super);\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 function DataSourceServiceImpl(dispatcher, registryId, _platformVersion) {\n if (_platformVersion === void 0) { _platformVersion = platformVersionObjectModelSupport; }\n var _this = _super.call(this, dispatcher, registryId) || this;\n _this._platformVersion = _platformVersion;\n return _this;\n }\n Object.defineProperty(DataSourceServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"data-source-service\" /* DataSourceService */;\n },\n enumerable: true,\n configurable: true\n });\n DataSourceServiceImpl.prototype.refreshAsync = function (dataSourceId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'refreshAsync',\n _a[api_internal_contract_js_1.ParameterId.DeltaTimeMs] = 0,\n _a[api_internal_contract_js_1.ParameterId.ShouldRefreshDS] = true,\n _a);\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(function (response) {\n return;\n });\n };\n DataSourceServiceImpl.prototype.getActiveTablesAsync = function (dataSourceId) {\n var _a;\n var joinParameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getActiveTablesAsync',\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId,\n _a);\n // Get the description of the tables used by this connection\n return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then(function (joinResponse) {\n var 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 DataSourceServiceImpl.prototype.getDataSourcesAsync = function (visualId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourcesAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then(function (response) {\n var dataSchema = response.result;\n return dataSchema;\n });\n };\n DataSourceServiceImpl.prototype.getAllDataSourcesAsync = function () {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAllDataSourcesAsync',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then(function (response) {\n var dataSchema = response.result;\n return dataSchema;\n });\n };\n DataSourceServiceImpl.prototype.getConnectionSummariesAsync = function (dataSourceId) {\n var _a;\n var params = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getConnectionSummariesAsync',\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId,\n _a);\n // Get the description of the tables used by this connection\n return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then(function (response) {\n var descriptionSummaries = response.result;\n return descriptionSummaries;\n });\n };\n DataSourceServiceImpl.prototype.getFieldAsync = function (globalfieldName) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFieldAsync',\n _a[api_internal_contract_js_1.ParameterId.FieldId] = globalfieldName,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource];\n var field = response.result[api_internal_contract_js_1.ParameterId.Field];\n return _this.convertField(field, _this.convertDataSource(dataSource));\n });\n };\n DataSourceServiceImpl.prototype.getLogicalTablesAsync = function (dataSourceId) {\n var _a;\n if (!this.isObjectModelSupportedByPlatform()) {\n /**\n * This sentinel ID can be passed to datasource.getLogicalTableData.\n * Once the desktop is upgraded to a version that supports object model,\n * the sentinel ID will automatically fetch the upgraded table.\n * */\n return new Promise(function (resolve) { return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); });\n }\n var params = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTablesAsync',\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then(function (response) {\n return response.result;\n });\n };\n DataSourceServiceImpl.prototype.getUnderlyingTablesAsync = function (visualId) {\n var _a;\n if (!this.isObjectModelSupportedByPlatform()) {\n /**\n * This sentinel ID can be passed to worksheet.getUnderlyingTableData.\n * Once the desktop is upgraded to a version that supports object model,\n * the sentinel ID will automatically fetch the upgraded table.\n * */\n return new Promise(function (resolve) { return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); });\n }\n var params = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTablesAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then(function (response) {\n return response.result;\n });\n };\n DataSourceServiceImpl.prototype.convertField = function (field, dataSource) {\n return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource));\n };\n DataSourceServiceImpl.prototype.convertDataSource = function (dataSource) {\n return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId));\n };\n DataSourceServiceImpl.prototype.isObjectModelSupportedByPlatform = function () {\n var platformVersionNoObjectModelSupport = { major: 1, minor: 13, fix: 0 };\n return InternalContract.VersionLessThan(platformVersionNoObjectModelSupport, this._platformVersion);\n };\n return DataSourceServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.DataSourceServiceImpl = DataSourceServiceImpl;\n//# sourceMappingURL=DataSourceServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\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};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar ExportHelpers_1 = require(\"../../Utils/ExportHelpers\");\nvar ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ExportServiceImpl = /** @class */ (function (_super) {\n __extends(ExportServiceImpl, _super);\n function ExportServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ExportServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"export-service\" /* Export */;\n },\n enumerable: true,\n configurable: true\n });\n ExportServiceImpl.prototype.getExportCrosstabSheetMapAsync = function (currentSheetType) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportCrosstabSheetMapAsync',\n _a[api_internal_contract_js_1.ParameterId.CurrentSheetType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType),\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n ExportServiceImpl.prototype.exportCrosstabAsync = function (sheetName, format, exportableWorksheetNames, currentSheetType) {\n return __awaiter(this, void 0, void 0, function () {\n var sheetNameToIdMap, parameters, verb;\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName);\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat');\n return [4 /*yield*/, this.getExportCrosstabSheetMapAsync(currentSheetType)];\n case 1:\n sheetNameToIdMap = _b.sent();\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 parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportCrosstabAsync',\n _a[api_internal_contract_js_1.ParameterId.SheetIdentifier] = sheetNameToIdMap[sheetName],\n _a[api_internal_contract_js_1.ParameterId.SendNotifications] = true,\n _a);\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 [2 /*return*/, this.execute(verb, parameters)\n .then(function (response) {\n var result = response.result;\n return result;\n })\n .catch(function () {\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 });\n };\n ExportServiceImpl.prototype.exportDataAsync = function (visualId, options) {\n var _a;\n var _b;\n ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options);\n // Remove any duplicates from the input array\n var columnsAsSet = new Set(options.columnsToIncludeById);\n var columnsToIncludeById = Array.from(columnsAsSet);\n var verb = api_internal_contract_js_1.VerbId.ExportDataDownload;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportDataAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = (_b = options.ignoreAliases, (_b !== null && _b !== void 0 ? _b : false)),\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = columnsToIncludeById,\n _a);\n return this.execute(verb, parameters)\n .then(function () { })\n .catch(function () {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.');\n });\n };\n ExportServiceImpl.prototype.exportPowerPointAsync = function (sheetNames, exportScenarios) {\n var _a;\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 var verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPowerPointAsync',\n _a[api_internal_contract_js_1.ParameterId.ExportOriginUrl] = '',\n _a[api_internal_contract_js_1.ParameterId.SelectedSheetNames] = sheetNames,\n _a);\n return this.execute(verb, parameters)\n .then(function (response) {\n var result = response.result;\n return result;\n })\n .catch(function () {\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 ExportServiceImpl.prototype.exportPDFAsync = function (sheetNames, externalExportPdfOptions, exportScenarios) {\n return __awaiter(this, void 0, void 0, function () {\n var internalExportPdfOptions, verb, parameters;\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions);\n ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios);\n return [4 /*yield*/, this.getExportPDFOptionsAsync()];\n case 1:\n internalExportPdfOptions = _b.sent();\n ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames);\n verb = api_internal_contract_js_1.VerbId.ExportPdfDownload;\n parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPDFAsync',\n _a[api_internal_contract_js_1.ParameterId.ExportPdfOptions] = internalExportPdfOptions,\n _a);\n return [2 /*return*/, this.execute(verb, parameters)\n .then(function (response) {\n var result = response.result;\n return result;\n })\n .catch(function () {\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 });\n };\n ExportServiceImpl.prototype.getExportPDFOptionsAsync = function () {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportPdfOptionsAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n return ExportServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ExportServiceImpl = ExportServiceImpl;\n//# sourceMappingURL=ExportServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ExternalContextMenuServiceImpl = /** @class */ (function (_super) {\n __extends(ExternalContextMenuServiceImpl, _super);\n function ExternalContextMenuServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ExternalContextMenuServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"external-context-menu-service\" /* ExternalContextMenu */;\n },\n enumerable: true,\n configurable: true\n });\n ExternalContextMenuServiceImpl.prototype.appendContextMenuAsync = function (sheetName, targetMenu, config) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'appendContextMenuAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName] = config.displayName,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var newMenuItemId = response.result;\n return newMenuItemId;\n });\n };\n ExternalContextMenuServiceImpl.prototype.removeContextMenuAsync = function (sheetName, targetMenu, menuItemId) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeContextMenuAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n ExternalContextMenuServiceImpl.prototype.executeContextMenuAsync = function (sheetName, targetMenu, menuItemId) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'executeContextMenuAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n ExternalContextMenuServiceImpl.prototype.renameContextMenuAsync = function (sheetName, targetMenu, menuHeader, menuDescription) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.RenameExternalMenu;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'renameContextMenuAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuHeader] = menuHeader,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuDescription] = menuDescription,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n return ExternalContextMenuServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl;\n//# sourceMappingURL=ExternalContextMenuServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\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};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar InternalContract = require(\"@tableau/api-internal-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ApiShared_1 = require(\"../../../ApiShared\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nvar FilterModels_1 = require(\"../../Models/FilterModels\");\nvar DataValueFactory_1 = require(\"../../Utils/DataValueFactory\");\nvar Param_1 = require(\"../../Utils/Param\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar FilterServiceImpl = /** @class */ (function (_super) {\n __extends(FilterServiceImpl, _super);\n function FilterServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(FilterServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"filter-service\" /* Filter */;\n },\n enumerable: true,\n configurable: true\n });\n FilterServiceImpl.prototype.applyFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyFilterAsync',\n _a);\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(function (response) {\n return fieldName;\n });\n };\n FilterServiceImpl.prototype.applyRangeFilterAsync = function (visualId, fieldName, filterOptions) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRangeFilterAsync',\n _a);\n if (filterOptions.min !== undefined && filterOptions.min !== null) {\n var min = void 0;\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 var max = void 0;\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(function (response) {\n _this.apiFilterHandlerCheckForCommandError(response.result);\n return fieldName;\n });\n };\n FilterServiceImpl.prototype.applyHierarchicalFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.HierarchicalFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyHierarchicalFilterAsync',\n _a);\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n var 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(function (response) {\n return fieldName;\n });\n };\n FilterServiceImpl.prototype.clearFilterAsync = function (visualId, fieldName) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ClearFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearFilterAsync',\n _a);\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(function (resposne) {\n return fieldName;\n });\n };\n FilterServiceImpl.prototype.applyRelativeDateFilterAsync = function (visualId, fieldName, options) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRelativeDateFilterAsync',\n _a);\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(function (response) {\n return response.result;\n });\n };\n FilterServiceImpl.prototype.getFiltersAsync = function (visualId) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetFilters;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFiltersAsync',\n _a);\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n return this.execute(verb, parameters).then(function (response) {\n var filters = response.result;\n return _this.convertDomainFilters(filters);\n });\n };\n FilterServiceImpl.prototype.getCategoricalDomainAsync = function (worksheetName, fieldId, domainType) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCategoricalDomainAsync',\n _a);\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(function (response) {\n var domain = response.result;\n return _this.convertCategoricalDomain(domain, domainType);\n });\n };\n FilterServiceImpl.prototype.getRangeDomainAsync = function (worksheetName, fieldId, domainType) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetRangeDomain;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getRangeDomainAsync',\n _a);\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(function (response) {\n var domain = response.result;\n return _this.convertRangeDomain(domain, domainType);\n });\n };\n FilterServiceImpl.prototype.getDashboardFiltersAsync = function () {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetDashboardFilters;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDashboardFiltersAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var filters = response.result;\n return _this.convertDomainFilters(filters);\n });\n };\n FilterServiceImpl.prototype.applyDashboardFilterAsync = function (fieldName, values, updateType, filterOptions) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyDashboardFilterAsync',\n _a);\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(function (response) {\n return response.result;\n });\n };\n FilterServiceImpl.prototype.getAppliedWorksheetsAsync = function (worksheetName, fieldId) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n var sharedFilterModel, worksheetNames;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync')];\n case 1:\n sharedFilterModel = _b.sent();\n worksheetNames = [];\n (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map(function (worksheetInfo) {\n if (worksheetInfo.isSelected) {\n worksheetNames.push(worksheetInfo.worksheetName);\n }\n });\n return [2 /*return*/, worksheetNames];\n }\n });\n });\n };\n FilterServiceImpl.prototype.setAppliedWorksheetsAsync = function (worksheetName, fieldName, fieldId, applyToWorksheets) {\n return __awaiter(this, void 0, void 0, function () {\n var sharedFilterModel, allowedWorksheets, activeWorksheet, verb, parameters;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal')];\n case 1:\n sharedFilterModel = _a.sent();\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 allowedWorksheets = [];\n activeWorksheet = '';\n sharedFilterModel.worksheets.forEach(function (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(function (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 verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter;\n 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 [2 /*return*/, this.execute(verb, parameters).then(function (response) {\n return applyToWorksheets;\n })];\n }\n });\n });\n };\n // Helper Methods\n FilterServiceImpl.prototype.executeGetAppliedWorksheets = function (worksheetName, fieldId, telemetryFunctionName) {\n var verb = api_internal_contract_js_1.VerbId.GetSharedFilter;\n var 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(function (response) {\n var sharedFilterModel = response.result;\n return sharedFilterModel;\n });\n };\n FilterServiceImpl.prototype.convertDomainFilters = function (domainFilters) {\n var _this = this;\n var filters = [];\n domainFilters.forEach(function (domainFilter) {\n switch (domainFilter.filterType) {\n case api_internal_contract_js_1.FilterType.Categorical: {\n var 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 var 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 var 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 var 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 FilterServiceImpl.prototype.convertCategoricalFilter = function (domainFilter) {\n var appliedValues = domainFilter.values.map(function (dv) {\n return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv);\n });\n 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);\n };\n FilterServiceImpl.prototype.convertHierarchicalFilter = function (domainFilter) {\n var appliedValues = domainFilter.values.map(function (hierarchicalDataValue) {\n return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level);\n });\n var levelDetails = domainFilter.levelInfo.map(function (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_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected);\n };\n FilterServiceImpl.prototype.convertRangeFilter = function (domainFilter) {\n var minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min);\n var maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max);\n 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);\n };\n FilterServiceImpl.prototype.convertRelativeDateFilter = function (domainFilter) {\n var 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 FilterServiceImpl.prototype.convertCategoricalDomain = function (domain, domainType) {\n var values = domain.values.map(function (domainDv) {\n return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv);\n });\n return new FilterModels_1.CategoricalDomain(values, domainType);\n };\n FilterServiceImpl.prototype.convertRangeDomain = function (domain, domainType) {\n var min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min);\n var max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max);\n return new FilterModels_1.RangeDomain(min, max, domainType);\n };\n FilterServiceImpl.prototype.convertAnchorDate = function (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 var year = anchorDate.getUTCFullYear();\n var month = anchorDate.getUTCMonth() + 1;\n var day = anchorDate.getUTCDate();\n var hh = anchorDate.getUTCHours();\n var mm = anchorDate.getUTCMinutes();\n var 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 var result = year + \"-\" + month + \"-\" + day + \" \" + hh + \":\" + mm + \":\" + sec;\n return result;\n };\n FilterServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (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 return FilterServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.FilterServiceImpl = FilterServiceImpl;\n//# sourceMappingURL=FilterServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar uuid_1 = require(\"uuid\");\nvar ApiShared_1 = require(\"../../../ApiShared\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar GetDataModels_1 = require(\"../../Models/GetDataModels\");\nvar GetDataTableReaderModels_1 = require(\"../../Models/GetDataTableReaderModels\");\nvar DataValueFactory_1 = require(\"../../Utils/DataValueFactory\");\nvar GetDataService_1 = require(\"../GetDataService\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar GetDataServiceImpl = /** @class */ (function (_super) {\n __extends(GetDataServiceImpl, _super);\n function GetDataServiceImpl() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n // The extension/embedding instance uses the same cache for all DataTableReaders.\n _this.viewDataTableCacheId = uuid_1.v4();\n return _this;\n }\n Object.defineProperty(GetDataServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"get-data-service\" /* GetData */;\n },\n enumerable: true,\n configurable: true\n });\n GetDataServiceImpl.prototype.getMaxRowLimit = function () {\n return 10000;\n };\n GetDataServiceImpl.prototype.getViewDataTableCacheId = function () {\n return this.viewDataTableCacheId;\n };\n GetDataServiceImpl.prototype.getLimitedMaxRows = function (requestedRows) {\n var rowCountLimit = this.getMaxRowLimit() + 1;\n return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit;\n };\n GetDataServiceImpl.prototype.getUnderlyingDataAsync = function (visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) {\n var _a;\n var _this = this;\n // Create all of our parameters\n var summaryData = getType === GetDataService_1.GetDataType.Summary;\n var functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync';\n var verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData;\n var requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows) : maxRows;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = functionName,\n _a);\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 return this.execute(verb, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsTable(responseData.data, responseData.isSummary);\n });\n };\n GetDataServiceImpl.prototype.getSummaryDataReaderAsync = function (visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryDataReaderAsync',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection,\n _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then(function (response) {\n var responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId);\n });\n };\n GetDataServiceImpl.prototype.getSummaryColumnsInfoAsync = function (visualId) {\n var _a;\n // Create all the parameters for GetDataType of Summary with 1 row, and only native values\n // Then return just the columns\n var verb = api_internal_contract_js_1.VerbId.GetDataSummaryData;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryColumnsInfoAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = true,\n _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = true,\n _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = true,\n _a[api_internal_contract_js_1.ParameterId.MaxRows] = 1,\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var underlyingDataTable = response.result;\n var dataTable = underlyingDataTable.data;\n var columns = dataTable.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); });\n return columns;\n });\n };\n GetDataServiceImpl.prototype.getSelectedMarksAsync = function (visualId) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSelectedMarksAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then(function (response) {\n var responseData = response.result;\n return {\n data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }),\n };\n });\n };\n GetDataServiceImpl.prototype.getHighlightedMarksAsync = function (visualId) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getHighlightedMarksAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then(function (response) {\n var responseData = response.result;\n return {\n data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }),\n };\n });\n };\n GetDataServiceImpl.prototype.getDataSourceDataAsync = function (dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourceDataAsync',\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows),\n _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = this.verifyIncludeColumnArray(columnsToInclude),\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsTable(responseData.data, false);\n });\n };\n GetDataServiceImpl.prototype.getLogicalTableDataAsync = function (datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataAsync',\n _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = columnsToInclude,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId,\n _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsTable(responseData.data, false);\n });\n };\n GetDataServiceImpl.prototype.getLogicalTableDataReaderAsync = function (datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataReaderAsync',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId,\n _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId,\n _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then(function (response) {\n var responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId);\n });\n };\n GetDataServiceImpl.prototype.getUnderlyingTableDataAsync = function (visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection,\n _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsTable(responseData.data, false);\n });\n };\n GetDataServiceImpl.prototype.getUnderlyingTableDataReaderAsync = function (visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataReaderAsync',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection,\n _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then(function (response) {\n var responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId);\n });\n };\n GetDataServiceImpl.prototype.getPageAsync = function (tableId, pageNumber, pageSize) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getPageAsync',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId,\n _a[api_internal_contract_js_1.ParameterId.DataRowIndex] = pageNumber * pageSize,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false);\n });\n };\n GetDataServiceImpl.prototype.releaseAsync = function (tableId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'release',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then(function (response) {\n return;\n });\n };\n GetDataServiceImpl.prototype.verifyIncludeColumnArray = function (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 var columnsAsSet = new Set(columns);\n return Array.from(columnsAsSet);\n };\n GetDataServiceImpl.prototype.processResultsTable = function (responseData, isSummary) {\n var headers = responseData.headers.map(function (h) { return 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 var marks;\n if (responseData.marks) {\n marks = responseData.marks.map(function (h) { return 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 var isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1;\n if (isTotalRowCountLimited) {\n responseData.dataTable.length -= 1;\n }\n var table = responseData.dataTable.map(function (row) {\n return row.map(function (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 GetDataServiceImpl.prototype.processResultsPage = function (responseData, isSummary) {\n var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); });\n var marks;\n if (responseData.marks) {\n marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); });\n }\n var table = responseData.dataTable.map(function (row) {\n return row.map(function (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 GetDataServiceImpl.summaryTableId = '';\n return GetDataServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.GetDataServiceImpl = GetDataServiceImpl;\n//# sourceMappingURL=GetDataServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar NotificationServiceImplBase_1 = require(\"./NotificationServiceImplBase\");\nvar NotificationServiceImpl = /** @class */ (function (_super) {\n __extends(NotificationServiceImpl, _super);\n function NotificationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(NotificationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"notification-service\" /* Notification */;\n },\n enumerable: true,\n configurable: true\n });\n return NotificationServiceImpl;\n}(NotificationServiceImplBase_1.NotificationServiceImplBase));\nexports.NotificationServiceImpl = NotificationServiceImpl;\n//# sourceMappingURL=NotificationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Registration = /** @class */ (function () {\n function Registration(_filterFn, _callbackFn) {\n this._filterFn = _filterFn;\n this._callbackFn = _callbackFn;\n // Nothing Here\n }\n Registration.prototype.onNotification = function (notificationModel) {\n if (this._filterFn(notificationModel)) {\n this._callbackFn(notificationModel);\n }\n };\n return Registration;\n}());\nexports.Registration = Registration;\nvar NotificationServiceImplBase = /** @class */ (function () {\n function NotificationServiceImplBase(dispatcher) {\n this.dispatcher = dispatcher;\n this._handlers = {};\n this.dispatcher.registerNotificationHandler(this.onNotification.bind(this));\n }\n NotificationServiceImplBase.prototype.registerHandler = function (id, filterFn, handler) {\n var _this = this;\n var handlers = this._handlers[id] || new Array();\n var registration = new Registration(filterFn, handler);\n handlers.push(registration);\n this._handlers[id] = handlers;\n return function () { return _this.removeRegistration(id, registration); };\n };\n NotificationServiceImplBase.prototype.hasHandlersForNotificationType = function (id) {\n // eslint-disable-next-line no-prototype-builtins\n return this._handlers.hasOwnProperty(id);\n };\n NotificationServiceImplBase.prototype.onNotification = function (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(function (h) { return h.onNotification(notification.data); });\n };\n NotificationServiceImplBase.prototype.removeRegistration = function (id, registration) {\n if (!this.hasHandlersForNotificationType(id)) {\n return;\n }\n this._handlers[id] = this._handlers[id].filter(function (reg) { return reg !== registration; });\n };\n return NotificationServiceImplBase;\n}());\nexports.NotificationServiceImplBase = NotificationServiceImplBase;\n//# sourceMappingURL=NotificationServiceImplBase.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ParameterImpl_1 = require(\"../../Impl/ParameterImpl\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ParametersServiceImpl = /** @class */ (function (_super) {\n __extends(ParametersServiceImpl, _super);\n function ParametersServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ParametersServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"parameters-service\" /* Parameters */;\n },\n enumerable: true,\n configurable: true\n });\n ParametersServiceImpl.prototype.getParametersForSheetAsync = function (sheetPath) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync',\n _a[api_internal_contract_js_1.ParameterId.SheetPath] = sheetPath,\n _a);\n return this.getParametersAsync(parameters);\n };\n ParametersServiceImpl.prototype.getAllParametersAsync = function () {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync',\n _a);\n return this.getParametersAsync(parameters);\n };\n ParametersServiceImpl.prototype.getParametersAsync = function (inputParameters) {\n var _this = this;\n return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then(function (response) {\n var result = response.result;\n return result.map(function (parameterInfo) {\n return new ParameterImpl_1.ParameterImpl(parameterInfo, _this._registryId);\n });\n });\n };\n ParametersServiceImpl.prototype.changeParameterValueAsync = function (fieldName, newValue) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeParameterValueAsync',\n _a[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName,\n _a[api_internal_contract_js_1.ParameterId.ParameterValue] = newValue,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n ParametersServiceImpl.prototype.findParameterByNameAsync = function (name) {\n return this.findParameterAsync(name, undefined);\n };\n ParametersServiceImpl.prototype.findParameterByGlobalFieldNameAsync = function (fieldName) {\n return this.findParameterAsync(undefined, fieldName);\n };\n ParametersServiceImpl.prototype.findParameterAsync = function (name, fieldName) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'findParameterAsync',\n _a);\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(function (response) {\n var instanceOfParameterInfo = function (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 var result = response.result;\n return new ParameterImpl_1.ParameterImpl(result, _this._registryId);\n }\n else {\n return undefined;\n }\n });\n };\n return ParametersServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ParametersServiceImpl = ParametersServiceImpl;\n//# sourceMappingURL=ParametersServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar SelectionModels_1 = require(\"../../Models/SelectionModels\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar Param_1 = require(\"../../Utils/Param\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar SelectionServiceImpl = /** @class */ (function (_super) {\n __extends(SelectionServiceImpl, _super);\n function SelectionServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(SelectionServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"selection-service\" /* Selection */;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Method to clear all the selected marks for the given worksheet.\n *\n * @param visualId\n */\n SelectionServiceImpl.prototype.clearSelectedMarksAsync = function (visualId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearSelectedMarksAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then(function (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 SelectionServiceImpl.prototype.selectMarksByValueAsync = function (visualId, selectionCriterias, selectionUpdateType) {\n var _a;\n var _this = this;\n if (selectionCriterias.length === 0) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value');\n }\n var selectionType = this.validateSelectionUpdateType(selectionUpdateType);\n var selectionModelContainer = this.parseSelectionMarks(selectionCriterias);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByValueAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType,\n _a);\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(function (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 SelectionServiceImpl.prototype.hoverTupleAsync = function (visualId, hoveredTuple, tooltip) {\n var _a;\n var interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, hoveredTuple, tooltip);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'hoverTupleAsync',\n _a[api_internal_contract_js_1.ParameterId.HoverTupleInteraction] = interactionModel,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then(function (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 SelectionServiceImpl.prototype.selectTuplesAsync = function (visualId, selectedTuples, selectOption, tooltip) {\n var _a;\n var option = this.validateSelectOption(selectOption);\n var interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, option, tooltip);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectTuplesAsync',\n _a[api_internal_contract_js_1.ParameterId.SelectTuplesInteraction] = interactionModel,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then(function (response) {\n return;\n });\n };\n SelectionServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (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 SelectionServiceImpl.prototype.selectMarksByIdAsync = function (visualId, marks, selectionUpdateType) {\n var _a;\n if (marks.length === 0) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id');\n }\n var selectionType = this.validateSelectionUpdateType(selectionUpdateType);\n var selectionModelContainer = this.parseSelectionIds(marks);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByIdAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType,\n _a[api_internal_contract_js_1.ParameterId.Selection] = selectionModelContainer.selection,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then(function (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 SelectionServiceImpl.prototype.parseSelectionIds = function (marks) {\n var ids = [];\n var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n for (var i = 0; i < marks.length; i++) {\n var 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 var 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 SelectionServiceImpl.prototype.parseSelectionMarks = function (selectionCriterias) {\n var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n for (var i = 0; i < selectionCriterias.length; i++) {\n var 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 var catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g');\n var rangeOption = st.value;\n if (catRegex.test(st.fieldName)) {\n // Hierarchical value selection\n var 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 var quantModel = this.addToRangeParamsList(st.fieldName, rangeOption);\n selectionModelContainer.quantModelArr.push(quantModel);\n }\n else {\n // Dimension value selection\n var 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 SelectionServiceImpl.prototype.addToParamsList = function (fieldName, value) {\n var valueSelectionModel = new SelectionModels_1.ValueSelectionModel();\n var markValues = [];\n if (value instanceof Array) {\n var valueArr = value;\n for (var 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 SelectionServiceImpl.prototype.addToRangeParamsList = function (fieldName, value) {\n var 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 SelectionServiceImpl.prototype.validateSelectionUpdateType = function (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 SelectionServiceImpl.prototype.validateNullOptionType = function (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 /**\n * Method to validate the select option.\n *\n * @param selectOption\n */\n SelectionServiceImpl.prototype.validateSelectOption = function (selectOption) {\n if (selectOption === Contract.SelectOptions.Simple) {\n return api_internal_contract_js_1.SelectOptions.Simple;\n }\n else if (selectOption === Contract.SelectOptions.Toggle) {\n return api_internal_contract_js_1.SelectOptions.Toggle;\n }\n else {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Only simple and toggle select options are currently supported');\n }\n };\n return SelectionServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.SelectionServiceImpl = SelectionServiceImpl;\n//# sourceMappingURL=SelectionServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar 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 */\nvar ServiceImplBase = /** @class */ (function () {\n function ServiceImplBase(_dispatcher, _registryId) {\n this._dispatcher = _dispatcher;\n this._registryId = _registryId;\n }\n ServiceImplBase.prototype.execute = function (verb, params) {\n return this._dispatcher.execute(verb, params).catch(function (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 var internalError = error;\n var externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No);\n throw new TableauError_1.TableauError(externalErrorCode, internalError.message);\n });\n };\n return ServiceImplBase;\n}());\nexports.ServiceImplBase = ServiceImplBase;\n//# sourceMappingURL=ServiceImplBase.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar SizeServiceImpl = /** @class */ (function (_super) {\n __extends(SizeServiceImpl, _super);\n function SizeServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(SizeServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"size-service\" /* Size */;\n },\n enumerable: true,\n configurable: true\n });\n SizeServiceImpl.prototype.changeSizeAsync = function (name, newSize) {\n var _a;\n var _b, _c, _d, _e;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeSizeAsync',\n _a[api_internal_contract_js_1.ParameterId.SheetName] = name,\n _a[api_internal_contract_js_1.ParameterId.MinHeight] = ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.height) || 0,\n _a[api_internal_contract_js_1.ParameterId.MinWidth] = ((_c = newSize.minSize) === null || _c === void 0 ? void 0 : _c.width) || 0,\n _a[api_internal_contract_js_1.ParameterId.MaxHeight] = ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.height) || 0,\n _a[api_internal_contract_js_1.ParameterId.MaxWidth] = ((_e = newSize.maxSize) === null || _e === void 0 ? void 0 : _e.width) || 0,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then(function (_response) {\n return;\n });\n };\n return SizeServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.SizeServiceImpl = SizeServiceImpl;\n//# sourceMappingURL=SizeServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar StoryActivationServiceImpl = /** @class */ (function (_super) {\n __extends(StoryActivationServiceImpl, _super);\n function StoryActivationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(StoryActivationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"story-activation-service\" /* StoryActivation */;\n },\n enumerable: true,\n configurable: true\n });\n StoryActivationServiceImpl.prototype.activateNextStoryPointAsync = function () {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateNextStoryPointAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n StoryActivationServiceImpl.prototype.activatePreviousStoryPointAsync = function () {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activatePreviousStoryPointAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n StoryActivationServiceImpl.prototype.activateStoryPointAsync = function (index) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateStoryPointAsync',\n _a);\n parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index;\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n StoryActivationServiceImpl.prototype.revertStoryPointAsync = function (index) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.RevertStoryPoint;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'revertStoryPointAsync',\n _a);\n parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index;\n return this.execute(verb, parameters).then(function (response) {\n return response.result;\n });\n };\n return StoryActivationServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.StoryActivationServiceImpl = StoryActivationServiceImpl;\n//# sourceMappingURL=StoryActivationServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar VisualModelServiceImpl = /** @class */ (function (_super) {\n __extends(VisualModelServiceImpl, _super);\n function VisualModelServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(VisualModelServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"visual-model-service\" /* VisualModel */;\n },\n enumerable: true,\n configurable: true\n });\n VisualModelServiceImpl.prototype.getVisualSpecificationAsync = function (visualId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getVisualSpecificationAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = visualId.worksheet,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n return VisualModelServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.VisualModelServiceImpl = VisualModelServiceImpl;\n//# sourceMappingURL=VisualModelServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar CustomViewImpl_1 = require(\"../../Impl/CustomViewImpl\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar VizServiceImpl = /** @class */ (function (_super) {\n __extends(VizServiceImpl, _super);\n function VizServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(VizServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"viz-service\" /* Viz */;\n },\n enumerable: true,\n configurable: true\n });\n VizServiceImpl.prototype.createVizImageAsync = function (inputSpec) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'createVizImageAsync',\n _a[api_internal_contract_js_1.ParameterId.VizAPIInputJson] = JSON.stringify(inputSpec),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n VizServiceImpl.prototype.activateSheetAsync = function (name) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateSheetAsync',\n _a[api_internal_contract_js_1.ParameterId.SwitchToSheetName] = name,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(function () {\n return;\n });\n };\n VizServiceImpl.prototype.getCustomViewsAsync = function () {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCustomViewsAsync',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then(function (response) {\n var customViews = response.result;\n return customViews.map(function (customView) {\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n });\n };\n VizServiceImpl.prototype.showCustomViewAsync = function (customViewName) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'showCustomViewAsync',\n _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then(function (response) {\n var customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n };\n VizServiceImpl.prototype.removeCustomViewAsync = function (customViewName) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeCustomViewAsync',\n _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then(function (response) {\n var customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n };\n VizServiceImpl.prototype.saveCustomViewAsync = function (customViewName) {\n var _a;\n var _this = this;\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 var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveCustomViewAsync',\n _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName,\n _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = false,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then(function (response) {\n var customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n };\n VizServiceImpl.prototype.setActiveCustomViewAsDefaultAsync = function () {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setActiveCustomViewAsDefaultAsync',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(function () {\n return;\n });\n };\n VizServiceImpl.prototype.saveAsync = function (customView) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveAsync',\n _a[api_internal_contract_js_1.ParameterId.CustomViewLuid] = customView.luid,\n _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customView.name,\n _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = customView.isDefault,\n _a[api_internal_contract_js_1.ParameterId.CustomViewIsPublic] = customView.shared,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then(function (response) {\n var customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n };\n VizServiceImpl.prototype.getCurrentSrcAsync = function () {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCurrentSrcAsync',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then(function (response) { return response.result; });\n };\n return VizServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.VizServiceImpl = VizServiceImpl;\n//# sourceMappingURL=VizServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nvar Param_1 = require(\"../../Utils/Param\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ZoneServiceImpl = /** @class */ (function (_super) {\n __extends(ZoneServiceImpl, _super);\n function ZoneServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ZoneServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"zone-service\" /* Zone */;\n },\n enumerable: true,\n configurable: true\n });\n ZoneServiceImpl.prototype.setVisibilityAsync = function (dashboard, dashboardZoneMap, zoneVisibilityMap) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setVisibilityAsync',\n _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard,\n _a[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap] = {},\n _a);\n // zoneVisibilityMap can be either an object or a Map - convert it to a Map\n var parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap');\n parameterAsMap.forEach(function (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(function (response) {\n return;\n });\n };\n ZoneServiceImpl.prototype.moveAndResizeAsync = function (dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard,\n _a[api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList] = dashboardObjectPositionAndSizeUpdateArray,\n _a);\n dashboardObjectPositionAndSizeUpdateArray.forEach(function (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(function (response) {\n return;\n });\n };\n return ZoneServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ZoneServiceImpl = ZoneServiceImpl;\n//# sourceMappingURL=ZoneServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a table summary.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nvar TableSummary = /** @class */ (function () {\n function TableSummary(_tableInfo) {\n this._tableInfo = _tableInfo;\n }\n Object.defineProperty(TableSummary.prototype, \"name\", {\n get: function () {\n return this._tableInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TableSummary.prototype, \"id\", {\n get: function () {\n return this._tableInfo.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TableSummary.prototype, \"connectionId\", {\n get: function () {\n return this._tableInfo.connectionId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TableSummary.prototype, \"customSQL\", {\n get: function () {\n return this._tableInfo.customSQL;\n },\n enumerable: true,\n configurable: true\n });\n return TableSummary;\n}());\nexports.TableSummary = TableSummary;\n//# sourceMappingURL=TableSummary.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar TableauError = /** @class */ (function (_super) {\n __extends(TableauError, _super);\n function TableauError(_errorCode, message) {\n var _this = _super.call(this, _errorCode + \": \" + message) || this;\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 return _this;\n }\n Object.defineProperty(TableauError.prototype, \"errorCode\", {\n get: function () {\n return this._errorCode;\n },\n enumerable: true,\n configurable: true\n });\n return TableauError;\n}(Error));\nexports.TableauError = TableauError;\n//# sourceMappingURL=TableauError.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar InternalContract = require(\"@tableau/api-internal-contract-js\");\nvar 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 */\nvar DataValueFactory = /** @class */ (function () {\n function DataValueFactory() {\n }\n DataValueFactory.MakeParameterDataValue = function (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);\n };\n DataValueFactory.MakeFilterDataValue = function (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 DataValueFactory.MakeTableDataValue = function (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 return DataValueFactory;\n}());\nexports.DataValueFactory = DataValueFactory;\n//# sourceMappingURL=DataValueFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar Deferred = /** @class */ (function () {\n /**\n * Creates an instance of Deferred.\n */\n function Deferred() {\n var _this = this;\n this._promise = new Promise(function (resolve, reject) {\n _this._resolve = resolve;\n _this._reject = reject;\n });\n }\n Object.defineProperty(Deferred.prototype, \"promise\", {\n /**\n * Gets the Promise.\n *\n * @readonly\n * @type {Promise}\n */\n get: function () {\n return this._promise;\n },\n enumerable: true,\n configurable: true\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 Deferred.prototype.resolve = function (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 Deferred.prototype.reject = function (reason) {\n if (!this._reject) {\n return;\n }\n this._reject(reason);\n };\n return Deferred;\n}());\nexports.Deferred = Deferred;\nexports.UnregisterTimeoutInMilliseconds = 30000;\n//# sourceMappingURL=Deferred.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar 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 */\nvar EnumConverter = /** @class */ (function () {\n function EnumConverter(_mappings, _defaultVal) {\n this._mappings = _mappings;\n this._defaultVal = _defaultVal;\n }\n EnumConverter.prototype.convert = function (enumVal, throwIfMissing) {\n if (throwIfMissing === void 0) { 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 return EnumConverter;\n}());\nexports.EnumConverter = EnumConverter;\nvar ShouldThrow;\n(function (ShouldThrow) {\n ShouldThrow[\"Yes\"] = \"yes\";\n ShouldThrow[\"No\"] = \"no\";\n})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {}));\n//# sourceMappingURL=EnumConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar 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 */\nvar ErrorHelpers = /** @class */ (function () {\n function ErrorHelpers() {\n }\n /**\n * Throws with code InternalError.\n *\n * @param apiName name of api that was called.\n */\n ErrorHelpers.apiNotImplemented = function (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 ErrorHelpers.verifyInternalValue = function (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 ErrorHelpers.verifyParameter = function (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 ErrorHelpers.verifyParameterType = function (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 ErrorHelpers.verifyStringParameter = function (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 * 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 ErrorHelpers.verifyEnumValue = function (enumValue, enumType, enumName) {\n var isValid = false;\n Object.keys(enumType).forEach(function (enumKey) {\n if (enumType[enumKey] === enumValue.toString()) {\n isValid = true;\n }\n });\n if (!isValid) {\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 /*tslint:disable-next-line */\n ErrorHelpers.verifyRange = function (value, min, max) {\n var 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 /*tslint:disable-next-line */\n ErrorHelpers.verifyRangeParamType = function (min, max) {\n if (!min && !max) {\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 (min && !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 (max && !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 (min && max && 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 ErrorHelpers.verifyZoneIsValid = function (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 ErrorHelpers.verifyZoneIsValidAndFloating = function (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 ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate = function (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 ErrorHelpers.verifySheetName = function (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 ErrorHelpers.verifyExportDataOptions = function (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 ErrorHelpers.verifySheetNamesForPDFAndPPT = function (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 var isIncludedInDashboard = sheetNames.every(function (sheetName) {\n return exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName);\n });\n if (isIncludedInDashboard) {\n return;\n }\n var isIncludedInWorkbook = sheetNames.every(function (sheetName) {\n return exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName);\n });\n if (isIncludedInWorkbook) {\n return;\n }\n var 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 ErrorHelpers.verifyExportPDFOptions = function (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 return ErrorHelpers;\n}());\nexports.ErrorHelpers = ErrorHelpers;\n//# sourceMappingURL=ErrorHelpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\n/**\n * Helper methods for Export APIs.\n *\n * @class ExportHelpers\n */\nvar ExportHelpers = /** @class */ (function () {\n function ExportHelpers() {\n }\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 ExportHelpers.updateInternalExportPDFOptions = function (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 ExportHelpers.updateExportLayoutOptions = function (internalExportPdfOptions, externalExportPdfOptions) {\n var 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 ExportHelpers.updateSheetOptions = function (internalExportPdfOptions, sheetNames) {\n var exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions, sheetOptions = internalExportPdfOptions.sheetOptions;\n // updating the export layouts options for each sheet and selecting sheet for export if included in list\n for (var _i = 0, sheetOptions_1 = sheetOptions; _i < sheetOptions_1.length; _i++) {\n var sheetOption = sheetOptions_1[_i];\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 ExportHelpers.setFitAndScaleValues = function (exportLayoutOptions, scalingSelection) {\n var _a;\n var _b = this.DefaultLayoutOptions, pageFitHorizontal = _b.pageFitHorizontal, pageFitVertical = _b.pageFitVertical, pageScaleMode = _b.pageScaleMode, pageScalePercent = _b.pageScalePercent;\n var fitMatch = this.fitRegex.exec(scalingSelection);\n var percentMatch = this.pctRegex.exec(scalingSelection);\n if (fitMatch) {\n _a = fitMatch.slice(1).map(function (value) { return Number(value); }), pageFitHorizontal = _a[0], pageFitVertical = _a[1];\n pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages;\n }\n else if (percentMatch) {\n pageScalePercent = percentMatch.slice(1).map(function (value) { return Number(value); })[0];\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 ExportHelpers.DefaultDataOptions = {\n ignoreAliases: false,\n columnsToIncludeById: [],\n };\n ExportHelpers.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 };\n ExportHelpers.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 };\n ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)');\n ExportHelpers.pctRegex = new RegExp('pct([0-9]+)');\n return ExportHelpers;\n}());\nexports.ExportHelpers = ExportHelpers;\n//# sourceMappingURL=ExportHelpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"./ErrorHelpers\");\nvar Param = /** @class */ (function () {\n function Param() {\n }\n /**\n * serializes the date into the format that the server expects.\n * @param date the date to serialize\n */\n Param.serializeDateForPlatform = function (date) {\n var year = date.getUTCFullYear();\n var month = date.getUTCMonth() + 1;\n var day = date.getUTCDate();\n var hh = date.getUTCHours();\n var mm = date.getUTCMinutes();\n var sec = date.getUTCSeconds();\n return year + \"-\" + month + \"-\" + day + \" \" + hh + \":\" + mm + \":\" + sec;\n };\n Param.serializeBooleanForPlatform = function (bool) {\n return bool ? 'true' : 'false';\n };\n Param.serializeNumberForPlatform = function (num) {\n return num.toString(10);\n };\n /**\n * Verifies the input is a number\n */\n /* tslint:disable-next-line:no-any */\n Param.isTypeNumber = function (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 Param.isTypeDate = function (input) {\n return input instanceof Date;\n };\n /* tslint:disable-next-line:no-any */\n Param.isTypeString = function (input) {\n return typeof input === 'string' || input instanceof String;\n };\n /* tslint:disable-next-line:no-any */\n Param.isTypeBool = function (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 Param.isNullOrUndefined = function (input) {\n return input === null || input === undefined;\n };\n /* tslint:disable-next-line:no-any */\n Param.serializeParameterValue = function (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 Param.convertParameterToMap = function (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 Param.tryParseNumber = function (value) {\n if (Param.isNullOrUndefined(value)) {\n return { success: false };\n }\n if (Param.isTypeNumber(value)) {\n return { parsed: value, success: true };\n }\n var 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 var parsed = parseFloat(valueString);\n if (isNaN(parsed)) {\n return { success: false };\n }\n return { parsed: parsed, success: true };\n };\n return Param;\n}());\nexports.Param = Param;\n//# sourceMappingURL=Param.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar SheetUtils = /** @class */ (function () {\n function SheetUtils() {\n }\n // This is a direct port from SheetSize.cs - SheetSizeFactory\n SheetUtils.getSheetSizeFromSizeConstraints = function (sizeConstraint) {\n var minWidth = sizeConstraint.minWidth, minHeight = sizeConstraint.minHeight, maxWidth = sizeConstraint.maxWidth, maxHeight = sizeConstraint.maxHeight;\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 var 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 SheetUtils.createAutomaticSize = function () {\n var behavior = Contract.SheetSizeBehavior.Automatic;\n var minSize = { width: 0, height: 0 };\n var maxSize = { width: 0, height: 0 };\n return { behavior: behavior, minSize: minSize, maxSize: maxSize };\n };\n SheetUtils.getPublishedSheetInfoByName = function (name, sheetInfos) {\n var sheetInfo = sheetInfos.find(function (sheet) { return sheet.name === name; });\n return sheetInfo;\n };\n SheetUtils.getSheetTypeEnum = function (internalSheetType) {\n var 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 SheetUtils.isValidSheetSize = function (sizeObject) {\n return sizeObject.behavior !== undefined;\n };\n return SheetUtils;\n}());\nexports.SheetUtils = SheetUtils;\n//# sourceMappingURL=SheetUtils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar 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 */\nvar ShortLivedDeferred = /** @class */ (function () {\n function ShortLivedDeferred(_timeoutInMilliseconds) {\n if (_timeoutInMilliseconds === void 0) { _timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds; }\n this._timeoutInMilliseconds = _timeoutInMilliseconds;\n }\n ShortLivedDeferred.prototype.getNewPromiseOrThrowIfBusy = function () {\n var _this = this;\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(function () {\n var 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 ShortLivedDeferred.prototype.resolve = function (response) {\n if (this._deferred) {\n clearTimeout(this._timeoutId);\n this._deferred.resolve(response);\n this._deferred = undefined;\n }\n };\n ShortLivedDeferred.prototype.reject = function (error) {\n if (this._deferred) {\n clearTimeout(this._timeoutId);\n this._deferred.reject(error);\n this._deferred = undefined;\n }\n };\n return ShortLivedDeferred;\n}());\nexports.ShortLivedDeferred = ShortLivedDeferred;\n//# sourceMappingURL=ShortLivedDeferred.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"./TableauError\");\n/**\n * Represents the current version of the extensions, embedding\n * and extensions-api-types library\n */\nvar VersionNumber = /** @class */ (function () {\n // private constructor so everyone uses the singleton instance\n // build numbers have this form: M.m.f-pre.N\n function VersionNumber(versionString, isAlpha) {\n var partStr = versionString.split('-');\n this.build = this.getBuildNumber(partStr[1]);\n versionString = partStr[0];\n var parts = versionString.split('.').map(function (p) { return 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 VersionNumber.prototype.getBuildNumber = function (preReleaseString) {\n var 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 var partStr = preReleaseString.split('.');\n return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber;\n };\n Object.defineProperty(VersionNumber.prototype, \"formattedValue\", {\n get: function () {\n return this.major + \".\" + this.minor + \".\" + this.fix;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(VersionNumber.prototype, \"fullFormattedValue\", {\n get: function () {\n return this.major + \".\" + this.minor + \".\" + this.fix + \"-pre.\" + this.build;\n },\n enumerable: true,\n configurable: true\n });\n return VersionNumber;\n}());\nexports.VersionNumber = VersionNumber;\n//# sourceMappingURL=VersionNumber.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar 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 */\nvar VersionedExternalApiDispatcher = /** @class */ (function () {\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 function VersionedExternalApiDispatcher(_apiDelegateDispatcher, platformVersionNumber) {\n var _this = this;\n this._apiDelegateDispatcher = _apiDelegateDispatcher;\n this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber);\n this._notificationHandlers = [];\n _apiDelegateDispatcher.registerNotificationHandler(function (notification) {\n if (_this._notificationHandlers.length === 0) {\n return;\n }\n var upgradedNotification = _this._versionConverter.upgradeNotification(notification);\n _this._notificationHandlers.forEach(function (handler) {\n handler(upgradedNotification);\n });\n });\n }\n VersionedExternalApiDispatcher.needsVersionConverter = function (platformVersion) {\n // If our platform is less than external library version, then we need a converter\n return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);\n };\n VersionedExternalApiDispatcher.prototype.execute = function (verb, parameters) {\n var _this = this;\n try {\n var downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters);\n return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then(function (response) {\n var upgradeResponse = _this._versionConverter.upgradeExecuteReturn(response, verb, parameters);\n return upgradeResponse;\n });\n }\n catch (e) {\n return Promise.reject(e);\n }\n };\n VersionedExternalApiDispatcher.prototype.registerNotificationHandler = function (handler) {\n this._notificationHandlers.push(handler);\n };\n VersionedExternalApiDispatcher.prototype.unregisterNotificationHandler = function (handler) {\n this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; });\n };\n return VersionedExternalApiDispatcher;\n}());\nexports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher;\n//# sourceMappingURL=VersionedExternalApiDispatcher.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;","// 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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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 });\n// The following polyfills are needed for IE11\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nrequire(\"core-js/es/array/find\");\nrequire(\"core-js/es/array/from\");\nrequire(\"core-js/es/map\");\nrequire(\"core-js/es/number/is-integer\");\nrequire(\"core-js/es/number/is-nan\");\nrequire(\"core-js/es/number/parse-float\");\nrequire(\"core-js/es/number/parse-int\");\nrequire(\"core-js/es/object/assign\");\nrequire(\"core-js/es/object/entries\");\nrequire(\"core-js/es/object/set-prototype-of\");\nrequire(\"core-js/es/promise\");\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.\nvar ExtensionsImpl_1 = require(\"./ExtensionsApi/Impl/ExtensionsImpl\");\nvar Extensions_1 = require(\"./ExtensionsApi/Namespaces/Extensions\");\nvar 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);\nvar 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\");\nexports.AnalyticsObjectType = api_external_contract_js_1.AnalyticsObjectType;\nexports.AnnotationType = api_external_contract_js_1.AnnotationType;\nexports.ClassNameKey = api_external_contract_js_1.ClassNameKey;\nexports.ColumnType = api_external_contract_js_1.ColumnType;\nexports.DashboardLayoutChange = api_external_contract_js_1.DashboardLayoutChange;\nexports.DashboardObjectType = api_external_contract_js_1.DashboardObjectType;\nexports.DashboardObjectVisibilityType = api_external_contract_js_1.DashboardObjectVisibilityType;\nexports.DataType = api_external_contract_js_1.DataType;\nexports.DateRangeType = api_external_contract_js_1.DateRangeType;\nexports.DialogStyle = api_external_contract_js_1.DialogStyle;\nexports.EncodingType = api_external_contract_js_1.EncodingType;\nexports.ErrorCodes = api_external_contract_js_1.ErrorCodes;\nexports.ExtensionContext = api_external_contract_js_1.ExtensionContext;\nexports.ExtensionMode = api_external_contract_js_1.ExtensionMode;\nexports.FieldAggregationType = api_external_contract_js_1.FieldAggregationType;\nexports.FieldRoleType = api_external_contract_js_1.FieldRoleType;\nexports.FilterDomainType = api_external_contract_js_1.FilterDomainType;\nexports.FilterNullOption = api_external_contract_js_1.FilterNullOption;\nexports.FilterType = api_external_contract_js_1.FilterType;\nexports.FilterUpdateType = api_external_contract_js_1.FilterUpdateType;\nexports.HierarchicalLevelSelectionState = api_external_contract_js_1.HierarchicalLevelSelectionState;\nexports.IncludeDataValuesOption = api_external_contract_js_1.IncludeDataValuesOption;\nexports.MarkType = api_external_contract_js_1.MarkType;\nexports.ParameterValueType = api_external_contract_js_1.ParameterValueType;\nexports.PeriodType = api_external_contract_js_1.PeriodType;\nexports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType;\nexports.ReplaySpeedType = api_external_contract_js_1.ReplaySpeedType;\nexports.SelectOptions = api_external_contract_js_1.SelectOptions;\nexports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType;\nexports.SheetType = api_external_contract_js_1.SheetType;\nexports.SortDirection = api_external_contract_js_1.SortDirection;\nexports.TableauEventType = api_external_contract_js_1.TableauEventType;\nexports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType;\nexports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType;\nexports.VizImagePaletteType = api_external_contract_js_1.VizImagePaletteType;\nexports.VizImageSizeSettingAlignmentType = api_external_contract_js_1.VizImageSizeSettingAlignmentType;\nexports.VizImageSizeSettingType = api_external_contract_js_1.VizImageSizeSettingType;\nexports.VizImageSortDirectionType = api_external_contract_js_1.VizImageSortDirectionType;\nexports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType;\n//# sourceMappingURL=ExtensionsApi.js.map"],"names":["entryUnbind","module","exports","path","Array","from","Map","Number","isInteger","isNaN","parseFloat","parseInt","Object","assign","entries","setPrototypeOf","Promise","global","isCallable","tryToString","TypeError","argument","isConstructor","String","wellKnownSymbol","create","definePropertyModule","UNSCOPABLES","ArrayPrototype","prototype","undefined","f","configurable","value","key","isPrototypeOf","it","Prototype","isObject","bind","call","toObject","callWithSafeIterationClosing","isArrayIteratorMethod","lengthOfArrayLike","createProperty","getIterator","getIteratorMethod","arrayLike","O","IS_CONSTRUCTOR","this","argumentsLength","arguments","length","mapfn","mapping","result","step","iterator","next","iteratorMethod","index","done","toIndexedObject","toAbsoluteIndex","createMethod","IS_INCLUDES","$this","el","fromIndex","includes","indexOf","uncurryThis","IndexedObject","arraySpeciesCreate","push","TYPE","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","IS_FILTER_REJECT","NO_HOLES","callbackfn","that","specificCreate","self","boundFunction","target","forEach","map","filter","some","every","find","findIndex","filterReject","slice","isArray","SPECIES","originalArray","C","constructor","arraySpeciesConstructor","anObject","iteratorClose","fn","ENTRIES","error","ITERATOR","SAFE_CLOSING","called","iteratorWithReturn","exec","SKIP_CLOSING","ITERATION_SUPPORT","object","toString","stringSlice","TO_STRING_TAG_SUPPORT","classofRaw","TO_STRING_TAG","CORRECT_ARGUMENTS","tag","tryGet","callee","arraySlice","replace","split","join","TEST","Error","stack","V8_OR_CHAKRA_STACK_ENTRY","IS_V8_OR_CHAKRA_STACK","test","IS_FIREFOX_OR_SAFARI_STACK","dropEntries","defineProperty","redefineAll","anInstance","iterate","defineIterator","setSpecies","DESCRIPTORS","fastKey","InternalStateModule","setInternalState","set","internalStateGetterFor","getterFor","getConstructor","wrapper","CONSTRUCTOR_NAME","ADDER","Constructor","iterable","type","first","last","size","AS_ENTRIES","getInternalState","define","previous","state","entry","getEntry","removed","clear","data","prev","has","get","add","setStrong","ITERATOR_NAME","getInternalCollectionState","getInternalIteratorState","iterated","kind","$","isForced","redefine","InternalMetadataModule","fails","checkCorrectnessOfIteration","setToStringTag","inheritIfRequired","common","IS_WEAK","NativeConstructor","NativePrototype","exported","fixMethod","KEY","uncurriedNativeMethod","enable","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","dummy","forced","hasOwn","ownKeys","getOwnPropertyDescriptorModule","source","keys","getOwnPropertyDescriptor","i","F","getPrototypeOf","IteratorPrototype","createPropertyDescriptor","Iterators","returnThis","IteratorConstructor","NAME","bitmap","enumerable","writable","toPropertyKey","propertyKey","IS_PURE","FunctionName","createIteratorConstructor","createNonEnumerableProperty","IteratorsCore","PROPER_FUNCTION_NAME","PROPER","CONFIGURABLE_FUNCTION_NAME","CONFIGURABLE","BUGGY_SAFARI_ITERATORS","KEYS","VALUES","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","name","values","proto","document","EXISTS","createElement","window","userAgent","Pebble","classof","process","getBuiltIn","match","version","Deno","versions","v8","CONSTRUCTOR","METHOD","setGlobal","copyConstructorProperties","options","targetProperty","sourceProperty","descriptor","TARGET","GLOBAL","STATIC","stat","noTargetGet","sham","isExtensible","preventExtensions","FunctionPrototype","Function","apply","Reflect","aCallable","getDescriptor","callBind","namespace","method","getMethod","usingIterator","V","P","func","check","Math","globalThis","g","hasOwnProperty","a","b","console","propertyIsEnumerable","Wrapper","NewTarget","NewTargetPrototype","store","functionToString","inspectSource","cause","hiddenKeys","getOwnPropertyNamesModule","getOwnPropertyNamesExternalModule","uid","FREEZING","REQUIRED","METADATA","id","setMetadata","objectID","weakData","meta","getOwnPropertyNames","splice","getWeakData","onFreeze","NATIVE_WEAK_MAP","shared","sharedKey","OBJECT_ALREADY_INITIALIZED","WeakMap","wmget","wmhas","wmset","metadata","facade","STATE","enforce","noop","empty","construct","constructorRegExp","INCORRECT_TO_STRING","isConstructorModern","replacement","feature","detection","normalize","POLYFILL","NATIVE","string","toLowerCase","floor","isFinite","USE_SYMBOL_AS_UID","$Symbol","Result","stopped","ResultPrototype","unboundFunction","iterFn","IS_ITERATOR","INTERRUPTED","stop","condition","callFn","innerResult","innerError","PrototypeOfArrayIteratorPrototype","arrayIterator","toLength","obj","flush","head","notify","toggle","node","promise","then","macrotask","IS_IOS","IS_IOS_PEBBLE","IS_WEBOS_WEBKIT","IS_NODE","MutationObserver","WebKitMutationObserver","queueMicrotaskDescriptor","queueMicrotask","parent","domain","exit","enter","resolve","nextTick","createTextNode","observe","characterData","task","V8_VERSION","getOwnPropertySymbols","symbol","Symbol","PromiseCapability","reject","$$resolve","$$reject","$default","trim","whitespaces","charAt","n$ParseFloat","trimmedString","$parseInt","hex","radix","S","objectKeys","getOwnPropertySymbolsModule","propertyIsEnumerableModule","$assign","concat","A","B","alphabet","chr","T","j","activeXDocument","defineProperties","enumBugKeys","html","documentCreateElement","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObjectViaActiveX","write","close","temp","parentWindow","NullProtoObject","ActiveXObject","iframeDocument","iframe","JS","style","display","appendChild","src","contentWindow","open","Properties","props","IE8_DOM_DEFINE","$defineProperty","Attributes","$getOwnPropertyDescriptor","$getOwnPropertyNames","windowNames","getWindowNames","internalObjectKeys","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","names","$propertyIsEnumerable","NASHORN_BUG","aPossiblePrototype","setter","CORRECT_SETTER","__proto__","TO_ENTRIES","input","pref","val","valueOf","newPromiseCapability","x","promiseCapability","enforceInternalState","TEMPLATE","unsafe","simple","TAG","SHARED","mode","copyright","aConstructor","defaultConstructor","toIntegerOrInfinity","requireObjectCoercible","charCodeAt","CONVERT_TO_STRING","pos","second","position","codeAt","whitespace","ltrim","RegExp","rtrim","start","end","location","defer","channel","port","setImmediate","clearImmediate","Dispatch","MessageChannel","counter","queue","ONREADYSTATECHANGE","run","runner","listener","event","post","postMessage","protocol","host","args","now","port2","port1","onmessage","addEventListener","importScripts","removeChild","setTimeout","max","min","integer","ceil","number","isSymbol","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","toPrimitive","postfix","random","NATIVE_SYMBOL","WellKnownSymbolsStore","symbolFor","createWellKnownSymbol","withoutSetter","description","clearErrorStack","installErrorCause","normalizeStringArgument","ERROR_STACK_INSTALLABLE","$AggregateError","errors","message","AggregateErrorPrototype","errorsArray","AggregateError","$find","addToUnscopables","FIND","SKIPS_HOLES","ARRAY_ITERATOR","Arguments","collection","init","$entries","newPromiseCapabilityModule","perform","allSettled","capability","promiseResolve","remaining","alreadyCalled","status","reason","PROMISE_ANY_ERROR","any","alreadyResolved","alreadyRejected","NativePromise","speciesConstructor","real","onFinally","isFunction","e","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","microtask","hostReportErrors","IS_BROWSER","PROMISE","getInternalPromiseState","NativePromisePrototype","PromiseConstructor","PromisePrototype","newGenericPromiseCapability","DISPATCH_EVENT","createEvent","dispatchEvent","NATIVE_REJECTION_EVENT","PromiseRejectionEvent","UNHANDLED_REJECTION","SUBCLASSING","PROMISE_CONSTRUCTOR_SOURCE","GLOBAL_CORE_JS_PROMISE","FakePromise","INCORRECT_ITERATION","all","isThenable","isReject","notified","chain","reactions","ok","exited","reaction","handler","fail","rejection","onHandleUnhandled","onUnhandled","initEvent","isUnhandled","emit","unwrap","internalReject","internalResolve","executor","onFulfilled","onRejected","wrap","r","$promiseResolve","race","STRING_ITERATOR","point","validator","gen","count","out","substring","Guid","guid","EMPTY","isGuid","equals","other","isEmpty","toJSON","raw","extendStatics","__extends","d","p","__","Contract","DashboardLayoutChangedEvent","_super","_dashboardLayoutChangeDetails","_this","TableauEventType","DashboardLayoutChanged","TableauEvent","api_external_contract_js_1","api_shared_js_1","FilterChangedEvent","worksheet","_fieldName","_fieldId","FilterChanged","getFilterAsync","_worksheet","getFiltersAsync","filters","eventedFilter","fieldId","fieldName","TableauError","ErrorCodes","MissingFilter","TableauWorksheetEvent","MarksSelectedEvent","MarkSelectionChanged","getMarksAsync","getSelectedMarksAsync","Parameter_1","ServiceRegistryUtil_1","ParameterChangedEvent","_globalFieldName","sheet","ParameterChanged","getParameterAsync","ApiServiceRegistry","ExtensionsRegistryId","getService","findParameterByGlobalFieldNameAsync","parameterImpl","MissingParameter","Parameter","TableauSheetEvent","SummaryDataChangedEvent","SummaryDataChanged","_type","_sheet","WorkbookFormattingChangedEvent","_formatting","WorkbookFormattingChanged","BentonSansFontFamilyName","BentonSansLowDPIFontFamilyName","BentonSansBookFontFaceName","BentonSansBookItalicFontFaceName","BentonSansSemiDemiFontFaceName","BentonSansSemiDemiItalicFontFaceName","BentonSansLightFontFaceName","BentonSansMediumFontFaceName","SupportedBentonSansFontFaces","ConnectedServer","_userId","_siteId","_siteNamespace","_workbookId","ExtensionWorkbookImpl","getAllDataSourcesAsync","dataSchema","dataSources","ds","createDataSourceFromInfo","dataSourceInfo","dataSourceImpl","DataSourceImpl","dataSource","DataSource","initializeWithPublicInterfaces","WorkbookImpl","__spreadArrays","s","il","k","jl","api_internal_contract_js_1","Dashboard_1","Workbook_1","Worksheet_1","DashboardContent_1","Environment_1","Settings_1","UI_1","WorksheetContent_1","RegisterAllExtensionsServices_1","BentonSansFontNameConstants_1","ExtensionWorkbookImpl_1","LegacyInternalApiDispatcherHolder_1","SettingsImpl_1","TableauBookFontNameConstants_1","UIImpl_1","ExtensionsImpl","initializeAsync","isExtensionDialog","contextMenuCallbacks","_initializationPromise","_a","initOptions","isAlpha","ApiVersion","Instance","LegacyInternalApiDispatcherHolder","hasDesktopApiDispatcherPromise","getDesktopDispatcherPromise","dispatcherFactory","onDispatcherReceived","openPayload","catch","onDispatcherReceivedCallback_1","doCrossFrameBootstrap","INTERNAL_CONTRACT_VERSION","factory","createVizImageAsync","inputSpec","setClickThroughAsync","clickThroughEnabled","extensionZoneId","isDashboardExtensionLocator","locator","dashboardPath","InternalError","contextMenuFunctions","dispatcher","registerInitializationExtensionsServices","initializationService","callbackMapKeys","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","workbookFormatting","initializeTableauFonts","applyAllFormatting","initializeContextMenuCallbacks","initializeWorkbookFormattingChangedEventCallback","extensionDialogPayload","formattingModel","_styleElement","stylesheet","cssRules","deleteRule","formattingSheets","currentFormattingSheet","applyFormattingSheetToStyleSheet","styleInfo","cssProperties","fontFamily","fontSize","fontWeight","fontStyle","textDecoration","color","rule","classNameKey","insertRule","registerHandler","NotificationId","eventFormatting","fontNames","SupportedTableauFontFaces","formattingSheet","parameters","ParameterId","FontNameListItems","execute","VerbId","GetFonts","response","loadFonts","fonts","fontNameAndInfo","fontName","loadTableauFonts","loadBentonSansFonts","FontFace","fontBinaryInfo","info","sheetPath","sheetInfoImpl","SheetInfoImpl","SheetType","Dashboard","width","w","height","h","dashboardImpl","DashboardImpl","zones","activeDashboardObjectId","dashboard","DashboardContent","visualId","Worksheet","worksheetImpl","WorksheetImpl","WorksheetContent","settingsInfo","settingsImpl","SettingsImpl","Settings","ContextMenuClick","TableauBookFontFaceName","TableauBookFontFamilyName","weight","TableauLightFontFaceName","TableauLightFontFamilyName","TableauRegularFontFaceName","TableauRegularFontFamilyName","TableauSemiBoldFontFaceName","TableauSemiboldFontFamilyName","TableauBoldFontFaceName","TableauBoldFontFamilyName","TableauMediumFontFamilyName","TableauMediumFontFaceName","__warningIssued","__platformIsOfficialRelease","__tableauDesktopDispatcher","BlockExtension","warn","TableauEvent_1","SettingsChangedEvent","_newSettings","SettingsChanged","_saveInProgress","erase","ErrorHelpers","verifyParameter","_currentSettings","verifySettingsAreUnlocked","_isModified","getAll","saveAsync","saveSettingsAsync","newSettings","verifyStringParameter","initializeEvents","notificationService","results","settingsChangedEvent","SingleEventManagerImpl","triggerEvent","settingsValues","SettingSaveInProgress","ASYNC_SAVE_IN_PROGRESS","displayDialogAsync","url","payload","uiService","unregisterFn","ExtensionDialogUpdate","isCloseEvent","closePayload","DialogClosedByUser","closeDialog","DashboardLayoutChangedEvent_1","WorkbookFormattingChangedEvent_1","DashboardObject_1","Sheet_1","_dashboardImpl","addNewEventType","worksheetsImpl","objects","dashboardObjectImpl","DashboardObject","activeDashboardName","setZoneVisibilityAsync","zoneVisibilityMap","setDashboardObjectVisibilityAsync","dashboardObjectVisibilityMap","getDashboardObjectById","dashboardObjectId","zone","dashboardLayoutChangedEvent","dashboardObjectChanges","updateZones","activeZoneId","workbookFormattingChangedEvent","moveAndResizeDashboardObjectsAsync","dashboardObjectPositionAndSizeUpdateArray","replayAnimationAsync","replaySpeed","applyFilterAsync","updateType","Sheet","_dashboardObjectImpl","isFloating","isVisible","ParameterChangedEvent_1","currentValue","dataType","allowableValues","changeValueAsync","newValue","verifyInternalValue","parameterEvent","model","EventListenerManager","_sheetImpl","sheetType","isValidSize","EmbeddingErrorCodes","ImplementationError","testSize","findParameterAsync","parameterName","getParametersAsync","parametersImpl","_workbookImpl","FilterChangedEvent_1","MarksSelectedEvent_1","SummaryDataChangedEvent_1","_worksheetImpl","parentDashboard","SharedErrorCodes","marksEvent","SelectedMarksChanged","visualIdsAreEqual","filterEvent","filterEventResponse","summaryDataEvent","summaryDataEventResponse","applyRangeFilterAsync","filterOptions","applyHierarchicalFilterAsync","applyRelativeDateFilterAsync","clearFilterAsync","getDataSourcesAsync","getHighlightedMarksAsync","getSummaryDataAsync","getSummaryDataReaderAsync","pageRowCount","getSummaryColumnsInfoAsync","getUnderlyingDataAsync","getUnderlyingTablesAsync","getUnderlyingTableDataAsync","logicalTableId","getUnderlyingTableDataReaderAsync","getVisualSpecificationAsync","clearSelectedMarksAsync","selectMarksByIDAsync","marksInfo","selectMarksByIdAsync","selectMarksByValueAsync","selections","selectionUpdateType","annotateMarkAsync","mark","annotationText","getAnnotationsAsync","removeAnnotationAsync","annotation","hoverTupleAsync","hoveredTuple","tooltip","selectTuplesAsync","selectedTuples","selectOption","storyboard","storyPointID","_dashboard","ConnectedServer_1","WorkbookFormattingEnvUtil_1","_apiVersion","formattedValue","_context","InternalToExternalEnumMappings","extensionContext","convert","WorkbookFormattingEnvUtil","convertToWorkbookFormatting","_language","extensionLanguage","_country","extensionCountry","_locale","extensionLocale","_mode","extensionMode","_operatingSystem","operatingSystem","_tableauVersion","tableauVersion","_uniqueUserId","uniqueUserId","userId","connectedServer","siteId","siteNamespace","workbookId","featureFlags","Extensions","extensionImpl","initializeDialogAsync","_settingsImpl","isModified","_impl","workbookFormattingModel","InitializationServiceImpl","contextMenuIds","params","ExtensionContextMenuIds","IsExtensionDialog","InitializeExtension","ServiceImplBase","SettingsServiceImpl","SettingsValues","SaveExtensionSettings","DEFAULT_DIALOG_STYLE","DialogStyle","Window","UIServiceImpl","ExtensionDialogUrl","ExtensionDialogPayload","dialogStyle","InvalidParameter","ExtensionDialogH","ExtensionDialogW","verifyEnumValue","ExtensionDialogStyle","ExternalToInternalEnumMappings","dialogStyles","DisplayDialog","ExtensionDialogResult","DialogAlreadyOpen","InvalidDomain","InvalidDomainDialog","CloseDialog","verifyParameterType","ExtensionZoneId","ClickThroughEnabled","SetClickThrough","InitializationServiceImpl_1","SettingsServiceImpl_1","UIServiceImpl_1","registerService","__export","m","Enums_1","ApiMenuType","CrosstabFileFormat","DeviceType","EmbeddingTableauEventType","FileFormats","PrintOrientation","PrintPageSize","PrintScaling","SheetSizeBehavior","TableauDialogType","Toolbar","Tableau_1","ExtensionContext","ExtensionMode","VizImageEncodingType","VizImagePaletteType","VizImageSizeSettingAlignmentType","VizImageSizeSettingType","VizImageSortDirectionType","AskDataAttributes","ToolbarButtons","RevertVizSelection","PulseAttributes","VizChildElementAttributes","VizChildElements","VizAuthoringAttributes","VizAttributes","VizSharedAttributes","WebComponentChildElementAttributes","WebComponentAttributes","WebComponentChildElements","Tableau","__assign","t","n","DashboardObjectVisibilityType","HierarchicalLevelSelectionState","ReplaySpeedType","TrendLineModelType","SortDirection","SelectOptions","SelectionUpdateType","QuickTableCalcType","PeriodType","ParameterValueType","MarkType","IncludeDataValuesOption","FilterNullOption","FilterDomainType","FilterUpdateType","FilterType","FieldRoleType","FieldAggregationType","EncodingType","DateRangeType","DashboardLayoutChange","DataType","DashboardObjectType","ClassNameKey","ColumnType","AnnotationType","AnalyticsObjectType","ZoneVisibilityType","internalContractVersion","MESSAGING_VERSION","DataTypeConverter","isSpecial","valueAsString","parseBoolean","booleanString","normalizedBoolean","specialValueIndicator","parseNumber","parseDate","dateAsString","Date","getTime","parseDateTime","formattedDateString","convertValueAsStringToValue","Bool","Int","Float","DateTime","Spatial","convertValueToNativeValue","convertStringValueToNativeValue","FitPages","PageScalingOption","ScaleMode","PageOrientation","PageSizeOption","ApiShowDataTableFormat","ApiShowDataTableSentinel","QuantitativeIncludedValues","DateStepPeriod","DomainRestrictionType","EncodedDataType","AnnotateEnum","AskDataOptionNames","PulseOptionNames","VqlParameterNames","PublicParameterNames","VizOptionNames","JsApiInternalContract_1","CrossFramePreparedMessage_1","MessageTypeChecks_1","MessageTypes_1","CrossFrameMessenger","thisWindow","otherWindow","otherWindowOrigin","startListening","unregisterFunction","boundHandler_1","onMessageReceived","removeEventListener","stopListening","setInitializeMessageHandler","initializeMessageHandler","setCommandResponseMessageHandler","commandResponseMessageHandler","setCommandMessageHandler","commandMessageHandler","setNotificationMessageHandler","notificationMessageHandler","setHandshakeMessageHandler","handshakeMessageHandler","prepareInitializationMessage","apiVersion","crossFrameVersion","msgGuid","msgType","MessageType","Initialize","prepareMessage","prepareCommandMessage","verbId","Command","prepareCommandResponseMessage","commandGuid","CommandResponse","JSON","parse","stringify","prepareNotificationMessage","notificationId","Notification","prepareAckMessage","Ack","msg","CrossFramePreparedMessage","isMessage","isInitMessage","isCommandResponseMessage","isCommandMessage","isNotificationMessage","Handshake","isHandshakeMessage","setOtherWindow","setOtherWindowOrigin","origin","_message","_target","_origin","send","Notifications_1","expectedEmptyNotifications","Set","EditButtonClicked","EditInDesktopButtonClicked","WorkbookPublished","WorkbookReadyToClose","ReadyToReceiveAuthToken","isVersion","versionNumber","v","initMessage","crMessage","commandMessage","notificationMessage","IdentityVersionConverter","upgradeExecuteCall","verb","downgradeExecuteReturn","executeResponse","downgradeNotification","notification","StackingVersionConverter","_externalMajorVersion","_platformMajorVersion","_upgradeExecuteTranslations","_downgradeExecuteTranslations","_downgradeNotificationTranslations","fromData","externalVersion","upgradeExecuteTranslations","downgradeExecuteTranslations","downgradeNotificationTranslations","upgraded","_i","upgradeTranslation","downgraded","downgradeTranslation","IdentityVersionConverter_1","StackingVersionConverter_1","VersionTranslations_1","VersionEqualTo","lhs","rhs","CreateVersionConverterWithTranslators","upgrades","downgrades","notificationDowngrades","externalMajorVersion","externalMinorVersion","platformMajorVersion","neededExecuteUpgrades","GetNeededTranslations","neededExecuteDowngrades","neededNotificationDowngrades","reverse","majorMinorTranslators","neededTranslations","maximumMinorVersion","GetMaximumMinorIndex","minorVersions","reduce","VersionLessThan","ExecuteMinorUpgrades","ExecuteMinorDowngrades","DowngradeWorksheetNames","NotificationMinorDowngrades","DowngradeFlipboardZoneID","CreateVersionConverter","bootstrapInfo","sheetInfo","visualModel","flipboardZoneID","ExternalIdentityVersionConverter","downgradeExecuteCall","upgradeExecuteReturn","upgradeNotification","ExternalStackingVersionConverter","_externalVersion","_platformVersion","_downgradeExecuteCallTranslations","_upgradeExecuteReturnTranslations","_upgradeNotificationTranslations","VersionConverterFactory_1","ExternalIdentityVersionConverter_1","ExternalStackingVersionConverter_1","ExternalVersionTranslations_1","CreateExternalCompatibleVersionConverterWithTranslators","upgradeNotifications","platformMinorVersion","neededExecuteCallDowngrade","GetNeededExternalTranslations","neededExecuteReturnUpgrades","neededNotificationUpgrades","ExecuteMinorDowngradeCallExternal","DowngradeUnderlyingTableDataAsync","DowngradeLogicalTableDataAsync","ExecuteMinorUpgradeReturnExternal","UpgradeDataTableTypes","UpgradeDataTableRowsAndColumns","ExecuteMinorUpgradeNotification","CreateExternalCompatibleVersionConverter","convertDataValues","table","dataTable","row","dataValue","columnIndex","headers","validateParametersForObjectModel","LogicalTableId","SingleTableId","oldUnderlyingDataTable","isSummary","oldSelectedMarksTable","marksTable","GetUnderlyingTableData","GetUnderlyingData","GetLogicalTableData","GetDataSourceData","GetDataSummaryData","isGetSummaryDataVerb","MaxRows","maxRows","underlyingDataTable","adjustDataRowLength","isGetTableDataVerb","ColumnsToIncludeById","columnsToInclude","newHeaders","header","valueIndex","newIndex","adjustDataColumns","ApiVersion_1","CrossFrameDispatcher_1","CrossFrameDispatcher","DataSource_1","ExternalToInternalEnumMappings_1","InternalToExternalEnumMappings_1","EventListenerManager_1","Field_1","Field","CustomViewImpl_1","CustomViewImpl","DashboardImpl_1","DashboardObjectImpl_1","DashboardObjectImpl","DataSourceImpl_1","ParameterImpl_1","ParameterImpl","SheetImpl_1","SheetImpl","SheetInfoImpl_1","SingleEventManagerImpl_1","StoryImpl_1","StoryImpl","StoryPointImpl_1","StoryPointImpl","StoryPointInfoImpl_1","StoryPointInfoImpl","WorkbookImpl_1","WorksheetImpl_1","Point_1","Point","ClientInfoServiceImpl_1","ClientInfoServiceImpl","NotificationServiceImpl_1","NotificationServiceImpl","NotificationServiceImplBase_1","NotificationServiceImplBase","Registration","ServiceImplBase_1","SizeServiceImpl_1","SizeServiceImpl","StoryActivationServiceImpl_1","StoryActivationServiceImpl","TableauError_1","Deferred_1","Deferred","ErrorHelpers_1","ExportHelpers_1","ExportHelpers","SheetUtils_1","SheetUtils","VersionNumber_1","VersionNumber","VersionedExternalApiDispatcher_1","_instance","SetVersionNumber","numString","ConnectionSummary","_connectionInfo","serverURI","inIframe","opener","messenger","initializationMessage","messageGuid","_messenger","_pendingPromises","_notificationHandlers","onCommandResponse","onNotification","preparedMessage","registerNotificationHandler","unregisterNotificationHandler","pendingPromise","errorCode","IncompatibleVersionError","_dataSourceImpl","fields","extractUpdateTime","isExtract","isPublished","publishedUrl","refreshAsync","getActiveTablesAsync","getConnectionSummariesAsync","getLogicalTablesAsync","getLogicalTableDataAsync","getLogicalTableDataReaderAsync","_b","_c","_d","_e","_f","_g","_h","_j","_k","EnumConverter_1","filterDomainType","EnumConverter","Relevant","Database","nullOptions","AllValues","NonNullValues","NullValues","filterUpdateType","Add","All","Remove","Replace","setVisibilityType","Show","Hide","setReplaySpeedType","Slow","Normal","Fast","Story","showDataTableFormatType","NativeAndFormattedValues","OnlyNativeValues","NativeValuesOnly","OnlyFormattedValues","FormattedValuesOnly","periodType","Years","Quarters","Months","Weeks","Days","Hours","Minutes","Seconds","dateRangeType","Last","LastN","Next","NextN","Current","ToDate","Modal","Modeless","_l","_m","_o","_p","_q","_r","_s","_t","Desktop","Server","Authoring","Viewing","columnType","Continuous","Discrete","fieldAggregationType","Attr","Avg","Collect","Count","Countd","Day","End","Hour","InOut","Kurtosis","Max","Mdy","Median","Min","Minute","MonthYear","None","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","Unknown","dashboardObjectType","Extension","Blank","Image","Legend","PageFilter","ParameterControl","QuickFilter","Text","Title","WebPage","List","Range","dateStepPeriod","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","filterType","Categorical","RelativeDate","Hierarchical","DashboardTitle","StoryTitle","Tooltip","WorksheetTitle","hierarchicalLevelSelectionState","AllSelected","NoneSelected","SomeSelected","UnknownSelected","annotationType","Area","Mark","markType","Bar","Circle","GanttBar","Heatmap","Line","Pie","Polygon","Shape","Square","VizExtension","_eventListenerManagers","eventType","UnsupportedEventName","eventManager","_fieldImpl","aggregation","role","isHidden","isGenerated","isCalculatedField","apiNotImplemented","isCombinedField","isPresentOnPublishedDatasource","ApiShared_1","customViewModel","_registryId","_luid","luid","_name","_shared","_isDefault","isDefault","_ownerName","owner","userFriendlyName","_url","ServiceRegistry_1","_sheetInfo","_zones","_sheetPath","_parentStoryPointImpl","_activeDashboardObjectId","_worksheetsImpl","_objects","sheetName","zoneMap","zoneSize","zoneType","worksheetName","worksheetUrl","vizId","_sheetInfoImpl","zonePoint","y","zoneId","setVisibilityAsync","newZones","newActiveZoneId","newActiveDashboardName","oldDashboardObjects","oldZoneMap","oldActiveZoneId","oldActiveDashboardName","newDashboardObjects","newZoneMap","zoneChanges","oldObject","oldId","newObject","addChange","IsFloatingChanged","IsVisibleChanged","NameChanged","PositionChanged","SizeChanged","Removed","Added","Selected","Deselected","DashboardChanged","change","moveAndResizeAsync","replayAsync","verifyActiveSheetOrEmbeddedInActiveStoryPoint","getDashboardFiltersAsync","applyDashboardFilterAsync","getWorksheetNamesFromZones","worksheetNames","isRootAndActiveDashboard","active","isWithinActiveStoryPoint","parentStoryPoint","NotActiveSheet","_position","_size","_isFloating","_isVisible","_id","ConnectionSummary_1","LogicalTable_1","TableSummary_1","FieldImpl_1","_dataSourceInfo","_fields","fieldModel","fieldImpl","FieldImpl","getMaxPageRowLimit","summaries","summary","tableInfos","tableInfo","TableSummary","getDataSourceDataAsync","ignoreAliases","columnsToIncludeById","includeDataValuesOption","logicalTableInfos","logicalTableInfo","LogicalTable","_fieldInfo","_parentDataSource","DataValueFactory_1","Param_1","parameterInfo","setParameterInfo","_parameterInfo","DataValueFactory","MakeParameterDataValue","_allowableValues","coercedValue","Param","serializeParameterValue","changeParameterValueAsync","listValues","minValue","maxValue","stepSize","allowableValuesType","sheetSize","isActive","getSheetSize","isValidSheetSize","findParameterByNameAsync","getParametersForSheetAsync","changeSizeAsync","newSize","invalidSizeError","InvalidSize","behavior","partialSheetSize","normalizeSheetSize","isAutomatic","Automatic","minSize","maxSize","InvalidSizeBehaviorOnWorksheet","processedNewSize","processNewSize","getClientInfoAsync","publishedSheets","getSheetSizeFromSizeConstraints","sizeConstraint","parseDimensions","minSizeMaybe","maxSizeMaybe","hasMinWidth","isNullOrUndefined","hasMinHeight","hasMaxWidth","hasMaxHeight","hasValidMinSize","hasValidMaxSize","AtMost","MissingMaxSize","AtLeast","MissingMinSize","MissingMinMaxSize","Exactly","tryParseNumber","widthParsed","success","parsedWidth","parsed","heightParsed","parsedHeight","_sheetType","_sheetSize","_index","_isActive","_isHidden","isDashboard","_eventType","_handlers","beforeCount","eventGenerator","ShortLivedDeferred_1","storyModel","_publishedSheetInfos","_storyPointInfoImpls","_deferred","ShortLivedDeferred","initializeStory","storyPoints","storyPointModel","activeStoryPointIndex","storyPointInfoImpl","caption","storyPointId","updated","_activeStoryPointImpl","containedSheetInfo","updateStoryInfo","storyInfoImpl","StoryPointIdMismatch","updateStory","activeStoryPoint","activateNextStoryPointAsync","getNewPromiseOrThrowIfBusy","activatePreviousStoryPointAsync","activateStoryPointAsync","IndexOutOfRange","revertStoryPointAsync","clearPendingPromises","_storyPointInfoImpl","sheetInfos","registryId","_containedSheetImpl","createContainedSheet","parentStory","sheetImpl","publishedSheetInfo","getPublishedSheetInfoByName","containedSheetSize","createAutomaticSize","isContainedSheetHidden","containedSheetUrl","containedSheetInfoImpl","getSheetTypeEnum","dashboardZones","ServerError","_caption","_storyPointId","_active","_updated","_parentStoryImpl","isUpdated","GetDataService_1","_visualId","_parentDashboardImpl","verifyActiveSheet","nullOption","verifyRangeParamType","levels","rangeType","worksheetDataSourceInfo","worksheetDataSchemaMap","primaryId","primaryDataSource","referencedDataSourceList","secondaryId","GetDataType","Summary","ignoreSelection","Underlying","includeAllColumns","appendContextMenuAsync","targetMenu","config","removeContextMenuAsync","menuItemId","executeContextMenuAsync","renameContextMenuAsync","menuHeader","menuDescription","isInsideDashboardExtension","isRootAndActiveWorksheet","isInsideActiveDashboard","isInsideActiveStoryPoint","_logicalTable","Filter","_worksheetName","_filterType","getFieldAsync","getAppliedWorksheetsAsync","setAppliedWorksheetsAsync","applyToWorksheets","uniqueWorksheets","CategoricalFilter","_appliedValues","_isExcludeMode","_isAllSelected","getDomainAsync","domainType","getCategoricalDomainAsync","HierarchicalDataValue","_value","_hierarchicalPath","_level","HierarchicalLevelDetail","_levelSelectionState","HierarchicalFilter","_dimensionName","_hierarchyCaption","_numberOfLevels","_levelDetails","RangeFilter","_min","_max","_includeNullValues","service","getRangeDomainAsync","RelativeDateFilter","_anchorDate","_periodType","_rangeType","_rangeN","CategoricalDomain","_values","_domainType","RangeDomain","DataTable","_data","_columns","_totalRowCount","_isTotalRowCountLimited","_isSummaryData","_marksInfo","MarkInfo","_color","_tupleId","Column","_dataType","_isReferenced","DataValue","_nativeValue","_formattedValue","__awaiter","thisArg","_arguments","generator","fulfilled","rejected","__generator","body","_","label","sent","trys","ops","op","pop","DataTableReader","_pageRowCount","_pageCount","getPageAsync","pageNumber","verifyRange","getAllPagesAsync","firstPage","rowsRequested","pagesRequested","pagesToFetch","isDataLimited","remainingData","page","fullData","totalRowCount","columns","isTotalRowCountLimited","isSummaryData","releaseAsync","SelectionModel","ValueSelectionModel","selectValues","HierarchicalSelectionModel","RangeSelectionModel","DimensionSelectionModel","TupleSelectionModel","objectIds","SelectionModelsContainer","hierModelArr","dimModelArr","quantModelArr","SelectTuplesInteractionModel","visualIdPresModel","tupleIds","selectOptions","tooltipContext","HoverTupleInteractionModel","tupleId","_x","_y","AnimationServiceImpl_1","AnnotationServiceImpl_1","DataSourceServiceImpl_1","ExportServiceImpl_1","ExternalContextMenuServiceImpl_1","FilterServiceImpl_1","GetDataServiceImpl_1","ParametersServiceImpl_1","SelectionServiceImpl_1","VisualModelServiceImpl_1","VizServiceImpl_1","ZoneServiceImpl_1","AnimationServiceImpl","DataSourceServiceImpl","ExportServiceImpl","GetDataServiceImpl","FilterServiceImpl","ParametersServiceImpl","SelectionServiceImpl","AnnotationServiceImpl","ZoneServiceImpl","VisualModelServiceImpl","VizServiceImpl","ExternalContextMenuServiceImpl","__tableauApiServiceRegistry","ServiceRegistryImpl","_services","serviceName","setInstance","serviceRegistry","clearRegistry","ReplaySpeed","ReplayAnimation","SelectionModels_1","selectionModelContainer","parseMarkSelectionIds","formattedText","VisualId","TargetPoint","SelectionList","selection","FormattedText","CreateAnnotation","GetAnnotations","annotationsList","annotationFilterMap","parseAnnotationSelectionIds","RemoveAnnotation","marks","ids","tupleSelectionModel","selectionType","annotations","annotationId","mapAnnotation","annotationHTML","annotationPlainText","annotateEnum","GetEmbeddingClientInfo","InternalContract","SENTINEL_LOGICAL_TABLE_INFO","SingleTableCaption","platformVersionObjectModelSupport","dataSourceId","DeltaTimeMs","ShouldRefreshDS","DataSourceId","RefreshDataSource","joinParameters","GetActiveTables","joinResponse","tables","UnsupportedMethodForDataSourceType","GetDataSources","GetAllDataSources","GetConnectionDescriptionSummaries","globalfieldName","GetFieldAndDataSource","FieldId","field","convertField","convertDataSource","isObjectModelSupportedByPlatform","GetLogicalTables","GetUnderlyingTables","getExportCrosstabSheetMapAsync","currentSheetType","GetExportCrosstabSheetMap","CurrentSheetType","exportCrosstabAsync","format","exportableWorksheetNames","sheetNameToIdMap","verifySheetName","SheetIdentifier","SendNotifications","CSV","ExportCrosstabCsvDownload","UseTabDelimiters","Excel","ExportCrosstabExcelDownload","CrosstabCreationError","exportDataAsync","verifyExportDataOptions","columnsAsSet","ExportDataDownload","IgnoreAliases","DataCreationError","exportPowerPointAsync","sheetNames","exportScenarios","verifySheetNamesForPDFAndPPT","ExportPowerpointDownload","ExportOriginUrl","SelectedSheetNames","PowerPointCreationError","exportPDFAsync","externalExportPdfOptions","internalExportPdfOptions","verifyExportPDFOptions","getExportPDFOptionsAsync","updateInternalExportPDFOptions","ExportPdfDownload","ExportPdfOptions","PDFCreationError","GetExportPdfOptions","AppendExternalMenuItem","WorksheetName","ExternalMenuItemDisplayName","displayName","RemoveExternalMenuItem","ExternalMenuItemId","ExecuteExternalMenuItem","RenameExternalMenu","ExternalMenuHeader","ExternalMenuDescription","FilterModels_1","ApplyCategoricalFilter","FieldName","FilterValues","IsExcludeMode","isExcludeMode","ApplyRangeFilter","serializeDateForPlatform","FilterRangeMin","FilterRangeMax","FilterRangeNullOption","apiFilterHandlerCheckForCommandError","hierarchicalLevels","FilterLevels","ClearFilter","resposne","ApplyRelativeDateFilter","rangeN","MissingRangeNForRelativeDateFilters","RangeN","anchorDate","AnchorDate","convertAnchorDate","GetFilters","convertDomainFilters","GetCategoricalDomain","DomainType","convertCategoricalDomain","GetRangeDomain","convertRangeDomain","GetDashboardFilters","DashboardCategoricalFilter","sharedFilterModel","executeGetAppliedWorksheets","worksheets","worksheetInfo","isSelected","allowedWorksheets","activeWorksheet","isEnabled","ChangeSharedFilter","SharedFilterSheets","telemetryFunctionName","GetSharedFilter","domainFilters","domainFilter","convertCategoricalFilter","convertHierarchicalFilter","convertRangeFilter","convertRelativeDateFilter","appliedValues","dv","MakeFilterDataValue","fieldCaption","isExclude","isAllSelected","hierarchicalDataValue","hierarchicalPath","level","levelDetails","levelInfo","aLevel","levelSelectionState","dimensionName","hierarchyCaption","includeNullValues","anchorDateValue","domainDv","year","getUTCFullYear","month","getUTCMonth","day","getUTCDate","hh","getUTCHours","mm","getUTCMinutes","sec","getUTCSeconds","InvalidDateParameter","serverPm","ParameterError","InvalidFieldCaption","InvalidFilterFieldName","InvalidValues","InvalidFilterFieldValue","InvalidAggFieldName","InvalidAggregationFieldName","uuid_1","GetDataModels_1","GetDataTableReaderModels_1","viewDataTableCacheId","v4","getMaxRowLimit","getViewDataTableCacheId","getLimitedMaxRows","requestedRows","rowCountLimit","getType","summaryData","functionName","requestMaxRows","IgnoreSelection","IncludeAllColumns","verifyIncludeColumnArray","ShowDataTableFormat","responseData","processResultsTable","ViewDataTableCacheId","PageRowCount","GetDataSummaryDataReader","isReferenced","GetSelectedMarks","GetHighlightedMarks","ColumnsToInclude","datasourceId","GetLogicalTableDataReader","GetUnderlyingTableDataReader","tableId","pageSize","ViewDataTableId","DataRowIndex","GetDataTableReaderPage","processResultsPage","summaryTableId","ReleaseDataTableReader","cell","MakeTableDataValue","_filterFn","_callbackFn","notificationModel","filterFn","handlers","registration","removeRegistration","hasHandlersForNotificationType","reg","SheetPath","getAllParametersAsync","inputParameters","GetParametersForSheet","ParameterFieldName","ParameterValue","ChangeParameterValue","ParameterCaption","FindParameter","ClearSelectedMarks","selectionCriterias","validateSelectionUpdateType","parseSelectionMarks","HierValSelectionModels","QuantRangeSelectionModels","DimValSelectionModels","SelectByValue","interactionModel","HoverTupleInteraction","RaiseHoverTupleNotification","option","validateSelectOption","SelectTuplesInteraction","RaiseSelectTuplesNotification","InvalidFields","InvalidSelectionFieldName","InvalidSelectionValue","InvalidDates","InvalidSelectionDate","parseSelectionIds","Selection","st","catRegex","rangeOption","hierModel","addToParamsList","quantModel","addToRangeParamsList","dimModel","valueSelectionModel","markValues","valueArr","qualifiedFieldCaption","rangeSelectionModel","included","validateNullOptionType","IncludeNull","IncludeNonNull","IncludeAll","Simple","Toggle","_dispatcher","internalError","externalErrorCode","ShouldThrow","No","SheetName","MinHeight","MinWidth","MaxHeight","MaxWidth","SetSheetSize","_response","ActivateNextStoryPoint","ActivatePreviousStoryPoint","ActivateStoryPoint","StoryPointIndex","RevertStoryPoint","GetVisualSpecification","VizAPIInputJson","VizAPI","activateSheetAsync","SwitchToSheetName","ActivateSheet","getCustomViewsAsync","GetCustomViews","customView","showCustomViewAsync","customViewName","CustomViewName","ShowCustomView","removeCustomViewAsync","RemoveCustomView","saveCustomViewAsync","CustomViewIsDefault","SaveWorkbookAsCustomView","setActiveCustomViewAsDefaultAsync","SetActiveCustomViewAsDefault","CustomViewLuid","CustomViewIsPublic","UpdateCustomView","getCurrentSrcAsync","GetCurrentSrc","dashboardZoneMap","ZoneIdsVisibilityMap","convertParameterToMap","verifyZoneIsValid","SetZoneVisibility","DashboardObjectPositionAndSizeUpdateList","dashboardObject","verifyZoneIsValidAndFloating","dashboardObjectID","verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate","MoveAndResizeZones","_tableInfo","connectionId","customSQL","_errorCode","internalDataValue","_promise","_resolve","_reject","UnregisterTimeoutInMilliseconds","_mappings","_defaultVal","enumVal","throwIfMissing","Yes","apiName","argumentValue","argumentName","expectedType","enumValue","enumType","enumName","isValid","enumKey","isTypeNumber","isTypeDate","zoneID","dashboardObjectPositionAndSizeUpdate","exportableSheetNames","InvalidSelectionSheet","isTypeBool","exportableSheetNamesFromDashboard","exportableSheetNamesFromWorkbook","currentSheetName","orientation","scaling","currentSheet","updateExportLayoutOptions","updateSheetOptions","exportLayoutOptions","imageHeight","DefaultLayoutOptions","imageWidth","Landscape","pageOrientationOption","Portrait","A3","pageSizeOption","A4","A5","B4","B5","Executive","Folio","Ledger","Legal","Letter","Note","Quarto","Statement","Tabloid","Unspecified","AtMost1PageHigh","setFitAndScaleValues","FitOneHigh","AtMost1PageWide","FitOneWide","AtMost2PagesHigh","FitTwoHigh","AtMost2PagesWide","FitTwoWide","ScalePctAuto","Perc100","ScalePct100","Perc200","ScalePct200","Perc25","ScalePct25","Perc400","ScalePct400","Perc50","ScalePct50","Perc60","ScalePct60","Perc75","ScalePct75","Perc80","ScalePct80","Perc90","ScalePct90","sheetOptions_1","sheetOptions","sheetOption","scalingSelection","pageFitHorizontal","pageFitVertical","pageScaleMode","pageScalePercent","fitMatch","fitRegex","percentMatch","pctRegex","ScaleFitPages","ScalePercentage","DefaultDataOptions","DefaultPDFOptions","ScaleAuto","date","serializeBooleanForPlatform","bool","serializeNumberForPlatform","num","isTypeString","Boolean","param","paramName","valueString","NaN","minWidth","minHeight","maxWidth","maxHeight","isDsdLayout","internalSheetType","sizeObject","_timeoutInMilliseconds","ApiExecutionError","_timeoutId","Timeout","clearTimeout","versionString","partStr","build","getBuildNumber","parts","preReleaseString","_apiDelegateDispatcher","platformVersionNumber","_versionConverter","upgradedNotification","downgradeParameters","getRandomValues","rnds8","Uint8Array","rng","crypto","msCrypto","uuid","byteToHex","substr","arr","offset","_nodeId","_clockseq","_lastMSecs","_lastNSecs","buf","clockseq","seedBytes","msecs","nsecs","dt","tl","tmh","hashfunc","generateUUID","str","unescape","encodeURIComponent","bytes","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","cnt","md5ff","c","md5gg","md5hh","md5ii","v35","output","length32","hexTab","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","z","ROTL","K","H","l","N","M","pow","_i2","W","_t2","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","o","prop","toStringTag","ExtensionsImpl_1","Extensions_1","VERSION_IS_ALPHA","extensions"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/previous/tableau.extensions.1.11.1.js b/lib/previous/tableau.extensions.1.11.1.js new file mode 100644 index 00000000..824c3407 --- /dev/null +++ b/lib/previous/tableau.extensions.1.11.1.js @@ -0,0 +1,19982 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "../../node_modules/core-js/es/array/find.js": +/*!***************************************************!*\ + !*** ../../node_modules/core-js/es/array/find.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.array.find */ "../../node_modules/core-js/modules/es.array.find.js"); +var entryUnbind = __webpack_require__(/*! ../../internals/entry-unbind */ "../../node_modules/core-js/internals/entry-unbind.js"); + +module.exports = entryUnbind('Array', 'find'); + + +/***/ }), + +/***/ "../../node_modules/core-js/es/array/from.js": +/*!***************************************************!*\ + !*** ../../node_modules/core-js/es/array/from.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); +__webpack_require__(/*! ../../modules/es.array.from */ "../../node_modules/core-js/modules/es.array.from.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Array.from; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/map/index.js": +/*!**************************************************!*\ + !*** ../../node_modules/core-js/es/map/index.js ***! + \**************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.array.iterator */ "../../node_modules/core-js/modules/es.array.iterator.js"); +__webpack_require__(/*! ../../modules/es.map */ "../../node_modules/core-js/modules/es.map.js"); +__webpack_require__(/*! ../../modules/es.object.to-string */ "../../node_modules/core-js/modules/es.object.to-string.js"); +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Map; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/number/is-integer.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/es/number/is-integer.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.number.is-integer */ "../../node_modules/core-js/modules/es.number.is-integer.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.isInteger; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/number/is-nan.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/es/number/is-nan.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.number.is-nan */ "../../node_modules/core-js/modules/es.number.is-nan.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.isNaN; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/number/parse-float.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/es/number/parse-float.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.number.parse-float */ "../../node_modules/core-js/modules/es.number.parse-float.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.parseFloat; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/number/parse-int.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/es/number/parse-int.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.number.parse-int */ "../../node_modules/core-js/modules/es.number.parse-int.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.parseInt; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/object/assign.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/es/object/assign.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.object.assign */ "../../node_modules/core-js/modules/es.object.assign.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.assign; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/object/entries.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/es/object/entries.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.object.entries */ "../../node_modules/core-js/modules/es.object.entries.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.entries; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/object/set-prototype-of.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/es/object/set-prototype-of.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.object.set-prototype-of */ "../../node_modules/core-js/modules/es.object.set-prototype-of.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.setPrototypeOf; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/promise/index.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/es/promise/index.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.aggregate-error */ "../../node_modules/core-js/modules/es.aggregate-error.js"); +__webpack_require__(/*! ../../modules/es.array.iterator */ "../../node_modules/core-js/modules/es.array.iterator.js"); +__webpack_require__(/*! ../../modules/es.object.to-string */ "../../node_modules/core-js/modules/es.object.to-string.js"); +__webpack_require__(/*! ../../modules/es.promise */ "../../node_modules/core-js/modules/es.promise.js"); +__webpack_require__(/*! ../../modules/es.promise.all-settled */ "../../node_modules/core-js/modules/es.promise.all-settled.js"); +__webpack_require__(/*! ../../modules/es.promise.any */ "../../node_modules/core-js/modules/es.promise.any.js"); +__webpack_require__(/*! ../../modules/es.promise.finally */ "../../node_modules/core-js/modules/es.promise.finally.js"); +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Promise; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/a-callable.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/a-callable.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); + +var TypeError = global.TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw TypeError(tryToString(argument) + ' is not a function'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/a-constructor.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/a-constructor.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); + +var TypeError = global.TypeError; + +// `Assert: IsConstructor(argument) is true` +module.exports = function (argument) { + if (isConstructor(argument)) return argument; + throw TypeError(tryToString(argument) + ' is not a constructor'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/a-possible-prototype.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/a-possible-prototype.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); + +var String = global.String; +var TypeError = global.TypeError; + +module.exports = function (argument) { + if (typeof argument == 'object' || isCallable(argument)) return argument; + throw TypeError("Can't set " + String(argument) + ' as a prototype'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/add-to-unscopables.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/internals/add-to-unscopables.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); + +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; + +// Array.prototype[@@unscopables] +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] == undefined) { + definePropertyModule.f(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} + +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/an-instance.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/an-instance.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); + +var TypeError = global.TypeError; + +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) return it; + throw TypeError('Incorrect invocation'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/an-object.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/an-object.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); + +var String = global.String; +var TypeError = global.TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw TypeError(String(argument) + ' is not an object'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-from.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/array-from.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); +var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "../../node_modules/core-js/internals/call-with-safe-iteration-closing.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "../../node_modules/core-js/internals/is-array-iterator-method.js"); +var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); +var createProperty = __webpack_require__(/*! ../internals/create-property */ "../../node_modules/core-js/internals/create-property.js"); +var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "../../node_modules/core-js/internals/get-iterator.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); + +var Array = global.Array; + +// `Array.from` method implementation +// https://tc39.es/ecma262/#sec-array.from +module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var IS_CONSTRUCTOR = isConstructor(this); + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined); + var iteratorMethod = getIteratorMethod(O); + var index = 0; + var length, result, step, iterator, next, value; + // if the target is not iterable or it's an array with the default iterator - use a simple case + if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) { + iterator = getIterator(O, iteratorMethod); + next = iterator.next; + result = IS_CONSTRUCTOR ? new this() : []; + for (;!(step = call(next, iterator)).done; index++) { + value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; + createProperty(result, index, value); + } + } else { + length = lengthOfArrayLike(O); + result = IS_CONSTRUCTOR ? new this(length) : Array(length); + for (;length > index; index++) { + value = mapping ? mapfn(O[index], index) : O[index]; + createProperty(result, index, value); + } + } + result.length = index; + return result; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-includes.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/array-includes.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "../../node_modules/core-js/internals/to-absolute-index.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-iteration.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/array-iteration.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); +var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "../../node_modules/core-js/internals/array-species-create.js"); + +var push = uncurryThis([].push); + +// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation +var createMethod = function (TYPE) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var IS_FILTER_REJECT = TYPE == 7; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + return function ($this, callbackfn, that, specificCreate) { + var O = toObject($this); + var self = IndexedObject(O); + var boundFunction = bind(callbackfn, that); + var length = lengthOfArrayLike(self); + var index = 0; + var create = specificCreate || arraySpeciesCreate; + var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; + var value, result; + for (;length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: return true; // some + case 5: return value; // find + case 6: return index; // findIndex + case 2: push(target, value); // filter + } else switch (TYPE) { + case 4: return false; // every + case 7: push(target, value); // filterReject + } + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; +}; + +module.exports = { + // `Array.prototype.forEach` method + // https://tc39.es/ecma262/#sec-array.prototype.foreach + forEach: createMethod(0), + // `Array.prototype.map` method + // https://tc39.es/ecma262/#sec-array.prototype.map + map: createMethod(1), + // `Array.prototype.filter` method + // https://tc39.es/ecma262/#sec-array.prototype.filter + filter: createMethod(2), + // `Array.prototype.some` method + // https://tc39.es/ecma262/#sec-array.prototype.some + some: createMethod(3), + // `Array.prototype.every` method + // https://tc39.es/ecma262/#sec-array.prototype.every + every: createMethod(4), + // `Array.prototype.find` method + // https://tc39.es/ecma262/#sec-array.prototype.find + find: createMethod(5), + // `Array.prototype.findIndex` method + // https://tc39.es/ecma262/#sec-array.prototype.findIndex + findIndex: createMethod(6), + // `Array.prototype.filterReject` method + // https://github.com/tc39/proposal-array-filtering + filterReject: createMethod(7) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-slice.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/array-slice.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = uncurryThis([].slice); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-species-constructor.js": +/*!*************************************************************************!*\ + !*** ../../node_modules/core-js/internals/array-species-constructor.js ***! + \*************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isArray = __webpack_require__(/*! ../internals/is-array */ "../../node_modules/core-js/internals/is-array.js"); +var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var SPECIES = wellKnownSymbol('species'); +var Array = global.Array; + +// a part of `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray) { + var C; + if (isArray(originalArray)) { + C = originalArray.constructor; + // cross-realm fallback + if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined; + else if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-species-create.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/array-species-create.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var arraySpeciesConstructor = __webpack_require__(/*! ../internals/array-species-constructor */ "../../node_modules/core-js/internals/array-species-constructor.js"); + +// `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray, length) { + return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/call-with-safe-iteration-closing.js": +/*!********************************************************************************!*\ + !*** ../../node_modules/core-js/internals/call-with-safe-iteration-closing.js ***! + \********************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../../node_modules/core-js/internals/iterator-close.js"); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/check-correctness-of-iteration.js": +/*!******************************************************************************!*\ + !*** ../../node_modules/core-js/internals/check-correctness-of-iteration.js ***! + \******************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var SAFE_CLOSING = false; + +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; + }, + 'return': function () { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function () { + return this; + }; + // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing + Array.from(iteratorWithReturn, function () { throw 2; }); +} catch (error) { /* empty */ } + +module.exports = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error) { /* empty */ } + return ITERATION_SUPPORT; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/classof-raw.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/classof-raw.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/classof.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/internals/classof.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var Object = global.Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/clear-error-stack.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/clear-error-stack.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); + +var replace = uncurryThis(''.replace); +var split = uncurryThis(''.split); +var join = uncurryThis([].join); + +var TEST = (function (arg) { return String(Error(arg).stack); })('zxcasd'); +var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; +var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); +var IS_FIREFOX_OR_SAFARI_STACK = /@[^\n]*\n/.test(TEST) && !/zxcasd/.test(TEST); + +module.exports = function (stack, dropEntries) { + if (typeof stack != 'string') return stack; + if (IS_V8_OR_CHAKRA_STACK) { + while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); + } else if (IS_FIREFOX_OR_SAFARI_STACK) { + return join(arraySlice(split(stack, '\n'), dropEntries), '\n'); + } return stack; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/collection-strong.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/collection-strong.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../node_modules/core-js/internals/redefine-all.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); +var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../node_modules/core-js/internals/set-species.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var fastKey = (__webpack_require__(/*! ../internals/internal-metadata */ "../../node_modules/core-js/internals/internal-metadata.js").fastKey); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); + +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; + +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var Constructor = wrapper(function (that, iterable) { + anInstance(that, Prototype); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + index: create(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!DESCRIPTORS) that.size = 0; + if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); + }); + + var Prototype = Constructor.prototype; + + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; + // change existing entry + if (entry) { + entry.value = value; + // create new entry + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) state.first = entry; + if (previous) previous.next = entry; + if (DESCRIPTORS) state.size++; + else that.size++; + // add to index + if (index !== 'F') state.index[index] = entry; + } return that; + }; + + var getEntry = function (that, key) { + var state = getInternalState(that); + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return state.index[index]; + // frozen object case + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) return entry; + } + }; + + redefineAll(Prototype, { + // `{ Map, Set }.prototype.clear()` methods + // https://tc39.es/ecma262/#sec-map.prototype.clear + // https://tc39.es/ecma262/#sec-set.prototype.clear + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + while (entry) { + entry.removed = true; + if (entry.previous) entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + state.first = state.last = undefined; + if (DESCRIPTORS) state.size = 0; + else that.size = 0; + }, + // `{ Map, Set }.prototype.delete(key)` methods + // https://tc39.es/ecma262/#sec-map.prototype.delete + // https://tc39.es/ecma262/#sec-set.prototype.delete + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) prev.next = next; + if (next) next.previous = prev; + if (state.first == entry) state.first = next; + if (state.last == entry) state.last = prev; + if (DESCRIPTORS) state.size--; + else that.size--; + } return !!entry; + }, + // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods + // https://tc39.es/ecma262/#sec-map.prototype.foreach + // https://tc39.es/ecma262/#sec-set.prototype.foreach + forEach: function forEach(callbackfn /* , that = undefined */) { + var state = getInternalState(this); + var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined); + var entry; + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + } + }, + // `{ Map, Set}.prototype.has(key)` methods + // https://tc39.es/ecma262/#sec-map.prototype.has + // https://tc39.es/ecma262/#sec-set.prototype.has + has: function has(key) { + return !!getEntry(this, key); + } + }); + + redefineAll(Prototype, IS_MAP ? { + // `Map.prototype.get(key)` method + // https://tc39.es/ecma262/#sec-map.prototype.get + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + // `Map.prototype.set(key, value)` method + // https://tc39.es/ecma262/#sec-map.prototype.set + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + // `Set.prototype.add(value)` method + // https://tc39.es/ecma262/#sec-set.prototype.add + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (DESCRIPTORS) defineProperty(Prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return Constructor; + }, + setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); + // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods + // https://tc39.es/ecma262/#sec-map.prototype.entries + // https://tc39.es/ecma262/#sec-map.prototype.keys + // https://tc39.es/ecma262/#sec-map.prototype.values + // https://tc39.es/ecma262/#sec-map.prototype-@@iterator + // https://tc39.es/ecma262/#sec-set.prototype.entries + // https://tc39.es/ecma262/#sec-set.prototype.keys + // https://tc39.es/ecma262/#sec-set.prototype.values + // https://tc39.es/ecma262/#sec-set.prototype-@@iterator + defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + // get next entry + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + // or finish the iteration + state.target = undefined; + return { value: undefined, done: true }; + } + // return step by kind + if (kind == 'keys') return { value: entry.key, done: false }; + if (kind == 'values') return { value: entry.value, done: false }; + return { value: [entry.key, entry.value], done: false }; + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // `{ Map, Set }.prototype[@@species]` accessors + // https://tc39.es/ecma262/#sec-get-map-@@species + // https://tc39.es/ecma262/#sec-get-set-@@species + setSpecies(CONSTRUCTOR_NAME); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/collection.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/collection.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "../../node_modules/core-js/internals/internal-metadata.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); +var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "../../node_modules/core-js/internals/inherit-if-required.js"); + +module.exports = function (CONSTRUCTOR_NAME, wrapper, common) { + var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; + var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; + var ADDER = IS_MAP ? 'set' : 'add'; + var NativeConstructor = global[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var exported = {}; + + var fixMethod = function (KEY) { + var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]); + redefine(NativePrototype, KEY, + KEY == 'add' ? function add(value) { + uncurriedNativeMethod(this, value === 0 ? 0 : value); + return this; + } : KEY == 'delete' ? function (key) { + return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'get' ? function get(key) { + return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'has' ? function has(key) { + return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : function set(key, value) { + uncurriedNativeMethod(this, key === 0 ? 0 : key, value); + return this; + } + ); + }; + + var REPLACE = isForced( + CONSTRUCTOR_NAME, + !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + })) + ); + + if (REPLACE) { + // create collection constructor + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + InternalMetadataModule.enable(); + } else if (isForced(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + // eslint-disable-next-line no-new -- required for testing + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); }); + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new NativeConstructor(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (dummy, iterable) { + anInstance(dummy, NativePrototype); + var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); + if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + + // weak collections should not contains .clear method + if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; + } + + exported[CONSTRUCTOR_NAME] = Constructor; + $({ global: true, forced: Constructor != NativeConstructor }, exported); + + setToStringTag(Constructor, CONSTRUCTOR_NAME); + + if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + + return Constructor; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/copy-constructor-properties.js": +/*!***************************************************************************!*\ + !*** ../../node_modules/core-js/internals/copy-constructor-properties.js ***! + \***************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "../../node_modules/core-js/internals/own-keys.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); + +module.exports = function (target, source) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/correct-prototype-getter.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/internals/correct-prototype-getter.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/create-iterator-constructor.js": +/*!***************************************************************************!*\ + !*** ../../node_modules/core-js/internals/create-iterator-constructor.js ***! + \***************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var IteratorPrototype = (__webpack_require__(/*! ../internals/iterators-core */ "../../node_modules/core-js/internals/iterators-core.js").IteratorPrototype); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); + +var returnThis = function () { return this; }; + +module.exports = function (IteratorConstructor, NAME, next) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/create-non-enumerable-property.js": +/*!******************************************************************************!*\ + !*** ../../node_modules/core-js/internals/create-non-enumerable-property.js ***! + \******************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/create-property-descriptor.js": +/*!**************************************************************************!*\ + !*** ../../node_modules/core-js/internals/create-property-descriptor.js ***! + \**************************************************************************/ +/***/ ((module) => { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/create-property.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/create-property.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = function (object, key, value) { + var propertyKey = toPropertyKey(key); + if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); + else object[propertyKey] = value; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/define-iterator.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/define-iterator.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); +var FunctionName = __webpack_require__(/*! ../internals/function-name */ "../../node_modules/core-js/internals/function-name.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "../../node_modules/core-js/internals/create-iterator-constructor.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); +var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "../../node_modules/core-js/internals/iterators-core.js"); + +var PROPER_FUNCTION_NAME = FunctionName.PROPER; +var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var ITERATOR = wellKnownSymbol('iterator'); +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; + +var returnThis = function () { return this; }; + +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; + case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; + case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; + } return function () { return new IteratorConstructor(this); }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] + || IterablePrototype['@@iterator'] + || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + + // fix native + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { + redefine(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + // Set @@toStringTag to native iterators + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; + } + } + + // fix Array.prototype.{ values, @@iterator }.name in V8 / FF + if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { + createNonEnumerableProperty(IterablePrototype, 'name', VALUES); + } else { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { return call(nativeIterator, this); }; + } + } + + // export additional methods + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine(IterablePrototype, KEY, methods[KEY]); + } + } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + + // define iterator + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); + } + Iterators[NAME] = defaultIterator; + + return methods; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/descriptors.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/descriptors.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/document-create-element.js": +/*!***********************************************************************!*\ + !*** ../../node_modules/core-js/internals/document-create-element.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); + +var document = global.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-browser.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-browser.js ***! + \*****************************************************************/ +/***/ ((module) => { + +module.exports = typeof window == 'object'; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-ios-pebble.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-ios-pebble.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = /ipad|iphone|ipod/i.test(userAgent) && global.Pebble !== undefined; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-ios.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-ios.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); + +module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-node.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-node.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = classof(global.process) == 'process'; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-webos-webkit.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-webos-webkit.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); + +module.exports = /web0s(?!.*chrome)/i.test(userAgent); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-user-agent.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-user-agent.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); + +module.exports = getBuiltIn('navigator', 'userAgent') || ''; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-v8-version.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-v8-version.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); + +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/entry-unbind.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/entry-unbind.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = function (CONSTRUCTOR, METHOD) { + return uncurryThis(global[CONSTRUCTOR].prototype[METHOD]); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/enum-bug-keys.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/enum-bug-keys.js ***! + \*************************************************************/ +/***/ ((module) => { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/error-stack-installable.js": +/*!***********************************************************************!*\ + !*** ../../node_modules/core-js/internals/error-stack-installable.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = !fails(function () { + var error = Error('a'); + if (!('stack' in error)) return true; + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7)); + return error.stack !== 7; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/export.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/internals/export.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js").f); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "../../node_modules/core-js/internals/copy-constructor-properties.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.noTargetGet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || setGlobal(TARGET, {}); + } else { + target = (global[TARGET] || {}).prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + // extend global + redefine(target, key, sourceProperty, options); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/fails.js": +/*!*****************************************************!*\ + !*** ../../node_modules/core-js/internals/fails.js ***! + \*****************************************************/ +/***/ ((module) => { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/freezing.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/internals/freezing.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing + return Object.isExtensible(Object.preventExtensions({})); +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-apply.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-apply.js ***! + \**************************************************************/ +/***/ ((module) => { + +var FunctionPrototype = Function.prototype; +var apply = FunctionPrototype.apply; +var bind = FunctionPrototype.bind; +var call = FunctionPrototype.call; + +// eslint-disable-next-line es/no-reflect -- safe +module.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () { + return call.apply(apply, arguments); +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-bind-context.js": +/*!*********************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-bind-context.js ***! + \*********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-call.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-call.js ***! + \*************************************************************/ +/***/ ((module) => { + +var call = Function.prototype.call; + +module.exports = call.bind ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-name.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-name.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-uncurry-this.js": +/*!*********************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-uncurry-this.js ***! + \*********************************************************************/ +/***/ ((module) => { + +var FunctionPrototype = Function.prototype; +var bind = FunctionPrototype.bind; +var call = FunctionPrototype.call; +var callBind = bind && bind.bind(call); + +module.exports = bind ? function (fn) { + return fn && callBind(call, fn); +} : function (fn) { + return fn && function () { + return call.apply(fn, arguments); + }; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/get-built-in.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/get-built-in.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/get-iterator-method.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/internals/get-iterator-method.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); +var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = function (it) { + if (it != undefined) return getMethod(it, ITERATOR) + || getMethod(it, '@@iterator') + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/get-iterator.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/get-iterator.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); + +var TypeError = global.TypeError; + +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); + throw TypeError(tryToString(argument) + ' is not iterable'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/get-method.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/get-method.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return func == null ? undefined : aCallable(func); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/global.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/internals/global.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var check = function (it) { + return it && it.Math == Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof __webpack_require__.g == 'object' && __webpack_require__.g) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/has-own-property.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/internals/has-own-property.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/hidden-keys.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/hidden-keys.js ***! + \***********************************************************/ +/***/ ((module) => { + +module.exports = {}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/host-report-errors.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/internals/host-report-errors.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = function (a, b) { + var console = global.console; + if (console && console.error) { + arguments.length == 1 ? console.error(a) : console.error(a, b); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/html.js": +/*!****************************************************!*\ + !*** ../../node_modules/core-js/internals/html.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); + +module.exports = getBuiltIn('document', 'documentElement'); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/ie8-dom-define.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/ie8-dom-define.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); + +// Thank's IE8 for his funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- requied for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a != 7; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/indexed-object.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/indexed-object.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); + +var Object = global.Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split(it, '') : Object(it); +} : Object; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/inherit-if-required.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/internals/inherit-if-required.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); + +// makes subclassing work correct for wrapped built-ins +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + isCallable(NewTarget = dummy.constructor) && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/inspect-source.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/inspect-source.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var store = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/install-error-cause.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/internals/install-error-cause.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); + +// `InstallErrorCause` abstract operation +// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause +module.exports = function (O, options) { + if (isObject(options) && 'cause' in options) { + createNonEnumerableProperty(O, 'cause', options.cause); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/internal-metadata.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/internal-metadata.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertyNamesExternalModule = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "../../node_modules/core-js/internals/object-get-own-property-names-external.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "../../node_modules/core-js/internals/freezing.js"); + +var REQUIRED = false; +var METADATA = uid('meta'); +var id = 0; + +// eslint-disable-next-line es/no-object-isextensible -- safe +var isExtensible = Object.isExtensible || function () { + return true; +}; + +var setMetadata = function (it) { + defineProperty(it, METADATA, { value: { + objectID: 'O' + id++, // object ID + weakData: {} // weak collections IDs + } }); +}; + +var fastKey = function (it, create) { + // return a primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!hasOwn(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMetadata(it); + // return object ID + } return it[METADATA].objectID; +}; + +var getWeakData = function (it, create) { + if (!hasOwn(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMetadata(it); + // return the store of weak collections IDs + } return it[METADATA].weakData; +}; + +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it); + return it; +}; + +var enable = function () { + meta.enable = function () { /* empty */ }; + REQUIRED = true; + var getOwnPropertyNames = getOwnPropertyNamesModule.f; + var splice = uncurryThis([].splice); + var test = {}; + test[METADATA] = 1; + + // prevent exposing of metadata key + if (getOwnPropertyNames(test).length) { + getOwnPropertyNamesModule.f = function (it) { + var result = getOwnPropertyNames(it); + for (var i = 0, length = result.length; i < length; i++) { + if (result[i] === METADATA) { + splice(result, i, 1); + break; + } + } return result; + }; + + $({ target: 'Object', stat: true, forced: true }, { + getOwnPropertyNames: getOwnPropertyNamesExternalModule.f + }); + } +}; + +var meta = module.exports = { + enable: enable, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze +}; + +hiddenKeys[METADATA] = true; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/internal-state.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/internal-state.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "../../node_modules/core-js/internals/native-weak-map.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var shared = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + var wmget = uncurryThis(store.get); + var wmhas = uncurryThis(store.has); + var wmset = uncurryThis(store.set); + set = function (it, metadata) { + if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + wmset(store, it, metadata); + return metadata; + }; + get = function (it) { + return wmget(store, it) || {}; + }; + has = function (it) { + return wmhas(store, it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-array-iterator-method.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/internals/is-array-iterator-method.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-array.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-array.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) == 'Array'; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-callable.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-callable.js ***! + \***********************************************************/ +/***/ ((module) => { + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +module.exports = function (argument) { + return typeof argument == 'function'; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-constructor.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/is-constructor.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); + +var noop = function () { /* empty */ }; +var empty = []; +var construct = getBuiltIn('Reflect', 'construct'); +var constructorRegExp = /^\s*(?:class|function)\b/; +var exec = uncurryThis(constructorRegExp.exec); +var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); + +var isConstructorModern = function (argument) { + if (!isCallable(argument)) return false; + try { + construct(noop, empty, argument); + return true; + } catch (error) { + return false; + } +}; + +var isConstructorLegacy = function (argument) { + if (!isCallable(argument)) return false; + switch (classof(argument)) { + case 'AsyncFunction': + case 'GeneratorFunction': + case 'AsyncGeneratorFunction': return false; + // we can't check .prototype since constructors produced by .bind haven't it + } return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); +}; + +// `IsConstructor` abstract operation +// https://tc39.es/ecma262/#sec-isconstructor +module.exports = !construct || fails(function () { + var called; + return isConstructorModern(isConstructorModern.call) + || !isConstructorModern(Object) + || !isConstructorModern(function () { called = true; }) + || called; +}) ? isConstructorLegacy : isConstructorModern; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-forced.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-forced.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true + : value == NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-integral-number.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/internals/is-integral-number.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); + +var floor = Math.floor; + +// `IsIntegralNumber` abstract operation +// https://tc39.es/ecma262/#sec-isintegralnumber +// eslint-disable-next-line es/no-number-isinteger -- safe +module.exports = Number.isInteger || function isInteger(it) { + return !isObject(it) && isFinite(it) && floor(it) === it; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-object.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-object.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-pure.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/internals/is-pure.js ***! + \*******************************************************/ +/***/ ((module) => { + +module.exports = false; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-symbol.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-symbol.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); +var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "../../node_modules/core-js/internals/use-symbol-as-uid.js"); + +var Object = global.Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/iterate.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/internals/iterate.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "../../node_modules/core-js/internals/is-array-iterator-method.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); +var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "../../node_modules/core-js/internals/get-iterator.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); +var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../../node_modules/core-js/internals/iterator-close.js"); + +var TypeError = global.TypeError; + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +var ResultPrototype = Result.prototype; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + if (iterator) iteratorClose(iterator, 'normal', condition); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) throw TypeError(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + + next = iterator.next; + while (!(step = call(next, iterator)).done) { + try { + result = callFn(step.value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/iterator-close.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/iterator-close.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/iterators-core.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/iterators-core.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + redefine(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/iterators.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/iterators.js ***! + \*********************************************************/ +/***/ ((module) => { + +module.exports = {}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/length-of-array-like.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/length-of-array-like.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toLength = __webpack_require__(/*! ../internals/to-length */ "../../node_modules/core-js/internals/to-length.js"); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/microtask.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/microtask.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js").f); +var macrotask = (__webpack_require__(/*! ../internals/task */ "../../node_modules/core-js/internals/task.js").set); +var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "../../node_modules/core-js/internals/engine-is-ios.js"); +var IS_IOS_PEBBLE = __webpack_require__(/*! ../internals/engine-is-ios-pebble */ "../../node_modules/core-js/internals/engine-is-ios-pebble.js"); +var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/engine-is-webos-webkit */ "../../node_modules/core-js/internals/engine-is-webos-webkit.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); + +var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; +var document = global.document; +var process = global.process; +var Promise = global.Promise; +// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` +var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask'); +var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; + +var flush, head, last, notify, toggle, node, promise, then; + +// modern engines have queueMicrotask method +if (!queueMicrotask) { + flush = function () { + var parent, fn; + if (IS_NODE && (parent = process.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (error) { + if (head) notify(); + else last = undefined; + throw error; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 + // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898 + if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) { + toggle = true; + node = document.createTextNode(''); + new MutationObserver(flush).observe(node, { characterData: true }); + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + promise = Promise.resolve(undefined); + // workaround of WebKit ~ iOS Safari 10.1 bug + promise.constructor = Promise; + then = bind(promise.then, promise); + notify = function () { + then(flush); + }; + // Node.js without promises + } else if (IS_NODE) { + notify = function () { + process.nextTick(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + // strange IE + webpack dev server bug - use .bind(global) + macrotask = bind(macrotask, global); + notify = function () { + macrotask(flush); + }; + } +} + +module.exports = queueMicrotask || function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/native-promise-constructor.js": +/*!**************************************************************************!*\ + !*** ../../node_modules/core-js/internals/native-promise-constructor.js ***! + \**************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = global.Promise; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/native-symbol.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/native-symbol.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../node_modules/core-js/internals/engine-v8-version.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol(); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + return !String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/native-weak-map.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/native-weak-map.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); + +var WeakMap = global.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap)); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/new-promise-capability.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/new-promise-capability.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aCallable(resolve); + this.reject = aCallable(reject); +}; + +// `NewPromiseCapability` abstract operation +// https://tc39.es/ecma262/#sec-newpromisecapability +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/normalize-string-argument.js": +/*!*************************************************************************!*\ + !*** ../../node_modules/core-js/internals/normalize-string-argument.js ***! + \*************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); + +module.exports = function (argument, $default) { + return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/number-parse-float.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/internals/number-parse-float.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var trim = (__webpack_require__(/*! ../internals/string-trim */ "../../node_modules/core-js/internals/string-trim.js").trim); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); + +var charAt = uncurryThis(''.charAt); +var n$ParseFloat = global.parseFloat; +var Symbol = global.Symbol; +var ITERATOR = Symbol && Symbol.iterator; +var FORCED = 1 / n$ParseFloat(whitespaces + '-0') !== -Infinity + // MS Edge 18- broken with boxed symbols + || (ITERATOR && !fails(function () { n$ParseFloat(Object(ITERATOR)); })); + +// `parseFloat` method +// https://tc39.es/ecma262/#sec-parsefloat-string +module.exports = FORCED ? function parseFloat(string) { + var trimmedString = trim(toString(string)); + var result = n$ParseFloat(trimmedString); + return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result; +} : n$ParseFloat; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/number-parse-int.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/internals/number-parse-int.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var trim = (__webpack_require__(/*! ../internals/string-trim */ "../../node_modules/core-js/internals/string-trim.js").trim); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); + +var $parseInt = global.parseInt; +var Symbol = global.Symbol; +var ITERATOR = Symbol && Symbol.iterator; +var hex = /^[+-]?0x/i; +var exec = uncurryThis(hex.exec); +var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22 + // MS Edge 18- broken with boxed symbols + || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); })); + +// `parseInt` method +// https://tc39.es/ecma262/#sec-parseint-string-radix +module.exports = FORCED ? function parseInt(string, radix) { + var S = trim(toString(string)); + return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10)); +} : $parseInt; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-assign.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-assign.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../../node_modules/core-js/internals/object-get-own-property-symbols.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); + +// eslint-disable-next-line es/no-object-assign -- safe +var $assign = Object.assign; +// eslint-disable-next-line es/no-object-defineproperty -- required for testing +var defineProperty = Object.defineProperty; +var concat = uncurryThis([].concat); + +// `Object.assign` method +// https://tc39.es/ecma262/#sec-object.assign +module.exports = !$assign || fails(function () { + // should have correct order of operations (Edge bug) + if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', { + enumerable: true, + get: function () { + defineProperty(this, 'b', { + value: 3, + enumerable: false + }); + } + }), { b: 2 })).b !== 1) return true; + // should work with symbols and should have deterministic property order (V8 bug) + var A = {}; + var B = {}; + // eslint-disable-next-line es/no-symbol -- safe + var symbol = Symbol(); + var alphabet = 'abcdefghijklmnopqrst'; + A[symbol] = 7; + alphabet.split('').forEach(function (chr) { B[chr] = chr; }); + return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length` + var T = toObject(target); + var argumentsLength = arguments.length; + var index = 1; + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + var propertyIsEnumerable = propertyIsEnumerableModule.f; + while (argumentsLength > index) { + var S = IndexedObject(arguments[index++]); + var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key]; + } + } return T; +} : $assign; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-create.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-create.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* global ActiveXObject -- old IE, WSH */ +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "../../node_modules/core-js/internals/object-define-properties.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); +var html = __webpack_require__(/*! ../internals/html */ "../../node_modules/core-js/internals/html.js"); +var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : defineProperties(result, Properties); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-define-properties.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-define-properties.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-define-property.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-define-property.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../../node_modules/core-js/internals/ie8-dom-define.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); + +var TypeError = global.TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js": +/*!**********************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-own-property-descriptor.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../../node_modules/core-js/internals/ie8-dom-define.js"); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-own-property-names-external.js": +/*!**************************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-own-property-names-external.js ***! + \**************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* eslint-disable es/no-object-getownpropertynames -- safe */ +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var $getOwnPropertyNames = (__webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js").f); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return $getOwnPropertyNames(it); + } catch (error) { + return arraySlice(windowNames); + } +}; + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && classof(it) == 'Window' + ? getWindowNames(it) + : $getOwnPropertyNames(toIndexedObject(it)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-own-property-names.js": +/*!*****************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-own-property-names.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../../node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-own-property-symbols.js": +/*!*******************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-own-property-symbols.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-prototype-of.js": +/*!***********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-prototype-of.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "../../node_modules/core-js/internals/correct-prototype-getter.js"); + +var IE_PROTO = sharedKey('IE_PROTO'); +var Object = global.Object; +var ObjectPrototype = Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof Object ? ObjectPrototype : null; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-is-prototype-of.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-is-prototype-of.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = uncurryThis({}.isPrototypeOf); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-keys-internal.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-keys-internal.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var indexOf = (__webpack_require__(/*! ../internals/array-includes */ "../../node_modules/core-js/internals/array-includes.js").indexOf); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-keys.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/object-keys.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../../node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-property-is-enumerable.js": +/*!*****************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-property-is-enumerable.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-set-prototype-of.js": +/*!***********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-set-prototype-of.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* eslint-disable no-proto -- safe */ +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "../../node_modules/core-js/internals/a-possible-prototype.js"); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-to-array.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-to-array.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var $propertyIsEnumerable = (__webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js").f); + +var propertyIsEnumerable = uncurryThis($propertyIsEnumerable); +var push = uncurryThis([].push); + +// `Object.{ entries, values }` methods implementation +var createMethod = function (TO_ENTRIES) { + return function (it) { + var O = toIndexedObject(it); + var keys = objectKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + while (length > i) { + key = keys[i++]; + if (!DESCRIPTORS || propertyIsEnumerable(O, key)) { + push(result, TO_ENTRIES ? [key, O[key]] : O[key]); + } + } + return result; + }; +}; + +module.exports = { + // `Object.entries` method + // https://tc39.es/ecma262/#sec-object.entries + entries: createMethod(true), + // `Object.values` method + // https://tc39.es/ecma262/#sec-object.values + values: createMethod(false) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-to-string.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-to-string.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); + +// `Object.prototype.toString` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.tostring +module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { + return '[object ' + classof(this) + ']'; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/ordinary-to-primitive.js": +/*!*********************************************************************!*\ + !*** ../../node_modules/core-js/internals/ordinary-to-primitive.js ***! + \*********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); + +var TypeError = global.TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/own-keys.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/internals/own-keys.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../../node_modules/core-js/internals/object-get-own-property-symbols.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/path.js": +/*!****************************************************!*\ + !*** ../../node_modules/core-js/internals/path.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = global; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/perform.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/internals/perform.js ***! + \*******************************************************/ +/***/ ((module) => { + +module.exports = function (exec) { + try { + return { error: false, value: exec() }; + } catch (error) { + return { error: true, value: error }; + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/promise-resolve.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/promise-resolve.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); + +module.exports = function (C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/redefine-all.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/redefine-all.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); + +module.exports = function (target, src, options) { + for (var key in src) redefine(target, key, src[key], options); + return target; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/redefine.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/internals/redefine.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); +var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(/*! ../internals/function-name */ "../../node_modules/core-js/internals/function-name.js").CONFIGURABLE); + +var getInternalState = InternalStateModule.get; +var enforceInternalState = InternalStateModule.enforce; +var TEMPLATE = String(String).split('String'); + +(module.exports = function (O, key, value, options) { + var unsafe = options ? !!options.unsafe : false; + var simple = options ? !!options.enumerable : false; + var noTargetGet = options ? !!options.noTargetGet : false; + var name = options && options.name !== undefined ? options.name : key; + var state; + if (isCallable(value)) { + if (String(name).slice(0, 7) === 'Symbol(') { + name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']'; + } + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + createNonEnumerableProperty(value, 'name', name); + } + state = enforceInternalState(value); + if (!state.source) { + state.source = TEMPLATE.join(typeof name == 'string' ? name : ''); + } + } + if (O === global) { + if (simple) O[key] = value; + else setGlobal(key, value); + return; + } else if (!unsafe) { + delete O[key]; + } else if (!noTargetGet && O[key]) { + simple = true; + } + if (simple) O[key] = value; + else createNonEnumerableProperty(O, key, value); +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, 'toString', function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/require-object-coercible.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/internals/require-object-coercible.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +var TypeError = global.TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/set-global.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/set-global.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(global, key, { value: value, configurable: true, writable: true }); + } catch (error) { + global[key] = value; + } return value; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/set-species.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/set-species.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); + +var SPECIES = wellKnownSymbol('species'); + +module.exports = function (CONSTRUCTOR_NAME) { + var Constructor = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = definePropertyModule.f; + + if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) { + defineProperty(Constructor, SPECIES, { + configurable: true, + get: function () { return this; } + }); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/set-to-string-tag.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/set-to-string-tag.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +module.exports = function (it, TAG, STATIC) { + if (it && !hasOwn(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { + defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/shared-key.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/shared-key.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var shared = __webpack_require__(/*! ../internals/shared */ "../../node_modules/core-js/internals/shared.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/shared-store.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/shared-store.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); + +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || setGlobal(SHARED, {}); + +module.exports = store; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/shared.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/internals/shared.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); +var store = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.19.0', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2021 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/species-constructor.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/internals/species-constructor.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var aConstructor = __webpack_require__(/*! ../internals/a-constructor */ "../../node_modules/core-js/internals/a-constructor.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var SPECIES = wellKnownSymbol('species'); + +// `SpeciesConstructor` abstract operation +// https://tc39.es/ecma262/#sec-speciesconstructor +module.exports = function (O, defaultConstructor) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/string-multibyte.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/internals/string-multibyte.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); + +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var stringSlice = uncurryThis(''.slice); + +var createMethod = function (CONVERT_TO_STRING) { + return function ($this, pos) { + var S = toString(requireObjectCoercible($this)); + var position = toIntegerOrInfinity(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; + first = charCodeAt(S, position); + return first < 0xD800 || first > 0xDBFF || position + 1 === size + || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF + ? CONVERT_TO_STRING + ? charAt(S, position) + : first + : CONVERT_TO_STRING + ? stringSlice(S, position, position + 2) + : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; + }; +}; + +module.exports = { + // `String.prototype.codePointAt` method + // https://tc39.es/ecma262/#sec-string.prototype.codepointat + codeAt: createMethod(false), + // `String.prototype.at` method + // https://github.com/mathiasbynens/String.prototype.at + charAt: createMethod(true) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/string-trim.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/string-trim.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); + +var replace = uncurryThis(''.replace); +var whitespace = '[' + whitespaces + ']'; +var ltrim = RegExp('^' + whitespace + whitespace + '*'); +var rtrim = RegExp(whitespace + whitespace + '*$'); + +// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation +var createMethod = function (TYPE) { + return function ($this) { + var string = toString(requireObjectCoercible($this)); + if (TYPE & 1) string = replace(string, ltrim, ''); + if (TYPE & 2) string = replace(string, rtrim, ''); + return string; + }; +}; + +module.exports = { + // `String.prototype.{ trimLeft, trimStart }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimstart + start: createMethod(1), + // `String.prototype.{ trimRight, trimEnd }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimend + end: createMethod(2), + // `String.prototype.trim` method + // https://tc39.es/ecma262/#sec-string.prototype.trim + trim: createMethod(3) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/task.js": +/*!****************************************************!*\ + !*** ../../node_modules/core-js/internals/task.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var apply = __webpack_require__(/*! ../internals/function-apply */ "../../node_modules/core-js/internals/function-apply.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var html = __webpack_require__(/*! ../internals/html */ "../../node_modules/core-js/internals/html.js"); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); +var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); +var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "../../node_modules/core-js/internals/engine-is-ios.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); + +var set = global.setImmediate; +var clear = global.clearImmediate; +var process = global.process; +var Dispatch = global.Dispatch; +var Function = global.Function; +var MessageChannel = global.MessageChannel; +var String = global.String; +var counter = 0; +var queue = {}; +var ONREADYSTATECHANGE = 'onreadystatechange'; +var location, defer, channel, port; + +try { + // Deno throws a ReferenceError on `location` access without `--location` flag + location = global.location; +} catch (error) { /* empty */ } + +var run = function (id) { + if (hasOwn(queue, id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; + +var runner = function (id) { + return function () { + run(id); + }; +}; + +var listener = function (event) { + run(event.data); +}; + +var post = function (id) { + // old engines have not location.origin + global.postMessage(String(id), location.protocol + '//' + location.host); +}; + +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if (!set || !clear) { + set = function setImmediate(fn) { + var args = arraySlice(arguments, 1); + queue[++counter] = function () { + apply(isCallable(fn) ? fn : Function(fn), undefined, args); + }; + defer(counter); + return counter; + }; + clear = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (IS_NODE) { + defer = function (id) { + process.nextTick(runner(id)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(runner(id)); + }; + // Browsers with MessageChannel, includes WebWorkers + // except iOS - https://github.com/zloirock/core-js/issues/624 + } else if (MessageChannel && !IS_IOS) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = bind(port.postMessage, port); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if ( + global.addEventListener && + isCallable(global.postMessage) && + !global.importScripts && + location && location.protocol !== 'file:' && + !fails(post) + ) { + defer = post; + global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in createElement('script')) { + defer = function (id) { + html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { + html.removeChild(this); + run(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(runner(id), 0); + }; + } +} + +module.exports = { + set: set, + clear: clear +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-absolute-index.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-absolute-index.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-indexed-object.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-indexed-object.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-integer-or-infinity.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-integer-or-infinity.js ***! + \**********************************************************************/ +/***/ ((module) => { + +var ceil = Math.ceil; +var floor = Math.floor; + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- safe + return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-length.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/to-length.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-object.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/to-object.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); + +var Object = global.Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-primitive.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-primitive.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "../../node_modules/core-js/internals/is-symbol.js"); +var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); +var ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ "../../node_modules/core-js/internals/ordinary-to-primitive.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var TypeError = global.TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-property-key.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-property-key.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "../../node_modules/core-js/internals/to-primitive.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "../../node_modules/core-js/internals/is-symbol.js"); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-string-tag-support.js": +/*!*********************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-string-tag-support.js ***! + \*********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; + +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-string.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/to-string.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); + +var String = global.String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); + return String(argument); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/try-to-string.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/try-to-string.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +var String = global.String; + +module.exports = function (argument) { + try { + return String(argument); + } catch (error) { + return 'Object'; + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/uid.js": +/*!***************************************************!*\ + !*** ../../node_modules/core-js/internals/uid.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/use-symbol-as-uid.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/use-symbol-as-uid.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../../node_modules/core-js/internals/native-symbol.js"); + +module.exports = NATIVE_SYMBOL + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/well-known-symbol.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/well-known-symbol.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "../../node_modules/core-js/internals/shared.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../../node_modules/core-js/internals/native-symbol.js"); +var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "../../node_modules/core-js/internals/use-symbol-as-uid.js"); + +var WellKnownSymbolsStore = shared('wks'); +var Symbol = global.Symbol; +var symbolFor = Symbol && Symbol['for']; +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { + var description = 'Symbol.' + name; + if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { + WellKnownSymbolsStore[name] = Symbol[name]; + } else if (USE_SYMBOL_AS_UID && symbolFor) { + WellKnownSymbolsStore[name] = symbolFor(description); + } else { + WellKnownSymbolsStore[name] = createWellKnownSymbol(description); + } + } return WellKnownSymbolsStore[name]; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/whitespaces.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/whitespaces.js ***! + \***********************************************************/ +/***/ ((module) => { + +// a string of all valid unicode whitespaces +module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + + '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.aggregate-error.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.aggregate-error.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "../../node_modules/core-js/internals/copy-constructor-properties.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); +var clearErrorStack = __webpack_require__(/*! ../internals/clear-error-stack */ "../../node_modules/core-js/internals/clear-error-stack.js"); +var installErrorCause = __webpack_require__(/*! ../internals/install-error-cause */ "../../node_modules/core-js/internals/install-error-cause.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); +var normalizeStringArgument = __webpack_require__(/*! ../internals/normalize-string-argument */ "../../node_modules/core-js/internals/normalize-string-argument.js"); +var ERROR_STACK_INSTALLABLE = __webpack_require__(/*! ../internals/error-stack-installable */ "../../node_modules/core-js/internals/error-stack-installable.js"); + +var Error = global.Error; +var push = [].push; + +var $AggregateError = function AggregateError(errors, message /* , options */) { + var that = isPrototypeOf(AggregateErrorPrototype, this) ? this : create(AggregateErrorPrototype); + var options = arguments.length > 2 ? arguments[2] : undefined; + if (setPrototypeOf) { + that = setPrototypeOf(new Error(undefined), getPrototypeOf(that)); + } + createNonEnumerableProperty(that, 'message', normalizeStringArgument(message, '')); + if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(that, 'stack', clearErrorStack(that.stack, 1)); + installErrorCause(that, options); + var errorsArray = []; + iterate(errors, push, { that: errorsArray }); + createNonEnumerableProperty(that, 'errors', errorsArray); + return that; +}; + +if (setPrototypeOf) setPrototypeOf($AggregateError, Error); +else copyConstructorProperties($AggregateError, Error); + +var AggregateErrorPrototype = $AggregateError.prototype = create(Error.prototype, { + constructor: createPropertyDescriptor(1, $AggregateError), + message: createPropertyDescriptor(1, ''), + name: createPropertyDescriptor(1, 'AggregateError') +}); + +// `AggregateError` constructor +// https://tc39.es/ecma262/#sec-aggregate-error-constructor +$({ global: true }, { + AggregateError: $AggregateError +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.array.find.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/modules/es.array.find.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var $find = (__webpack_require__(/*! ../internals/array-iteration */ "../../node_modules/core-js/internals/array-iteration.js").find); +var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../../node_modules/core-js/internals/add-to-unscopables.js"); + +var FIND = 'find'; +var SKIPS_HOLES = true; + +// Shouldn't skip holes +if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; }); + +// `Array.prototype.find` method +// https://tc39.es/ecma262/#sec-array.prototype.find +$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables(FIND); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.array.from.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/modules/es.array.from.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var from = __webpack_require__(/*! ../internals/array-from */ "../../node_modules/core-js/internals/array-from.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); + +var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { + // eslint-disable-next-line es/no-array-from -- required for testing + Array.from(iterable); +}); + +// `Array.from` method +// https://tc39.es/ecma262/#sec-array.from +$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { + from: from +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.array.iterator.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.array.iterator.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../../node_modules/core-js/internals/add-to-unscopables.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); + +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); + +// `Array.prototype.entries` method +// https://tc39.es/ecma262/#sec-array.prototype.entries +// `Array.prototype.keys` method +// https://tc39.es/ecma262/#sec-array.prototype.keys +// `Array.prototype.values` method +// https://tc39.es/ecma262/#sec-array.prototype.values +// `Array.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-array.prototype-@@iterator +// `CreateArrayIterator` internal method +// https://tc39.es/ecma262/#sec-createarrayiterator +module.exports = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), // target + index: 0, // next index + kind: kind // kind + }); +// `%ArrayIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next +}, function () { + var state = getInternalState(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return { value: undefined, done: true }; + } + if (kind == 'keys') return { value: index, done: false }; + if (kind == 'values') return { value: target[index], done: false }; + return { value: [index, target[index]], done: false }; +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% +// https://tc39.es/ecma262/#sec-createunmappedargumentsobject +// https://tc39.es/ecma262/#sec-createmappedargumentsobject +Iterators.Arguments = Iterators.Array; + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.map.js": +/*!****************************************************!*\ + !*** ../../node_modules/core-js/modules/es.map.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var collection = __webpack_require__(/*! ../internals/collection */ "../../node_modules/core-js/internals/collection.js"); +var collectionStrong = __webpack_require__(/*! ../internals/collection-strong */ "../../node_modules/core-js/internals/collection-strong.js"); + +// `Map` constructor +// https://tc39.es/ecma262/#sec-map-objects +collection('Map', function (init) { + return function Map() { return init(this, arguments.length ? arguments[0] : undefined); }; +}, collectionStrong); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.number.is-integer.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.number.is-integer.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var isIntegralNumber = __webpack_require__(/*! ../internals/is-integral-number */ "../../node_modules/core-js/internals/is-integral-number.js"); + +// `Number.isInteger` method +// https://tc39.es/ecma262/#sec-number.isinteger +$({ target: 'Number', stat: true }, { + isInteger: isIntegralNumber +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.number.is-nan.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.number.is-nan.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); + +// `Number.isNaN` method +// https://tc39.es/ecma262/#sec-number.isnan +$({ target: 'Number', stat: true }, { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare -- NaN check + return number != number; + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.number.parse-float.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.number.parse-float.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var parseFloat = __webpack_require__(/*! ../internals/number-parse-float */ "../../node_modules/core-js/internals/number-parse-float.js"); + +// `Number.parseFloat` method +// https://tc39.es/ecma262/#sec-number.parseFloat +// eslint-disable-next-line es/no-number-parsefloat -- required for testing +$({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, { + parseFloat: parseFloat +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.number.parse-int.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.number.parse-int.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var parseInt = __webpack_require__(/*! ../internals/number-parse-int */ "../../node_modules/core-js/internals/number-parse-int.js"); + +// `Number.parseInt` method +// https://tc39.es/ecma262/#sec-number.parseint +// eslint-disable-next-line es/no-number-parseint -- required for testing +$({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, { + parseInt: parseInt +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.object.assign.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.object.assign.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var assign = __webpack_require__(/*! ../internals/object-assign */ "../../node_modules/core-js/internals/object-assign.js"); + +// `Object.assign` method +// https://tc39.es/ecma262/#sec-object.assign +// eslint-disable-next-line es/no-object-assign -- required for testing +$({ target: 'Object', stat: true, forced: Object.assign !== assign }, { + assign: assign +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.object.entries.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.object.entries.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var $entries = (__webpack_require__(/*! ../internals/object-to-array */ "../../node_modules/core-js/internals/object-to-array.js").entries); + +// `Object.entries` method +// https://tc39.es/ecma262/#sec-object.entries +$({ target: 'Object', stat: true }, { + entries: function entries(O) { + return $entries(O); + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.object.set-prototype-of.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.object.set-prototype-of.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +$({ target: 'Object', stat: true }, { + setPrototypeOf: setPrototypeOf +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.object.to-string.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.object.to-string.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var toString = __webpack_require__(/*! ../internals/object-to-string */ "../../node_modules/core-js/internals/object-to-string.js"); + +// `Object.prototype.toString` method +// https://tc39.es/ecma262/#sec-object.prototype.tostring +if (!TO_STRING_TAG_SUPPORT) { + redefine(Object.prototype, 'toString', toString, { unsafe: true }); +} + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.promise.all-settled.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.promise.all-settled.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); + +// `Promise.allSettled` method +// https://tc39.es/ecma262/#sec-promise.allsettled +$({ target: 'Promise', stat: true }, { + allSettled: function allSettled(iterable) { + var C = this; + var capability = newPromiseCapabilityModule.f(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var promiseResolve = aCallable(C.resolve); + var values = []; + var counter = 0; + var remaining = 1; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + remaining++; + call(promiseResolve, C, promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = { status: 'fulfilled', value: value }; + --remaining || resolve(values); + }, function (error) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = { status: 'rejected', reason: error }; + --remaining || resolve(values); + }); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.promise.any.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.promise.any.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); + +var PROMISE_ANY_ERROR = 'No one promise resolved'; + +// `Promise.any` method +// https://tc39.es/ecma262/#sec-promise.any +$({ target: 'Promise', stat: true }, { + any: function any(iterable) { + var C = this; + var AggregateError = getBuiltIn('AggregateError'); + var capability = newPromiseCapabilityModule.f(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var promiseResolve = aCallable(C.resolve); + var errors = []; + var counter = 0; + var remaining = 1; + var alreadyResolved = false; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyRejected = false; + remaining++; + call(promiseResolve, C, promise).then(function (value) { + if (alreadyRejected || alreadyResolved) return; + alreadyResolved = true; + resolve(value); + }, function (error) { + if (alreadyRejected || alreadyResolved) return; + alreadyRejected = true; + errors[index] = error; + --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR)); + }); + }); + --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR)); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.promise.finally.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.promise.finally.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); +var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../node_modules/core-js/internals/native-promise-constructor.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "../../node_modules/core-js/internals/species-constructor.js"); +var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "../../node_modules/core-js/internals/promise-resolve.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); + +// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829 +var NON_GENERIC = !!NativePromise && fails(function () { + NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ }); +}); + +// `Promise.prototype.finally` method +// https://tc39.es/ecma262/#sec-promise.prototype.finally +$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, { + 'finally': function (onFinally) { + var C = speciesConstructor(this, getBuiltIn('Promise')); + var isFunction = isCallable(onFinally); + return this.then( + isFunction ? function (x) { + return promiseResolve(C, onFinally()).then(function () { return x; }); + } : onFinally, + isFunction ? function (e) { + return promiseResolve(C, onFinally()).then(function () { throw e; }); + } : onFinally + ); + } +}); + +// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then` +if (!IS_PURE && isCallable(NativePromise)) { + var method = getBuiltIn('Promise').prototype['finally']; + if (NativePromise.prototype['finally'] !== method) { + redefine(NativePromise.prototype, 'finally', method, { unsafe: true }); + } +} + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.promise.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/modules/es.promise.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../node_modules/core-js/internals/native-promise-constructor.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../node_modules/core-js/internals/redefine-all.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); +var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../node_modules/core-js/internals/set-species.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); +var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "../../node_modules/core-js/internals/species-constructor.js"); +var task = (__webpack_require__(/*! ../internals/task */ "../../node_modules/core-js/internals/task.js").set); +var microtask = __webpack_require__(/*! ../internals/microtask */ "../../node_modules/core-js/internals/microtask.js"); +var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "../../node_modules/core-js/internals/promise-resolve.js"); +var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "../../node_modules/core-js/internals/host-report-errors.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var IS_BROWSER = __webpack_require__(/*! ../internals/engine-is-browser */ "../../node_modules/core-js/internals/engine-is-browser.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); +var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../node_modules/core-js/internals/engine-v8-version.js"); + +var SPECIES = wellKnownSymbol('species'); +var PROMISE = 'Promise'; + +var getInternalState = InternalStateModule.get; +var setInternalState = InternalStateModule.set; +var getInternalPromiseState = InternalStateModule.getterFor(PROMISE); +var NativePromisePrototype = NativePromise && NativePromise.prototype; +var PromiseConstructor = NativePromise; +var PromisePrototype = NativePromisePrototype; +var TypeError = global.TypeError; +var document = global.document; +var process = global.process; +var newPromiseCapability = newPromiseCapabilityModule.f; +var newGenericPromiseCapability = newPromiseCapability; + +var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent); +var NATIVE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent); +var UNHANDLED_REJECTION = 'unhandledrejection'; +var REJECTION_HANDLED = 'rejectionhandled'; +var PENDING = 0; +var FULFILLED = 1; +var REJECTED = 2; +var HANDLED = 1; +var UNHANDLED = 2; +var SUBCLASSING = false; + +var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; + +var FORCED = isForced(PROMISE, function () { + var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor); + var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor); + // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // We can't detect it synchronously, so just check versions + if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true; + // We need Promise#finally in the pure version for preventing prototype pollution + if (IS_PURE && !PromisePrototype['finally']) return true; + // We can't use @@species feature detection in V8 since it causes + // deoptimization and performance degradation + // https://github.com/zloirock/core-js/issues/679 + if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false; + // Detect correctness of subclassing with @@species support + var promise = new PromiseConstructor(function (resolve) { resolve(1); }); + var FakePromise = function (exec) { + exec(function () { /* empty */ }, function () { /* empty */ }); + }; + var constructor = promise.constructor = {}; + constructor[SPECIES] = FakePromise; + SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise; + if (!SUBCLASSING) return true; + // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT; +}); + +var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) { + PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); +}); + +// helpers +var isThenable = function (it) { + var then; + return isObject(it) && isCallable(then = it.then) ? then : false; +}; + +var notify = function (state, isReject) { + if (state.notified) return; + state.notified = true; + var chain = state.reactions; + microtask(function () { + var value = state.value; + var ok = state.state == FULFILLED; + var index = 0; + // variable length - can't use forEach + while (chain.length > index) { + var reaction = chain[index++]; + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (state.rejection === UNHANDLED) onHandleUnhandled(state); + state.rejection = HANDLED; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // can throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError('Promise-chain cycle')); + } else if (then = isThenable(result)) { + call(then, result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (error) { + if (domain && !exited) domain.exit(); + reject(error); + } + } + state.reactions = []; + state.notified = false; + if (isReject && !state.rejection) onUnhandled(state); + }); +}; + +var dispatchEvent = function (name, promise, reason) { + var event, handler; + if (DISPATCH_EVENT) { + event = document.createEvent('Event'); + event.promise = promise; + event.reason = reason; + event.initEvent(name, false, true); + global.dispatchEvent(event); + } else event = { promise: promise, reason: reason }; + if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event); + else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); +}; + +var onUnhandled = function (state) { + call(task, global, function () { + var promise = state.facade; + var value = state.value; + var IS_UNHANDLED = isUnhandled(state); + var result; + if (IS_UNHANDLED) { + result = perform(function () { + if (IS_NODE) { + process.emit('unhandledRejection', value, promise); + } else dispatchEvent(UNHANDLED_REJECTION, promise, value); + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED; + if (result.error) throw result.value; + } + }); +}; + +var isUnhandled = function (state) { + return state.rejection !== HANDLED && !state.parent; +}; + +var onHandleUnhandled = function (state) { + call(task, global, function () { + var promise = state.facade; + if (IS_NODE) { + process.emit('rejectionHandled', promise); + } else dispatchEvent(REJECTION_HANDLED, promise, state.value); + }); +}; + +var bind = function (fn, state, unwrap) { + return function (value) { + fn(state, value, unwrap); + }; +}; + +var internalReject = function (state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + state.value = value; + state.state = REJECTED; + notify(state, true); +}; + +var internalResolve = function (state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + try { + if (state.facade === value) throw TypeError("Promise can't be resolved itself"); + var then = isThenable(value); + if (then) { + microtask(function () { + var wrapper = { done: false }; + try { + call(then, value, + bind(internalResolve, wrapper, state), + bind(internalReject, wrapper, state) + ); + } catch (error) { + internalReject(wrapper, error, state); + } + }); + } else { + state.value = value; + state.state = FULFILLED; + notify(state, false); + } + } catch (error) { + internalReject({ done: false }, error, state); + } +}; + +// constructor polyfill +if (FORCED) { + // 25.4.3.1 Promise(executor) + PromiseConstructor = function Promise(executor) { + anInstance(this, PromisePrototype); + aCallable(executor); + call(Internal, this); + var state = getInternalState(this); + try { + executor(bind(internalResolve, state), bind(internalReject, state)); + } catch (error) { + internalReject(state, error); + } + }; + PromisePrototype = PromiseConstructor.prototype; + // eslint-disable-next-line no-unused-vars -- required for `.length` + Internal = function Promise(executor) { + setInternalState(this, { + type: PROMISE, + done: false, + notified: false, + parent: false, + reactions: [], + rejection: false, + state: PENDING, + value: undefined + }); + }; + Internal.prototype = redefineAll(PromisePrototype, { + // `Promise.prototype.then` method + // https://tc39.es/ecma262/#sec-promise.prototype.then + then: function then(onFulfilled, onRejected) { + var state = getInternalPromiseState(this); + var reactions = state.reactions; + var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor)); + reaction.ok = isCallable(onFulfilled) ? onFulfilled : true; + reaction.fail = isCallable(onRejected) && onRejected; + reaction.domain = IS_NODE ? process.domain : undefined; + state.parent = true; + reactions[reactions.length] = reaction; + if (state.state != PENDING) notify(state, false); + return reaction.promise; + }, + // `Promise.prototype.catch` method + // https://tc39.es/ecma262/#sec-promise.prototype.catch + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + var state = getInternalState(promise); + this.promise = promise; + this.resolve = bind(internalResolve, state); + this.reject = bind(internalReject, state); + }; + newPromiseCapabilityModule.f = newPromiseCapability = function (C) { + return C === PromiseConstructor || C === PromiseWrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; + + if (!IS_PURE && isCallable(NativePromise) && NativePromisePrototype !== Object.prototype) { + nativeThen = NativePromisePrototype.then; + + if (!SUBCLASSING) { + // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs + redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) { + var that = this; + return new PromiseConstructor(function (resolve, reject) { + call(nativeThen, that, resolve, reject); + }).then(onFulfilled, onRejected); + // https://github.com/zloirock/core-js/issues/640 + }, { unsafe: true }); + + // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then` + redefine(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true }); + } + + // make `.constructor === Promise` work for native promise-based APIs + try { + delete NativePromisePrototype.constructor; + } catch (error) { /* empty */ } + + // make `instanceof Promise` work for native promise-based APIs + if (setPrototypeOf) { + setPrototypeOf(NativePromisePrototype, PromisePrototype); + } + } +} + +$({ global: true, wrap: true, forced: FORCED }, { + Promise: PromiseConstructor +}); + +setToStringTag(PromiseConstructor, PROMISE, false, true); +setSpecies(PROMISE); + +PromiseWrapper = getBuiltIn(PROMISE); + +// statics +$({ target: PROMISE, stat: true, forced: FORCED }, { + // `Promise.reject` method + // https://tc39.es/ecma262/#sec-promise.reject + reject: function reject(r) { + var capability = newPromiseCapability(this); + call(capability.reject, undefined, r); + return capability.promise; + } +}); + +$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, { + // `Promise.resolve` method + // https://tc39.es/ecma262/#sec-promise.resolve + resolve: function resolve(x) { + return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x); + } +}); + +$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, { + // `Promise.all` method + // https://tc39.es/ecma262/#sec-promise.all + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aCallable(C.resolve); + var values = []; + var counter = 0; + var remaining = 1; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + remaining++; + call($promiseResolve, C, promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + }, + // `Promise.race` method + // https://tc39.es/ecma262/#sec-promise.race + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aCallable(C.resolve); + iterate(iterable, function (promise) { + call($promiseResolve, C, promise).then(capability.resolve, reject); + }); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.string.iterator.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.string.iterator.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var charAt = (__webpack_require__(/*! ../internals/string-multibyte */ "../../node_modules/core-js/internals/string-multibyte.js").charAt); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); + +var STRING_ITERATOR = 'String Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); + +// `String.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-string.prototype-@@iterator +defineIterator(String, 'String', function (iterated) { + setInternalState(this, { + type: STRING_ITERATOR, + string: toString(iterated), + index: 0 + }); +// `%StringIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next +}, function next() { + var state = getInternalState(this); + var string = state.string; + var index = state.index; + var point; + if (index >= string.length) return { value: undefined, done: true }; + point = charAt(string, index); + state.index += point.length; + return { value: point, done: false }; +}); + + +/***/ }), + +/***/ "../../node_modules/guid/guid.js": +/*!***************************************!*\ + !*** ../../node_modules/guid/guid.js ***! + \***************************************/ +/***/ ((module) => { + +(function () { + var validator = new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", "i"); + + function gen(count) { + var out = ""; + for (var i=0; i { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var TableauEvent = /** @class */ (function () { + function TableauEvent(type) { + this._type = type; + } + Object.defineProperty(TableauEvent.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + return TableauEvent; +}()); +exports.TableauEvent = TableauEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js": +/*!***********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauSheetEvent.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +var TableauSheetEvent = /** @class */ (function (_super) { + __extends(TableauSheetEvent, _super); + function TableauSheetEvent(type, sheet) { + var _this = _super.call(this, type) || this; + _this._sheet = sheet; + return _this; + } + Object.defineProperty(TableauSheetEvent.prototype, "sheet", { + get: function () { + return this._sheet; + }, + enumerable: true, + configurable: true + }); + return TableauSheetEvent; +}(TableauEvent_1.TableauEvent)); +exports.TableauSheetEvent = TableauSheetEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +var TableauWorksheetEvent = /** @class */ (function (_super) { + __extends(TableauWorksheetEvent, _super); + function TableauWorksheetEvent(type, _worksheet) { + var _this = _super.call(this, type, _worksheet) || this; + _this._worksheet = _worksheet; + return _this; + } + Object.defineProperty(TableauWorksheetEvent.prototype, "worksheet", { + get: function () { + return this._worksheet; + }, + enumerable: true, + configurable: true + }); + return TableauWorksheetEvent; +}(TableauSheetEvent_1.TableauSheetEvent)); +exports.TableauWorksheetEvent = TableauWorksheetEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js": +/*!************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +var WorkbookFormattingChangedEvent = /** @class */ (function (_super) { + __extends(WorkbookFormattingChangedEvent, _super); + function WorkbookFormattingChangedEvent(_formatting) { + var _this = _super.call(this, Contract.TableauEventType.WorkbookFormattingChanged) || this; + _this._formatting = _formatting; + return _this; + } + Object.defineProperty(WorkbookFormattingChangedEvent.prototype, "formatting", { + get: function () { + return this._formatting; + }, + enumerable: true, + configurable: true + }); + return WorkbookFormattingChangedEvent; +}(TableauEvent_1.TableauEvent)); +exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js": +/*!*******************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BentonSansFontFamilyName = 'Benton Sans'; +exports.BentonSansLowDPIFontFamilyName = 'Benton Sans Low-DPI'; +exports.BentonSansBookFontFaceName = 'Benton Sans Book'; +exports.BentonSansBookItalicFontFaceName = 'Benton Sans Book Italic'; +exports.BentonSansSemiDemiFontFaceName = 'Benton Sans SemiDemi'; +exports.BentonSansSemiDemiItalicFontFaceName = 'Benton Sans SemiDemi Italic'; +exports.BentonSansLightFontFaceName = 'Benton Sans Light'; +exports.BentonSansMediumFontFaceName = 'Benton Sans Medium'; +exports.SupportedBentonSansFontFaces = [ + exports.BentonSansBookFontFaceName, + exports.BentonSansBookItalicFontFaceName, + exports.BentonSansSemiDemiFontFaceName, + exports.BentonSansSemiDemiItalicFontFaceName, + exports.BentonSansLightFontFaceName, + exports.BentonSansMediumFontFaceName, +]; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js": +/*!*******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ConnectedServer.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ConnectedServer = /** @class */ (function () { + function ConnectedServer(_userId, _siteId, _siteNamespace, _workbookId) { + this._userId = _userId; + this._siteId = _siteId; + this._siteNamespace = _siteNamespace; + this._workbookId = _workbookId; + } + Object.defineProperty(ConnectedServer.prototype, "userId", { + get: function () { + return this._userId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectedServer.prototype, "siteId", { + get: function () { + return this._siteId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectedServer.prototype, "siteNamespace", { + get: function () { + return this._siteNamespace; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectedServer.prototype, "workbookId", { + get: function () { + return this._workbookId; + }, + enumerable: true, + configurable: true + }); + return ConnectedServer; +}()); +exports.ConnectedServer = ConnectedServer; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js": +/*!*************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var ExtensionWorkbookImpl = /** @class */ (function (_super) { + __extends(ExtensionWorkbookImpl, _super); + function ExtensionWorkbookImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + ExtensionWorkbookImpl.prototype.getAllDataSourcesAsync = function () { + var _this = this; + var service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("data-source-service" /* DataSourceService */); + return service.getAllDataSourcesAsync().then(function (result) { + var dataSchema = result; + var dataSources = []; + // Loop through all data sources and add them. + Object.values(dataSchema.dataSources).forEach(function (ds) { + dataSources.push(_this.createDataSourceFromInfo(ds)); + }); + return dataSources; + }); + }; + ExtensionWorkbookImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) { + var dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId); + var dataSource = new api_shared_js_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + }; + return ExtensionWorkbookImpl; +}(api_shared_js_1.WorkbookImpl)); +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 __spreadArrays = (this && this.__spreadArrays) || function () { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var Dashboard_1 = __webpack_require__(/*! ../Models/Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +var Workbook_1 = __webpack_require__(/*! ../Models/Workbook */ "./lib/src/ExtensionsApi/Models/Workbook.js"); +var Worksheet_1 = __webpack_require__(/*! ../Models/Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +var DashboardContent_1 = __webpack_require__(/*! ../Namespaces/DashboardContent */ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js"); +var Environment_1 = __webpack_require__(/*! ../Namespaces/Environment */ "./lib/src/ExtensionsApi/Namespaces/Environment.js"); +var Settings_1 = __webpack_require__(/*! ../Namespaces/Settings */ "./lib/src/ExtensionsApi/Namespaces/Settings.js"); +var UI_1 = __webpack_require__(/*! ../Namespaces/UI */ "./lib/src/ExtensionsApi/Namespaces/UI.js"); +var WorksheetContent_1 = __webpack_require__(/*! ../Namespaces/WorksheetContent */ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js"); +var RegisterAllExtensionsServices_1 = __webpack_require__(/*! ../Services/RegisterAllExtensionsServices */ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var BentonSansFontNameConstants_1 = __webpack_require__(/*! ./BentonSansFontNameConstants */ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js"); +var ExtensionWorkbookImpl_1 = __webpack_require__(/*! ./ExtensionWorkbookImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js"); +var LegacyInternalApiDispatcherHolder_1 = __webpack_require__(/*! ./LegacyInternalApiDispatcherHolder */ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js"); +var SettingsImpl_1 = __webpack_require__(/*! ./SettingsImpl */ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js"); +var TableauBookFontNameConstants_1 = __webpack_require__(/*! ./TableauBookFontNameConstants */ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js"); +var UIImpl_1 = __webpack_require__(/*! ./UIImpl */ "./lib/src/ExtensionsApi/Impl/UIImpl.js"); +var ExtensionsImpl = /** @class */ (function () { + function ExtensionsImpl() { + } + ExtensionsImpl.prototype.initializeAsync = function (isExtensionDialog, contextMenuCallbacks) { + var _this = this; + if (!this._initializationPromise) { + this._initializationPromise = new Promise(function (resolve, reject) { + var _a; + var initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha }; + // First thing we want to do is check to see if there is a desktop dispatcher already registered for us + if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) { + // Running in a pre-2019.3 desktop, use our legacy dispatcher promise + var desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions); + (_a = desktopDispatcherPromise) === null || _a === void 0 ? void 0 : _a.then(function (dispatcherFactory) { return _this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks); }).then(function (openPayload) { + resolve(openPayload); + }).catch(function (error) { + reject(error); + }); + } + else { + // We must be running in server, so we should try to kick of the server dispatcher bootstrapping + var onDispatcherReceivedCallback_1 = _this.onDispatcherReceived.bind(_this); + api_shared_js_1.doCrossFrameBootstrap(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions) + .then(function (factory) { + return onDispatcherReceivedCallback_1(factory, isExtensionDialog, contextMenuCallbacks); + }) + .then(function (openPayload) { + resolve(openPayload); + }) + .catch(function (error) { + reject(error); + }); + } + }); + } + return this._initializationPromise; + }; + ExtensionsImpl.prototype.createVizImageAsync = function (inputSpec) { + var vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* Viz */); + return vizService.createVizImageAsync(inputSpec); + }; + ExtensionsImpl.prototype.setClickThroughAsync = function (clickThroughEnabled) { + var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId); + }; + ExtensionsImpl.prototype.isDashboardExtensionLocator = function (locator) { + var dashboardExtensionLocator = locator; + if (!dashboardExtensionLocator.dashboardPath) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.'); + } + return true; + }; + ExtensionsImpl.prototype.onDispatcherReceived = function (dispatcherFactory, isExtensionDialog, contextMenuFunctions) { + var _this = this; + var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + // Call to register all the services which will use the newly initialized dispatcher + RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher); + // Get the initialization service and initialize this extension + var initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("InitializationService" /* InitializationService */); + var callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : []; + return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then(function (result) { + // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and + // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9 + var platformVersion = result.extensionEnvironment.platformVersion + ? 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, platformVersion); + RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher); + if (result.extensionDashboardInfo && _this.isDashboardExtensionLocator(result.extensionInstance.locator)) { + _this.dashboardContent = _this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath); + _this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId; + } + if (result.extensionWorksheetInfo) { + _this.worksheetContent = _this.initializeWorksheetContent(result.extensionWorksheetInfo); + } + _this.environment = new Environment_1.Environment(result.extensionEnvironment); + _this.settings = _this.initializeSettings(result.extensionSettingsInfo); + _this.ui = new UI_1.UI(new UIImpl_1.UIImpl()); + _this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl()); + if (result.extensionEnvironment.workbookFormatting) { + _this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting); + _this.applyAllFormatting(result.extensionEnvironment.workbookFormatting); + } + // After initialization has completed, setup listeners for the callback functions that + // are meant to be triggered whenever a context menu item is clicked. + _this.initializeContextMenuCallbacks(contextMenuFunctions); + // Also set up listeners for ExtensionStylesChangedEvent + _this.initializeWorkbookFormattingChangedEventCallback(dispatcher); + // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the + // developer, we just ingore that string. In the case of initializing from an extension dialog, this string + // is an optional payload sent from the parent extension. + return result.extensionDialogPayload; + }); + }; + ExtensionsImpl.prototype.applyAllFormatting = function (formattingModel) { + var _this = this; + 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; + } + var stylesheet = this._styleElement.sheet; + while (stylesheet.cssRules.length > 0) { + stylesheet.deleteRule(stylesheet.cssRules.length - 1); + } + formattingModel.formattingSheets.map(function (currentFormattingSheet) { + _this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet); + }); + }; + ExtensionsImpl.prototype.applyFormattingSheetToStyleSheet = function (currentFormattingSheet, stylesheet) { + var styleInfo = ''; + var 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 + '; '; + } + var selector = '.' + currentFormattingSheet.classNameKey; + var rule = selector + ' { ' + styleInfo + ' }'; + stylesheet.insertRule(rule, stylesheet.cssRules.length); + }; + ExtensionsImpl.prototype.initializeWorkbookFormattingChangedEventCallback = function (dispatcher) { + var _this = this; + var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function () { return true; }, function (eventFormatting) { + if (eventFormatting) { + _this.initializeTableauFonts(dispatcher, eventFormatting); + _this.applyAllFormatting(eventFormatting); + } + }); + }; + ExtensionsImpl.prototype.initializeTableauFonts = function (dispatcher, workbookFormatting) { + var _a; + var _this = this; + var fontNames = __spreadArrays(BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, TableauBookFontNameConstants_1.SupportedTableauFontFaces); + workbookFormatting.formattingSheets.forEach(function (formattingSheet) { + if (formattingSheet.cssProperties.fontFamily) { + fontNames.push(formattingSheet.cssProperties.fontFamily); + } + }); + if (fontNames.length > 0) { + var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.FontNameListItems] = fontNames, _a); + dispatcher + .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters) + .then(function (response) { + _this.loadFonts(response.result); + }) + .catch(); + } + }; + ExtensionsImpl.prototype.loadFonts = function (fonts) { + var _this = this; + fonts.forEach(function (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)); + } + }); + }; + ExtensionsImpl.prototype.initializeDashboardContent = function (info, sheetPath) { + // sheets are always active for Extensions + var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true); + var dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId); + var dashboard = new Dashboard_1.Dashboard(dashboardImpl); + return new DashboardContent_1.DashboardContent(dashboard); + }; + ExtensionsImpl.prototype.initializeWorksheetContent = function (info) { + var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific + true); + var worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent + null); + var worksheet = new Worksheet_1.Worksheet(worksheetImpl); + return new WorksheetContent_1.WorksheetContent(worksheet); + }; + ExtensionsImpl.prototype.initializeSettings = function (settingsInfo) { + var settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo); + return new Settings_1.Settings(settingsImpl); + }; + ExtensionsImpl.prototype.initializeContextMenuCallbacks = function (contextMenuFunctions) { + var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, function () { + // Let through any context menu event, these are already filtered on api-core + // based on the extension locator. + return true; + }, function (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](); + } + }); + }; + ExtensionsImpl.prototype.loadTableauFonts = function (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 + ".'"); + } + }; + ExtensionsImpl.prototype.loadBentonSansFonts = function (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 + ".'"); + } + }; + return ExtensionsImpl; +}()); +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 })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract. + * It supports running a newer external library against a pre 2019.3 desktop. + * Starting in 2019.3, we have a merged bootstrap style for both desktop and server. + * In addition, the alpha checking that is happening here is not necessary in external-api-js + * after 2019.3 because that checking happens in api-platform-js (ApiDispatcherTest.ts) + * TFSID: 1091561 tracks an improvement to this system to make it less complex and tie it directly to + * tableau beta release versions. + * @deprecated + */ +// eslint-disable-next-line @typescript-eslint/no-namespace +var LegacyInternalApiDispatcherHolder; +(function (LegacyInternalApiDispatcherHolder) { + /** + * @param options + */ + function getDesktopDispatcherPromise(options) { + var _a; + if ((!options || typeof options.isAlpha === 'undefined') && !window.__warningIssued) { + // tslint:disable-next-line:no-console + console.warn('This is a beta version of the Extensions API. Please upgrade to an official release.'); + window.__warningIssued = true; + } + else if (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) { + window.__tableauDesktopDispatcher + .then(function (dispatcherFactory) { + var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch(); + }) + .catch(); + } + // this will be undefined if promise is rejected or throws + return window.__tableauDesktopDispatcher; + } + LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise = getDesktopDispatcherPromise; + /** + * @param options + */ + function hasDesktopApiDispatcherPromise(options) { + return !!getDesktopDispatcherPromise(options); + } + LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise = hasDesktopApiDispatcherPromise; +})(LegacyInternalApiDispatcherHolder = exports.LegacyInternalApiDispatcherHolder || (exports.LegacyInternalApiDispatcherHolder = {})); + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js": +/*!****************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var SettingsChangedEvent = /** @class */ (function (_super) { + __extends(SettingsChangedEvent, _super); + function SettingsChangedEvent(_newSettings) { + var _this = _super.call(this, Contract.TableauEventType.SettingsChanged) || this; + _this._newSettings = _newSettings; + return _this; + } + Object.defineProperty(SettingsChangedEvent.prototype, "newSettings", { + get: function () { + return this._newSettings; + }, + enumerable: true, + configurable: true + }); + return SettingsChangedEvent; +}(TableauEvent_1.TableauEvent)); +var SettingsImpl = /** @class */ (function () { + function SettingsImpl(settingsInfo) { + // Since promises can't be introspected for state, keep a variable that + // indicates a save is in progress, so that set/erase can't be called during a save. + this._saveInProgress = false; + this.initializeSettings(settingsInfo); + } + SettingsImpl.prototype.erase = function (key) { + 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; + } + }; + SettingsImpl.prototype.get = function (key) { + api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); + return this._currentSettings[key]; + }; + SettingsImpl.prototype.getAll = function () { + // Returns a mutable copy of the settings + return Object.assign({}, this._currentSettings); + }; + Object.defineProperty(SettingsImpl.prototype, "isModified", { + get: function () { + return this._isModified; + }, + enumerable: true, + configurable: true + }); + SettingsImpl.prototype.saveAsync = function () { + var _this = this; + 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 + var settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("SettingsService" /* SettingsService */); + return settingsService.saveSettingsAsync(this._currentSettings).then(function (newSettings) { + _this._saveInProgress = false; + _this._isModified = false; + if (_this._currentSettings === undefined) { + _this._currentSettings = newSettings; + } + else { + Object.assign(_this._currentSettings, newSettings); + } + return newSettings; + }, function (reason) { + _this._saveInProgress = false; + return Promise.reject(reason); + }); + }; + SettingsImpl.prototype.set = function (key, value) { + api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string. + api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed. + this.verifySettingsAreUnlocked(); + this._currentSettings[key] = value; + this._isModified = true; + }; + /** + * Initializes all events relevant to settings object. This is only a settingsUpdate event currently. + * + * @returns {Array} Collection of event managers to pass to an EventListenerManager. + */ + SettingsImpl.prototype.initializeEvents = function () { + var _this = this; + var results = new Array(); + var notificationService; + 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; + } + var settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, function () { return true; }, function (event) { + _this._currentSettings = event.newSettings; + settingsChangedEvent.triggerEvent(function () { return new SettingsChangedEvent(event.newSettings); }); + }); + results.push(settingsChangedEvent); + return results; + }; + SettingsImpl.prototype.initializeSettings = function (settingsInfo) { + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo'); + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues'); + this._currentSettings = settingsInfo.settingsValues; + // Reset the isModified flag + this._isModified = false; + }; + /** + * This helper should be called before any local update to this.currentSettings. + * Checks if a current save call is still in progress and throws an error if so. + */ + SettingsImpl.prototype.verifySettingsAreUnlocked = function () { + if (this._saveInProgress) { + throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS); + } + }; + SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; + return SettingsImpl; +}()); +exports.SettingsImpl = SettingsImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableauBookFontFamilyName = 'Tableau Book'; +exports.TableauLightFontFamilyName = 'Tableau Light'; +exports.TableauRegularFontFamilyName = 'Tableau Regular'; +exports.TableauMediumFontFamilyName = 'Tableau Medium'; +exports.TableauSemiboldFontFamilyName = 'Tableau Semibold'; +exports.TableauBoldFontFamilyName = 'Tableau Bold'; +exports.TableauBookFontFaceName = 'Tableau Book'; +exports.TableauBoldFontFaceName = 'Tableau Bold'; +exports.TableauLightFontFaceName = 'Tableau Light'; +exports.TableauMediumFontFaceName = 'Tableau Medium'; +exports.TableauRegularFontFaceName = 'Tableau Regular'; +exports.TableauSemiBoldFontFaceName = 'Tableau Semi Bold'; +exports.SupportedTableauFontFaces = [ + exports.TableauBookFontFaceName, + exports.TableauBoldFontFaceName, + exports.TableauLightFontFaceName, + exports.TableauMediumFontFaceName, + exports.TableauRegularFontFaceName, + exports.TableauSemiBoldFontFaceName, +]; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/UIImpl.js": +/*!**********************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/UIImpl.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var UIImpl = /** @class */ (function () { + function UIImpl() { + } + UIImpl.prototype.displayDialogAsync = function (url, payload, options) { + var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + return new Promise(function (resolve, reject) { + uiService + .displayDialogAsync(url, payload || '', options) + .then(function () { + var unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, function () { + // Let through any dialog update event + return true; + }, function (event) { + if (event.isCloseEvent) { + if (event.closePayload === undefined) { + throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); + } + resolve(event.closePayload); + } + else { + reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.')); + } + unregisterFn(); + }); + }) + .catch(function (error) { + reject(error); + }); + }); + }; + UIImpl.prototype.closeDialog = function (payload) { + var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + uiService.closeDialog(payload); + }; + return UIImpl; +}()); +exports.UIImpl = UIImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Dashboard.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Dashboard.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var DashboardLayoutChangedEvent_1 = __webpack_require__(/*! ../Events/DashboardLayoutChangedEvent */ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js"); +var WorkbookFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorkbookFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var DashboardObject_1 = __webpack_require__(/*! ./DashboardObject */ "./lib/src/ExtensionsApi/Models/DashboardObject.js"); +var Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +var Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +var Dashboard = /** @class */ (function (_super) { + __extends(Dashboard, _super); + function Dashboard(_dashboardImpl) { + var _this = _super.call(this, _dashboardImpl) || this; + _this._dashboardImpl = _dashboardImpl; + _dashboardImpl.initializeWithPublicInterfaces(); + _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Object.defineProperty(Dashboard.prototype, "worksheets", { + get: function () { + return this._dashboardImpl.worksheetsImpl.map(function (worksheetImpl) { + return new Worksheet_1.Worksheet(worksheetImpl); + }); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Dashboard.prototype, "objects", { + get: function () { + return this._dashboardImpl.objects.map(function (dashboardObjectImpl) { + return new DashboardObject_1.DashboardObject(dashboardObjectImpl); + }); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Dashboard.prototype, "activeDashboardObjectId", { + get: function () { + return this._dashboardImpl.activeDashboardObjectId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Dashboard.prototype, "activeDashboardName", { + get: function () { + return this._dashboardImpl.activeDashboardName; + }, + enumerable: true, + configurable: true + }); + Dashboard.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) { + return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap); + }; + Dashboard.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) { + return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap); + }; + Dashboard.prototype.getDashboardObjectById = function (dashboardObjectId) { + var zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId); + return zone && new DashboardObject_1.DashboardObject(zone); + }; + Dashboard.prototype.initializeEvents = function () { + var _this = this; + var results = new Array(); + // Initializing events and registering notification service + var 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; + } + var dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, function () { return true; }, function (event) { + var dashboardObjectChanges = _this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName); + dashboardLayoutChangedEvent.triggerEvent(function () { return new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges); }); + }); + results.push(dashboardLayoutChangedEvent); + var workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function () { return true; }, function (eventFormatting) { + workbookFormattingChangedEvent.triggerEvent(function () { return new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting); }); + }); + results.push(workbookFormattingChangedEvent); + return results; + }; + Dashboard.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) { + return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray); + }; + Dashboard.prototype.replayAnimationAsync = function (replaySpeed) { + return this._dashboardImpl.replayAnimationAsync(replaySpeed); + }; + Dashboard.prototype.getFiltersAsync = function () { + return this._dashboardImpl.getFiltersAsync(); + }; + Dashboard.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options); + }; + return Dashboard; +}(Sheet_1.Sheet)); +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 })); +var Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +var Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + */ +var DashboardObject = /** @class */ (function () { + function DashboardObject(_dashboardObjectImpl) { + this._dashboardObjectImpl = _dashboardObjectImpl; + } + Object.defineProperty(DashboardObject.prototype, "dashboard", { + get: function () { + return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "type", { + get: function () { + return this._dashboardObjectImpl.type; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "position", { + get: function () { + return this._dashboardObjectImpl.position; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "size", { + get: function () { + return this._dashboardObjectImpl.size; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "worksheet", { + get: function () { + if (this._dashboardObjectImpl.worksheetImpl) { + return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl); + } + return undefined; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "name", { + get: function () { + return this._dashboardObjectImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "isFloating", { + get: function () { + return this._dashboardObjectImpl.isFloating; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "isVisible", { + get: function () { + return this._dashboardObjectImpl.isVisible; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "id", { + get: function () { + return this._dashboardObjectImpl.id; + }, + enumerable: true, + configurable: true + }); + return DashboardObject; +}()); +exports.DashboardObject = DashboardObject; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Parameter.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Parameter.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var ParameterChangedEvent_1 = __webpack_require__(/*! ../Events/ParameterChangedEvent */ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +/** + * Implementation of the Parameter contract. Calls down to the impl + * class for almost all of the work it does. + */ +var Parameter = /** @class */ (function (_super) { + __extends(Parameter, _super); + function Parameter(parameterImpl, sheet) { + var _this = _super.call(this) || this; + _this.parameterImpl = parameterImpl; + // Initialize our event handling for this class + _this.initializeEvents(sheet).forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Object.defineProperty(Parameter.prototype, "name", { + get: function () { + return this.parameterImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "currentValue", { + get: function () { + return this.parameterImpl.currentValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "dataType", { + get: function () { + return this.parameterImpl.dataType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "allowableValues", { + get: function () { + return this.parameterImpl.allowableValues; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "id", { + get: function () { + return this.parameterImpl.id; + }, + enumerable: true, + configurable: true + }); + Parameter.prototype.changeValueAsync = function (newValue) { + 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 + */ + Parameter.prototype.initializeEvents = function (sheet) { + var _this = this; + api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet'); + var results = new Array(); + var 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) + var parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, function (model) { + var fieldName = model; + return fieldName === _this.parameterImpl.id; + }, function (fieldName) { + parameterEvent.triggerEvent(function () { return new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet); }); + }); + results.push(parameterEvent); + return results; + }; + return Parameter; +}(api_shared_js_1.EventListenerManager)); +exports.Parameter = Parameter; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Sheet.js": +/*!***********************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Sheet.js ***! + \***********************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var Parameter_1 = __webpack_require__(/*! ./Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); +var Sheet = /** @class */ (function (_super) { + __extends(Sheet, _super); + function Sheet(_sheetImpl) { + var _this = _super.call(this) || this; + _this._sheetImpl = _sheetImpl; + return _this; + } + Object.defineProperty(Sheet.prototype, "name", { + get: function () { + return this._sheetImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Sheet.prototype, "sheetType", { + get: function () { + return this._sheetImpl.sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Sheet.prototype, "size", { + get: function () { + if (this.isValidSize(this._sheetImpl.size)) { + return this._sheetImpl.size; + } + throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented'); + }, + enumerable: true, + configurable: true + }); + Sheet.prototype.isValidSize = function (size) { + var testSize = size; + if (testSize.width !== undefined && testSize.height !== undefined) { + return true; + } + return false; + }; + Sheet.prototype.findParameterAsync = function (parameterName) { + var _this = this; + return this._sheetImpl.findParameterAsync(parameterName).then(function (parameterImpl) { + if (parameterImpl) { + return new Promise(function (resolve) { return resolve(new Parameter_1.Parameter(parameterImpl, _this)); }); + } + else { + return new Promise(function (resolve) { return resolve(undefined); }); + } + }); + }; + Sheet.prototype.getParametersAsync = function () { + var _this = this; + return this._sheetImpl.getParametersAsync().then(function (parametersImpl) { + return parametersImpl.map(function (parameterImpl) { + return new Parameter_1.Parameter(parameterImpl, _this); + }); + }); + }; + return Sheet; +}(api_shared_js_1.EventListenerManager)); +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 })); +var Workbook = /** @class */ (function () { + function Workbook(_workbookImpl) { + this._workbookImpl = _workbookImpl; + } + Workbook.prototype.getAllDataSourcesAsync = function () { + return this._workbookImpl.getAllDataSourcesAsync(); + }; + return Workbook; +}()); +exports.Workbook = Workbook; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Worksheet.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Worksheet.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var FilterChangedEvent_1 = __webpack_require__(/*! ../Events/FilterChangedEvent */ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js"); +var MarksSelectedEvent_1 = __webpack_require__(/*! ../Events/MarksSelectedEvent */ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js"); +var SummaryDataChangedEvent_1 = __webpack_require__(/*! ../Events/SummaryDataChangedEvent */ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +var Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +var Worksheet = /** @class */ (function (_super) { + __extends(Worksheet, _super); + function Worksheet(_worksheetImpl) { + var _this = _super.call(this, _worksheetImpl) || this; + _this._worksheetImpl = _worksheetImpl; + // Call to initialize events and then call down to the event listener manager to handle things + _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Object.defineProperty(Worksheet.prototype, "parentDashboard", { + get: function () { + // This should never happen for Extensions if the DashboardImpls are created correctly + if (this._worksheetImpl.parentDashboard == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "Parent dashboard not implemented"); + } + return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard); + }, + enumerable: true, + configurable: true + }); + /** + * 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 + */ + Worksheet.prototype.initializeEvents = function () { + var _this = this; + var results = new Array(); + var 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) + var marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, function (model) { + var visualId = model; + return _this.visualIdsAreEqual(visualId, _this._worksheetImpl.visualId); + }, function () { return marksEvent.triggerEvent(function () { return new MarksSelectedEvent_1.MarksSelectedEvent(_this); }); }); + var filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, function (model) { + var filterEventResponse = model; + return _this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet; + }, function (event) { + filterEvent.triggerEvent(function () { return new FilterChangedEvent_1.FilterChangedEvent(_this, event.fieldName, event.fieldId); }); + }); + var summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, function (model) { + var summaryDataEventResponse = model; + return _this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet; + }, function (event) { + summaryDataEvent.triggerEvent(function () { return new SummaryDataChangedEvent_1.SummaryDataChangedEvent(_this); }); + }); + results.push(marksEvent); + results.push(filterEvent); + results.push(summaryDataEvent); + return results; + }; + Worksheet.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options); + }; + Worksheet.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) { + return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions); + }; + Worksheet.prototype.applyHierarchicalFilterAsync = function (fieldName, values, updateType, options) { + return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options); + }; + Worksheet.prototype.applyRelativeDateFilterAsync = function (fieldName, options) { + return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options); + }; + Worksheet.prototype.clearFilterAsync = function (fieldName) { + return this._worksheetImpl.clearFilterAsync(fieldName); + }; + Worksheet.prototype.getDataSourcesAsync = function () { + return this._worksheetImpl.getDataSourcesAsync(); + }; + Worksheet.prototype.getFiltersAsync = function () { + return this._worksheetImpl.getFiltersAsync(); + }; + Worksheet.prototype.getSelectedMarksAsync = function () { + return this._worksheetImpl.getSelectedMarksAsync(); + }; + Worksheet.prototype.getHighlightedMarksAsync = function () { + return this._worksheetImpl.getHighlightedMarksAsync(); + }; + Worksheet.prototype.getSummaryDataAsync = function (options) { + return this._worksheetImpl.getSummaryDataAsync(options); + }; + Worksheet.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) { + return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options); + }; + Worksheet.prototype.getSummaryColumnsInfoAsync = function () { + return this._worksheetImpl.getSummaryColumnsInfoAsync(); + }; + Worksheet.prototype.getUnderlyingDataAsync = function (options) { + console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' + + 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync'); + return this._worksheetImpl.getUnderlyingDataAsync(options); + }; + Worksheet.prototype.getUnderlyingTablesAsync = function () { + return this._worksheetImpl.getUnderlyingTablesAsync(); + }; + Worksheet.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) { + return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options); + }; + Worksheet.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options); + }; + Worksheet.prototype.getVisualSpecificationAsync = function () { + return this._worksheetImpl.getVisualSpecificationAsync(); + }; + Worksheet.prototype.clearSelectedMarksAsync = function () { + return this._worksheetImpl.clearSelectedMarksAsync(); + }; + Worksheet.prototype.selectMarksByIDAsync = function (marksInfo, updateType) { + return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType); + }; + Worksheet.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType); + }; + Worksheet.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType); + }; + Worksheet.prototype.annotateMarkAsync = function (mark, annotationText) { + return this._worksheetImpl.annotateMarkAsync(mark, annotationText); + }; + Worksheet.prototype.getAnnotationsAsync = function () { + return this._worksheetImpl.getAnnotationsAsync(); + }; + Worksheet.prototype.removeAnnotationAsync = function (annotation) { + return this._worksheetImpl.removeAnnotationAsync(annotation); + }; + Worksheet.prototype.hoverTupleAsync = function (hoveredTuple, tooltip) { + return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip); + }; + Worksheet.prototype.selectTuplesAsync = function (selectedTuples, selectOption, tooltip) { + return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip); + }; + Worksheet.prototype.visualIdsAreEqual = function (a, b) { + return (a && + b && + a.worksheet === b.worksheet && + a.dashboard === b.dashboard && + a.storyboard === b.storyboard && + a.storyPointID === b.storyPointID); + }; + return Worksheet; +}(Sheet_1.Sheet)); +exports.Worksheet = Worksheet; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/DashboardContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external DashboardContent namespace. + * This does not follow the Impl pattern as DashboardContent is + * currently just a (single) property bag. + */ +var DashboardContent = /** @class */ (function () { + function DashboardContent(_dashboard) { + this._dashboard = _dashboard; + } + Object.defineProperty(DashboardContent.prototype, "dashboard", { + get: function () { + return this._dashboard; + }, + enumerable: true, + configurable: true + }); + return DashboardContent; +}()); +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 })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var ConnectedServer_1 = __webpack_require__(/*! ../Impl/ConnectedServer */ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js"); +var WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ./WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); +/** + * Implementation of the external environment namespace. + * Environment does not follow the Impl pattern as it is + * just a property bag. + * First class extensions can get to ConnectedServer with: environment['connectedServer'] + */ +var Environment = /** @class */ (function () { + function Environment(extensionEnvironment) { + 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; + } + } + Object.defineProperty(Environment.prototype, "apiVersion", { + get: function () { + return this._apiVersion; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "context", { + get: function () { + return this._context; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "workbookFormatting", { + get: function () { + return this._formatting; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "language", { + get: function () { + return this._language; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "country", { + get: function () { + return this._country; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "locale", { + get: function () { + return this._locale; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "mode", { + get: function () { + return this._mode; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "operatingSystem", { + get: function () { + return this._operatingSystem; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "tableauVersion", { + get: function () { + return this._tableauVersion; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "uniqueUserId", { + get: function () { + return this._uniqueUserId; + }, + enumerable: true, + configurable: true + }); + return Environment; +}()); +exports.Environment = Environment; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Extensions.js": +/*!********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Extensions.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external Extensions namespace. + */ +var Extensions = /** @class */ (function () { + function Extensions(extensionImpl) { + this.extensionImpl = extensionImpl; + this.extensionImpl = extensionImpl; + } + Object.defineProperty(Extensions.prototype, "dashboardContent", { + get: function () { + return this.extensionImpl.dashboardContent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "worksheetContent", { + get: function () { + return this.extensionImpl.worksheetContent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "environment", { + get: function () { + return this.extensionImpl.environment; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "settings", { + get: function () { + return this.extensionImpl.settings; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "ui", { + get: function () { + return this.extensionImpl.ui; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "workbook", { + get: function () { + return this.extensionImpl.workbook; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "dashboardObjectId", { + get: function () { + return this.extensionImpl.extensionZoneId; + }, + enumerable: true, + configurable: true + }); + Extensions.prototype.initializeAsync = function (contextMenuCallbacks) { + return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then(); + }; + Extensions.prototype.initializeDialogAsync = function () { + return this.extensionImpl.initializeAsync(true); + }; + Extensions.prototype.createVizImageAsync = function (inputSpec) { + return this.extensionImpl.createVizImageAsync(inputSpec); + }; + Extensions.prototype.setClickThroughAsync = function (clickThroughEnabled) { + return this.extensionImpl.setClickThroughAsync(clickThroughEnabled); + }; + return Extensions; +}()); +exports.Extensions = Extensions; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Settings.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Settings.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +/** + * Implementation of the external settings namespace. + */ +var Settings = /** @class */ (function (_super) { + __extends(Settings, _super); + function Settings(_settingsImpl) { + var _this = _super.call(this) || this; + _this._settingsImpl = _settingsImpl; + // Initialize our event handling for this class + _this._settingsImpl.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Settings.prototype.erase = function (key) { + this._settingsImpl.erase(key); + }; + Settings.prototype.get = function (key) { + return this._settingsImpl.get(key); + }; + Settings.prototype.getAll = function () { + return this._settingsImpl.getAll(); + }; + Object.defineProperty(Settings.prototype, "isModified", { + get: function () { + return this._settingsImpl.isModified; + }, + enumerable: true, + configurable: true + }); + Settings.prototype.saveAsync = function () { + return this._settingsImpl.saveAsync(); + }; + Settings.prototype.set = function (key, value) { + this._settingsImpl.set(key, value); + }; + return Settings; +}(api_shared_js_1.EventListenerManager)); +exports.Settings = Settings; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/UI.js": +/*!************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/UI.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external UI namespace. + */ +var UI = /** @class */ (function () { + function UI(_impl) { + this._impl = _impl; + } + UI.prototype.displayDialogAsync = function (url, payload, options) { + return this._impl.displayDialogAsync(url, payload, options); + }; + UI.prototype.closeDialog = function (payload) { + this._impl.closeDialog(payload); + }; + return UI; +}()); +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 })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var WorkbookFormattingEnvUtil = /** @class */ (function () { + function WorkbookFormattingEnvUtil() { + } + WorkbookFormattingEnvUtil.convertToWorkbookFormatting = function (workbookFormattingModel) { + if (!workbookFormattingModel) { + return undefined; + } + else { + var formattingMap = workbookFormattingModel.formattingSheets.map(function (currentFormattingSheet) { + var formattingSheet = { + classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey), + cssProperties: { + fontFamily: currentFormattingSheet.cssProperties.fontFamily, + fontSize: currentFormattingSheet.cssProperties.fontSize, + fontWeight: currentFormattingSheet.cssProperties.fontWeight, + fontStyle: currentFormattingSheet.cssProperties.fontStyle, + textDecoration: currentFormattingSheet.cssProperties.textDecoration, + color: currentFormattingSheet.cssProperties.color, + }, + }; + return formattingSheet; + }); + var result = { + formattingSheets: formattingMap, + }; + return result; + } + }; + return WorkbookFormattingEnvUtil; +}()); +exports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external WorksheetContent namespace. + * This does not follow the Impl pattern as WorksheetContent is + * currently just a (single) property bag. + */ +var WorksheetContent = /** @class */ (function () { + function WorksheetContent(_worksheet) { + this._worksheet = _worksheet; + } + Object.defineProperty(WorksheetContent.prototype, "worksheet", { + get: function () { + return this._worksheet; + }, + enumerable: true, + configurable: true + }); + return WorksheetContent; +}()); +exports.WorksheetContent = WorksheetContent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js": +/*!**************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js ***! + \**************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var InitializationServiceImpl = /** @class */ (function (_super) { + __extends(InitializationServiceImpl, _super); + function InitializationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(InitializationServiceImpl.prototype, "serviceName", { + get: function () { + return "InitializationService" /* InitializationService */; + }, + enumerable: true, + configurable: true + }); + InitializationServiceImpl.prototype.initializeDashboardExtensionsAsync = function (isExtensionDialog, contextMenuIds) { + var _a; + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'initializeDashboardExtensionsAsync', + _a[api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds] = contextMenuIds, + _a[api_internal_contract_js_1.ParameterId.IsExtensionDialog] = isExtensionDialog, + _a); + return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then(function (response) { + // TODO - Validate return value + var result = response.result; + return result; + }); + }; + return InitializationServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +exports.InitializationServiceImpl = InitializationServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var SettingsServiceImpl = /** @class */ (function (_super) { + __extends(SettingsServiceImpl, _super); + function SettingsServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(SettingsServiceImpl.prototype, "serviceName", { + get: function () { + return "SettingsService" /* SettingsService */; + }, + enumerable: true, + configurable: true + }); + SettingsServiceImpl.prototype.saveSettingsAsync = function (settings) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveSettingsAsync', + _a[api_internal_contract_js_1.ParameterId.SettingsValues] = settings, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then(function (value) { + var result = value.result; + if (!result || !result.settingsValues) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.'); + } + return result.settingsValues; + }); + }; + return SettingsServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +exports.SettingsServiceImpl = SettingsServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js ***! + \**************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var DEFAULT_DIALOG_HEIGHT = 400; // in pixels +var DEFAULT_DIALOG_WIDTH = 600; // in pixels +var DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window; +var UIServiceImpl = /** @class */ (function (_super) { + __extends(UIServiceImpl, _super); + function UIServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(UIServiceImpl.prototype, "serviceName", { + get: function () { + return "UIService" /* UIService */; + }, + enumerable: true, + configurable: true + }); + UIServiceImpl.prototype.displayDialogAsync = function (url, payload, options) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'displayDialogAsync', + _a[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = url, + _a[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload, + _a); + var h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT; + var w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH; + var dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE; + // 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(function (response) { + var 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; + } + }); + }; + UIServiceImpl.prototype.closeDialog = function (payload) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'closeDialog', + _a); + if (payload) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; + } + return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(function () { + return; + }); + }; + UIServiceImpl.prototype.setClickThroughAsync = function (clickThroughEnabled, extensionZoneId) { + var _a; + api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled'); + if (extensionZoneId === undefined || extensionZoneId <= 0) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.'); + } + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.ExtensionZoneId] = extensionZoneId, + _a[api_internal_contract_js_1.ParameterId.ClickThroughEnabled] = clickThroughEnabled, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(function () { + return; + }); + }; + return UIServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +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 })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js"); +var SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js"); +var UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ./ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +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.SheetSizeBehavior = Enums_1.SheetSizeBehavior; +exports.TableauDialogType = Enums_1.TableauDialogType; +exports.Toolbar = Enums_1.Toolbar; +__export(__webpack_require__(/*! ./ExternalContract/Embedding/PulseInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js")); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/VizInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js")); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/WebComponentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js")); +__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the extensions api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js"); +exports.ErrorCodes = Tableau_1.ErrorCodes; +exports.ExtensionContext = Tableau_1.ExtensionContext; +exports.ExtensionMode = Tableau_1.ExtensionMode; +exports.TableauEventType = Tableau_1.TableauEventType; +exports.VizImageEncodingType = Tableau_1.VizImageEncodingType; +exports.VizImagePaletteType = Tableau_1.VizImagePaletteType; +exports.VizImageSizeSettingAlignmentType = Tableau_1.VizImageSizeSettingAlignmentType; +exports.VizImageSizeSettingType = Tableau_1.VizImageSizeSettingType; +exports.VizImageSortDirectionType = Tableau_1.VizImageSortDirectionType; +__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract.js": +/*!***************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js")); +__export(__webpack_require__(/*! ./ExtensionsApiExternalContract */ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + * @deprecated + */ +var AskDataAttributes; +(function (AskDataAttributes) { + AskDataAttributes["Origin"] = "origin"; + AskDataAttributes["ShowEmbed"] = "show-embed"; + AskDataAttributes["ShowPin"] = "show-pin"; + AskDataAttributes["ShowSave"] = "show-save"; + AskDataAttributes["ShowShare"] = "show-share"; +})(AskDataAttributes = exports.AskDataAttributes || (exports.AskDataAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js": +/*!*******************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// All enum values made available to Embedding developers. +// Enums should be kept in alphabetical order. +// Most of them should match an enum on the server defined at +// workgroup/vqlweb/scriptsharp/src/ApiShared/PublicEnums.cs#L398:17 +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Crosstab file formats available to use with {@link Viz.exportCrosstabAsync} + */ +var CrosstabFileFormat; +(function (CrosstabFileFormat) { + CrosstabFileFormat["CSV"] = "csv"; + CrosstabFileFormat["Excel"] = "xlsx"; +})(CrosstabFileFormat = exports.CrosstabFileFormat || (exports.CrosstabFileFormat = {})); +/** + * Device types available to use with {@link Viz.device} + */ +var DeviceType; +(function (DeviceType) { + DeviceType["Default"] = "default"; + DeviceType["Desktop"] = "desktop"; + DeviceType["Tablet"] = "tablet"; + DeviceType["Phone"] = "phone"; +})(DeviceType = exports.DeviceType || (exports.DeviceType = {})); +/** + * All error codes used by the Embedding API. + */ +var EmbeddingErrorCodes; +(function (EmbeddingErrorCodes) { + /** + * Raised when a request to the auth endpoint fails. + */ + EmbeddingErrorCodes["AuthFailed"] = "auth-failed"; + /** + * The browser is not capable of supporting the Tableau Embedding API + */ + EmbeddingErrorCodes["BrowserNotCapable"] = "browser-not-capable"; + /** + * The permissions on a workbook or a view do not allow downloading the workbook. + */ + EmbeddingErrorCodes["DownloadWorkbookNotAllowed"] = "download-workbook-not-allowed"; + /** + * Thrown when an error occurs while attempting to perform a filter operation. + */ + EmbeddingErrorCodes["FilterCannotBePerformed"] = "filter-cannot-be-performed"; + /** + * Thrown when attempting to switch to a sheet by index that does not exist in the workbook. + */ + EmbeddingErrorCodes["IndexOutOfRange"] = "index-out-of-range"; + /** + * Thrown when an error occurs within the Tableau Embedding API. Contact Tableau Support. + */ + EmbeddingErrorCodes["InternalError"] = "internal-error"; + /** + * An operation was attempted on a custom view that does not exist. + */ + EmbeddingErrorCodes["InvalidCustomViewName"] = "invalid-custom-view-name"; + /** + * An invalid date was specified in a method that required a date parameter. + */ + EmbeddingErrorCodes["InvalidDateParameter"] = "invalid-date-parameter"; + /** + * Either a filter operation was attempted on a field that does not exist in the data source, or the value supplied + * in the filter operation is the wrong data type or format. + */ + EmbeddingErrorCodes["invalidFilterFieldNameOrValue"] = "invalid-filter-field-name"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message + * field. + */ + EmbeddingErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * A negative size was specified or the maxSize value is less than minSize in Sheet.changeSizeAsync(). + */ + EmbeddingErrorCodes["InvalidSize"] = "invalid-size"; + /** + * Attempted to get an authoring worksheet when the current sheet is not a worksheet. + * @ignore + */ + EmbeddingErrorCodes["InvalidSheetType"] = "invalid-sheet-type"; + /** + * A behavior value was found that is not included in the SheetSizeBehavior enum. + */ + EmbeddingErrorCodes["InvalidSizeBehavior"] = "invalid-size-behavior"; + /** + * A behavior other than SheetSizeBehavior.Automatic was specified in Sheet.changeSizeAsync() when the sheet is a + * Worksheet instance. + */ + EmbeddingErrorCodes["InvalidSizeBehaviorOnWorksheet"] = "invalid-size-behavior-on-worksheet"; + /** + * The URL specified in the Viz class constructor is not valid. + */ + EmbeddingErrorCodes["InvalidUrl"] = "invalid-url"; + /** + * The maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtMost. + */ + EmbeddingErrorCodes["MissingMaxSize"] = "missing-max-size"; + /** + * The minSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtLeast. + */ + EmbeddingErrorCodes["MissingMinSize"] = "missing-min-size"; + /** + * The minSize or maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.Range. + */ + EmbeddingErrorCodes["MissingMinMaxSize"] = "missing-min-max-size"; + /** + * Can occur if the embedding app interacts with a parameter that has been removed from the worksheet. + */ + EmbeddingErrorCodes["MissingParameter"] = "missing-parameter"; + /** + * The rangeN field is missing for a relative date filter of type LASTN or NEXTN. + */ + EmbeddingErrorCodes["MissingRangeNForRelativeDateFilters"] = "missing-range-n-for-relative-date-filters"; + /** + * An attempt was made to access Sheet.getUrl() on a hidden sheet. Hidden sheets do not have URLs. + */ + EmbeddingErrorCodes["NoUrlForHiddenWorksheet"] = "no-url-for-hidden-worksheet"; + /** + * One or both of the parentElement or the URL parameters is not specified in the Viz constructor. + */ + EmbeddingErrorCodes["NoUrlOrParentElementNotFound"] = "no-url-or-parent-element-not-found"; + /** + * An operation was attempted on a sheet that is not active or embedded within the active dashboard. + */ + EmbeddingErrorCodes["NotActiveSheet"] = "not-active-sheet"; + /** + * A required parameter was not specified, null, or an empty string/array. + */ + EmbeddingErrorCodes["NullOrEmptyParameter"] = "null-or-empty-parameter"; + /** + * An operation was attempted on a sheet that does not exist in the workbook. + */ + EmbeddingErrorCodes["SheetNotInWorkbook"] = "sheet-not-in-workbook"; + /** + * An operation is performed on a CustomView object that is no longer valid (it has been removed). + */ + EmbeddingErrorCodes["StaleDataReference"] = "stale-data-reference"; + /** + * Unknown error triggered during the auth flow. + */ + EmbeddingErrorCodes["UnknownAuthError"] = "unknown-auth-error"; + /** + * An unknown event name was specified in the call to Viz.addEventListener or Viz.removeEventListener. + */ + EmbeddingErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; + /** + * A Viz object has already been created as a child of the parentElement specified in the Viz constructor. + */ + EmbeddingErrorCodes["VizAlreadyInManager"] = "viz-already-in-manager"; + /** + * Function is not supported in the embedding api. + */ + EmbeddingErrorCodes["ImplementationError"] = "wrong-implementation"; + /** + * @NotImplemented + */ + EmbeddingErrorCodes["NotImplemented"] = "not-implemented"; + /** + * Unknown error during event initialization + */ + EmbeddingErrorCodes["EventInitializationError"] = "event-initialization-error"; + /** + * Version of the embedding api not supported by the version of tableau + */ + EmbeddingErrorCodes["IncompatibleVersionError"] = "incompatible-version-error"; + /** + * Unknown {@link TableauDialogType} passed in to Viz.displayDialogAsync. + */ + EmbeddingErrorCodes["UnknownDialogType"] = "unknown-dialog-type"; + /** + * Can occur if the API interacts with a filter that has been removed from the worksheet. + * Can also occurs if a {@link FilterType} has not been implemented. + */ + EmbeddingErrorCodes["FilterMissingOrNotImplemented"] = "filter-missing-not-implemented"; + /** + * Can occur if story point ids no longer match. + */ + EmbeddingErrorCodes["StoryPointIdMismatch"] = "storypoint-id-mismatch"; +})(EmbeddingErrorCodes = exports.EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = {})); +/** + * Formats available to use with displayStaticImage in @VizInterfaces + */ +var FileFormats; +(function (FileFormats) { + FileFormats["PDF"] = "pdf"; + FileFormats["PNG"] = "png"; +})(FileFormats = exports.FileFormats || (exports.FileFormats = {})); +var PrintOrientation; +(function (PrintOrientation) { + PrintOrientation["Portrait"] = "portrait"; + PrintOrientation["Landscape"] = "landscape"; +})(PrintOrientation = exports.PrintOrientation || (exports.PrintOrientation = {})); +var PrintPageSize; +(function (PrintPageSize) { + PrintPageSize["Letter"] = "letter"; + PrintPageSize["Legal"] = "legal"; + PrintPageSize["Note"] = "note"; + PrintPageSize["Folio"] = "folio"; + PrintPageSize["Tabloid"] = "tabloid"; + PrintPageSize["Ledger"] = "ledger"; + PrintPageSize["Statement"] = "statement"; + PrintPageSize["Executive"] = "executive"; + PrintPageSize["A3"] = "A3"; + PrintPageSize["A4"] = "A4"; + PrintPageSize["A5"] = "A5"; + PrintPageSize["B4"] = "B4"; + PrintPageSize["B5"] = "B5"; + PrintPageSize["Quarto"] = "quarto"; + PrintPageSize["Unspecified"] = "unspecified"; +})(PrintPageSize = exports.PrintPageSize || (exports.PrintPageSize = {})); +var PrintScaling; +(function (PrintScaling) { + PrintScaling["Automatic"] = "automatic"; + PrintScaling["Perc25"] = "25%"; + PrintScaling["Perc50"] = "50%"; + PrintScaling["Perc60"] = "60%"; + PrintScaling["Perc75"] = "75%"; + PrintScaling["Perc80"] = "80%"; + PrintScaling["Perc90"] = "90%"; + PrintScaling["Perc100"] = "100%"; + PrintScaling["Perc200"] = "200%"; + PrintScaling["Perc400"] = "400%"; + PrintScaling["AtMost1PageHigh"] = "at-most-1-page-high"; + PrintScaling["AtMost2PagesHigh"] = "at-most-2-pages-high"; + PrintScaling["AtMost1PageWide"] = "at-most-1-page-wide"; + PrintScaling["AtMost2PagesWide"] = "at-most-2-pages-wide"; +})(PrintScaling = exports.PrintScaling || (exports.PrintScaling = {})); +var RevertVizSelection; +(function (RevertVizSelection) { + RevertVizSelection["All"] = "all"; + RevertVizSelection["Axes"] = "axes"; + RevertVizSelection["Filters"] = "filters"; + RevertVizSelection["Sorts"] = "sorts"; + RevertVizSelection["Shelves"] = "shelves"; +})(RevertVizSelection = exports.RevertVizSelection || (exports.RevertVizSelection = {})); +var ToolbarButtons; +(function (ToolbarButtons) { + ToolbarButtons["Alerts"] = "alerts"; + ToolbarButtons["AskData"] = "askData"; + ToolbarButtons["CustomViews"] = "customViews"; + ToolbarButtons["DataDetails"] = "dataDetails"; + ToolbarButtons["Share"] = "share"; + ToolbarButtons["Subscribe"] = "subscribe"; +})(ToolbarButtons = exports.ToolbarButtons || (exports.ToolbarButtons = {})); +var Toolbar; +(function (Toolbar) { + Toolbar["Top"] = "top"; + Toolbar["Bottom"] = "bottom"; + Toolbar["Hidden"] = "hidden"; +})(Toolbar = exports.Toolbar || (exports.Toolbar = {})); +var SheetSizeBehavior; +(function (SheetSizeBehavior) { + SheetSizeBehavior["Automatic"] = "automatic"; + SheetSizeBehavior["Exactly"] = "exactly"; + SheetSizeBehavior["Range"] = "range"; + SheetSizeBehavior["AtLeast"] = "atleast"; + SheetSizeBehavior["AtMost"] = "atmost"; +})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {})); +/** + * 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 + */ + 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"; +})(TableauEventType = exports.TableauEventType || (exports.TableauEventType = {})); +/** + * Represents the location of a context menu where users can add external menu items. + */ +var ApiMenuType; +(function (ApiMenuType) { + /** External menu item will be injected in ubertip dialog */ + ApiMenuType["Ubertip"] = "ubertip"; +})(ApiMenuType = exports.ApiMenuType || (exports.ApiMenuType = {})); +/** You can use this type with a {@link Viz} object. */ +var TableauDialogType; +(function (TableauDialogType) { + /** + * Used to display the download PDF dialog. + */ + TableauDialogType["ExportPDF"] = "export-pdf"; + /** + * Used to display the download PowerPoint dialog. + */ + TableauDialogType["ExportPowerPoint"] = "export-powerpoint"; + /** + * Used to display the download Data dialog. + */ + TableauDialogType["ExportData"] = "export-data"; + /** + * Used to display the download CrossTab dialog. + */ + TableauDialogType["ExportCrossTab"] = "export-cross-tab"; + /** + * Used to display the download Workbook dialog. + */ + TableauDialogType["ExportWorkbook"] = "export-workbook"; + /** + * Used to display the Share dialog. + */ + TableauDialogType["Share"] = "share"; +})(TableauDialogType = exports.TableauDialogType || (exports.TableauDialogType = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var PulseAttributes; +(function (PulseAttributes) { + PulseAttributes["DisableExploreFilter"] = "disable-explore-filter"; +})(PulseAttributes = exports.PulseAttributes || (exports.PulseAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js": +/*!***************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The shared string constants you can use as HTML attributes for the and web component. + * @ignore + */ +var VizSharedAttributes; +(function (VizSharedAttributes) { + VizSharedAttributes["TouchOptimize"] = "touch-optimize"; + VizSharedAttributes["HideEditInDesktopButton"] = "hide-edit-in-desktop-button"; + VizSharedAttributes["SuppressDefaultEditBehavior"] = "suppress-default-edit-behavior"; + VizSharedAttributes["DisableVersionCheck"] = "disable-version-check"; + VizSharedAttributes["OnEditInDesktopButtonClicked"] = "onEditInDesktopButtonClicked"; + VizSharedAttributes["OnFirstVizSizeKnown"] = "onFirstVizSizeKnown"; + VizSharedAttributes["OnFirstInteractive"] = "onFirstInteractive"; +})(VizSharedAttributes = exports.VizSharedAttributes || (exports.VizSharedAttributes = {})); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var VizAttributes; +(function (VizAttributes) { + VizAttributes["DisableUrlActionsPopups"] = "disable-url-actions"; + VizAttributes["HideTabs"] = "hide-tabs"; + VizAttributes["Toolbar"] = "toolbar"; + VizAttributes["InstanceIdToClone"] = "instance-id-to-clone"; + VizAttributes["Device"] = "device"; + VizAttributes["HideEditButton"] = "hide-edit-button"; + VizAttributes["OnEditButtonClicked"] = "onEditButtonClicked"; + VizAttributes["OnFilterChanged"] = "onFilterChanged"; + VizAttributes["OnCustomMarkContextMenuEvent"] = "onCustomMarkContextMenuEvent"; + VizAttributes["OnMarkSelectionChanged"] = "onMarkSelectionChanged"; + VizAttributes["OnParameterChanged"] = "onParameterChanged"; + VizAttributes["OnToolbarStateChanged"] = "onToolbarStateChanged"; + VizAttributes["OnUrlAction"] = "onUrlAction"; + VizAttributes["OnTabSwitched"] = "onTabSwitched"; + VizAttributes["OnCustomViewLoaded"] = "onCustomViewLoaded"; + VizAttributes["OnCustomViewRemoved"] = "onCustomViewRemoved"; + VizAttributes["OnCustomViewSaved"] = "onCustomViewSaved"; + VizAttributes["OnCustomViewSetDefault"] = "onCustomViewSetDefault"; + VizAttributes["OnStoryPointSwitched"] = "onStoryPointSwitched"; + VizAttributes["OnSummaryDataChanged"] = "onSummaryDataChanged"; + VizAttributes["OnReadyToReceiveAuthToken"] = "onReadyToReceiveAuthToken"; +})(VizAttributes = exports.VizAttributes || (exports.VizAttributes = {})); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var VizAuthoringAttributes; +(function (VizAuthoringAttributes) { + VizAuthoringAttributes["OnWorkbookPublished"] = "onWorkbookPublished"; + VizAuthoringAttributes["OnWorkbookPublishedAs"] = "onWorkbookPublishedAs"; + VizAuthoringAttributes["OnWorkbookReadyToClose"] = "onWorkbookReadyToClose"; + VizAuthoringAttributes["HideCloseButton"] = "hide-close-button"; +})(VizAuthoringAttributes = exports.VizAuthoringAttributes || (exports.VizAuthoringAttributes = {})); +/** + * The names of the string constants you can use as child tags for TableauViz and TableauAuthoringViz custom elements. + */ +var VizChildElements; +(function (VizChildElements) { + /** + * Contains a list of filter parameters. Available only in viewing mode. + */ + VizChildElements["VizFilter"] = "viz-filter"; + /** + * Contains a name and value for a parameter. Available only in viewing mode. + */ + VizChildElements["VizParameter"] = "viz-parameter"; + /** + * Contains a list of custom parameters. Available in both viewing and authoring modes. + */ + VizChildElements["CustomParameter"] = "custom-parameter"; +})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {})); +var VizChildElementAttributes; +(function (VizChildElementAttributes) { + VizChildElementAttributes["Field"] = "field"; + VizChildElementAttributes["Value"] = "value"; + VizChildElementAttributes["Name"] = "name"; +})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js": +/*!************************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js ***! + \************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the common string constants you can use as HTML attributes for the tableau web component. + * @ignore + */ +var WebComponentAttributes; +(function (WebComponentAttributes) { + WebComponentAttributes["Src"] = "src"; + WebComponentAttributes["Width"] = "width"; + WebComponentAttributes["Height"] = "height"; + WebComponentAttributes["Token"] = "token"; + WebComponentAttributes["Debug"] = "debug"; + WebComponentAttributes["IframeAuth"] = "iframe-auth"; + WebComponentAttributes["OnVizLoadError"] = "onvizloaderror"; + WebComponentAttributes["ForceTokenSync"] = "force-token-sync"; +})(WebComponentAttributes = exports.WebComponentAttributes || (exports.WebComponentAttributes = {})); +/** + * The names of the 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"; +})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {})); +var WebComponentChildElementAttributes; +(function (WebComponentChildElementAttributes) { + WebComponentChildElementAttributes["Field"] = "field"; + WebComponentChildElementAttributes["Value"] = "value"; + WebComponentChildElementAttributes["Name"] = "name"; +})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js": +/*!*********************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js ***! + \*********************************************************************************************/ +/***/ ((module) => { + +"use strict"; + +// All enum values made available to Extensions developers. +// Enums should be kept in alphabetical order. +var Tableau; +(function (Tableau) { + /** + * All error codes used by the Extensions API. + */ + var ErrorCodes; + (function (ErrorCodes) { + /** + * Thrown when caller attempts to execute command before initialization has completed. + */ + ErrorCodes["APINotInitialized"] = "api-not-initialized"; + /** + * Thrown when caller attempts to execute command while extension is not visible. + */ + ErrorCodes["VisibilityError"] = "visibility-error"; + /** + * Only one dialog can be opened at time with the UI namespace functionality. + */ + ErrorCodes["DialogAlreadyOpen"] = "dialog-already-open"; + /** + * The open dialog was closed by the user. + */ + ErrorCodes["DialogClosedByUser"] = "dialog-closed-by-user"; + /** + * An error occurred within the Tableau Extensions API. Contact Tableau Support. + */ + ErrorCodes["InternalError"] = "internal-error"; + /** + * A dialog must start on the same domain as the parent extenion. + */ + ErrorCodes["InvalidDomainDialog"] = "invalid-dialog-domain"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. + */ + ErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * Can occur if the extension interacts with a filter that has been removed from the worksheet. + */ + ErrorCodes["MissingFilter"] = "missing-filter"; + /** + * Can occur if the extension interacts with a parameter that has been removed from the worksheet. + */ + ErrorCodes["MissingParameter"] = "missing-parameter"; + /** + * Internal Server Error + */ + ErrorCodes["ServerError"] = "server-error"; + /** + * Developer cannot save settings while another save is still in progress. + */ + ErrorCodes["SettingSaveInProgress"] = "setting-save-in-progress"; + /** + * An unknown event name was specified in the call to `addEventListener` or `removeEventListener`. + */ + ErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; + /** + * A method was used for a type of data source that doesn't support that method (see getActiveTablesAsync for an example) + */ + ErrorCodes["UnsupportedMethodForDataSourceType"] = "unsupported-method-for-data-source-type"; + })(ErrorCodes = Tableau.ErrorCodes || (Tableau.ErrorCodes = {})); + /** + * The context in which the Extensions is currently running. + */ + var ExtensionContext; + (function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {})); + /** + * The mode in which the Extensions is currently running. + */ + var ExtensionMode; + (function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {})); + /** + * Represents the type of event that can be listened for. + */ + var TableauEventType; + (function (TableauEventType) { + /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ + TableauEventType["FilterChanged"] = "filter-changed"; + /** The selected marks on a visualization has changed. + * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */ + TableauEventType["MarkSelectionChanged"] = "mark-selection-changed"; + /** The summary data backing a worksheet has changed + * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ + TableauEventType["SummaryDataChanged"] = "summary-data-changed"; + /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. */ + TableauEventType["ParameterChanged"] = "parameter-changed"; + /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */ + TableauEventType["SettingsChanged"] = "settings-changed"; + /** The dashboard layout has changed + * @category Dashboard Extensions + */ + TableauEventType["DashboardLayoutChanged"] = "dashboard-layout-changed"; + /** The workbook formatting has changed + * @category Dashboard Extensions + */ + TableauEventType["WorkbookFormattingChanged"] = "workbook-formatting-changed"; + })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {})); + /** + * Enum that represents the data type of encodings for createVizImageAsync. + * @since 1.6.0 + */ + var 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 + */ + var 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 + */ + var 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 + */ + var 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 + */ + var VizImageSizeSettingAlignmentType; + (function (VizImageSizeSettingAlignmentType) { + VizImageSizeSettingAlignmentType["Right"] = "right"; + VizImageSizeSettingAlignmentType["Left"] = "left"; + VizImageSizeSettingAlignmentType["Center"] = "center"; + })(VizImageSizeSettingAlignmentType = Tableau.VizImageSizeSettingAlignmentType || (Tableau.VizImageSizeSettingAlignmentType = {})); +})(Tableau || (Tableau = {})); +module.exports = Tableau; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var SharedErrorCodes; +(function (SharedErrorCodes) { + /** + * A CSV or Excel file failed to be created in Viz.exportCrosstabAsync(). + */ + SharedErrorCodes["CrosstabCreationError"] = "crosstab-creation-error"; + /** + * A CSV file failed to be created in Viz.exportDataAsync(). + */ + SharedErrorCodes["DataCreationError"] = "data-creation-error"; + /** + * An invalid aggregation was specified for the filter, such as setting a range filter to "SUM(Sales)" instead of + * "Sales". + */ + SharedErrorCodes["InvalidAggregationFieldName"] = "invalid-aggregation-field-name"; + /** + * A filter operation was attempted on a field that does not exist in the data source. + */ + SharedErrorCodes["InvalidFilterFieldName"] = "invalid-filter-name"; + /** + * A filter operation was attempted using a value that is the wrong data type or format. + */ + SharedErrorCodes["InvalidFilterFieldValue"] = "invalid-filter-fieldValue"; + /** + * An invalid date value was specified in a Sheet.selectMarksAsync() call for a date field. + */ + SharedErrorCodes["InvalidSelectionDate"] = "invalid-selection-date"; + /** + * A field was specified in a Sheet.selectMarksAsync() call that does not exist in the data source. + */ + SharedErrorCodes["InvalidSelectionFieldName"] = "invalid-selection-fieldName"; + /** + * An invalid value was specified in a Sheet.selectMarksAsync() call. + */ + SharedErrorCodes["InvalidSelectionValue"] = "invalid-selection-value"; + /** + * A parameter did not include a valid sheet selection for exporting. + */ + SharedErrorCodes["InvalidSelectionSheet"] = "invalid-selection-sheet"; + /** + * An error occurred within the Tableau API. Contact Tableau Support. + */ + SharedErrorCodes["InternalError"] = "internal-error"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. + */ + SharedErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * A PDF file failed to be created in Viz.exportPDFAsync(). + */ + SharedErrorCodes["PDFCreationError"] = "pdf-creation-error"; + /** + * A PowerPoint file failed to be created in Viz.exportPowerPointAsync(). + */ + SharedErrorCodes["PowerPointCreationError"] = "powerpoint-creation-error"; + /** + * An operation was attempted on a sheet that is not active or embedded within the active dashboard. + */ + SharedErrorCodes["NotActiveSheet"] = "not-active-sheet"; + /** + * Property or Function is not supported within the Tableau API. + */ + SharedErrorCodes["ImplementationError"] = "wrong-implementation"; + /** + * Can occur when two incompatible calls are triggered together. + */ + SharedErrorCodes["ApiExecutionError"] = "api-execution-error"; + /** + * A general-purpose server error occurred. Details are contained in the Error object. + */ + SharedErrorCodes["ServerError"] = "server-error"; + /** + * Can occur when an api call times out. + */ + SharedErrorCodes["Timeout"] = "timeout"; +})(SharedErrorCodes = exports.SharedErrorCodes || (exports.SharedErrorCodes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js ***! + \*****************************************************************************************/ +/***/ (function(module) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +/** + * The tableau namespace exists for organization and to avoid polluting + * the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations. + */ +var Tableau; +(function (Tableau) { + var AnalyticsObjectType; + (function (AnalyticsObjectType) { + AnalyticsObjectType["Cluster"] = "cluster"; + AnalyticsObjectType["Forecast"] = "forecast"; + AnalyticsObjectType["TrendLine"] = "trend-line"; + })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {})); + var AnnotationType; + (function (AnnotationType) { + AnnotationType["Mark"] = "mark"; + AnnotationType["Point"] = "point"; + AnnotationType["Area"] = "area"; + })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {})); + var ColumnType; + (function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; + })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {})); + var 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 = Tableau.ClassNameKey || (Tableau.ClassNameKey = {})); + /** + * What the object represents in a dashboard. + */ + 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 = Tableau.DashboardObjectType || (Tableau.DashboardObjectType = {})); + /** + * Enum that represents the visibility state of a dashboard object. + * @since 1.7.0 + */ + var 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 + */ + 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 = Tableau.DataType || (Tableau.DataType = {})); + /** + * Enum that represents the changes that occur to a dashboard object. + */ + var 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. + */ + var 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. + */ + var DialogStyle; + (function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; + })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {})); + var 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. + */ + 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 = Tableau.FieldAggregationType || (Tableau.FieldAggregationType = {})); + /** + * Role of a field. + */ + var 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. + */ + var 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 + */ + var 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 + */ + var 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. + */ + var 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 + */ + var 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. + */ + 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 = Tableau.MarkType || (Tableau.MarkType = {})); + /** + * An enumeration describing the different types of allowable values. + * This is used for restricting the domain of a parameter + */ + var 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. + */ + var PeriodType; + (function (PeriodType) { + PeriodType["Years"] = "years"; + PeriodType["Quarters"] = "quarters"; + PeriodType["Months"] = "months"; + PeriodType["Weeks"] = "weeks"; + PeriodType["Days"] = "days"; + PeriodType["Hours"] = "hours"; + PeriodType["Minutes"] = "minutes"; + PeriodType["Seconds"] = "seconds"; + })(PeriodType = Tableau.PeriodType || (Tableau.PeriodType = {})); + var 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. + */ + var 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 {@link Worksheet.selectTuplesAsync} method. + */ + var 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 + */ + var SheetType; + (function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; + })(SheetType = Tableau.SheetType || (Tableau.SheetType = {})); + var SortDirection; + (function (SortDirection) { + SortDirection["Increasing"] = "increasing"; + SortDirection["Decreasing"] = "decreasing"; + })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {})); + var 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 + */ + var 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 + */ + var HierarchicalLevelSelectionState; + (function (HierarchicalLevelSelectionState) { + HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; + HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; + HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; + HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; + })(HierarchicalLevelSelectionState = Tableau.HierarchicalLevelSelectionState || (Tableau.HierarchicalLevelSelectionState = {})); + Tableau.ZoneVisibilityType = __assign({}, DashboardObjectVisibilityType); +})(Tableau || (Tableau = {})); +module.exports = Tableau; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/SharedApiExternalContract.js": +/*!************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/SharedApiExternalContract.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the shared api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./ExternalContract/Shared/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js")); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Shared/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js"); +exports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType; +exports.AnnotationType = Tableau_1.AnnotationType; +exports.ClassNameKey = Tableau_1.ClassNameKey; +exports.ColumnType = Tableau_1.ColumnType; +exports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange; +exports.DashboardObjectType = Tableau_1.DashboardObjectType; +exports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType; +exports.DataType = Tableau_1.DataType; +exports.DateRangeType = Tableau_1.DateRangeType; +exports.DialogStyle = Tableau_1.DialogStyle; +exports.EncodingType = Tableau_1.EncodingType; +exports.FieldAggregationType = Tableau_1.FieldAggregationType; +exports.FieldRoleType = Tableau_1.FieldRoleType; +exports.FilterDomainType = Tableau_1.FilterDomainType; +exports.FilterNullOption = Tableau_1.FilterNullOption; +exports.FilterType = Tableau_1.FilterType; +exports.FilterUpdateType = Tableau_1.FilterUpdateType; +exports.HierarchicalLevelSelectionState = Tableau_1.HierarchicalLevelSelectionState; +exports.IncludeDataValuesOption = Tableau_1.IncludeDataValuesOption; +exports.MarkType = Tableau_1.MarkType; +exports.ParameterValueType = Tableau_1.ParameterValueType; +exports.PeriodType = Tableau_1.PeriodType; +exports.QuickTableCalcType = Tableau_1.QuickTableCalcType; +exports.ReplaySpeedType = Tableau_1.ReplaySpeedType; +exports.SelectOptions = Tableau_1.SelectOptions; +exports.SelectionUpdateType = Tableau_1.SelectionUpdateType; +exports.SheetType = Tableau_1.SheetType; +exports.SortDirection = Tableau_1.SortDirection; +exports.TrendLineModelType = Tableau_1.TrendLineModelType; +exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/JsApiInternalContract.js": +/*!********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/JsApiInternalContract.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +// The following polyfills are needed for IE11 +__webpack_require__(/*! core-js/es/number/is-integer */ "../../node_modules/core-js/es/number/is-integer.js"); +__webpack_require__(/*! core-js/es/number/is-nan */ "../../node_modules/core-js/es/number/is-nan.js"); +__webpack_require__(/*! core-js/es/object/assign */ "../../node_modules/core-js/es/object/assign.js"); +// Export the version of the internal contract to be available at runtime +// This file is generated by yarn publish:bump via scripts/publish-check.ts +// updateInternalContractRuntimeVersion in the monorepo root. +var internalContractVersion = __webpack_require__(/*! ../internal-contract-version.json */ "../api-internal-contract-js/lib/internal-contract-version.json"); +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/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js")); +__export(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js")); +__export(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js")); +// Export 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 })); +var Enums_1 = __webpack_require__(/*! ./Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"); +var DataTypeConverter = /** @class */ (function () { + function DataTypeConverter() { + } + DataTypeConverter.isSpecial = function (valueAsString) { + // 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 + DataTypeConverter.parseBoolean = function (booleanString) { + // boolean values come to us as 'true'|'false' + var normalizedBoolean = booleanString.toLowerCase(); + return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true'; + }; + // tslint:disable-next-line:no-any + DataTypeConverter.parseNumber = function (valueAsString) { + var value = Number(valueAsString); + return isNaN(value) ? this.specialValueIndicator : value; + }; + DataTypeConverter.parseDate = function (dateAsString) { + // Note that without a time, the date is assumed to be UTC + // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700 + // This matches style used in existing convertFilterValuePresModel + var value = new Date(dateAsString); + return Number.isNaN(value.getTime()) ? null : value; + }; + DataTypeConverter.parseDateTime = function (dateAsString) { + // With a time, the date is assumed to be UTC. + // Our date format is always: yyyy-mm-dd hh:mm:ss + // Unfortunately, IE11 can't parse that format so we add a T between the day and time. + // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC) + var formattedDateString = dateAsString.replace(' ', 'T').concat('Z'); + var value = new Date(formattedDateString); + return Number.isNaN(value.getTime()) ? null : value; + }; + // tslint:disable-next-line:no-any + DataTypeConverter.convertValueAsStringToValue = function (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 + DataTypeConverter.convertValueToNativeValue = function (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 + DataTypeConverter.convertStringValueToNativeValue = function (value, type) { + // This handles the conversion from string directly to native value for all types + return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type); + }; + DataTypeConverter.specialValueIndicator = '%null%'; + return DataTypeConverter; +}()); +exports.DataTypeConverter = DataTypeConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Enums.js": +/*!*************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Enums.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ExtensionContext; +(function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + ExtensionContext["Unknown"] = "unknown"; +})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {})); +var ExtensionMode; +(function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + ExtensionMode["Unknown"] = "unknown"; +})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {})); +var AnnotateEnum; +(function (AnnotateEnum) { + AnnotateEnum["Mark"] = "mark"; + AnnotateEnum["Point"] = "point"; + AnnotateEnum["Area"] = "area"; +})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {})); +var ColumnType; +(function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; +})(ColumnType = exports.ColumnType || (exports.ColumnType = {})); +var DashboardObjectType; +(function (DashboardObjectType) { + DashboardObjectType["Blank"] = "blank"; + DashboardObjectType["Worksheet"] = "worksheet"; + DashboardObjectType["QuickFilter"] = "quick-filter"; + DashboardObjectType["ParameterControl"] = "parameter-control"; + DashboardObjectType["PageFilter"] = "page-filter"; + DashboardObjectType["Legend"] = "legend"; + DashboardObjectType["Title"] = "title"; + DashboardObjectType["Text"] = "text"; + DashboardObjectType["Image"] = "image"; + DashboardObjectType["WebPage"] = "web-page"; + DashboardObjectType["Extension"] = "extension"; +})(DashboardObjectType = exports.DashboardObjectType || (exports.DashboardObjectType = {})); +var DataType; +(function (DataType) { + DataType["String"] = "string"; + DataType["Int"] = "int"; + DataType["Float"] = "float"; + DataType["Bool"] = "bool"; + DataType["Date"] = "date"; + DataType["DateTime"] = "date-time"; + DataType["Spatial"] = "spatial"; + DataType["Unknown"] = "unknown"; +})(DataType = exports.DataType || (exports.DataType = {})); +var DialogStyle; +(function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; +})(DialogStyle = exports.DialogStyle || (exports.DialogStyle = {})); +var EncodedDataType; +(function (EncodedDataType) { + EncodedDataType["Number"] = "number"; + EncodedDataType["String"] = "string"; + EncodedDataType["Date"] = "date"; + EncodedDataType["Boolean"] = "boolean"; +})(EncodedDataType = exports.EncodedDataType || (exports.EncodedDataType = {})); +var ErrorCodes; +(function (ErrorCodes) { + ErrorCodes["INITIALIZATION_ERROR"] = "initialization-error"; + ErrorCodes["INTERNAL_ERROR"] = "internal-error"; + ErrorCodes["MISSING_ENUM_MAPPING"] = "missing-enum-mapping"; + ErrorCodes["MISSING_PARAMETER"] = "missing-parameter"; + ErrorCodes["PERMISSION_DENIED"] = "permission-denied"; + ErrorCodes["PRES_MODEL_PARSING_ERROR"] = "pres-model-parsing-error"; + ErrorCodes["VERSION_NOT_CONFIGURED"] = "version-not-configured"; + ErrorCodes["VISIBILITY_ERROR"] = "visibility-error"; + ErrorCodes["UNKNOWN_VERB_ID"] = "unknown-verb-id"; +})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {})); +var FieldAggregationType; +(function (FieldAggregationType) { + FieldAggregationType["Sum"] = "sum"; + FieldAggregationType["Avg"] = "avg"; + FieldAggregationType["Min"] = "min"; + FieldAggregationType["Max"] = "max"; + FieldAggregationType["Stdev"] = "stdev"; + FieldAggregationType["Stdevp"] = "stdevp"; + FieldAggregationType["Var"] = "var"; + FieldAggregationType["Varp"] = "varp"; + FieldAggregationType["Collect"] = "collect"; + FieldAggregationType["Count"] = "count"; + FieldAggregationType["Countd"] = "countd"; + FieldAggregationType["Median"] = "median"; + FieldAggregationType["Attr"] = "attr"; + FieldAggregationType["None"] = "none"; + FieldAggregationType["Year"] = "year"; + FieldAggregationType["Qtr"] = "qtr"; + FieldAggregationType["Month"] = "month"; + FieldAggregationType["Day"] = "day"; + FieldAggregationType["Hour"] = "hour"; + FieldAggregationType["Minute"] = "minute"; + FieldAggregationType["Second"] = "second"; + FieldAggregationType["Week"] = "week"; + FieldAggregationType["Weekday"] = "weekday"; + FieldAggregationType["MonthYear"] = "month-year"; + FieldAggregationType["Mdy"] = "mdy"; + FieldAggregationType["End"] = "end"; + FieldAggregationType["TruncYear"] = "trunc-year"; + FieldAggregationType["TruncQtr"] = "trunc-qtr"; + FieldAggregationType["TruncMonth"] = "trunc-month"; + FieldAggregationType["TruncWeek"] = "trunc-week"; + FieldAggregationType["TruncDay"] = "trunc-day"; + FieldAggregationType["TruncHour"] = "trunc-hour"; + FieldAggregationType["TruncMinute"] = "trunc-minute"; + FieldAggregationType["TruncSecond"] = "trunc-second"; + FieldAggregationType["Quart1"] = "quart1"; + FieldAggregationType["Quart3"] = "quart3"; + FieldAggregationType["Skewness"] = "skewness"; + FieldAggregationType["Kurtosis"] = "kurtosis"; + FieldAggregationType["InOut"] = "in-out"; + FieldAggregationType["User"] = "user"; +})(FieldAggregationType = exports.FieldAggregationType || (exports.FieldAggregationType = {})); +var FieldRoleType; +(function (FieldRoleType) { + FieldRoleType["Dimension"] = "dimension"; + FieldRoleType["Measure"] = "measure"; + FieldRoleType["Unknown"] = "unknown"; +})(FieldRoleType = exports.FieldRoleType || (exports.FieldRoleType = {})); +/** + * The different update types for applying filter. + */ +var FilterUpdateType; +(function (FilterUpdateType) { + FilterUpdateType["Add"] = "add"; + FilterUpdateType["All"] = "all"; + FilterUpdateType["Replace"] = "replace"; + FilterUpdateType["Remove"] = "remove"; +})(FilterUpdateType = exports.FilterUpdateType || (exports.FilterUpdateType = {})); +var SheetType; +(function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; +})(SheetType = exports.SheetType || (exports.SheetType = {})); +var DomainRestrictionType; +(function (DomainRestrictionType) { + DomainRestrictionType["All"] = "all"; + DomainRestrictionType["List"] = "list"; + DomainRestrictionType["Range"] = "range"; +})(DomainRestrictionType = exports.DomainRestrictionType || (exports.DomainRestrictionType = {})); +var DateStepPeriod; +(function (DateStepPeriod) { + DateStepPeriod["Years"] = "years"; + DateStepPeriod["Quarters"] = "quarters"; + DateStepPeriod["Months"] = "months"; + DateStepPeriod["Weeks"] = "weeks"; + DateStepPeriod["Days"] = "days"; + DateStepPeriod["Hours"] = "hours"; + DateStepPeriod["Minutes"] = "minutes"; + DateStepPeriod["Seconds"] = "seconds"; +})(DateStepPeriod = exports.DateStepPeriod || (exports.DateStepPeriod = {})); +/** + * The option for specifying which values to include for filtering. + */ +var FilterNullOption; +(function (FilterNullOption) { + FilterNullOption["NullValues"] = "nullvalues"; + FilterNullOption["NonNullValues"] = "nonnullvalues"; + FilterNullOption["AllValues"] = "allvalues"; +})(FilterNullOption = exports.FilterNullOption || (exports.FilterNullOption = {})); +/** + * The type of filter domain + */ +var FilterDomainType; +(function (FilterDomainType) { + FilterDomainType["Relevant"] = "relevant"; + FilterDomainType["Database"] = "database"; +})(FilterDomainType = exports.FilterDomainType || (exports.FilterDomainType = {})); +/** + * Internal enum for specifying the selection type for select marks api. + */ +var SelectionUpdateType; +(function (SelectionUpdateType) { + SelectionUpdateType["Replace"] = "select-replace"; + SelectionUpdateType["Add"] = "select-add"; + SelectionUpdateType["Remove"] = "select-remove"; +})(SelectionUpdateType = exports.SelectionUpdateType || (exports.SelectionUpdateType = {})); +/** + * Internal enum for specifying the select option for the select tuples api. + */ +var SelectOptions; +(function (SelectOptions) { + SelectOptions["Simple"] = "select-options-simple"; + SelectOptions["Toggle"] = "select-options-toggle"; + SelectOptions["Menu"] = "select-options-menu"; + SelectOptions["Range"] = "select-options-range"; + SelectOptions["Search"] = "select-options-search"; +})(SelectOptions = exports.SelectOptions || (exports.SelectOptions = {})); +/** + * Internal enum for specifying the included values type for range selection. + */ +var QuantitativeIncludedValues; +(function (QuantitativeIncludedValues) { + QuantitativeIncludedValues["IncludeNull"] = "include-null"; + QuantitativeIncludedValues["IncludeNonNull"] = "include-non-null"; + QuantitativeIncludedValues["IncludeAll"] = "include-all"; +})(QuantitativeIncludedValues = exports.QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = {})); +/** + * Internal enum for specifying a hierarchical level selection state. + */ +var HierarchicalLevelSelectionState; +(function (HierarchicalLevelSelectionState) { + HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; + HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; + HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; + HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; +})(HierarchicalLevelSelectionState = exports.HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = {})); +/** + * Type of mark for a given marks card in a viz. + */ +var MarkType; +(function (MarkType) { + MarkType["Bar"] = "bar"; + MarkType["Line"] = "line"; + MarkType["Area"] = "area"; + MarkType["Square"] = "square"; + MarkType["Circle"] = "circle"; + MarkType["Shape"] = "shape"; + MarkType["Text"] = "text"; + MarkType["Map"] = "map"; + MarkType["Pie"] = "pie"; + MarkType["GanttBar"] = "gantt-bar"; + MarkType["Polygon"] = "polygon"; + MarkType["Heatmap"] = "heatmap"; + MarkType["VizExtension"] = "viz-extension"; +})(MarkType = exports.MarkType || (exports.MarkType = {})); +/** + * Internal enum for specifying the type of filter + */ +var FilterType; +(function (FilterType) { + FilterType["Categorical"] = "categorical"; + FilterType["Range"] = "range"; + FilterType["RelativeDate"] = "relativeDate"; + FilterType["Hierarchical"] = "hierarchical"; +})(FilterType = exports.FilterType || (exports.FilterType = {})); +/** + * Internal enum for specifying the DateRangeType of a relative date filter + */ +var DateRangeType; +(function (DateRangeType) { + /** + * Refers to the last day, week, month, etc. of the date period. + */ + DateRangeType["Last"] = "last"; + /** + * Refers to the last N days, weeks, months, etc. of the date period. + */ + DateRangeType["LastN"] = "lastN"; + /** + * Refers to the next day, week, month, etc. of the date period. + */ + DateRangeType["Next"] = "next"; + /** + * Refers to the next N days, weeks, months, etc. of the date period. + */ + DateRangeType["NextN"] = "nextN"; + /** + * Refers to the current day, week, month, etc. of the date period. + */ + DateRangeType["Current"] = "current"; + /** + * Refers to everything up to and including the current day, week, month, etc. of the date period. + */ + DateRangeType["ToDate"] = "toDate"; +})(DateRangeType = exports.DateRangeType || (exports.DateRangeType = {})); +/** + * Used to determine if the launching of an extension dialog succeeded or failed. + */ +var ExtensionDialogResult; +(function (ExtensionDialogResult) { + ExtensionDialogResult["DialogAlreadyOpen"] = "dialog-already-open"; + ExtensionDialogResult["InvalidDomain"] = "invalid-domain"; + ExtensionDialogResult["Success"] = "success"; +})(ExtensionDialogResult = exports.ExtensionDialogResult || (exports.ExtensionDialogResult = {})); +// Enumeration for ApiShowData table id sentinels. +var ApiShowDataTableSentinel; +(function (ApiShowDataTableSentinel) { + // find the one logical table - used in version compatibility check for getUnderlyingDataTable and getLogicalDataTable commands + ApiShowDataTableSentinel["SingleTableId"] = "single-table-id-sentinel"; + ApiShowDataTableSentinel["SingleTableCaption"] = "Single table id sentinel"; +})(ApiShowDataTableSentinel = exports.ApiShowDataTableSentinel || (exports.ApiShowDataTableSentinel = {})); +/** + * Used to optimize the getSummaryData/getUnderlyingTableData results + * Mapped from external IncludeDataValuesOption + */ +var ApiShowDataTableFormat; +(function (ApiShowDataTableFormat) { + ApiShowDataTableFormat["NativeValuesOnly"] = "native-values-only"; + ApiShowDataTableFormat["FormattedValuesOnly"] = "formatted-values-only"; + ApiShowDataTableFormat["NativeAndFormattedValues"] = "native-and-formatted-values"; +})(ApiShowDataTableFormat = exports.ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = {})); +/** + * Used to set page size for export layout options. + */ +var PageSizeOption; +(function (PageSizeOption) { + PageSizeOption["Letter"] = "letter"; + PageSizeOption["Legal"] = "legal"; + PageSizeOption["Note"] = "note"; + PageSizeOption["Folio"] = "folio"; + PageSizeOption["Tabloid"] = "tabloid"; + PageSizeOption["Ledger"] = "ledger"; + PageSizeOption["Statement"] = "statement"; + PageSizeOption["Executive"] = "executive"; + PageSizeOption["A3"] = "a3"; + PageSizeOption["A4"] = "a4"; + PageSizeOption["A5"] = "a5"; + PageSizeOption["B4"] = "b4"; + PageSizeOption["B5"] = "b5"; + PageSizeOption["Quarto"] = "quarto"; + PageSizeOption["Unspecified"] = "unspecified"; +})(PageSizeOption = exports.PageSizeOption || (exports.PageSizeOption = {})); +/** + * Used to set the page orientation mode for export layout options. + */ +var PageOrientation; +(function (PageOrientation) { + PageOrientation["Printer"] = "printer"; + PageOrientation["Portrait"] = "portrait"; + PageOrientation["Landscape"] = "landscape"; +})(PageOrientation = exports.PageOrientation || (exports.PageOrientation = {})); +/** + * Used to set scale mode for export layout options. + */ +var ScaleMode; +(function (ScaleMode) { + ScaleMode["ScaleAuto"] = "auto"; + ScaleMode["ScalePercentage"] = "percent"; + ScaleMode["ScaleFitPages"] = "fit-pages"; +})(ScaleMode = exports.ScaleMode || (exports.ScaleMode = {})); +/** + * Used by setFitAndScaleValues to scale percent values + */ +var PageScalingOption; +(function (PageScalingOption) { + PageScalingOption["ScalePctAuto"] = "auto"; + PageScalingOption["ScalePct400"] = "pct400"; + PageScalingOption["ScalePct200"] = "pct200"; + PageScalingOption["ScalePct100"] = "pct100"; + PageScalingOption["ScalePct90"] = "pct90"; + PageScalingOption["ScalePct80"] = "pct80"; + PageScalingOption["ScalePct75"] = "pct75"; + PageScalingOption["ScalePct60"] = "pct60"; + PageScalingOption["ScalePct50"] = "pct50"; + PageScalingOption["ScalePct25"] = "pct25"; +})(PageScalingOption = exports.PageScalingOption || (exports.PageScalingOption = {})); +/** + * Used by setFitAndScaleValues to scale fit page values + */ +var FitPages; +(function (FitPages) { + FitPages["FitOneHigh"] = "fit0x1"; + FitPages["FitTwoHigh"] = "fit0x2"; + FitPages["FitOneWide"] = "fit1x0"; + FitPages["FitTwoWide"] = "fit2x0"; +})(FitPages = exports.FitPages || (exports.FitPages = {})); +/** + * Used by getVisualSpecificationAsync + */ +var EncodingType; +(function (EncodingType) { + EncodingType["Color"] = "color"; + EncodingType["Size"] = "size"; + EncodingType["Label"] = "label"; + EncodingType["Detail"] = "detail"; + EncodingType["Tooltip"] = "tooltip"; + EncodingType["Shape"] = "shape"; + EncodingType["Path"] = "path"; + EncodingType["Angle"] = "angle"; + EncodingType["Geometry"] = "geometry"; + EncodingType["Custom"] = "custom"; +})(EncodingType = exports.EncodingType || (exports.EncodingType = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Notifications.js": +/*!*********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Notifications.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var NotificationId; +(function (NotificationId) { + NotificationId["CustomMarkContextMenuClicked"] = "custom-mark-context-menu-clicked"; + NotificationId["ContextMenuClick"] = "context-menu-click"; + NotificationId["CustomViewRemoved"] = "custom-view-removed"; + NotificationId["CustomViewSaved"] = "custom-view-saved"; + NotificationId["CustomViewSetDefault"] = "custom-view-set-default"; + NotificationId["CustomViewsLoaded"] = "custom-views-loaded"; + NotificationId["DashboardLayoutChanged"] = "dashboard-layout-changed"; + NotificationId["EditButtonClicked"] = "edit-button-clicked"; + NotificationId["EditInDesktopButtonClicked"] = "edit-in-desktop-button-clicked"; + NotificationId["ExtensionDialogUpdate"] = "extension-dialog-update"; + NotificationId["FilterChanged"] = "filter-changed"; + NotificationId["FirstVizSizeKnown"] = "first-viz-size-known"; + NotificationId["ParameterChanged"] = "parameter-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["UrlAction"] = "url-action"; + NotificationId["TabSwitched"] = "tab-switched"; + NotificationId["StoryPointSwitched"] = "story-point-switched"; + NotificationId["ReadyToReceiveAuthToken"] = "ready-to-receive-auth-token"; +})(NotificationId = exports.NotificationId || (exports.NotificationId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Parameters.js": +/*!******************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Parameters.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put +// new ones, and merge conflicts. +var ParameterId; +(function (ParameterId) { + ParameterId["ActiveTablesInfo"] = "active-tables-info"; + ParameterId["AnchorDate"] = "anchor-date"; + ParameterId["AnnotateEnum"] = "annotate-enum"; + ParameterId["AnnotationList"] = "annotation-list"; + ParameterId["CategoricalDomain"] = "categorical-domain"; + ParameterId["ClickThroughEnabled"] = "click-through-enabled"; + 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["DeltaTimeMs"] = "delta-time-ms"; + ParameterId["DimValSelectionModels"] = "dimensionValueSelectionModels"; + ParameterId["DomainType"] = "domain-type"; + ParameterId["EmbeddingAbstractQuery"] = "embedding-abstract-query"; + ParameterId["EmbeddingBootstrapInfo"] = "embedding-bootstrap-info"; + 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["ExtensionDialogPayload"] = "extension-dialog-payload"; + ParameterId["ExtensionDialogResult"] = "extension-dialog-result"; + ParameterId["ExtensionDialogStyle"] = "extension-dialog-style"; + ParameterId["ExtensionDialogUrl"] = "extension-dialog-url"; + ParameterId["ExtensionDialogW"] = "extension-dialog-width"; + ParameterId["ExtensionLocator"] = "extension-locator"; + ParameterId["ExtensionSettingsInfo"] = "extension-settings-info"; + ParameterId["ExtensionZoneId"] = "extension-zone-id"; + ParameterId["ExternalMenuDescription"] = "external-menu-description"; + ParameterId["ExternalMenuHeader"] = "external-menu-header"; + ParameterId["ExternalMenuItemDisplayName"] = "external-menu-item-display-name"; + ParameterId["ExternalMenuItemId"] = "external-menu-item-id"; + ParameterId["Field"] = "field"; + ParameterId["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["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["IsExcludeMode"] = "is-exclude"; + ParameterId["IsExtensionDialog"] = "is-extension-dialog"; + ParameterId["JoinDescription"] = "join-description"; + ParameterId["LogicalTableId"] = "logical-table-id"; + ParameterId["LogicalTableInfoList"] = "logical-table-info-list"; + 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["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["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["TooltipContext"] = "tooltip-context"; + ParameterId["UnderlyingDataTable"] = "underlying-data-table"; + ParameterId["UnderlyingSummaryDataTable"] = "underlying-summary-data-table"; + ParameterId["Url"] = "url"; + ParameterId["UseTabDelimiters"] = "use-tab-delimiters"; + ParameterId["ViewDataTableCacheId"] = "view-data-table-cache-id"; + ParameterId["ViewDataTableId"] = "view-data-table-id"; + ParameterId["VisualId"] = "visual-id"; + ParameterId["VisualSpecification"] = "visual-specification"; + ParameterId["VizAPIInputJson"] = "vizapi-input-json"; + ParameterId["VizAPIStateWithDataModel"] = "vizapi-state-with-data-model"; + ParameterId["VizAPIStateWarningMsg"] = "vizapi-state-warning-msg"; + ParameterId["VizAPISVG"] = "vizapi-svg"; + ParameterId["WorksheetName"] = "worksheet-name"; + ParameterId["WorksheetFilters"] = "worksheet-filters"; + ParameterId["ZoneIdsVisibilityMap"] = "zone-ids-visibility-map"; +})(ParameterId = exports.ParameterId || (exports.ParameterId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Verbs.js": +/*!*************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Verbs.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// Declare this key type and export the NotificationId to make this behave like a string enum. +// +// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put +// new ones, and merge conflicts. +var VerbId; +(function (VerbId) { + VerbId["ActivateNextStoryPoint"] = "activate-next-story-point"; + VerbId["ActivatePreviousStoryPoint"] = "activate-previous-story-point"; + VerbId["ActivateSheet"] = "activateSheet"; + VerbId["ActivateStoryPoint"] = "activate-story-point"; + VerbId["AppendExternalMenuItem"] = "append-external-menu-item"; + VerbId["ApplyCategoricalFilter"] = "categorical-filter"; + 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["ClearFilter"] = "clear-filter"; + 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["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["GetRangeDomain"] = "get-range-domain"; + VerbId["GetSelectedMarks"] = "get-selected-marks"; + VerbId["GetSharedFilter"] = "get-shared-filter"; + 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["MoveAndResizeZones"] = "move-and-resize-zones"; + VerbId["RaiseHoverTupleNotification"] = "raise-hover-tuple-notification"; + VerbId["RaiseSelectTuplesNotification"] = "raise-select-tuples-notification"; + VerbId["Redo"] = "redo"; + VerbId["RefreshDataSource"] = "refresh-data-source"; + VerbId["ReleaseDataTableReader"] = "release-data-table-reader"; + VerbId["RemoveAnnotation"] = "remove-annotation"; + VerbId["RemoveCustomView"] = "remove-custom-view"; + VerbId["RemoveExternalMenuItem"] = "remove-external-menu-item"; + VerbId["RenameExternalMenu"] = "rename-external-menu"; + VerbId["ReplayAnimation"] = "replay-animation"; + VerbId["RevertStoryPoint"] = "revert-story-point"; + VerbId["RevertWorkbook"] = "revert-workbook"; + VerbId["SaveExtensionSettings"] = "save-extension-settings"; + VerbId["SaveWorkbookAsCustomView"] = "save-workbook-as-custom-view"; + VerbId["SelectByValue"] = "select-by-value"; + VerbId["SetActiveCustomViewAsDefault"] = "set-active-custom-view-as-default"; + VerbId["SetAutoUpdate"] = "set-auto-update"; + VerbId["SetClickThrough"] = "set-click-through"; + VerbId["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["TestConversionVerb"] = "test-conversion-verb"; + VerbId["Undo"] = "undo"; + VerbId["UpdateCustomView"] = "update-custom-view"; + VerbId["VizAPI"] = "viz-api"; +})(VerbId = exports.VerbId || (exports.VerbId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js": +/*!*************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/AskDataInterface.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var AskDataOptionNames; +(function (AskDataOptionNames) { + AskDataOptionNames["token"] = "token"; + AskDataOptionNames["origin"] = "origin"; + AskDataOptionNames["showEmbed"] = "showEmbed"; + AskDataOptionNames["showPin"] = "showPin"; + AskDataOptionNames["showSave"] = "showSave"; + AskDataOptionNames["showShare"] = "showShare"; + AskDataOptionNames["debug"] = ":jsdebug"; + AskDataOptionNames["ApiID"] = ":apiID"; + AskDataOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + AskDataOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + AskDataOptionNames["AskDataWebComponent"] = ":askDataWebComponent"; +})(AskDataOptionNames = exports.AskDataOptionNames || (exports.AskDataOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/PulseInterface.js": +/*!***********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/PulseInterface.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var PulseOptionNames; +(function (PulseOptionNames) { + PulseOptionNames["embed"] = "embed"; + PulseOptionNames["token"] = "token"; + PulseOptionNames["disableExploreFilter"] = "disableExploreFilter"; + PulseOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + PulseOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + PulseOptionNames["PulseWebComponent"] = ":pulseWebComponent"; +})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/VqlInterface.js": +/*!*********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/VqlInterface.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * These strings were *manually copied* from the server, + * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/ + * controller/vizql/constants/ParameterKeys.java#L9 + * should be exported instead + * parameters that vizql will accept in an embedding URL + **/ +var VqlParameterNames; +(function (VqlParameterNames) { + VqlParameterNames["ONE"] = "1"; + VqlParameterNames["ALERTS"] = ":alerts"; + VqlParameterNames["ALIAS"] = "alias"; + VqlParameterNames["ALLOW_DEFERRED_BOOTSTRAP"] = ":allowDeferredBootstrap"; + VqlParameterNames["ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS"] = "allowAutogenWorksheetPhoneLayouts"; + VqlParameterNames["API_ID"] = ":apiID"; + VqlParameterNames["APP"] = ":app"; + VqlParameterNames["ATTACHMENT"] = "attachment"; + VqlParameterNames["IS_IPAD_APP"] = "app"; + VqlParameterNames["ANIMATE_TRANSITION"] = ":animate_transition"; + VqlParameterNames["ASCENDING"] = "ascending"; + VqlParameterNames["AUTHENTICATION"] = "authentication"; + VqlParameterNames["ATTRIBUTES"] = "attributes"; + VqlParameterNames["AUTHORING_SHEET"] = ":authSheet"; + VqlParameterNames["AXIS"] = "axis"; + VqlParameterNames["BOOTSTRAP_WHEN_NOTIFIED"] = ":bootstrapWhenNotified"; + VqlParameterNames["BROWSER_BACK_BUTTON_UNDO"] = ":browserBackButtonUndo"; + VqlParameterNames["BROWSER_RENDERING_ON"] = "isBrowserRendering"; + VqlParameterNames["BROWSER_RENDERING_THRESHOLD"] = "browserRenderingThreshold"; + VqlParameterNames["CHARSET"] = "charset"; + VqlParameterNames["CLIENT_DIMENSION"] = "clientDimension"; + VqlParameterNames["CLIENT_IP"] = "client_ip"; + VqlParameterNames["CLIENT_NUM"] = "clientNum"; + VqlParameterNames["COLON_EMBEDDED"] = ":embedded"; + VqlParameterNames["COLON_MOBILE"] = ":mobile"; + VqlParameterNames["COLON_DEEP_LINKING_DISABLED"] = ":deepLinkingDisabled"; + VqlParameterNames["COLON_WATERMARK"] = ":watermark"; + VqlParameterNames["COMMENTS"] = ":comments"; + VqlParameterNames["COMMENTING_ENABLED"] = ":commentingEnabled"; + VqlParameterNames["COMMENTING_MENTIONS_ENABLED"] = ":commentingMentions"; + VqlParameterNames["CONNECTION"] = "connection"; + VqlParameterNames["CREATED_BY_FEATURE"] = "createdByFeature"; + VqlParameterNames["CRYPTED_PASSWORD"] = "crypted"; + VqlParameterNames["CSSDEBUG"] = ":cssdebug"; + VqlParameterNames["CSV"] = "csv"; + VqlParameterNames["CUSTOM_VIEWS"] = ":customViews"; + VqlParameterNames["CV"] = ":cv"; + VqlParameterNames["CV_ID"] = "cvId"; + VqlParameterNames["DASHBOARD_PORT_SIZE"] = "dashboardPortSize"; + VqlParameterNames["DATA_DETAILS"] = ":dataDetails"; + VqlParameterNames["DATASOURCE"] = "datasource"; + VqlParameterNames["DEBUG"] = ":debug"; + VqlParameterNames["DELAY"] = ":delay"; + VqlParameterNames["DEPTH"] = "depth"; + VqlParameterNames["DEVICE_TYPE"] = ":device"; + VqlParameterNames["DEVICE_PIXEL_RATIO"] = "devicePixelRatio"; + VqlParameterNames["DEVICE_PREVIEW_MODE"] = ":devicepreviewmode"; + VqlParameterNames["DIMENSIONS"] = ":dimensions"; + VqlParameterNames["DISABLE_SHARED_SESSIONS"] = ":disable_shared_sessions"; + VqlParameterNames["DISABLE_URL_ACTIONS_POPUPS"] = ":disableUrlActionsPopups"; + VqlParameterNames["DIRECTION"] = "direction"; + VqlParameterNames["DISPLAY_OVERLAY"] = ":display_overlay"; + VqlParameterNames["DISPLAY_SHARE"] = ":display_share"; + VqlParameterNames["DISPLAY_SPINNER"] = ":display_spinner"; + VqlParameterNames["DISPLAY_STATIC_IMAGE"] = ":display_static_image"; + VqlParameterNames["DISPLAY_TABS"] = "display_tabs"; + VqlParameterNames["DISPLAY_VIEW_COUNT"] = ":display_count"; + VqlParameterNames["IGNORE_STICKY_SESSION"] = ":ignore_sticky_session"; + VqlParameterNames["INCREMENT_VIEW_COUNT"] = ":increment_view_count"; + VqlParameterNames["DOCMODE"] = "docmode"; + VqlParameterNames["DOMAIN"] = "domain"; + VqlParameterNames["DO_WORK"] = "do_work"; + VqlParameterNames["DX"] = "dx"; + VqlParameterNames["DY"] = "dy"; + VqlParameterNames["EDIT_DATA_ALERT"] = ":editDataAlert"; + VqlParameterNames["EMBED"] = ":embed"; + VqlParameterNames["EMBEDDED"] = "embedded"; + VqlParameterNames["ENCRYPTED"] = "encrypted"; + VqlParameterNames["API_EXTERNAL_VERSION"] = ":apiExternalVersion"; + VqlParameterNames["API_INTERNAL_VERSION"] = ":apiInternalVersion"; + VqlParameterNames["EXCLUDE"] = "exclude"; + VqlParameterNames["EXPORT_FORMAT"] = ":export_format"; + VqlParameterNames["FIELDNAME"] = "fieldname"; + VqlParameterNames["FIELD_NAME"] = "field_name"; + VqlParameterNames["FIELD_SEP"] = "field_sep"; + VqlParameterNames["FILE"] = "file"; + VqlParameterNames["FILTER_TILE_SIZE"] = "filterTileSize"; + VqlParameterNames["FN"] = "fn"; + VqlParameterNames["FOCUS"] = "focus"; + VqlParameterNames["FORCE_CACHE"] = "force_cache"; + VqlParameterNames["FORMAT"] = "format"; + VqlParameterNames["FORMAT_DATA_VALUE_LOCALLY"] = "formatDataValueLocally"; + VqlParameterNames["FROM_WG"] = ":from_wg"; + VqlParameterNames["GRAPHQL_DATABASE_ID"] = ":graphQLDatabaseId"; + VqlParameterNames["GRAPHQL_TABLE_ID"] = ":graphQLTableId"; + VqlParameterNames["GUID"] = ":guid"; + VqlParameterNames["H"] = "h"; + VqlParameterNames["HIDDEN"] = "hidden"; + VqlParameterNames["HIDE_CLOSE_BUTTON"] = ":hideCloseButton"; + VqlParameterNames["HIDE_EDIT_BUTTON"] = ":hideEditButton"; + VqlParameterNames["HIDE_EDIT_IN_DESKTOP_BUTTON"] = ":hideEditInDesktopButton"; + VqlParameterNames["HIGH_DPI"] = ":highdpi"; + VqlParameterNames["IMAGE_SIZE_LIMIT"] = "imageSizeLimit"; + VqlParameterNames["TRANSPARENT_LINE_MARKS_LIMIT"] = "transparentLineMarkLimit"; + VqlParameterNames["CLIENT_RENDER_PIXEL_LIMIT"] = "clientRenderPixelLimit"; + VqlParameterNames["IN"] = "in"; + VqlParameterNames["INSTANCE_ID"] = ":iid"; + VqlParameterNames["IS_GUEST_REDIRECT_FROM_VIZPORTAL"] = ":isGuestRedirectFromVizportal"; + VqlParameterNames["IS_MARK_ANIMATION_ENABLED"] = "isMarkAnimationEnabled"; + VqlParameterNames["IS_VIZPORTAL"] = ":isVizPortal"; + VqlParameterNames["INPUT_"] = "input_string"; + VqlParameterNames["JSDEBUG"] = ":jsdebug"; + VqlParameterNames["JSON"] = "json"; + VqlParameterNames["JSON_ONLY"] = ":jsonOnly"; + VqlParameterNames["KEEPFILE"] = "keepfile"; + VqlParameterNames["KEY"] = "key"; + VqlParameterNames["LANGUAGE"] = "language"; + VqlParameterNames["LANGUAGE_REQUESTED"] = ":language"; + VqlParameterNames["LINKTARGET"] = ":linktarget"; + VqlParameterNames["LOAD_ORDER_ID"] = ":loadOrderID"; + VqlParameterNames["LOAD_NEWEST_REVISION"] = ":loadNewestRevision"; + VqlParameterNames["LOCAL_PATHS"] = ":localPaths"; + VqlParameterNames["LOCALE"] = "locale"; + VqlParameterNames["LOCATION_ID"] = "locationid"; + VqlParameterNames["LOCATION_TYPE"] = "locationtype"; + VqlParameterNames["WORKBOOK_LOCALE"] = "workbookLocale"; + VqlParameterNames["MAXROWS"] = "maxrows"; + VqlParameterNames["MAX_AGE"] = "maxAge"; + VqlParameterNames["MAX_ROWS"] = "maxRows"; + VqlParameterNames["METHOD"] = "method"; + VqlParameterNames["MOBILE"] = "mobile"; + VqlParameterNames["MODIFIER"] = "modifier"; + VqlParameterNames["NAME"] = "name"; + VqlParameterNames["NAV_TYPE"] = "navType"; + VqlParameterNames["NAV_SRC"] = "navSrc"; + VqlParameterNames["NOATTACHMENT"] = "no-attachment"; + VqlParameterNames["NO_OVERWRITE"] = "no_overwrite"; + VqlParameterNames["OPEN_AUTHORING_IN_TOP_WINDOW"] = ":openAuthoringInTopWindow"; + VqlParameterNames["OPENID_HD"] = ":openid_hd"; + VqlParameterNames["OPENID_LOGIN_HINT"] = ":openid_login_hint"; + VqlParameterNames["OAUTHREQUEST"] = "oauthrequest"; + VqlParameterNames["OAUTH_CREDENTIAL_IDS"] = "oauth_credential_ids"; + VqlParameterNames["OFFLINE_MODE"] = ":offlinemode"; + VqlParameterNames["ORIGIN"] = ":origin"; + VqlParameterNames["OVERLAY"] = ":overlay"; + VqlParameterNames["P"] = "p"; + VqlParameterNames["PATH"] = "path"; + VqlParameterNames["PANE_RESOLVER_X"] = "paneResolverX"; + VqlParameterNames["PANE_RESOLVER_Y"] = "paneResolverY"; + VqlParameterNames["PARAM"] = "param"; + VqlParameterNames["PARENT_ID"] = "parent_id"; + VqlParameterNames["PASSWORD"] = "password"; + VqlParameterNames["PATTERN"] = "pattern"; + VqlParameterNames["PIXEL_RATIO"] = ":pixelratio"; + VqlParameterNames["PREFIX"] = ":prefix"; + VqlParameterNames["PREVIEW"] = ":preview"; + VqlParameterNames["PRIMARY_CONTENT_URL"] = "primary_content_url"; + VqlParameterNames["PROJECT"] = "project"; + VqlParameterNames["PROTOCOL"] = "protocol"; + VqlParameterNames["PSEUDO"] = ":pseudo"; + VqlParameterNames["QUERY"] = "query"; + VqlParameterNames["R"] = "r"; + VqlParameterNames["RANGE_TYPE"] = "range_type"; + VqlParameterNames["RECORD_SEP"] = "record_sep"; + VqlParameterNames["RECORD_CLIENT_PERFORMANCE"] = ":record_client_performance"; + VqlParameterNames["RECORD_PERFORMANCE"] = ":record_performance"; + VqlParameterNames["RECOVER_OLD_SESSION_ID"] = ":recover_old_session_id"; + VqlParameterNames["RECOVER_SESSION_STATE_TICKETS"] = ":recover_session_state_tickets"; + VqlParameterNames["REFRESH"] = ":refresh"; + VqlParameterNames["REFRESHUNMODIFIED"] = ":refreshunmodified"; + VqlParameterNames["REGION"] = "region"; + VqlParameterNames["RELOAD_ON_CUSTOM_VIEW_SAVE"] = ":reloadOnCustomViewSave"; + VqlParameterNames["RENDER"] = ":render"; + VqlParameterNames["RENDER_MAPS_CLIENT_SIDE"] = "renderMapsClientSide"; + VqlParameterNames["RETRY"] = ":retry"; + VqlParameterNames["REUSE"] = "reuse"; + VqlParameterNames["REUSE_FOREVER"] = "reuse_forever"; + VqlParameterNames["REVERT"] = ":revert"; + VqlParameterNames["SAVE_DB_PASSWORDS"] = "save_db_passwords"; + VqlParameterNames["SELECT_X"] = "select_x"; + VqlParameterNames["SELECT_Y"] = "select_y"; + VqlParameterNames["SESSION_FEATURE_PREFIX"] = ":ff_"; + VqlParameterNames["SESSION_FLAGS"] = ":session_feature_flags"; + VqlParameterNames["SHARE_BUTTON"] = "share_button"; + VqlParameterNames["SHEET_ID"] = "sheet_id"; + VqlParameterNames["SHARED"] = "shared"; + VqlParameterNames["SHOWALL"] = "showall"; + VqlParameterNames["SHOW_APP_BANNER"] = ":showAppBanner"; + VqlParameterNames["SHOW_ASK_DATA"] = ":showAskData"; + VqlParameterNames["SHOW_PARAMS"] = "showParams"; + VqlParameterNames["SHOW_SHARE_OPTIONS"] = ":showShareOptions"; + VqlParameterNames["SIZE"] = ":size"; + VqlParameterNames["SOURCE"] = "source"; + VqlParameterNames["STATE"] = "state"; + VqlParameterNames["STICKY_SESSION_KEY"] = "stickySessionKey"; + VqlParameterNames["SUBSCRIPTIONS"] = ":subscriptions"; + VqlParameterNames["SUMMARY"] = "summary"; + VqlParameterNames["SUPPRESS_DEFAULT_EDIT_BEHAVIOR"] = ":suppressDefaultEditBehavior"; + VqlParameterNames["SYNC_SESSION"] = ":sync_session"; + VqlParameterNames["SYNC_SESSION_STATE"] = "sync_session_state"; + VqlParameterNames["TABS"] = ":tabs"; + VqlParameterNames["TARGET"] = "target"; + VqlParameterNames["TARGET_SITE"] = "target_site"; + VqlParameterNames["TOOLBAR"] = ":toolbar"; + VqlParameterNames["TOOLTIP"] = ":tooltip"; + VqlParameterNames["TS"] = "ts"; + VqlParameterNames["UNDERLYING_TABLE_ID"] = "underlying_table_id"; + VqlParameterNames["UNDERLYING_TABLE_CAPTION"] = "underlying_table_caption"; + VqlParameterNames["UPDATE_TYPE"] = "update_type"; + VqlParameterNames["USE_GUEST"] = ":useGuest"; + VqlParameterNames["USE_INLINE_IMAGES"] = "use_inline_images"; + VqlParameterNames["USERAGENT"] = "useragent"; + VqlParameterNames["USERNAME"] = "username"; + VqlParameterNames["VALUE"] = "value"; + VqlParameterNames["VERBOSE_MODE"] = "verboseMode"; + VqlParameterNames["VIEW_ID"] = "views_id"; + VqlParameterNames["VIZ_SNAPSHOT_ID"] = "viz_snapshot_id"; + VqlParameterNames["VW"] = ":vw"; + VqlParameterNames["W"] = "w"; + VqlParameterNames["WORKSHEET_PORT_SIZE"] = "worksheetPortSize"; + VqlParameterNames["WATERMARK"] = "watermark"; + VqlParameterNames["WATERMARK_MARGIN"] = ":watermark_margin"; + VqlParameterNames["WB"] = ":wb"; + VqlParameterNames["WHICH"] = "which"; + VqlParameterNames["X"] = "x"; + VqlParameterNames["Y"] = "y"; + VqlParameterNames["ZID"] = "zid"; + VqlParameterNames["ZONE_ID"] = "zone_id"; + VqlParameterNames["KEYCHAIN_VERSION"] = "keychain_version"; + VqlParameterNames["DATASOURCE_ID"] = "datasource_id"; + VqlParameterNames["DATASOURCE_NAME"] = "datasource_name"; + VqlParameterNames["LENS_ID"] = "lens_id"; + VqlParameterNames["WIDTH"] = "width"; + VqlParameterNames["HEIGHT"] = "height"; + // Default Layout params + VqlParameterNames["LAYOUT_VIEWS"] = "views"; + VqlParameterNames["LAYOUT_MENUS"] = "menus"; + VqlParameterNames["LAYOUT_GEOMETRY"] = "geometry"; + VqlParameterNames["LAYOUT_PAGES"] = "pages"; + VqlParameterNames["LAYOUT_CACHEURL"] = "cacheurl"; + VqlParameterNames["LAYOUT_SHEET"] = "sheet"; + VqlParameterNames["LAYOUT_DEPTH"] = "depth"; +})(VqlParameterNames || (VqlParameterNames = {})); +/** + * parameters that are only relevant when working with Tableau Public + * maybe not really necessry to split them out + */ +var PublicParameterNames; +(function (PublicParameterNames) { + PublicParameterNames["SHOW_VIZ_HOME"] = ":showVizHome"; + // display view count +})(PublicParameterNames || (PublicParameterNames = {})); +/** + * Map the parameter names as used in the url to what we call them publicly in the embedding library. + * The only parameters listed here should be the ones that get sent to vizql + * - this should match the interface at external-contract:VizInterfaces:VizSettings + */ +var VizOptionNames; +(function (VizOptionNames) { + // publicName = internalStringValue + VizOptionNames["Size"] = ":size"; + VizOptionNames["Embed"] = ":embed"; + VizOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + VizOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + VizOptionNames["ShowVizHome"] = ":showVizHome"; + VizOptionNames["Jsdebug"] = ":jsdebug"; + VizOptionNames["BootstrapWhenNotified"] = ":bootstrapWhenNotified"; + VizOptionNames["NavType"] = "navType"; + VizOptionNames["NavSrc"] = "navSrc"; + VizOptionNames["debug"] = ":jsdebug"; + VizOptionNames["ApiID"] = ":apiID"; + VizOptionNames["disableUrlActionsPopups"] = ":disableUrlActionsPopups"; + VizOptionNames["hideTabs"] = ":tabs"; + VizOptionNames["toolbar"] = ":toolbar"; + VizOptionNames["device"] = ":device"; + VizOptionNames["instanceIdToClone"] = ":iid"; + VizOptionNames["touchOptimize"] = "mobile"; + VizOptionNames["hideEditButton"] = ":hideEditButton"; + VizOptionNames["hideEditInDesktopButton"] = ":hideEditInDesktopButton"; + VizOptionNames["suppressDefaultEditBehavior"] = ":suppressDefaultEditBehavior"; + VizOptionNames["hideCloseButton"] = ":hideCloseButton"; +})(VizOptionNames = exports.VizOptionNames || (exports.VizOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js": +/*!****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +var JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var CrossFramePreparedMessage_1 = __webpack_require__(/*! ./CrossFramePreparedMessage */ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js"); +var MessageTypeChecks_1 = __webpack_require__(/*! ./MessageTypeChecks */ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js"); +var MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +/** + * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of + * this class can be instantiated on both sides of a frame boundary to facilitate communication + * in both directions between the frames. This class implements both the dispatcher and the listener + * portions, but doesn't require callers to care about both. + */ +var CrossFrameMessenger = /** @class */ (function () { + /** + * 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) + */ + function CrossFrameMessenger(thisWindow, otherWindow, otherWindowOrigin) { + this.thisWindow = thisWindow; + this.otherWindow = otherWindow; + this.otherWindowOrigin = otherWindowOrigin; + // Make sure to call StartListening + } + ///// MessageListener Implementation + CrossFrameMessenger.prototype.startListening = function () { + var _this = this; + // Check if we already are listening, if not, hook up a message listener + if (!this.unregisterFunction) { + var boundHandler_1 = this.onMessageReceived.bind(this); + this.thisWindow.addEventListener('message', boundHandler_1, true); + this.unregisterFunction = function () { return _this.thisWindow.removeEventListener('message', boundHandler_1, true); }; + } + }; + CrossFrameMessenger.prototype.stopListening = function () { + // Stop listening if we have started listening + if (this.unregisterFunction) { + this.unregisterFunction(); + this.unregisterFunction = undefined; + } + }; + CrossFrameMessenger.prototype.setInitializeMessageHandler = function (handler) { + this.initializeMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setCommandResponseMessageHandler = function (handler) { + this.commandResponseMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setCommandMessageHandler = function (handler) { + this.commandMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setNotificationMessageHandler = function (handler) { + this.notificationMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setHandshakeMessageHandler = function (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) + */ + CrossFrameMessenger.prototype.prepareInitializationMessage = function (apiVersion, crossFrameVersion, options) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Initialize, + crossFrameVersion: crossFrameVersion, + apiVersion: apiVersion, + options: options, + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareCommandMessage = function (verbId, parameters) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Command, + verbId: verbId, + parameters: parameters, + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareCommandResponseMessage = function (commandGuid, data, error) { + var message = { + 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); + }; + CrossFrameMessenger.prototype.prepareNotificationMessage = function (notificationId, data) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Notification, + notificationId: notificationId, + data: data, + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareAckMessage = function () { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Ack, + platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION, + }; + return this.prepareMessage(message); + }; + /** + * Prepares a pending message for sending and returns the prepared message + * + * @param msg The message to be sent to this.otherWindow + * @returns The prepared message + */ + CrossFrameMessenger.prototype.prepareMessage = function (msg) { + if (!this.otherWindow || !this.otherWindowOrigin) { + throw 'Other window not initialized, cannot dispatch messages'; + } + var preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin); + return preparedMessage; + }; + /** + * Called when a message is received. Does some validation of the message, and then + * calls an appropriate message handler if one is defined + * + * @param event The incoming MessageEvent + */ + CrossFrameMessenger.prototype.onMessageReceived = function (event) { + // 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; + } + var message = event.data; + if (!MessageTypeChecks_1.isMessage(message)) { + return; + } + // Check the declared message type, validate the message, and call an appropriate hander if one exists + switch (message.msgType) { + case MessageTypes_1.MessageType.Initialize: { + if (!MessageTypeChecks_1.isInitMessage(message) || !this.initializeMessageHandler) { + return; + } + this.initializeMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.CommandResponse: { + if (!MessageTypeChecks_1.isCommandResponseMessage(message) || !this.commandResponseMessageHandler) { + return; + } + this.commandResponseMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Command: { + if (!MessageTypeChecks_1.isCommandMessage(message) || !this.commandMessageHandler) { + return; + } + this.commandMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Notification: { + if (!MessageTypeChecks_1.isNotificationMessage(message) || !this.notificationMessageHandler) { + return; + } + this.notificationMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Handshake: { + if (!MessageTypeChecks_1.isHandshakeMessage(message) || !this.handshakeMessageHandler) { + return; + } + this.handshakeMessageHandler(message, event.source); + break; + } + default: + // Just ignore this since we don't know how to handle the message type + } + }; + CrossFrameMessenger.prototype.setOtherWindow = function (otherWindow) { + this.otherWindow = otherWindow; + }; + CrossFrameMessenger.prototype.setOtherWindowOrigin = function (origin) { + this.otherWindowOrigin = origin; + }; + return CrossFrameMessenger; +}()); +exports.CrossFrameMessenger = CrossFrameMessenger; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the PreparedMessage interface used to post messages between + * two frames using window.postMessage + */ +var CrossFramePreparedMessage = /** @class */ (function () { + /** + * Creates an instance of CrossFramePreparedMessage. + * @param _message The message to be sent + * @param _target The target window where the message will be sent + * @param _origin The targetOrigin where this message can be received + */ + function CrossFramePreparedMessage(_message, _target, _origin) { + this._message = _message; + this._target = _target; + this._origin = _origin; + } + Object.defineProperty(CrossFramePreparedMessage.prototype, "messageGuid", { + get: function () { + return this._message.msgGuid; + }, + enumerable: true, + configurable: true + }); + CrossFramePreparedMessage.prototype.send = function () { + this._target.postMessage(this._message, this._origin); + return this; + }; + return CrossFramePreparedMessage; +}()); +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 })); +var guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +var Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); +var MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +var expectedEmptyNotifications = new Set([ + 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; + } + var message = data; + if (!message || !message.msgGuid || !message.msgType) { + return false; + } + if (!guid.isGuid(message.msgGuid)) { + return false; + } + if (typeof message.msgType !== 'string') { + return false; + } + var messageTypes = [ + MessageTypes_1.MessageType.Command, + MessageTypes_1.MessageType.CommandResponse, + MessageTypes_1.MessageType.Initialize, + MessageTypes_1.MessageType.Notification, + MessageTypes_1.MessageType.Handshake, + ]; + if (messageTypes.indexOf(message.msgType) < 0) { + return false; + } + return true; +} +exports.isMessage = isMessage; +function isVersion(versionNumber) { + if (!versionNumber) { + return false; + } + var v = versionNumber; + if (typeof v !== 'object') { + return false; + } + if (typeof v.fix !== 'number' || typeof v.minor !== 'number' || typeof v.major !== 'number') { + return false; + } + return true; +} +exports.isVersion = isVersion; +function isInitMessage(message) { + if (!isMessage(message)) { + return false; + } + var initMessage = message; + if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) { + return false; + } + if (!initMessage.apiVersion || !isVersion(initMessage.apiVersion)) { + return false; + } + if (!initMessage.crossFrameVersion || !isVersion(initMessage.crossFrameVersion)) { + return false; + } + return true; +} +exports.isInitMessage = isInitMessage; +function isCommandResponseMessage(message) { + if (!isMessage(message)) { + return false; + } + var crMessage = message; + if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) { + return false; + } + if (!guid.isGuid(crMessage.commandGuid)) { + return false; + } + if (!crMessage.data && !crMessage.error) { + return false; + } + return true; +} +exports.isCommandResponseMessage = isCommandResponseMessage; +function isCommandMessage(message) { + if (!isMessage(message)) { + return false; + } + var commandMessage = message; + if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) { + return false; + } + if (!commandMessage.parameters || typeof commandMessage.parameters !== 'object') { + return false; + } + if (!commandMessage.verbId || typeof commandMessage.verbId !== 'string') { + return false; + } + return true; +} +exports.isCommandMessage = isCommandMessage; +function isNotificationMessage(message) { + if (!isMessage(message)) { + return false; + } + var notificationMessage = message; + if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) { + return false; + } + if (!notificationMessage.data && !expectedEmptyNotifications.has(notificationMessage.notificationId)) { + return false; + } + if (!notificationMessage.notificationId || typeof notificationMessage.notificationId !== 'string') { + return false; + } + return true; +} +exports.isNotificationMessage = isNotificationMessage; +function isHandshakeMessage(message) { + if (!isMessage(message)) { + return false; + } + var handshakeMessage = message; + if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) { + return false; + } + return true; +} +exports.isHandshakeMessage = isHandshakeMessage; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js": +/*!*******************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Enum defining the 4 different types of messages we have defined + */ +var MessageType; +(function (MessageType) { + MessageType["Initialize"] = "initialize"; + MessageType["Notification"] = "notification"; + MessageType["Command"] = "command"; + MessageType["CommandResponse"] = "command-response"; + MessageType["Handshake"] = "v-handshake"; + MessageType["Ack"] = "v-ack"; +})(MessageType = exports.MessageType || (exports.MessageType = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and internal version number + */ +var IdentityVersionConverter = /** @class */ (function () { + function IdentityVersionConverter() { + } + IdentityVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) { + return { + verb: verb, + parameters: parameters, + }; + }; + IdentityVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) { + return executeResponse; + }; + IdentityVersionConverter.prototype.downgradeNotification = function (notification) { + return notification; + }; + return IdentityVersionConverter; +}()); +exports.IdentityVersionConverter = IdentityVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. The only + * mode it supports is external's version <= platform's version. When executing + * commands, it is used to upgrade the external representation to what platform knows on the way in + * and downgrade the representations on the way out. Similarly for notifications, it can + * downgrade those on the way from platform to external. + */ +var StackingVersionConverter = /** @class */ (function () { + /** + * 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 + */ + function StackingVersionConverter(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) { + this._externalMajorVersion = _externalMajorVersion; + this._platformMajorVersion = _platformMajorVersion; + this._upgradeExecuteTranslations = _upgradeExecuteTranslations; + this._downgradeExecuteTranslations = _downgradeExecuteTranslations; + this._downgradeNotificationTranslations = _downgradeNotificationTranslations; + if (this._externalMajorVersion > this._platformMajorVersion) { + throw new Error("Cannot convert between external version " + this._externalMajorVersion + " and " + this._platformMajorVersion); + } + } + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalVersion The version of the internal contract api-external-js is using + * @param _platformVersion The version of the internal contract the api-platform-js is using + * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters + * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd + * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification + */ + StackingVersionConverter.fromData = function (externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) { + return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations); + }; + StackingVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) { + // Perform the upgrade of the verb and parameters to the level that platform is using + var upgraded = { verb: verb, parameters: parameters }; + for (var _i = 0, _a = this._upgradeExecuteTranslations; _i < _a.length; _i++) { + var upgradeTranslation = _a[_i]; + upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters); + } + return upgraded; + }; + StackingVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) { + // Downgrade the response to what the external module is expecting + var downgraded = executeResponse; + for (var _i = 0, _a = this._downgradeExecuteTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + }; + StackingVersionConverter.prototype.downgradeNotification = function (notification) { + // Downgrade the notification to what the external module is expecting + var downgraded = notification; + for (var _i = 0, _a = this._downgradeNotificationTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + }; + return StackingVersionConverter; +}()); +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 })); +var IdentityVersionConverter_1 = __webpack_require__(/*! ./IdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js"); +var StackingVersionConverter_1 = __webpack_require__(/*! ./StackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js"); +var VersionTranslations_1 = __webpack_require__(/*! ./VersionTranslations */ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js"); +/** + * @returns true if lhs < rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionLessThan(lhs, rhs) { + if (lhs.major > rhs.major) { + return false; + } + if (lhs.major < rhs.major) { + return true; + } + return lhs.minor < rhs.minor; +} +exports.VersionLessThan = VersionLessThan; +/** + * @returns true if lhs == rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionEqualTo(lhs, rhs) { + return lhs.major === rhs.major && lhs.minor === rhs.minor; +} +exports.VersionEqualTo = VersionEqualTo; +// A mapping from an older client version of internal-contract to the current platform version of this contract. +// Each version bump can have an array of translations to perform in order. Notice that this is +// different than the major upgrades/downgrades above because it handles both major and minor version changes. +// Also please note: downgradeExecuteCall is handled on the client/external side rather than platform side. +// When updating the major or minor version of our internal-contract, you will need to update these data structures. +// * If there are translations to add, add them to the version to "upgrade from" or "downgrade to". +exports.ExecuteMinorUpgrades = { + 1: { + 9: [], + }, +}; +exports.ExecuteMinorDowngrades = { + 1: { + 5: [VersionTranslations_1.DowngradeWorksheetNames], + 9: [], + }, +}; +exports.NotificationMinorDowngrades = { + 1: { + 9: [], + 10: [VersionTranslations_1.DowngradeFlipboardZoneID], + }, +}; +/** + * Creates a new InternalContractVersionConverter which has the ability to upgrade and downgrade the contract + * between the two versions, which are specified. If externalMajorVersion is greater than platformMajorVersion, + * an error will be thrown because we won't know how to do those conversions. + * This converter can handle both major and minor updates when the platform version is greater than external version. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateVersionConverter(externalVersion, platformVersion) { + return CreateVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorUpgrades, exports.ExecuteMinorDowngrades, exports.NotificationMinorDowngrades); +} +exports.CreateVersionConverter = CreateVersionConverter; +/** + * Implementation of CreateVersionConverter. This function takes the upgrade, downgrade, and + * notification arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + * @param upgrades MajorMinorTranslators for upgrades + * @param downgrades MajorMinorTranslators for downgrades + * @param notificationDowngrades MajorMinorTranslators for notification downgrades + */ +function CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) { + var externalMajorVersion = externalVersion.major; + var externalMinorVersion = externalVersion.minor; + var platformMajorVersion = platformVersion.major; + if (externalMajorVersion > platformMajorVersion) { + throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion=" + externalMajorVersion + " platformMajorVersion=" + platformMajorVersion); + } + // If we are using the exact same versions (major.minor), just use the identity converter + if (VersionEqualTo(externalVersion, platformVersion)) { + return new IdentityVersionConverter_1.IdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + var neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades); + var neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades); + var neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades); + // We want to apply the downgrades in reverse order in case of dependencies between them + neededExecuteDowngrades.reverse(); + neededNotificationDowngrades.reverse(); + return StackingVersionConverter_1.StackingVersionConverter.fromData(externalVersion, platformVersion, neededExecuteUpgrades, neededExecuteDowngrades, neededNotificationDowngrades); +} +exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; +function GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) { + var neededTranslations = []; + for (var major = externalMajorVersion; major <= platformMajorVersion; major++) { + if (major in majorMinorTranslators) { + var start = major === externalMajorVersion ? externalMinorVersion : 0; + var maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major])); + for (var minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[major]) { + neededTranslations.push.apply(neededTranslations, majorMinorTranslators[major][minor]); + } + } + } + } + return neededTranslations; +} +function GetMaximumMinorIndex(minorVersions) { + return minorVersions.map(function (a) { return Number(a); }).reduce(function (a, b) { return (a > b ? a : b); }); +} +exports.GetMaximumMinorIndex = GetMaximumMinorIndex; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js": +/*!*****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/VersionTranslations.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var 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. + var bootstrapInfo = executeResponse.result; + if (bootstrapInfo.extensionDashboardInfo !== undefined) { + bootstrapInfo.extensionDashboardInfo.zones.forEach(function (zone) { + if (zone.sheetInfo) { + zone.name = zone.sheetInfo.name; + } + }); + } + return executeResponse; +} +exports.DowngradeWorksheetNames = DowngradeWorksheetNames; +function DowngradeFlipboardZoneID(notification) { + // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs. + // When running against a newer server, if flipboardZoneId is absent, set it to default(0). + if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) { + var visualModel = notification.data; + if (visualModel.flipboardZoneID === undefined) { + visualModel.flipboardZoneID = 0; + } + } + return notification; +} +exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and external version number + */ +var ExternalIdentityVersionConverter = /** @class */ (function () { + function ExternalIdentityVersionConverter() { + } + ExternalIdentityVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) { + return { + verb: verb, + parameters: parameters, + }; + }; + ExternalIdentityVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) { + return executeResponse; + }; + ExternalIdentityVersionConverter.prototype.upgradeNotification = function (notification) { + return notification; + }; + return ExternalIdentityVersionConverter; +}()); +exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. This converter + * supports external's version(minor) >= platform's version(minor). When executing + * commands, it is used to downgrade the external representation to what platform knows on the way in + * and upgrade the representations on the way out. + */ +var ExternalStackingVersionConverter = /** @class */ (function () { + /** + * 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 + */ + function ExternalStackingVersionConverter(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) { + this._externalVersion = _externalVersion; + this._platformVersion = _platformVersion; + this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations; + this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations; + this._upgradeNotificationTranslations = _upgradeNotificationTranslations; + if (this._externalVersion.major > this._platformVersion.major) { + throw new Error("Cannot convert between external version " + this._externalVersion.major + "\n and " + this._platformVersion.major); + } + } + ExternalStackingVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) { + // Perform the downgrade of the verb and parameters to the level that platform is using + var downgraded = { verb: verb, parameters: parameters }; + for (var _i = 0, _a = this._downgradeExecuteCallTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters); + } + return downgraded; + }; + ExternalStackingVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) { + // Perform the upgrade of the response to what the external module is expecting + var upgraded = executeResponse; + for (var _i = 0, _a = this._upgradeExecuteReturnTranslations; _i < _a.length; _i++) { + var upgradeTranslation = _a[_i]; + upgraded = upgradeTranslation(upgraded, verb, parameters); + } + return upgraded; + }; + ExternalStackingVersionConverter.prototype.upgradeNotification = function (notification) { + // Perform the upgrade of notification to what the external module is expecting + var upgraded = notification; + for (var _i = 0, _a = this._upgradeNotificationTranslations; _i < _a.length; _i++) { + var upgradeNotification = _a[_i]; + upgraded = upgradeNotification(upgraded); + } + return upgraded; + }; + return ExternalStackingVersionConverter; +}()); +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 })); +var VersionConverterFactory_1 = __webpack_require__(/*! ../VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"); +var ExternalIdentityVersionConverter_1 = __webpack_require__(/*! ./ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"); +var ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalStackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js"); +var ExternalVersionTranslations_1 = __webpack_require__(/*! ./ExternalVersionTranslations */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js"); +// 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: [], + 13: [ExternalVersionTranslations_1.DowngradeUnderlyingTableDataAsync, ExternalVersionTranslations_1.DowngradeLogicalTableDataAsync], + }, +}; +exports.ExecuteMinorUpgradeReturnExternal = { + 1: { + 9: [ExternalVersionTranslations_1.UpgradeDataTableTypes], + 29: [ExternalVersionTranslations_1.UpgradeDataTableRowsAndColumns], + }, +}; +exports.ExecuteMinorUpgradeNotification = { + 1: { + 9: [], + }, +}; +/** + * Creates a new ExternalContractVersionConverter which has the ability to upgrade and downgrade + * the contract between the two versions which are specified. If externalMajorVersion is less than + * platformMajorVersion, an ExternalIdentityVersionConverter will be returned. + * Handles upgrade/downgrade for both major and minor updates. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateExternalCompatibleVersionConverter(externalVersion, platformVersion) { + return CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorDowngradeCallExternal, exports.ExecuteMinorUpgradeReturnExternal, exports.ExecuteMinorUpgradeNotification); +} +exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter; +/** + * Implementation of CreateExternalCompatibleVersionConverterWithTranslators. + * This function takes the upgrade, downgrade arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal contract which the external module is using + * @param platformVersion VersionNumber of the internal contract which the platform is using + * @param upgrades MajorMinorTranslators for response upgrades + * @param downgrades MajorMinorTranslators for execute call downgrades + */ +function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) { + var externalMajorVersion = externalVersion.major; + var platformMajorVersion = platformVersion.major; + var platformMinorVersion = platformVersion.minor; + // This check is present in VersionConverterFactory. We throw the same error here as well. + // Hence we only need to check the minor versions for translations. + if (externalMajorVersion > platformMajorVersion) { + throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion=" + externalMajorVersion + " platformMajorVersion=" + platformMajorVersion); + } + if (externalMajorVersion < platformMajorVersion || VersionConverterFactory_1.VersionEqualTo(externalVersion, platformVersion)) { + return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + var neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades); + var neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades); + var neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications); + // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version + neededExecuteCallDowngrade.reverse(); + return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades); +} +exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; +function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) { + var neededTranslations = []; + if (platformMajorVersion in majorMinorTranslators) { + var start = platformMinorVersion; + var maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion])); + for (var minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[platformMajorVersion]) { + neededTranslations.push.apply(neededTranslations, majorMinorTranslators[platformMajorVersion][minor]); + } + } + } + return neededTranslations; +} + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js": +/*!**********************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js ***! + \**********************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var JsApiInternalContract_1 = __webpack_require__(/*! ../../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +// 1.2 -> 1.0 Translations +// Uncomment this line to import from the V1 definition of the API +// import * as V1 from '@tableau-api-internal-contract-js_v1'; +/** + * Prior to 2019.2 (internal-contract v1.9), DataValue.value were all strings. + * Go through all DataValue objects. If we have a string, but the type should not be a string, + * convert it to the correct type. The type of DataValue.value is 'any' in the contract, so + * this change doesn't need any updates to classes or types. + */ +function UpgradeDataTableTypes(executeResponse, verb, parameters) { + if (!executeResponse) { + return executeResponse; + } + var oldUnderlyingDataTable = executeResponse.result; + if (oldUnderlyingDataTable.data !== undefined && oldUnderlyingDataTable.isSummary !== undefined) { + convertDataValues(oldUnderlyingDataTable.data); + return executeResponse; + } + var oldSelectedMarksTable = executeResponse.result; + if (oldSelectedMarksTable.data !== undefined && Array.isArray(oldSelectedMarksTable.data)) { + oldSelectedMarksTable.data.forEach(function (marksTable) { + convertDataValues(marksTable); + }); + return executeResponse; + } + return executeResponse; +} +exports.UpgradeDataTableTypes = UpgradeDataTableTypes; +/** + * Prior to 2020.2 (internal-contract v1.13 and older), worksheet.getUnderlyingTableDataAsync doesn't exist. + * Map it to the older GetUnderlyingData verb and validate the the logical table Id. + **/ +function DowngradeUnderlyingTableDataAsync(verb, parameters) { + if (verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData) { + validateParametersForObjectModel(verb, parameters); + verb = JsApiInternalContract_1.VerbId.GetUnderlyingData; + } + return { + verb: verb, + parameters: parameters, + }; +} +exports.DowngradeUnderlyingTableDataAsync = DowngradeUnderlyingTableDataAsync; +/** + * Prior to 2020.2 (internal-contract v1.13 and older), datasource.getLogicalTableDataAsync doesn't exist. + * Map it to the older GetDataSourceData verb and validate the the logical table Id. + **/ +function DowngradeLogicalTableDataAsync(verb, parameters) { + if (verb === JsApiInternalContract_1.VerbId.GetLogicalTableData) { + validateParametersForObjectModel(verb, parameters); + verb = JsApiInternalContract_1.VerbId.GetDataSourceData; + } + return { + verb: verb, + parameters: parameters, + }; +} +exports.DowngradeLogicalTableDataAsync = DowngradeLogicalTableDataAsync; +function convertDataValues(table) { + // dataTable is a two-dimensional array of data. First index is the row, second is the column. + if (table === undefined || table.dataTable === undefined || !Array.isArray(table.dataTable)) { + return; + } + table.dataTable.forEach(function (row) { + row.forEach(function (dataValue, columnIndex) { + var value = dataValue.value; + if (value !== null) { + dataValue.value = JsApiInternalContract_1.DataTypeConverter.convertValueAsStringToValue(value, table.headers[columnIndex].dataType); + } + }); + }); +} +// ToDo: TFS1069027 Refactor input verbs & parameters in api-internal-contract Upgrade/Downgrade framework +function validateParametersForObjectModel(verb, parameters) { + if (parameters[JsApiInternalContract_1.ParameterId.LogicalTableId] !== JsApiInternalContract_1.ApiShowDataTableSentinel.SingleTableId) { + throw new Error("Invalid logical table id passed to " + verb + "."); + } +} +/** + * Prior to 2021.2 (internal-contract v1.29 and below), getSummaryDataAsync did not support maxRows, + * and any get...DataAsync did not support columnsToIncludeById. + * Trim result to maxRows if it is included in the parameters for getSummaryDataAsync + * Trim columns to columnsToInclude if included in the parameters for any get...DataAsync + */ +function UpgradeDataTableRowsAndColumns(executeResponse, verb, parameters) { + if (isGetSummaryDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.MaxRows]) { + executeResponse = adjustDataRowLength(executeResponse, parameters[JsApiInternalContract_1.ParameterId.MaxRows]); + } + if (isGetTableDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]) { + executeResponse = adjustDataColumns(executeResponse, parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]); + } + return executeResponse; +} +exports.UpgradeDataTableRowsAndColumns = UpgradeDataTableRowsAndColumns; +function isGetSummaryDataVerb(verb) { + return verb === JsApiInternalContract_1.VerbId.GetDataSummaryData; +} +function isGetTableDataVerb(verb) { + return (verb === JsApiInternalContract_1.VerbId.GetDataSummaryData || + verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData || + verb === JsApiInternalContract_1.VerbId.GetLogicalTableData || + verb === JsApiInternalContract_1.VerbId.GetDataSourceData || + verb === JsApiInternalContract_1.VerbId.GetUnderlyingData); +} +function adjustDataRowLength(executeResponse, maxRows) { + var underlyingDataTable = executeResponse.result; + if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable)) { + return executeResponse; + } + if (maxRows > 0 && maxRows < underlyingDataTable.data.dataTable.length) { + underlyingDataTable.data.dataTable.length = maxRows; + } + return executeResponse; +} +function adjustDataColumns(executeResponse, columnsToInclude) { + if (columnsToInclude.length === 0) { + return executeResponse; + } + // verify that we have a valid UnderlyingDataTable + var underlyingDataTable = executeResponse.result; + if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable) || !Array.isArray(underlyingDataTable.data.headers)) { + return executeResponse; + } + // 1. filter the headers to only columnsToInclude + // 2. use the new headers to filter all rows + // 3. update the indices in our new headers + var newHeaders = underlyingDataTable.data.headers.filter(function (header, index) { + return columnsToInclude.find(function (name) { return name === header.fieldName; }); + }); + underlyingDataTable.data.dataTable.forEach(function (row, index) { + underlyingDataTable.data.dataTable[index] = row.filter(function (value, valueIndex) { return newHeaders.findIndex(function (header) { return header.index === valueIndex; }) !== -1; }); + }); + var newIndex = 0; + underlyingDataTable.data.headers = newHeaders.map(function (header) { + header.index = newIndex++; + return header; + }); + return executeResponse; +} + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared.js": +/*!*********************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// Export everything which had been previously in the api-shared module +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ApiVersion_1 = __webpack_require__(/*! ./ApiShared/ApiVersion */ "../api-shared-js/lib/src/ApiShared/ApiVersion.js"); +exports.ApiVersion = ApiVersion_1.ApiVersion; +__export(__webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameBootstrap */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js")); +var CrossFrameDispatcher_1 = __webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +exports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher; +var DataSource_1 = __webpack_require__(/*! ./ApiShared/DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +exports.DataSource = DataSource_1.DataSource; +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings; +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; +var EventListenerManager_1 = __webpack_require__(/*! ./ApiShared/EventListenerManager */ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); +exports.EventListenerManager = EventListenerManager_1.EventListenerManager; +var Field_1 = __webpack_require__(/*! ./ApiShared/Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +exports.Field = Field_1.Field; +var CustomViewImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +exports.CustomViewImpl = CustomViewImpl_1.CustomViewImpl; +var DashboardImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +exports.DashboardImpl = DashboardImpl_1.DashboardImpl; +var DashboardObjectImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +exports.DashboardObjectImpl = DashboardObjectImpl_1.DashboardObjectImpl; +var DataSourceImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +exports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl; +var ParameterImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +exports.ParameterImpl = ParameterImpl_1.ParameterImpl; +var SheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +exports.SheetImpl = SheetImpl_1.SheetImpl; +var SheetInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +exports.SheetInfoImpl = SheetInfoImpl_1.SheetInfoImpl; +var SingleEventManagerImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SingleEventManagerImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); +exports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl; +var StoryImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js"); +exports.StoryImpl = StoryImpl_1.StoryImpl; +var StoryPointImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +exports.StoryPointImpl = StoryPointImpl_1.StoryPointImpl; +var StoryPointInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +exports.StoryPointInfoImpl = StoryPointInfoImpl_1.StoryPointInfoImpl; +var WorkbookImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorkbookImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js"); +exports.WorkbookImpl = WorkbookImpl_1.WorkbookImpl; +var WorksheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +exports.WorksheetImpl = WorksheetImpl_1.WorksheetImpl; +var Point_1 = __webpack_require__(/*! ./ApiShared/Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +exports.Point = Point_1.Point; +__export(__webpack_require__(/*! ./ApiShared/Services/RegisterAllSharedServices */ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js")); +__export(__webpack_require__(/*! ./ApiShared/Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js")); +var ClientInfoServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ClientInfoServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js"); +exports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl; +var NotificationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +exports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl; +var NotificationServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +exports.NotificationServiceImplBase = NotificationServiceImplBase_1.NotificationServiceImplBase; +exports.Registration = NotificationServiceImplBase_1.Registration; +var ServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +exports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase; +var SizeServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +exports.SizeServiceImpl = SizeServiceImpl_1.SizeServiceImpl; +var StoryActivationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/StoryActivationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js"); +exports.StoryActivationServiceImpl = StoryActivationServiceImpl_1.StoryActivationServiceImpl; +var TableauError_1 = __webpack_require__(/*! ./ApiShared/TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +exports.TableauError = TableauError_1.TableauError; +var Deferred_1 = __webpack_require__(/*! ./ApiShared/Utils/Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +exports.Deferred = Deferred_1.Deferred; +var ErrorHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +exports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers; +var ExportHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +exports.ExportHelpers = ExportHelpers_1.ExportHelpers; +var SheetUtils_1 = __webpack_require__(/*! ./ApiShared/Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +exports.SheetUtils = SheetUtils_1.SheetUtils; +var VersionNumber_1 = __webpack_require__(/*! ./ApiShared/VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +exports.VersionNumber = VersionNumber_1.VersionNumber; +var VersionedExternalApiDispatcher_1 = __webpack_require__(/*! ./VersionedExternalApiDispatcher */ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js"); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/ApiVersion.js": +/*!********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/ApiVersion.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +/** + * This is the singleton wrapper of VersionNumber + */ +var ApiVersion = /** @class */ (function () { + function ApiVersion() { + } + Object.defineProperty(ApiVersion, "Instance", { + /** + * Gets the singleton instance of the version number. + */ + get: function () { + return ApiVersion._instance; + }, + enumerable: true, + configurable: true + }); + ApiVersion.SetVersionNumber = function (numString, isAlpha) { + ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha); + }; + return ApiVersion; +}()); +exports.ApiVersion = ApiVersion; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js": +/*!***************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/ConnectionSummary.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a connection summary. + * This does not follow the Impl pattern as it is just a property bag. + */ +var ConnectionSummary = /** @class */ (function () { + function ConnectionSummary(_connectionInfo) { + this._connectionInfo = _connectionInfo; + } + Object.defineProperty(ConnectionSummary.prototype, "name", { + get: function () { + return this._connectionInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "id", { + get: function () { + return this._connectionInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "serverURI", { + get: function () { + return this._connectionInfo.serverURI; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "type", { + get: function () { + return this._connectionInfo.type; + }, + enumerable: true, + configurable: true + }); + return ConnectionSummary; +}()); +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 })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var CrossFrameDispatcher_1 = __webpack_require__(/*! ./CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +// 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(function (resolve, reject) { + var 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 + var messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*'); + // Prepare to send an initialization message to the parent frame + var initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options); + // 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. + var dispatcherFactory = function () { return new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger); }; + resolve(dispatcherFactory); + } + }); + // Now that our handlers are ready, start listening and send our initialization message + messenger.startListening(); + initializationMessage.send(); + }); +} +exports.doCrossFrameBootstrap = doCrossFrameBootstrap; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +/** + * This is an implementation of the InternalApiDispatcher interface which functions by passing messages + * across a frame boundary. This is usually between the code where our javscript library has been included + * by a 3rd party dev and another frame where Tableau server has content. + */ +var CrossFrameDispatcher = /** @class */ (function () { + /** + * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate + * @param _messenger an instantiated and listening messenger object + */ + function CrossFrameDispatcher(_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 + CrossFrameDispatcher.prototype.execute = function (verb, parameters) { + var _this = this; + // To execute a verb, we first prepare a command message and then define a promise. + var preparedMessage = this._messenger.prepareCommandMessage(verb, parameters); + var promise = new Promise(function (resolve, reject) { + // 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; + }; + CrossFrameDispatcher.prototype.registerNotificationHandler = function (handler) { + this._notificationHandlers.push(handler); + }; + CrossFrameDispatcher.prototype.unregisterNotificationHandler = function (handler) { + this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; }); + }; + ////// End InternalApiDispatcher implementation + CrossFrameDispatcher.prototype.onCommandResponse = function (response) { + // We got a command response, look through the pending promises and resolve + if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) { + return; // We don't have any reference to this command, just return + } + var pendingPromise = this._pendingPromises[response.commandGuid]; + // 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]; + }; + CrossFrameDispatcher.prototype.onNotification = function (notificationMessage) { + // Go through each notification handler we have registered and let them know a notification came in + for (var _i = 0, _a = this._notificationHandlers; _i < _a.length; _i++) { + var handler = _a[_i]; + 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. + } + } + }; + return CrossFrameDispatcher; +}()); +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 })); +var DataSource = /** @class */ (function () { + function DataSource(_dataSourceImpl) { + this._dataSourceImpl = _dataSourceImpl; + } + Object.defineProperty(DataSource.prototype, "name", { + get: function () { + return this._dataSourceImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "id", { + get: function () { + return this._dataSourceImpl.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "fields", { + get: function () { + return this._dataSourceImpl.fields; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "extractUpdateTime", { + get: function () { + return this._dataSourceImpl.extractUpdateTime; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "isExtract", { + get: function () { + return this._dataSourceImpl.isExtract; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "isPublished", { + get: function () { + return this._dataSourceImpl.isPublished; + }, + enumerable: true, + configurable: true + }); + DataSource.prototype.publishedUrl = function () { + return this._dataSourceImpl.publishedUrl(); + }; + DataSource.prototype.refreshAsync = function () { + return this._dataSourceImpl.refreshAsync(); + }; + DataSource.prototype.getActiveTablesAsync = function () { + console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.'); + return this._dataSourceImpl.getActiveTablesAsync(); + }; + DataSource.prototype.getConnectionSummariesAsync = function () { + return this._dataSourceImpl.getConnectionSummariesAsync(); + }; + DataSource.prototype.getUnderlyingDataAsync = function (options) { + console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' + + 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.'); + return this._dataSourceImpl.getUnderlyingDataAsync(options); + }; + DataSource.prototype.getLogicalTablesAsync = function () { + return this._dataSourceImpl.getLogicalTablesAsync(); + }; + DataSource.prototype.getLogicalTableDataAsync = function (logicalTableId, options) { + return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options); + }; + DataSource.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options); + }; + return DataSource; +}()); +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"; + +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the external-api-contract to the enums used + * in the internal-api-contract, which developers code against. + */ +var ExternalToInternalEnumMappings = /** @class */ (function () { + function ExternalToInternalEnumMappings() { + } + ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter((_a = {}, + _a[api_external_contract_js_1.FilterDomainType.Relevant] = api_internal_contract_js_1.FilterDomainType.Relevant, + _a[api_external_contract_js_1.FilterDomainType.Database] = api_internal_contract_js_1.FilterDomainType.Database, + _a)); + ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter((_b = {}, + _b[api_external_contract_js_1.FilterNullOption.AllValues] = api_internal_contract_js_1.FilterNullOption.AllValues, + _b[api_external_contract_js_1.FilterNullOption.NonNullValues] = api_internal_contract_js_1.FilterNullOption.NonNullValues, + _b[api_external_contract_js_1.FilterNullOption.NullValues] = api_internal_contract_js_1.FilterNullOption.NullValues, + _b)); + ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_c = {}, + _c[api_external_contract_js_1.FilterUpdateType.Add] = api_internal_contract_js_1.FilterUpdateType.Add, + _c[api_external_contract_js_1.FilterUpdateType.All] = api_internal_contract_js_1.FilterUpdateType.All, + _c[api_external_contract_js_1.FilterUpdateType.Remove] = api_internal_contract_js_1.FilterUpdateType.Remove, + _c[api_external_contract_js_1.FilterUpdateType.Replace] = api_internal_contract_js_1.FilterUpdateType.Replace, + _c)); + ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter((_d = {}, + _d[api_external_contract_js_1.ZoneVisibilityType.Show] = true, + _d[api_external_contract_js_1.ZoneVisibilityType.Hide] = false, + _d)); + ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter((_e = {}, + // these numbers are duration multipliers + // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed + _e[api_external_contract_js_1.ReplaySpeedType.Slow] = 2.0, + _e[api_external_contract_js_1.ReplaySpeedType.Normal] = 1.0, + _e[api_external_contract_js_1.ReplaySpeedType.Fast] = 0.5, + _e)); + ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {}, + _f[api_external_contract_js_1.SheetType.Dashboard] = api_internal_contract_js_1.SheetType.Dashboard, + _f[api_external_contract_js_1.SheetType.Worksheet] = api_internal_contract_js_1.SheetType.Worksheet, + _f[api_external_contract_js_1.SheetType.Story] = api_internal_contract_js_1.SheetType.Story, + _f)); + ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter((_g = {}, + _g[api_external_contract_js_1.IncludeDataValuesOption.AllValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues, + _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues] = api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly, + _g)); + ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter((_h = {}, + _h[api_external_contract_js_1.PeriodType.Years] = api_internal_contract_js_1.DateStepPeriod.Years, + _h[api_external_contract_js_1.PeriodType.Quarters] = api_internal_contract_js_1.DateStepPeriod.Quarters, + _h[api_external_contract_js_1.PeriodType.Months] = api_internal_contract_js_1.DateStepPeriod.Months, + _h[api_external_contract_js_1.PeriodType.Weeks] = api_internal_contract_js_1.DateStepPeriod.Weeks, + _h[api_external_contract_js_1.PeriodType.Days] = api_internal_contract_js_1.DateStepPeriod.Days, + _h[api_external_contract_js_1.PeriodType.Hours] = api_internal_contract_js_1.DateStepPeriod.Hours, + _h[api_external_contract_js_1.PeriodType.Minutes] = api_internal_contract_js_1.DateStepPeriod.Minutes, + _h[api_external_contract_js_1.PeriodType.Seconds] = api_internal_contract_js_1.DateStepPeriod.Seconds, + _h)); + ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_j = {}, + _j[api_external_contract_js_1.DateRangeType.Last] = api_internal_contract_js_1.DateRangeType.Last, + _j[api_external_contract_js_1.DateRangeType.LastN] = api_internal_contract_js_1.DateRangeType.LastN, + _j[api_external_contract_js_1.DateRangeType.Next] = api_internal_contract_js_1.DateRangeType.Next, + _j[api_external_contract_js_1.DateRangeType.NextN] = api_internal_contract_js_1.DateRangeType.NextN, + _j[api_external_contract_js_1.DateRangeType.Current] = api_internal_contract_js_1.DateRangeType.Current, + _j[api_external_contract_js_1.DateRangeType.ToDate] = api_internal_contract_js_1.DateRangeType.ToDate, + _j)); + ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter((_k = {}, + _k[api_external_contract_js_1.DialogStyle.Window] = api_internal_contract_js_1.DialogStyle.Window, + _k[api_external_contract_js_1.DialogStyle.Modal] = api_internal_contract_js_1.DialogStyle.Modal, + _k[api_external_contract_js_1.DialogStyle.Modeless] = api_internal_contract_js_1.DialogStyle.Modeless, + _k)); + return ExternalToInternalEnumMappings; +}()); +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings; +/* 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"; + +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the internal-api-contract to the enums used + * in the external-api-contract, which developers code against. + */ +var InternalToExternalEnumMappings = /** @class */ (function () { + function InternalToExternalEnumMappings() { + } + InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter((_a = {}, + _a[api_internal_contract_js_1.ExtensionContext.Desktop] = api_external_contract_js_1.ExtensionContext.Desktop, + _a[api_internal_contract_js_1.ExtensionContext.Server] = api_external_contract_js_1.ExtensionContext.Server, + _a)); + InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter((_b = {}, + _b[api_internal_contract_js_1.ExtensionMode.Authoring] = api_external_contract_js_1.ExtensionMode.Authoring, + _b[api_internal_contract_js_1.ExtensionMode.Viewing] = api_external_contract_js_1.ExtensionMode.Viewing, + _b)); + InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter((_c = {}, + _c[api_internal_contract_js_1.ColumnType.Continuous] = api_external_contract_js_1.ColumnType.Continuous, + _c[api_internal_contract_js_1.ColumnType.Discrete] = api_external_contract_js_1.ColumnType.Discrete, + _c)); + InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter((_d = {}, + _d[api_internal_contract_js_1.FieldAggregationType.Attr] = api_external_contract_js_1.FieldAggregationType.Attr, + _d[api_internal_contract_js_1.FieldAggregationType.Avg] = api_external_contract_js_1.FieldAggregationType.Avg, + _d[api_internal_contract_js_1.FieldAggregationType.Collect] = api_external_contract_js_1.FieldAggregationType.Collect, + _d[api_internal_contract_js_1.FieldAggregationType.Count] = api_external_contract_js_1.FieldAggregationType.Count, + _d[api_internal_contract_js_1.FieldAggregationType.Countd] = api_external_contract_js_1.FieldAggregationType.Countd, + _d[api_internal_contract_js_1.FieldAggregationType.Day] = api_external_contract_js_1.FieldAggregationType.Day, + _d[api_internal_contract_js_1.FieldAggregationType.End] = api_external_contract_js_1.FieldAggregationType.End, + _d[api_internal_contract_js_1.FieldAggregationType.Hour] = api_external_contract_js_1.FieldAggregationType.Hour, + _d[api_internal_contract_js_1.FieldAggregationType.InOut] = api_external_contract_js_1.FieldAggregationType.InOut, + _d[api_internal_contract_js_1.FieldAggregationType.Kurtosis] = api_external_contract_js_1.FieldAggregationType.Kurtosis, + _d[api_internal_contract_js_1.FieldAggregationType.Max] = api_external_contract_js_1.FieldAggregationType.Max, + _d[api_internal_contract_js_1.FieldAggregationType.Mdy] = api_external_contract_js_1.FieldAggregationType.Mdy, + _d[api_internal_contract_js_1.FieldAggregationType.Median] = api_external_contract_js_1.FieldAggregationType.Median, + _d[api_internal_contract_js_1.FieldAggregationType.Min] = api_external_contract_js_1.FieldAggregationType.Min, + _d[api_internal_contract_js_1.FieldAggregationType.Minute] = api_external_contract_js_1.FieldAggregationType.Minute, + _d[api_internal_contract_js_1.FieldAggregationType.MonthYear] = api_external_contract_js_1.FieldAggregationType.MonthYear, + _d[api_internal_contract_js_1.FieldAggregationType.None] = api_external_contract_js_1.FieldAggregationType.None, + _d[api_internal_contract_js_1.FieldAggregationType.Qtr] = api_external_contract_js_1.FieldAggregationType.Qtr, + _d[api_internal_contract_js_1.FieldAggregationType.Quart1] = api_external_contract_js_1.FieldAggregationType.Quart1, + _d[api_internal_contract_js_1.FieldAggregationType.Quart3] = api_external_contract_js_1.FieldAggregationType.Quart3, + _d[api_internal_contract_js_1.FieldAggregationType.Second] = api_external_contract_js_1.FieldAggregationType.Second, + _d[api_internal_contract_js_1.FieldAggregationType.Skewness] = api_external_contract_js_1.FieldAggregationType.Skewness, + _d[api_internal_contract_js_1.FieldAggregationType.Stdev] = api_external_contract_js_1.FieldAggregationType.Stdev, + _d[api_internal_contract_js_1.FieldAggregationType.Stdevp] = api_external_contract_js_1.FieldAggregationType.Stdevp, + _d[api_internal_contract_js_1.FieldAggregationType.Sum] = api_external_contract_js_1.FieldAggregationType.Sum, + _d[api_internal_contract_js_1.FieldAggregationType.TruncDay] = api_external_contract_js_1.FieldAggregationType.TruncDay, + _d[api_internal_contract_js_1.FieldAggregationType.TruncHour] = api_external_contract_js_1.FieldAggregationType.TruncHour, + _d[api_internal_contract_js_1.FieldAggregationType.TruncMinute] = api_external_contract_js_1.FieldAggregationType.TruncMinute, + _d[api_internal_contract_js_1.FieldAggregationType.TruncMonth] = api_external_contract_js_1.FieldAggregationType.TruncMonth, + _d[api_internal_contract_js_1.FieldAggregationType.TruncQtr] = api_external_contract_js_1.FieldAggregationType.TruncQtr, + _d[api_internal_contract_js_1.FieldAggregationType.TruncSecond] = api_external_contract_js_1.FieldAggregationType.TruncSecond, + _d[api_internal_contract_js_1.FieldAggregationType.TruncWeek] = api_external_contract_js_1.FieldAggregationType.TruncWeek, + _d[api_internal_contract_js_1.FieldAggregationType.TruncYear] = api_external_contract_js_1.FieldAggregationType.TruncYear, + _d[api_internal_contract_js_1.FieldAggregationType.User] = api_external_contract_js_1.FieldAggregationType.User, + _d[api_internal_contract_js_1.FieldAggregationType.Var] = api_external_contract_js_1.FieldAggregationType.Var, + _d[api_internal_contract_js_1.FieldAggregationType.Varp] = api_external_contract_js_1.FieldAggregationType.Varp, + _d[api_internal_contract_js_1.FieldAggregationType.Week] = api_external_contract_js_1.FieldAggregationType.Week, + _d[api_internal_contract_js_1.FieldAggregationType.Weekday] = api_external_contract_js_1.FieldAggregationType.Weekday, + _d[api_internal_contract_js_1.FieldAggregationType.Year] = api_external_contract_js_1.FieldAggregationType.Year, + _d)); + InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter((_e = {}, + _e[api_internal_contract_js_1.FieldRoleType.Dimension] = api_external_contract_js_1.FieldRoleType.Dimension, + _e[api_internal_contract_js_1.FieldRoleType.Measure] = api_external_contract_js_1.FieldRoleType.Measure, + _e[api_internal_contract_js_1.FieldRoleType.Unknown] = api_external_contract_js_1.FieldRoleType.Unknown, + _e)); + InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {}, + _f[api_internal_contract_js_1.SheetType.Dashboard] = api_external_contract_js_1.SheetType.Dashboard, + _f[api_internal_contract_js_1.SheetType.Story] = api_external_contract_js_1.SheetType.Story, + _f[api_internal_contract_js_1.SheetType.Worksheet] = api_external_contract_js_1.SheetType.Worksheet, + _f)); + InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter((_g = {}, + _g[api_internal_contract_js_1.DashboardObjectType.Extension] = api_external_contract_js_1.DashboardObjectType.Extension, + _g[api_internal_contract_js_1.DashboardObjectType.Blank] = api_external_contract_js_1.DashboardObjectType.Blank, + _g[api_internal_contract_js_1.DashboardObjectType.Image] = api_external_contract_js_1.DashboardObjectType.Image, + _g[api_internal_contract_js_1.DashboardObjectType.Legend] = api_external_contract_js_1.DashboardObjectType.Legend, + _g[api_internal_contract_js_1.DashboardObjectType.PageFilter] = api_external_contract_js_1.DashboardObjectType.PageFilter, + _g[api_internal_contract_js_1.DashboardObjectType.ParameterControl] = api_external_contract_js_1.DashboardObjectType.ParameterControl, + _g[api_internal_contract_js_1.DashboardObjectType.QuickFilter] = api_external_contract_js_1.DashboardObjectType.QuickFilter, + _g[api_internal_contract_js_1.DashboardObjectType.Text] = api_external_contract_js_1.DashboardObjectType.Text, + _g[api_internal_contract_js_1.DashboardObjectType.Title] = api_external_contract_js_1.DashboardObjectType.Title, + _g[api_internal_contract_js_1.DashboardObjectType.WebPage] = api_external_contract_js_1.DashboardObjectType.WebPage, + _g[api_internal_contract_js_1.DashboardObjectType.Worksheet] = api_external_contract_js_1.DashboardObjectType.Worksheet, + _g)); + InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter((_h = {}, + _h[api_internal_contract_js_1.DataType.Bool] = api_external_contract_js_1.DataType.Bool, + _h[api_internal_contract_js_1.DataType.Date] = api_external_contract_js_1.DataType.Date, + _h[api_internal_contract_js_1.DataType.DateTime] = api_external_contract_js_1.DataType.DateTime, + _h[api_internal_contract_js_1.DataType.Float] = api_external_contract_js_1.DataType.Float, + _h[api_internal_contract_js_1.DataType.Int] = api_external_contract_js_1.DataType.Int, + _h[api_internal_contract_js_1.DataType.String] = api_external_contract_js_1.DataType.String, + _h)); + InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_j = {}, + _j[api_internal_contract_js_1.FilterUpdateType.Add] = api_external_contract_js_1.FilterUpdateType.Add, + _j[api_internal_contract_js_1.FilterUpdateType.All] = api_external_contract_js_1.FilterUpdateType.All, + _j[api_internal_contract_js_1.FilterUpdateType.Remove] = api_external_contract_js_1.FilterUpdateType.Remove, + _j[api_internal_contract_js_1.FilterUpdateType.Replace] = api_external_contract_js_1.FilterUpdateType.Replace, + _j)); + InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter((_k = {}, + _k[api_internal_contract_js_1.DomainRestrictionType.All] = api_external_contract_js_1.ParameterValueType.All, + _k[api_internal_contract_js_1.DomainRestrictionType.List] = api_external_contract_js_1.ParameterValueType.List, + _k[api_internal_contract_js_1.DomainRestrictionType.Range] = api_external_contract_js_1.ParameterValueType.Range, + _k)); + InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter((_l = {}, + _l[api_internal_contract_js_1.DateStepPeriod.Years] = api_external_contract_js_1.PeriodType.Years, + _l[api_internal_contract_js_1.DateStepPeriod.Quarters] = api_external_contract_js_1.PeriodType.Quarters, + _l[api_internal_contract_js_1.DateStepPeriod.Months] = api_external_contract_js_1.PeriodType.Months, + _l[api_internal_contract_js_1.DateStepPeriod.Weeks] = api_external_contract_js_1.PeriodType.Weeks, + _l[api_internal_contract_js_1.DateStepPeriod.Days] = api_external_contract_js_1.PeriodType.Days, + _l[api_internal_contract_js_1.DateStepPeriod.Hours] = api_external_contract_js_1.PeriodType.Hours, + _l[api_internal_contract_js_1.DateStepPeriod.Minutes] = api_external_contract_js_1.PeriodType.Minutes, + _l[api_internal_contract_js_1.DateStepPeriod.Seconds] = api_external_contract_js_1.PeriodType.Seconds, + _l)); + InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_m = {}, + _m[api_internal_contract_js_1.DateRangeType.Current] = api_external_contract_js_1.DateRangeType.Current, + _m[api_internal_contract_js_1.DateRangeType.Last] = api_external_contract_js_1.DateRangeType.Last, + _m[api_internal_contract_js_1.DateRangeType.LastN] = api_external_contract_js_1.DateRangeType.LastN, + _m[api_internal_contract_js_1.DateRangeType.Next] = api_external_contract_js_1.DateRangeType.Next, + _m[api_internal_contract_js_1.DateRangeType.NextN] = api_external_contract_js_1.DateRangeType.NextN, + _m[api_internal_contract_js_1.DateRangeType.ToDate] = api_external_contract_js_1.DateRangeType.ToDate, + _m)); + InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter((_o = {}, + _o[api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED] = api_external_contract_js_1.ErrorCodes.APINotInitialized, + _o[api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR] = api_external_contract_js_1.ErrorCodes.VisibilityError, + _o), api_external_contract_js_1.ErrorCodes.InternalError); + InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter((_p = {}, + _p[api_internal_contract_js_1.FilterType.Categorical] = api_external_contract_js_1.FilterType.Categorical, + _p[api_internal_contract_js_1.FilterType.Range] = api_external_contract_js_1.FilterType.Range, + _p[api_internal_contract_js_1.FilterType.RelativeDate] = api_external_contract_js_1.FilterType.RelativeDate, + _p[api_internal_contract_js_1.FilterType.Hierarchical] = api_external_contract_js_1.FilterType.Hierarchical, + _p)); + InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter((_q = {}, + _q["tableau-dashboard-title" /* DashboardTitle */] = api_external_contract_js_1.ClassNameKey.DashboardTitle, + _q["tableau-story-title" /* StoryTitle */] = api_external_contract_js_1.ClassNameKey.StoryTitle, + _q["tableau-tooltip" /* Tooltip */] = api_external_contract_js_1.ClassNameKey.Tooltip, + _q["tableau-worksheet" /* Worksheet */] = api_external_contract_js_1.ClassNameKey.Worksheet, + _q["tableau-worksheet-title" /* WorksheetTitle */] = api_external_contract_js_1.ClassNameKey.WorksheetTitle, + // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed + _q['dashboard-title'] = api_external_contract_js_1.ClassNameKey.DashboardTitle, + _q['story-title'] = api_external_contract_js_1.ClassNameKey.StoryTitle, + _q['tooltip'] = api_external_contract_js_1.ClassNameKey.Tooltip, + _q['worksheet'] = api_external_contract_js_1.ClassNameKey.Worksheet, + _q['worksheet-title'] = api_external_contract_js_1.ClassNameKey.WorksheetTitle, + _q)); + InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter((_r = {}, + _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected, + _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected, + _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected, + _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected, + _r)); + InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter((_s = {}, + _s[api_internal_contract_js_1.AnnotateEnum.Area] = api_external_contract_js_1.AnnotationType.Area, + _s[api_internal_contract_js_1.AnnotateEnum.Mark] = api_external_contract_js_1.AnnotationType.Mark, + _s[api_internal_contract_js_1.AnnotateEnum.Point] = api_external_contract_js_1.AnnotationType.Point, + _s)); + InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter((_t = {}, + _t[api_internal_contract_js_1.MarkType.Area] = api_external_contract_js_1.MarkType.Area, + _t[api_internal_contract_js_1.MarkType.Bar] = api_external_contract_js_1.MarkType.Bar, + _t[api_internal_contract_js_1.MarkType.Circle] = api_external_contract_js_1.MarkType.Circle, + _t[api_internal_contract_js_1.MarkType.GanttBar] = api_external_contract_js_1.MarkType.GanttBar, + _t[api_internal_contract_js_1.MarkType.Heatmap] = api_external_contract_js_1.MarkType.Heatmap, + _t[api_internal_contract_js_1.MarkType.Line] = api_external_contract_js_1.MarkType.Line, + _t[api_internal_contract_js_1.MarkType.Map] = api_external_contract_js_1.MarkType.Map, + _t[api_internal_contract_js_1.MarkType.Pie] = api_external_contract_js_1.MarkType.Pie, + _t[api_internal_contract_js_1.MarkType.Polygon] = api_external_contract_js_1.MarkType.Polygon, + _t[api_internal_contract_js_1.MarkType.Shape] = api_external_contract_js_1.MarkType.Shape, + _t[api_internal_contract_js_1.MarkType.Square] = api_external_contract_js_1.MarkType.Square, + _t[api_internal_contract_js_1.MarkType.Text] = api_external_contract_js_1.MarkType.Text, + _t[api_internal_contract_js_1.MarkType.VizExtension] = api_external_contract_js_1.MarkType.VizExtension, + _t)); + return InternalToExternalEnumMappings; +}()); +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings; +/* 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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Class designed to register and unregister handlers from a user. Only those events + * which are added via AddNewEventType will be supported by this instance + */ +var EventListenerManager = /** @class */ (function () { + function EventListenerManager() { + this._eventListenerManagers = {}; + } + EventListenerManager.prototype.addEventListener = function (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); + }; + EventListenerManager.prototype.removeEventListener = function (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); + }; + EventListenerManager.prototype.addNewEventType = function (eventManager) { + this._eventListenerManagers[eventManager.eventType] = eventManager; + }; + return EventListenerManager; +}()); +exports.EventListenerManager = EventListenerManager; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Field.js": +/*!***************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Field.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ErrorHelpers_1 = __webpack_require__(/*! ./Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Field = /** @class */ (function () { + function Field(_fieldImpl) { + this._fieldImpl = _fieldImpl; + } + Object.defineProperty(Field.prototype, "name", { + get: function () { + return this._fieldImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "id", { + get: function () { + return this._fieldImpl.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "description", { + get: function () { + return this._fieldImpl.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "dataType", { + get: function () { + return this._fieldImpl.dataType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "aggregation", { + get: function () { + return this._fieldImpl.aggregation; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "dataSource", { + get: function () { + return this._fieldImpl.dataSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "role", { + get: function () { + return this._fieldImpl.role; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isHidden", { + get: function () { + return this._fieldImpl.isHidden; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isGenerated", { + get: function () { + return this._fieldImpl.isGenerated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isCalculatedField", { + get: function () { + return this._fieldImpl.isCalculatedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "columnType", { + get: function () { + throw ErrorHelpers_1.ErrorHelpers.apiNotImplemented('Field.columnType'); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isCombinedField", { + get: function () { + return this._fieldImpl.isCombinedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isPresentOnPublishedDatasource", { + get: function () { + return this._fieldImpl.isPresentOnPublishedDatasource; + }, + enumerable: true, + configurable: true + }); + return Field; +}()); +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 })); +var ApiShared_1 = __webpack_require__(/*! ../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +var CustomViewImpl = /** @class */ (function () { + function CustomViewImpl(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; + } + Object.defineProperty(CustomViewImpl.prototype, "luid", { + get: function () { + return this._luid; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "name", { + get: function () { + return this._name; + }, + set: function (name) { + this._name = name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "shared", { + get: function () { + return this._shared; + }, + set: function (shared) { + this._shared = shared; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "isDefault", { + get: function () { + return this._isDefault; + }, + set: function (isDefault) { + this._isDefault = isDefault; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "ownerName", { + get: function () { + return this._ownerName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "url", { + get: function () { + return this._url; + }, + enumerable: true, + configurable: true + }); + CustomViewImpl.prototype.saveAsync = function () { + var service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* Viz */); + return service.saveAsync(this); + }; + return CustomViewImpl; +}()); +exports.CustomViewImpl = CustomViewImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var Point_1 = __webpack_require__(/*! ../Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var DashboardObjectImpl_1 = __webpack_require__(/*! ./DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +var SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +var WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +var DashboardImpl = /** @class */ (function (_super) { + __extends(DashboardImpl, _super); + function DashboardImpl(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId) { + if (_activeDashboardObjectId === void 0) { _activeDashboardObjectId = 0; } + var _this = _super.call(this, _sheetInfo, _registryId) || this; + _this._zones = _zones; + _this._sheetPath = _sheetPath; + _this._parentStoryPointImpl = _parentStoryPointImpl; + _this._activeDashboardObjectId = _activeDashboardObjectId; + return _this; + } + Object.defineProperty(DashboardImpl.prototype, "worksheetsImpl", { + get: function () { + return this._worksheetsImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "objects", { + get: function () { + return this._objects; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "parentStoryPoint", { + get: function () { + return this._parentStoryPointImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "activeDashboardObjectId", { + get: function () { + return this._activeDashboardObjectId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "activeDashboardName", { + get: function () { + return this._sheetPath.sheetName; + }, + enumerable: true, + configurable: true + }); + DashboardImpl.prototype.initializeWithPublicInterfaces = function () { + this._worksheetsImpl = new Array(); + this._objects = new Array(); + this.zoneMap = new Map(); + // Process all the zones which are contained in this dashboard + for (var _i = 0, _a = this._zones; _i < _a.length; _i++) { + var zone = _a[_i]; + var worksheetImpl = undefined; + var zoneSize = { width: zone.width, height: zone.height }; + // As the dashboard is active, all other zones in the dashboard are inactive. + var isActive = false; + if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) { + var worksheetName = ''; + var worksheetUrl = ''; + var 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. + var sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl); + var 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); + this._worksheetsImpl.push(worksheetImpl); + } + var zonePoint = new Point_1.Point(zone.x, zone.y); + var dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false + zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true + zone.zoneId); + this._objects.push(dashboardObjectImpl); + this.zoneMap.set(zone.zoneId, dashboardObjectImpl); + } + }; + DashboardImpl.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) { + var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap); + }; + DashboardImpl.prototype.getDashboardObjectById = function (dashboardObjectId) { + return this.zoneMap.get(dashboardObjectId); + }; + DashboardImpl.prototype.updateZones = function (newZones, newActiveZoneId, newActiveDashboardName) { + var _this = this; + if (newActiveZoneId === void 0) { newActiveZoneId = 0; } + if (newActiveDashboardName === void 0) { newActiveDashboardName = ''; } + // getting previous dashboard objects, active zone ID and active dashboard name + var oldDashboardObjects = this._objects; + var oldZoneMap = this.zoneMap; + var oldActiveZoneId = this._activeDashboardObjectId; + var oldActiveDashboardName = this._sheetPath.sheetName; + // 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 + var newDashboardObjects = this._objects; + var newZoneMap = this.zoneMap; + // initializing map for changes + var zoneChanges = new Map(); + // comparing old dashboard objects with new ones + oldDashboardObjects.forEach(function (oldObject) { + var oldId = oldObject.id; + // checking if zone was removed + if (!newZoneMap.has(oldId)) { + _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed); + return; + } + var 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(function (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; + }; + DashboardImpl.prototype.addChange = function (zoneId, zoneChanges, change) { + if (!zoneChanges.has(zoneId)) { + zoneChanges.set(zoneId, []); + } + zoneChanges.get(zoneId).push(change); + }; + DashboardImpl.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) { + var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray); + }; + DashboardImpl.prototype.replayAnimationAsync = function (replaySpeed) { + var animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* Animation */); + return animationService.replayAsync(replaySpeed); + }; + DashboardImpl.prototype.getFiltersAsync = function () { + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getDashboardFiltersAsync(); + }; + DashboardImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'FilterUpdateType'); + ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); + if (!Array.isArray(values)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyDashboardFilterAsync must be an array'); + } + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyDashboardFilterAsync(fieldName, values, updateType, options); + }; + // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class + // This method only exists since worksheetsImpl can be undefined, but we need the worksheet names in the Export APIs + DashboardImpl.prototype.getWorksheetNamesFromZones = function () { + var worksheetNames = []; + for (var _i = 0, _a = this._zones; _i < _a.length; _i++) { + var zone = _a[_i]; + if (zone.zoneType !== api_internal_contract_js_1.DashboardObjectType.Worksheet) { + continue; + } + // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 + var worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name; + worksheetNames.push(worksheetName); + } + return worksheetNames; + }; + DashboardImpl.prototype.verifyActiveSheetOrEmbeddedInActiveStoryPoint = function () { + var isRootAndActiveDashboard = this.active; + var isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active; + if (!isRootAndActiveDashboard && !isWithinActiveStoryPoint) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); + } + }; + return DashboardImpl; +}(SheetImpl_1.SheetImpl)); +exports.DashboardImpl = DashboardImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + * This does not follow the Impl pattern as it is just a property bag. + */ +var DashboardObjectImpl = /** @class */ (function () { + function DashboardObjectImpl(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id) { + 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; + } + Object.defineProperty(DashboardObjectImpl.prototype, "dashboardImpl", { + get: function () { + return this._dashboardImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "position", { + get: function () { + return this._position; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "size", { + get: function () { + return this._size; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "worksheetImpl", { + get: function () { + return this._worksheetImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "isFloating", { + get: function () { + return this._isFloating; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "isVisible", { + get: function () { + return this._isVisible; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "id", { + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + return DashboardObjectImpl; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ConnectionSummary_1 = __webpack_require__(/*! ../ConnectionSummary */ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js"); +var Field_1 = __webpack_require__(/*! ../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableSummary_1 = __webpack_require__(/*! ../TableSummary */ "../api-shared-js/lib/src/ApiShared/TableSummary.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var FieldImpl_1 = __webpack_require__(/*! ./FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +var DataSourceImpl = /** @class */ (function () { + function DataSourceImpl(_dataSourceInfo, _registryId) { + var _this = this; + this._dataSourceInfo = _dataSourceInfo; + this._registryId = _registryId; + this._fields = _dataSourceInfo.fields.map(function (fieldModel) { + var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, _this); + return new Field_1.Field(fieldImpl); + }); + } + Object.defineProperty(DataSourceImpl.prototype, "name", { + get: function () { + return this._dataSourceInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "id", { + get: function () { + return this._dataSourceInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "extractUpdateTime", { + get: function () { + return this._dataSourceInfo.extractUpdateTime; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "fields", { + get: function () { + return this._fields; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "isExtract", { + get: function () { + return this._dataSourceInfo.isExtract; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "isPublished", { + get: function () { + return this._dataSourceInfo.isPublished; + }, + enumerable: true, + configurable: true + }); + DataSourceImpl.prototype.publishedUrl = function () { + return this._dataSourceInfo.publishedUrl; + }; + DataSourceImpl.prototype.getMaxPageRowLimit = function () { + return 10000; + }; + DataSourceImpl.prototype.refreshAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.refreshAsync(this._dataSourceInfo.id); + }; + DataSourceImpl.prototype.getConnectionSummariesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then(function (summaries) { + return summaries.map(function (summary) { return new ConnectionSummary_1.ConnectionSummary(summary); }); + }); + }; + DataSourceImpl.prototype.getActiveTablesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then(function (tableInfos) { + return tableInfos.map(function (tableInfo) { return new TableSummary_1.TableSummary(tableInfo); }); + }); + }; + DataSourceImpl.prototype.getUnderlyingDataAsync = function (options) { + var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + DataSourceImpl.prototype.getLogicalTableDataAsync = function (logicalTableId, options) { + var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + DataSourceImpl.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataReaderAsync(this.id, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + DataSourceImpl.prototype.initializeWithPublicInterfaces = function (dataSource) { + ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource'); + this._fields = this._dataSourceInfo.fields.map(function (fieldModel) { + var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource); + return new Field_1.Field(fieldImpl); + }); + }; + DataSourceImpl.prototype.getLogicalTablesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getLogicalTablesAsync(this.id).then(function (logicalTableInfos) { + return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); }); + }); + }; + return DataSourceImpl; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var FieldImpl = /** @class */ (function () { + function FieldImpl(_fieldInfo, _parentDataSource) { + this._fieldInfo = _fieldInfo; + this._parentDataSource = _parentDataSource; + } + Object.defineProperty(FieldImpl.prototype, "name", { + get: function () { + return this._fieldInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "id", { + get: function () { + return this._fieldInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "description", { + get: function () { + return this._fieldInfo.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "dataType", { + get: function () { + var _a; + return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : api_external_contract_js_1.DataType.Unknown); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "aggregation", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "dataSource", { + get: function () { + if (!this._parentDataSource) + throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information"); + return this._parentDataSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "role", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isHidden", { + get: function () { + return this._fieldInfo.isHidden; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isGenerated", { + get: function () { + return this._fieldInfo.isGenerated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isCalculatedField", { + get: function () { + return this._fieldInfo.isCalculatedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isCombinedField", { + get: function () { + return this._fieldInfo.isCombinedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isPresentOnPublishedDatasource", { + get: function () { + return this._fieldInfo.isPresentOnPublishedDatasource; + }, + enumerable: true, + configurable: true + }); + return FieldImpl; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ParameterImpl = /** @class */ (function () { + function ParameterImpl(parameterInfo, _registryId) { + this._registryId = _registryId; + this.setParameterInfo(parameterInfo); + } + Object.defineProperty(ParameterImpl.prototype, "name", { + get: function () { + return this._parameterInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "currentValue", { + get: function () { + return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "dataType", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "id", { + get: function () { + return this._globalFieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "allowableValues", { + get: function () { + return this._allowableValues; + }, + enumerable: true, + configurable: true + }); + ParameterImpl.prototype.changeValueAsync = function (newValue) { + var _this = this; + ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue'); + var coercedValue = Param_1.Param.serializeParameterValue(newValue); + var parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then(function (parameterInfo) { + _this.setParameterInfo(parameterInfo); + return _this.currentValue; + }); + }; + ParameterImpl.prototype.setParameterInfo = function (parameterInfo) { + this._parameterInfo = parameterInfo; + this._globalFieldName = parameterInfo.fieldName; + var type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType); + var listValues; + var minValue; + var maxValue; + var stepSize; + var dateStepPeriod; + if (type === api_external_contract_js_1.ParameterValueType.List) { + var values = parameterInfo.allowableValues || []; + listValues = values.map(function (val) { return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType); }); + } + 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, + }; + }; + return ParameterImpl; +}()); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +var SheetImpl = /** @class */ (function () { + function SheetImpl(_sheetInfoImpl, _registryId) { + this._sheetInfoImpl = _sheetInfoImpl; + this._registryId = _registryId; + } + Object.defineProperty(SheetImpl.prototype, "name", { + get: function () { + return this._sheetInfoImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "sheetType", { + get: function () { + return this._sheetInfoImpl.sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "sheetPath", { + get: function () { + return this._sheetInfoImpl.sheetPath; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "size", { + get: function () { + return this._sheetInfoImpl.sheetSize; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "hidden", { + get: function () { + if (this._sheetInfoImpl.isHidden !== undefined) { + return this._sheetInfoImpl.isHidden; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "isHidden not implemented"); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "active", { + get: function () { + if (this._sheetInfoImpl.isActive !== undefined) { + return this._sheetInfoImpl.isActive; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "active not implemented"); + }, + set: function (active) { + if (this._sheetInfoImpl.isActive !== undefined) { + this._sheetInfoImpl.active = active; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "index", { + get: function () { + if (this._sheetInfoImpl.index !== undefined) { + return this._sheetInfoImpl.index; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "index not implemented"); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "url", { + get: function () { + if (this._sheetInfoImpl.url !== undefined) { + return this._sheetInfoImpl.url; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "url not implemented"); + }, + enumerable: true, + configurable: true + }); + SheetImpl.prototype.getSheetSize = function () { + if (!SheetUtils_1.SheetUtils.isValidSheetSize(this.size)) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InternalError, 'size is not of type SheetSize'); + } + return this.size; + }; + SheetImpl.prototype.findParameterAsync = function (parameterName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName'); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return service.findParameterByNameAsync(parameterName); + }; + SheetImpl.prototype.getParametersAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return service.getParametersForSheetAsync(this.sheetPath); + }; + SheetImpl.prototype.changeSizeAsync = function (newSize) { + var _this = this; + var invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); + if (!newSize || !newSize.behavior) { + throw invalidSizeError; + } + var partialSheetSize = this.normalizeSheetSize(newSize); + var 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); + } + var processedNewSize = this.processNewSize(partialSheetSize); + var sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* Size */); + return sizeService.changeSizeAsync(this.name, processedNewSize).then(function () { + var clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(_this._registryId).getService("client-info-service" /* ClientInfo */); + return clientInfoService.getClientInfoAsync().then(function (bootstrapInfo) { + var sheet = bootstrapInfo.publishedSheets.find(function (s) { return s.name === _this.name; }); + if (!sheet) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, "Can't find sheet with name " + _this.name); + } + var sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint); + _this._sheetInfoImpl.sheetSize = sheetSize; + return sheetSize; + }); + }); + }; + SheetImpl.prototype.normalizeSheetSize = function (newSize) { + var behavior = newSize.behavior; + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior'); + var minSize = SheetImpl.parseDimensions(newSize.minSize); + var maxSize = SheetImpl.parseDimensions(newSize.maxSize); + return { behavior: behavior, minSize: minSize, maxSize: maxSize }; + }; + SheetImpl.prototype.processNewSize = function (newSize) { + var _a, _b, _c, _d; + var behavior = newSize.behavior, minSizeMaybe = newSize.minSize, maxSizeMaybe = newSize.maxSize; + var hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width); + var hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height); + var hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width); + var hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height); + var hasValidMinSize = hasMinWidth && hasMinHeight; + var hasValidMaxSize = hasMaxWidth && hasMaxHeight; + switch (behavior) { + case Contract.SheetSizeBehavior.Automatic: { + return { behavior: behavior }; + } + case Contract.SheetSizeBehavior.AtMost: { + if (!maxSizeMaybe || !hasValidMaxSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMaxSize, 'Missing maxSize for SheetSizeBehavior.AtMost'); + } + var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (maxSize.width < 0 || maxSize.height < 0) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); + } + return { behavior: behavior, maxSize: maxSize }; + } + case Contract.SheetSizeBehavior.AtLeast: { + if (!minSizeMaybe || !hasValidMinSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinSize, 'Missing minSize for SheetSizeBehavior.AtLeast'); + } + var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + if (minSize.width < 0 || minSize.height < 0) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); + } + return { behavior: behavior, minSize: minSize }; + } + case Contract.SheetSizeBehavior.Range: { + if (!minSizeMaybe || !maxSizeMaybe || !hasValidMinSize || !hasValidMaxSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinMaxSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); + } + var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + 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: behavior, minSize: minSize, maxSize: maxSize }; + } + case Contract.SheetSizeBehavior.Exactly: { + if (minSizeMaybe && maxSizeMaybe) { + if (hasValidMinSize && hasValidMaxSize) { + var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (minSize.width !== maxSize.width || minSize.height !== maxSize.height) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Conflicting size values for SheetSizeBehavior.Exactly'); + } + return { behavior: behavior, minSize: minSize, maxSize: maxSize }; + } + if (hasValidMinSize) { + var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + return { behavior: behavior, minSize: minSize, maxSize: minSize }; + } + if (hasValidMaxSize) { + var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + return { behavior: behavior, minSize: maxSize, 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); + } + } + }; + SheetImpl.parseDimensions = function (size) { + var empty = { width: undefined, height: undefined }; + if (!size) { + return empty; + } + var _a = Param_1.Param.tryParseNumber(size.width), widthParsed = _a.success, parsedWidth = _a.parsed; + var _b = Param_1.Param.tryParseNumber(size.height), heightParsed = _b.success, parsedHeight = _b.parsed; + if (widthParsed && heightParsed) { + return { width: parsedWidth, height: parsedHeight }; + } + if (widthParsed) { + return { width: parsedWidth }; + } + if (heightParsed) { + return { height: parsedHeight }; + } + return empty; + }; + return SheetImpl; +}()); +exports.SheetImpl = SheetImpl; + + +/***/ }), + +/***/ "../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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var SheetInfoImpl = /** @class */ (function () { + function SheetInfoImpl(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) { + this._name = _name; + this._sheetType = _sheetType; + this._sheetSize = _sheetSize; + this._index = _index; + this._isActive = _isActive; + this._isHidden = _isHidden; + this._url = _url; + } + Object.defineProperty(SheetInfoImpl.prototype, "name", { + get: function () { + return this._name; + }, + set: function (sheetName) { + this._name = sheetName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetSize", { + get: function () { + return this._sheetSize; + }, + set: function (value) { + this._sheetSize = value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetType", { + get: function () { + return this._sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetPath", { + get: function () { + return { + sheetName: this.name, + isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard, + }; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "index", { + get: function () { + return this._index; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "isActive", { + get: function () { + return this._isActive; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "active", { + set: function (active) { + this._isActive = active; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "isHidden", { + get: function () { + return this._isHidden; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "url", { + get: function () { + return this._url; + }, + enumerable: true, + configurable: true + }); + return SheetInfoImpl; +}()); +exports.SheetInfoImpl = SheetInfoImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js": +/*!*************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * This class implements the SingleEventManager interface for a single type of Tableau event + * + * @template TEventType The Tableau event type this class specializes + */ +var SingleEventManagerImpl = /** @class */ (function () { + function SingleEventManagerImpl(eventType) { + this._eventType = eventType; + this._handlers = []; + } + Object.defineProperty(SingleEventManagerImpl.prototype, "eventType", { + get: function () { + return this._eventType; + }, + enumerable: true, + configurable: true + }); + SingleEventManagerImpl.prototype.addEventListener = function (handler) { + var _this = this; + this._handlers.push(handler); + return function () { return _this.removeEventListener(handler); }; + }; + SingleEventManagerImpl.prototype.removeEventListener = function (handler) { + var beforeCount = this._handlers.length; + this._handlers = this._handlers.filter(function (h) { return h !== handler; }); + return beforeCount > this._handlers.length; + }; + SingleEventManagerImpl.prototype.triggerEvent = function (eventGenerator) { + for (var _i = 0, _a = this._handlers; _i < _a.length; _i++) { + var handler = _a[_i]; + try { + var eventModel = eventGenerator(); + handler(eventModel); + } + catch (e) { + // Since this handler could be outside our control, just catch anything it throws and continue on + continue; + } + } + }; + return SingleEventManagerImpl; +}()); +exports.SingleEventManagerImpl = SingleEventManagerImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var ShortLivedDeferred_1 = __webpack_require__(/*! ../Utils/ShortLivedDeferred */ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js"); +var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +var StoryPointImpl_1 = __webpack_require__(/*! ./StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +var StoryPointInfoImpl_1 = __webpack_require__(/*! ./StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +var StoryImpl = /** @class */ (function (_super) { + __extends(StoryImpl, _super); + function StoryImpl(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) { + var _this = _super.call(this, _sheetInfoImpl, _registryId) || this; + _this._sheetInfoImpl = _sheetInfoImpl; + _this._publishedSheetInfos = _publishedSheetInfos; + _this._registryId = _registryId; + _this._storyPointInfoImpls = []; + _this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred(); + _this.initializeStory(storyModel); + return _this; + } + StoryImpl.prototype.initializeStory = function (storyModel) { + var _this = this; + storyModel.storyPoints.forEach(function (storyPointModel) { + var isActive = storyPointModel.index === storyModel.activeStoryPointIndex; + var storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, _this); + _this._storyPointInfoImpls.push(storyPointInfoImpl); + if (isActive) { + _this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, _this._publishedSheetInfos, _this._registryId, storyPointModel.containedSheetInfo); + } + }); + }; + StoryImpl.prototype.updateStoryInfo = function (index, storyPointModel) { + if (!this._storyPointInfoImpls) { + return; + } + var 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; + } + }; + StoryImpl.prototype.updateStory = function (storyPointModel) { + var _this = this; + if (!this._storyPointInfoImpls) { + return; + } + this._storyPointInfoImpls.forEach(function (storyPointInfoImpl) { + var 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); + } + }; + Object.defineProperty(StoryImpl.prototype, "activeStoryPoint", { + get: function () { + return this._activeStoryPointImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryImpl.prototype, "storyPointsInfo", { + get: function () { + return this._storyPointInfoImpls; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryImpl.prototype, "isActive", { + get: function () { + return this._sheetInfoImpl.active; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryImpl.prototype, "isHidden", { + get: function () { + return !!this._sheetInfoImpl.isHidden; + }, + enumerable: true, + configurable: true + }); + StoryImpl.prototype.activateNextStoryPointAsync = function () { + if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) { + return Promise.resolve(this._activeStoryPointImpl); + } + var promise = this._deferred.getNewPromiseOrThrowIfBusy(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activateNextStoryPointAsync(); + return promise; + }; + StoryImpl.prototype.activatePreviousStoryPointAsync = function () { + if (this._activeStoryPointImpl.index === 0) { + return Promise.resolve(this._activeStoryPointImpl); + } + var promise = this._deferred.getNewPromiseOrThrowIfBusy(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activatePreviousStoryPointAsync(); + return promise; + }; + StoryImpl.prototype.activateStoryPointAsync = function (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); + } + var promise = this._deferred.getNewPromiseOrThrowIfBusy(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activateStoryPointAsync(index); + return promise; + }; + StoryImpl.prototype.revertStoryPointAsync = function (index) { + var _this = this; + ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); + ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); + if (index < 0 || index >= this._storyPointInfoImpls.length) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); + } + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + return service.revertStoryPointAsync(index).then(function (response) { + _this.updateStoryInfo(response.index, response); + var storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, _this); + return storyPointInfoImpl; + }); + }; + StoryImpl.prototype.clearPendingPromises = function () { + if (this._deferred) { + this._deferred.reject('All pending promises cleared'); + } + }; + return StoryImpl; +}(SheetImpl_1.SheetImpl)); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +var DashboardImpl_1 = __webpack_require__(/*! ./DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +var SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +var WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +var StoryPointImpl = /** @class */ (function () { + function StoryPointImpl(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) { + this._storyPointInfoImpl = _storyPointInfoImpl; + if (containedSheetInfo) { + this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId); + } + } + Object.defineProperty(StoryPointImpl.prototype, "index", { + get: function () { + return this._storyPointInfoImpl.index; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "caption", { + get: function () { + return this._storyPointInfoImpl.caption; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "active", { + get: function () { + return this._storyPointInfoImpl.active; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "updated", { + get: function () { + return this._storyPointInfoImpl.updated; + }, + set: function (updated) { + this._storyPointInfoImpl.updated = updated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "parentStory", { + get: function () { + return this._storyPointInfoImpl.parentStory; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "containedSheet", { + get: function () { + return this._containedSheetImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "storyPointId", { + get: function () { + return this._storyPointInfoImpl.storyPointId; + }, + enumerable: true, + configurable: true + }); + StoryPointImpl.prototype.createContainedSheet = function (containedSheetInfo, sheetInfos, registryId) { + var containedSheetIdx = -1; + var publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos); + var containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize(); + var isContainedSheetHidden = publishedSheetInfo === undefined; + var containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : ''; + // Contained sheets aren't active - the containing sheet is active. + var containedSheetActive = false; + var containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl); + var sheetImpl; + switch (containedSheetInfoImpl.sheetType) { + case Contract.SheetType.Worksheet: { + var vizId = { + worksheet: containedSheetInfoImpl.name, + }; + sheetImpl = new WorksheetImpl_1.WorksheetImpl(containedSheetInfoImpl, registryId, vizId, null, this); + break; + } + case Contract.SheetType.Dashboard: { + var 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; + }; + return StoryPointImpl; +}()); +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 })); +var StoryPointInfoImpl = /** @class */ (function () { + function StoryPointInfoImpl(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) { + this._caption = _caption; + this._index = _index; + this._storyPointId = _storyPointId; + this._active = _active; + this._updated = _updated; + this._parentStoryImpl = _parentStoryImpl; + } + Object.defineProperty(StoryPointInfoImpl.prototype, "caption", { + get: function () { + return this._caption; + }, + set: function (caption) { + this._caption = caption; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "index", { + get: function () { + return this._index; + }, + set: function (index) { + this._index = index; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "storyPointId", { + get: function () { + return this._storyPointId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "active", { + get: function () { + return this._active; + }, + set: function (isActive) { + this._active = isActive; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "updated", { + get: function () { + return this._updated; + }, + set: function (isUpdated) { + this._updated = isUpdated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "parentStory", { + get: function () { + return this._parentStoryImpl; + }, + enumerable: true, + configurable: true + }); + return StoryPointInfoImpl; +}()); +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 })); +var WorkbookImpl = /** @class */ (function () { + function WorkbookImpl() { + } + return WorkbookImpl; +}()); +exports.WorkbookImpl = WorkbookImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var DataSource_1 = __webpack_require__(/*! ../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +var GetDataService_1 = __webpack_require__(/*! ../Services/GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var DataSourceImpl_1 = __webpack_require__(/*! ./DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +var WorksheetImpl = /** @class */ (function (_super) { + __extends(WorksheetImpl, _super); + function WorksheetImpl(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl) { + var _this = _super.call(this, sheetInfoImpl, _registryId) || this; + _this._visualId = _visualId; + _this._parentDashboardImpl = _parentDashboardImpl; + _this._parentStoryPointImpl = _parentStoryPointImpl; + return _this; + } + Object.defineProperty(WorksheetImpl.prototype, "parentDashboard", { + get: function () { + return this._parentDashboardImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(WorksheetImpl.prototype, "parentStoryPoint", { + get: function () { + return this._parentStoryPointImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(WorksheetImpl.prototype, "visualId", { + get: function () { + return this._visualId; + }, + enumerable: true, + configurable: true + }); + WorksheetImpl.prototype.getMaxPageRowLimit = function () { + return 10000; + }; + WorksheetImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options); + }; + WorksheetImpl.prototype.applyRangeFilterAsync = function (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(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions); + }; + WorksheetImpl.prototype.applyHierarchicalFilterAsync = function (fieldName, values, updateType, options) { + 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(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options); + }; + WorksheetImpl.prototype.clearFilterAsync = function (fieldName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.clearFilterAsync(this.visualId, fieldName); + }; + WorksheetImpl.prototype.applyRelativeDateFilterAsync = function (fieldName, options) { + ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(options, 'options'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.periodType, api_external_contract_js_1.PeriodType, 'PeriodType'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.rangeType, api_external_contract_js_1.DateRangeType, 'DateRangeType'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options); + }; + WorksheetImpl.prototype.getDataSourcesAsync = function () { + var _this = this; + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getDataSourcesAsync(this.visualId).then(function (result) { + var dataSchema = result; + var worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[_this.name]; + var dataSources = []; + // First, add the primary datasource. By convention, it comes first in the returned array. + var primaryId = worksheetDataSourceInfo.primaryDataSource; + dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[primaryId])); + // Then, loop through any secondary data sources and add them. + for (var _i = 0, _a = worksheetDataSourceInfo.referencedDataSourceList; _i < _a.length; _i++) { + var secondaryId = _a[_i]; + if (secondaryId !== primaryId) { + dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId])); + } + } + return dataSources; + }); + }; + WorksheetImpl.prototype.getFiltersAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getFiltersAsync(this.visualId); + }; + WorksheetImpl.prototype.getSelectedMarksAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getSelectedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.getHighlightedMarksAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getHighlightedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.getSummaryDataAsync = function (options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getSummaryDataReaderAsync(this.visualId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, true, // includeAllColumns (can be overridden by columnsToIncludeById) + options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getVisualSpecificationAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.getVisualSpecificationAsync(this.visualId); + }; + WorksheetImpl.prototype.getSummaryColumnsInfoAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getSummaryColumnsInfoAsync(this.visualId); + }; + WorksheetImpl.prototype.getUnderlyingDataAsync = function (options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getUnderlyingTablesAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getUnderlyingTablesAsync(this.visualId).then(function (logicalTableInfos) { + return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); }); + }); + }; + WorksheetImpl.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataReaderAsync(this.visualId, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.clearSelectedMarksAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.clearSelectedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType); + }; + WorksheetImpl.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType); + }; + WorksheetImpl.prototype.annotateMarkAsync = function (mark, annotationText) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.annotateMarkAsync(this.visualId, mark, annotationText); + }; + WorksheetImpl.prototype.getAnnotationsAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.getAnnotationsAsync(this.visualId); + }; + WorksheetImpl.prototype.removeAnnotationAsync = function (annotation) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.removeAnnotationAsync(this.visualId, annotation); + }; + WorksheetImpl.prototype.appendContextMenuAsync = function (targetMenu, config) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config); + }; + WorksheetImpl.prototype.removeContextMenuAsync = function (targetMenu, menuItemId) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); + }; + WorksheetImpl.prototype.executeContextMenuAsync = function (targetMenu, menuItemId) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); + }; + WorksheetImpl.prototype.renameContextMenuAsync = function (targetMenu, menuHeader, menuDescription) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription); + }; + WorksheetImpl.prototype.hoverTupleAsync = function (hoveredTuple, tooltip) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "hoverTupleAsync is not supported in dashboard extensions")); + } + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip); + }; + WorksheetImpl.prototype.selectTuplesAsync = function (selectedTuples, selectOption, tooltip) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "selectTuplesAsync is not supported in dashboard extensions")); + } + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip); + }; + WorksheetImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) { + var dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId); + var dataSource = new DataSource_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + }; + WorksheetImpl.prototype.verifyActiveSheet = function () { + var isRootAndActiveWorksheet = this.active; + var isInsideActiveDashboard = this.isInsideActiveDashboard(); + var isInsideActiveStoryPoint = this.isInsideActiveStoryPoint(); + if (!isRootAndActiveWorksheet && !isInsideActiveDashboard && !isInsideActiveStoryPoint) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); + } + }; + WorksheetImpl.prototype.isInsideActiveStoryPoint = function () { + return this._parentStoryPointImpl && this._parentStoryPointImpl.active; + }; + WorksheetImpl.prototype.isInsideActiveDashboard = function () { + return this._parentDashboardImpl && this._parentDashboardImpl.active; + }; + WorksheetImpl.prototype.isInsideDashboardExtension = function () { + return this._parentDashboardImpl !== null; + }; + return WorksheetImpl; +}(SheetImpl_1.SheetImpl)); +exports.WorksheetImpl = WorksheetImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/LogicalTable.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/LogicalTable.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a logical table. + * This does not follow the Impl pattern as it is just a property bag. + */ +var LogicalTable = /** @class */ (function () { + function LogicalTable(_logicalTable) { + this._logicalTable = _logicalTable; + } + Object.defineProperty(LogicalTable.prototype, "id", { + get: function () { + return this._logicalTable.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(LogicalTable.prototype, "caption", { + get: function () { + return this._logicalTable.caption; + }, + enumerable: true, + configurable: true + }); + return LogicalTable; +}()); +exports.LogicalTable = LogicalTable; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***! + \*****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Filter = /** @class */ (function () { + function Filter(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) { + this._worksheetName = _worksheetName; + this._fieldName = _fieldName; + this._filterType = _filterType; + this._fieldId = _fieldId; + this._registryId = _registryId; + } + Object.defineProperty(Filter.prototype, "worksheetName", { + get: function () { + return this._worksheetName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "fieldName", { + get: function () { + return this._fieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "fieldId", { + get: function () { + return this._fieldId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "filterType", { + get: function () { + return this._filterType; + }, + enumerable: true, + configurable: true + }); + Filter.prototype.getFieldAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getFieldAsync(this._fieldId); + }; + Filter.prototype.getAppliedWorksheetsAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId); + }; + Filter.prototype.setAppliedWorksheetsAsync = function (applyToWorksheets) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets'); + var uniqueWorksheets = new Set(applyToWorksheets); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets)); + }; + return Filter; +}()); +exports.Filter = Filter; +var CategoricalFilter = /** @class */ (function (_super) { + __extends(CategoricalFilter, _super); + function CategoricalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; + _this._appliedValues = _appliedValues; + _this._isExcludeMode = _isExcludeMode; + _this._isAllSelected = _isAllSelected; + return _this; + } + Object.defineProperty(CategoricalFilter.prototype, "isAllSelected", { + get: function () { + return this._isAllSelected; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalFilter.prototype, "appliedValues", { + get: function () { + return this._appliedValues; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalFilter.prototype, "isExcludeMode", { + get: function () { + return this._isExcludeMode; + }, + enumerable: true, + configurable: true + }); + CategoricalFilter.prototype.getDomainAsync = function (domainType) { + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType); + }; + return CategoricalFilter; +}(Filter)); +exports.CategoricalFilter = CategoricalFilter; +var HierarchicalDataValue = /** @class */ (function () { + function HierarchicalDataValue(_value, _hierarchicalPath, _level) { + this._value = _value; + this._hierarchicalPath = _hierarchicalPath; + this._level = _level; + } + Object.defineProperty(HierarchicalDataValue.prototype, "value", { + get: function () { + return this._value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalDataValue.prototype, "hierarchicalPath", { + get: function () { + return this._hierarchicalPath; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalDataValue.prototype, "level", { + get: function () { + return this._level; + }, + enumerable: true, + configurable: true + }); + return HierarchicalDataValue; +}()); +exports.HierarchicalDataValue = HierarchicalDataValue; +var HierarchicalLevelDetail = /** @class */ (function () { + function HierarchicalLevelDetail(_name, _levelSelectionState) { + this._name = _name; + this._levelSelectionState = _levelSelectionState; + } + Object.defineProperty(HierarchicalLevelDetail.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalLevelDetail.prototype, "levelSelectionState", { + get: function () { + return this._levelSelectionState; + }, + enumerable: true, + configurable: true + }); + return HierarchicalLevelDetail; +}()); +exports.HierarchicalLevelDetail = HierarchicalLevelDetail; +var HierarchicalFilter = /** @class */ (function (_super) { + __extends(HierarchicalFilter, _super); + function HierarchicalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; + _this._dimensionName = _dimensionName; + _this._hierarchyCaption = _hierarchyCaption; + _this._numberOfLevels = _numberOfLevels; + _this._levelDetails = _levelDetails; + _this._appliedValues = _appliedValues; + _this._isAllSelected = _isAllSelected; + return _this; + } + HierarchicalFilter.prototype.getDomainAsync = function (domainType) { + throw new Error('Method not implemented.'); + }; + Object.defineProperty(HierarchicalFilter.prototype, "dimensionName", { + get: function () { + return this._dimensionName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "hierarchyCaption", { + get: function () { + return this._hierarchyCaption; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "numberOfLevels", { + get: function () { + return this._numberOfLevels; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "levelDetails", { + get: function () { + return this._levelDetails; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "isAllSelected", { + get: function () { + return this._isAllSelected; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "appliedValues", { + get: function () { + return this._appliedValues; + }, + enumerable: true, + configurable: true + }); + return HierarchicalFilter; +}(Filter)); +exports.HierarchicalFilter = HierarchicalFilter; +var RangeFilter = /** @class */ (function (_super) { + __extends(RangeFilter, _super); + function RangeFilter(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; + _this._min = _min; + _this._max = _max; + _this._includeNullValues = _includeNullValues; + return _this; + } + Object.defineProperty(RangeFilter.prototype, "minValue", { + get: function () { + return this._min; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeFilter.prototype, "maxValue", { + get: function () { + return this._max; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeFilter.prototype, "includeNullValues", { + get: function () { + return this._includeNullValues; + }, + enumerable: true, + configurable: true + }); + RangeFilter.prototype.getDomainAsync = function (domainType) { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType); + }; + return RangeFilter; +}(Filter)); +exports.RangeFilter = RangeFilter; +var RelativeDateFilter = /** @class */ (function (_super) { + __extends(RelativeDateFilter, _super); + function RelativeDateFilter(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; + _this._anchorDate = _anchorDate; + _this._periodType = _periodType; + _this._rangeType = _rangeType; + _this._rangeN = _rangeN; + return _this; + } + Object.defineProperty(RelativeDateFilter.prototype, "anchorDate", { + get: function () { + return this._anchorDate; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "periodType", { + get: function () { + return this._periodType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "rangeType", { + get: function () { + return this._rangeType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "rangeN", { + get: function () { + return this._rangeN; + }, + enumerable: true, + configurable: true + }); + return RelativeDateFilter; +}(Filter)); +exports.RelativeDateFilter = RelativeDateFilter; +var CategoricalDomain = /** @class */ (function () { + function CategoricalDomain(_values, _domainType) { + this._values = _values; + this._domainType = _domainType; + } + Object.defineProperty(CategoricalDomain.prototype, "values", { + get: function () { + return this._values; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalDomain.prototype, "type", { + get: function () { + return this._domainType; + }, + enumerable: true, + configurable: true + }); + return CategoricalDomain; +}()); +exports.CategoricalDomain = CategoricalDomain; +var RangeDomain = /** @class */ (function () { + function RangeDomain(_min, _max, _domainType) { + this._min = _min; + this._max = _max; + this._domainType = _domainType; + } + Object.defineProperty(RangeDomain.prototype, "type", { + get: function () { + return this._domainType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeDomain.prototype, "min", { + get: function () { + return this._min; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeDomain.prototype, "max", { + get: function () { + return this._max; + }, + enumerable: true, + configurable: true + }); + return RangeDomain; +}()); +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 })); +var DataTable = /** @class */ (function () { + function DataTable(_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'; + } + Object.defineProperty(DataTable.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "data", { + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "columns", { + get: function () { + return this._columns; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "marksInfo", { + get: function () { + return this._marksInfo; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "totalRowCount", { + get: function () { + return this._totalRowCount; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "isTotalRowCountLimited", { + get: function () { + return this._isTotalRowCountLimited; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "isSummaryData", { + get: function () { + return this._isSummaryData; + }, + enumerable: true, + configurable: true + }); + return DataTable; +}()); +exports.DataTable = DataTable; +var MarkInfo = /** @class */ (function () { + function MarkInfo(_type, _color, _tupleId) { + this._type = _type; + this._color = _color; + this._tupleId = _tupleId; + } + Object.defineProperty(MarkInfo.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MarkInfo.prototype, "color", { + get: function () { + return this._color; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MarkInfo.prototype, "tupleId", { + get: function () { + return this._tupleId; + }, + enumerable: true, + configurable: true + }); + return MarkInfo; +}()); +exports.MarkInfo = MarkInfo; +var Column = /** @class */ (function () { + function Column(_fieldName, _fieldId, _dataType, _isReferenced, _index) { + this._fieldName = _fieldName; + this._fieldId = _fieldId; + this._dataType = _dataType; + this._isReferenced = _isReferenced; + this._index = _index; + } + Object.defineProperty(Column.prototype, "fieldName", { + get: function () { + return this._fieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "fieldId", { + get: function () { + return this._fieldId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "dataType", { + get: function () { + return this._dataType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "isReferenced", { + get: function () { + return this._isReferenced; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "index", { + get: function () { + return this._index; + }, + enumerable: true, + configurable: true + }); + return Column; +}()); +exports.Column = Column; +var DataValue = /** @class */ (function () { + /* tslint:disable:no-any */ + function DataValue(_value, _nativeValue, _formattedValue) { + this._value = _value; + this._nativeValue = _nativeValue; + this._formattedValue = _formattedValue; + } + Object.defineProperty(DataValue.prototype, "value", { + get: function () { + return this._value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataValue.prototype, "nativeValue", { + get: function () { + return this._nativeValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataValue.prototype, "formattedValue", { + get: function () { + return this._formattedValue; + }, + enumerable: true, + configurable: true + }); + return DataValue; +}()); +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()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var DataTableReader = /** @class */ (function () { + function DataTableReader(_id, _totalRowCount, _pageRowCount, _registryId) { + this._id = _id; + this._totalRowCount = _totalRowCount; + this._pageRowCount = _pageRowCount; + this._registryId = _registryId; + this._pageCount = Math.ceil(_totalRowCount / _pageRowCount); + } + Object.defineProperty(DataTableReader.prototype, "totalRowCount", { + get: function () { + return this._totalRowCount; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTableReader.prototype, "pageCount", { + get: function () { + return this._pageCount; + }, + enumerable: true, + configurable: true + }); + DataTableReader.prototype.getPageAsync = function (pageNumber) { + ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getPageAsync(this._id, pageNumber, this._pageRowCount); + }; + DataTableReader.prototype.getAllPagesAsync = function (maxRows) { + return __awaiter(this, void 0, void 0, function () { + var firstPage, rowsRequested, pagesRequested, pagesToFetch, isDataLimited, remainingData, i, page, fullData; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, this.getPageAsync(0)]; + case 1: + firstPage = _b.sent(); + maxRows = maxRows || this.totalRowCount; + rowsRequested = Math.min(maxRows, this.totalRowCount); + pagesRequested = Math.ceil(rowsRequested / this._pageRowCount); + pagesToFetch = Math.min(pagesRequested, 400); + isDataLimited = pagesToFetch < pagesRequested; + remainingData = []; + i = 1; + _b.label = 2; + case 2: + if (!(i < pagesToFetch)) return [3 /*break*/, 5]; + return [4 /*yield*/, this.getPageAsync(i)]; + case 3: + page = _b.sent(); + remainingData.push(page.data); + _b.label = 4; + case 4: + i++; + return [3 /*break*/, 2]; + case 5: + fullData = (_a = firstPage.data).concat.apply(_a, remainingData); + // This slices the array only if maxRows has been set and is less than totalRowCount + fullData.length = rowsRequested; + return [2 /*return*/, { + name: firstPage.name, + data: fullData, + columns: firstPage.columns, + totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested, + isTotalRowCountLimited: isDataLimited, + isSummaryData: firstPage.isSummaryData, + }]; + } + }); + }); + }; + DataTableReader.prototype.releaseAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.releaseAsync(this._id); + }; + return DataTableReader; +}()); +exports.DataTableReader = DataTableReader; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Selection Model. + */ +var SelectionModel = /** @class */ (function () { + function SelectionModel() { + } + return SelectionModel; +}()); +exports.SelectionModel = SelectionModel; +/** + * Value based selection model. Meant for hierarchical, range and categorical selections. + */ +var ValueSelectionModel = /** @class */ (function (_super) { + __extends(ValueSelectionModel, _super); + function ValueSelectionModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.selectValues = []; + return _this; + } + return ValueSelectionModel; +}(SelectionModel)); +exports.ValueSelectionModel = ValueSelectionModel; +/** + * Hierarchical value selection model + */ +var HierarchicalSelectionModel = /** @class */ (function (_super) { + __extends(HierarchicalSelectionModel, _super); + function HierarchicalSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return HierarchicalSelectionModel; +}(ValueSelectionModel)); +exports.HierarchicalSelectionModel = HierarchicalSelectionModel; +/** + * Range based value selection model + */ +var RangeSelectionModel = /** @class */ (function (_super) { + __extends(RangeSelectionModel, _super); + function RangeSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return RangeSelectionModel; +}(SelectionModel)); +exports.RangeSelectionModel = RangeSelectionModel; +/** + * Dimension value selection model + */ +var DimensionSelectionModel = /** @class */ (function (_super) { + __extends(DimensionSelectionModel, _super); + function DimensionSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return DimensionSelectionModel; +}(ValueSelectionModel)); +exports.DimensionSelectionModel = DimensionSelectionModel; +/** + * Tuple based selection model + */ +var TupleSelectionModel = /** @class */ (function () { + function TupleSelectionModel() { + this.objectIds = []; + } + return TupleSelectionModel; +}()); +exports.TupleSelectionModel = TupleSelectionModel; +/** + * Container class to populate all the selection models when parsing input + */ +var SelectionModelsContainer = /** @class */ (function () { + function SelectionModelsContainer() { + this.hierModelArr = []; + this.dimModelArr = []; + this.quantModelArr = []; + } + return SelectionModelsContainer; +}()); +exports.SelectionModelsContainer = SelectionModelsContainer; +var SelectTuplesInteractionModel = /** @class */ (function () { + function SelectTuplesInteractionModel(visualIdPresModel, tupleIds, selectOptions, tooltipContext) { + if (tupleIds === void 0) { tupleIds = []; } + this.visualIdPresModel = visualIdPresModel; + this.tupleIds = tupleIds; + this.selectOptions = selectOptions; + this.tooltipContext = tooltipContext; + } + return SelectTuplesInteractionModel; +}()); +exports.SelectTuplesInteractionModel = SelectTuplesInteractionModel; +var HoverTupleInteractionModel = /** @class */ (function () { + function HoverTupleInteractionModel(visualIdPresModel, tupleId, tooltipContext) { + this.visualIdPresModel = visualIdPresModel; + this.tupleId = tupleId; + this.tooltipContext = tooltipContext; + } + return HoverTupleInteractionModel; +}()); +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 })); +var Point = /** @class */ (function () { + function Point(_x, _y) { + this._x = _x; + this._y = _y; + } + Object.defineProperty(Point.prototype, "x", { + get: function () { + return this._x; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Point.prototype, "y", { + get: function () { + return this._y; + }, + enumerable: true, + configurable: true + }); + return Point; +}()); +exports.Point = Point; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js": +/*!*********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/GetDataService.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Defines which type of getData call to make. + */ +var GetDataType; +(function (GetDataType) { + GetDataType["Summary"] = "summary"; + GetDataType["Underlying"] = "underlying"; +})(GetDataType = exports.GetDataType || (exports.GetDataType = {})); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var AnimationServiceImpl_1 = __webpack_require__(/*! ./impl/AnimationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js"); +var AnnotationServiceImpl_1 = __webpack_require__(/*! ./impl/AnnotationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js"); +var DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js"); +var ExportServiceImpl_1 = __webpack_require__(/*! ./impl/ExportServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js"); +var ExternalContextMenuServiceImpl_1 = __webpack_require__(/*! ./impl/ExternalContextMenuServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js"); +var FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js"); +var GetDataServiceImpl_1 = __webpack_require__(/*! ./impl/GetDataServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js"); +var NotificationServiceImpl_1 = __webpack_require__(/*! ./impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +var ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js"); +var SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js"); +var SizeServiceImpl_1 = __webpack_require__(/*! ./impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +var VisualModelServiceImpl_1 = __webpack_require__(/*! ./impl/VisualModelServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js"); +var VizServiceImpl_1 = __webpack_require__(/*! ./impl/VizServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js"); +var ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js"); +function registerAllSharedServices(dispatcher, registryId, platformVersion) { + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, registryId, platformVersion)); + 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)); +} +exports.registerAllSharedServices = registerAllSharedServices; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +window.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {}; +var ServiceRegistryImpl = /** @class */ (function () { + function ServiceRegistryImpl() { + this._services = {}; + } + ServiceRegistryImpl.prototype.registerService = function (service) { + this._services[service.serviceName] = service; + }; + ServiceRegistryImpl.prototype.getService = function (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]; + }; + return ServiceRegistryImpl; +}()); +/** + * 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). + */ +var ApiServiceRegistry = /** @class */ (function () { + // Private to avoid anyone constructing this + function ApiServiceRegistry() { + } + /** + * Gets the singleton instance of the ServiceRegistry + */ + ApiServiceRegistry.get = function (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 + */ + ApiServiceRegistry.setInstance = function (registryId, serviceRegistry) { + if (!window.__tableauApiServiceRegistry) { + window.__tableauApiServiceRegistry = {}; + } + window.__tableauApiServiceRegistry[registryId] = serviceRegistry; + }; + /** + * Only used by unit tests + */ + ApiServiceRegistry.clearRegistry = function () { + window.__tableauApiServiceRegistry = {}; + }; + return ApiServiceRegistry; +}()); +exports.ApiServiceRegistry = ApiServiceRegistry; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var AnimationServiceImpl = /** @class */ (function (_super) { + __extends(AnimationServiceImpl, _super); + function AnimationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(AnimationServiceImpl.prototype, "serviceName", { + get: function () { + return "animation-service" /* Animation */; + }, + enumerable: true, + configurable: true + }); + AnimationServiceImpl.prototype.replayAsync = function (replaySpeed) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.ReplaySpeed] = 1.0, + _a); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType'); + parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed); + return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then(function (response) { + return; + }); + }; + return AnimationServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.AnimationServiceImpl = AnimationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var AnnotationServiceImpl = /** @class */ (function (_super) { + __extends(AnnotationServiceImpl, _super); + function AnnotationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(AnnotationServiceImpl.prototype, "serviceName", { + get: function () { + return "annotation-service" /* Annotation */; + }, + enumerable: true, + configurable: true + }); + /** + * Method to annotate a mark on the given worksheet. + * + * @param visualId + * @param mark + * @param annotationText + */ + AnnotationServiceImpl.prototype.annotateMarkAsync = function (visualId, mark, annotationText) { + var _a; + var selectionModelContainer = this.parseMarkSelectionIds([mark]); + var dummyTargetPoint = { x: 0, y: 0 }; + var formattedText = "" + annotationText + ""; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'annotateMarkAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.AnnotateEnum] = api_internal_contract_js_1.AnnotateEnum.Mark, + _a[api_internal_contract_js_1.ParameterId.TargetPoint] = dummyTargetPoint, + _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection], + _a[api_internal_contract_js_1.ParameterId.FormattedText] = formattedText, + _a); + return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then(function (response) { + // Expecting an empty model and hence the void response. + return; + }); + }; + /** + * Method to retrieve annotations for the given worksheet. + * + * @param visualId + * @returns {Promise>} + */ + AnnotationServiceImpl.prototype.getAnnotationsAsync = function (visualId) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAnnotationsAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then(function (response) { + var annotationsList = response.result; + return _this.annotationFilterMap(annotationsList); + }); + }; + /** + * Method to remove an annotation from a given worksheet. + * + * @param visualId + * @param annotation + */ + AnnotationServiceImpl.prototype.removeAnnotationAsync = function (visualId, annotation) { + var _a; + var selectionModelContainer = this.parseAnnotationSelectionIds([annotation]); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeAnnotationAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection], + _a); + return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then(function (response) { + // Expecting an empty model and hence the void response. + return; + }); + }; + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + AnnotationServiceImpl.prototype.parseMarkSelectionIds = function (marks) { + var ids = []; + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + marks.forEach(function (mark) { + var tupleId = mark.tupleId; + 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 + var tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'tuples'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + }; + /** + * Method to prepare the pres models for selection by MarkAnnotationInfo + * @param marks + */ + AnnotationServiceImpl.prototype.parseAnnotationSelectionIds = function (annotations) { + var ids = []; + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + annotations.forEach(function (annotation) { + var annotationId = annotation.annotationId; + 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 + var tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'annotations'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + }; + /** + * Method to map Annotation to MarkAnnotationInfo + * @param annotation + * @returns {Annotation} + */ + AnnotationServiceImpl.prototype.mapAnnotation = function (annotation) { + 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} + */ + AnnotationServiceImpl.prototype.annotationFilterMap = function (annotations) { + var _this = this; + var annotationInfos = annotations.map(function (annotation) { return _this.mapAnnotation(annotation); }); + return annotationInfos; + }; + return AnnotationServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.AnnotationServiceImpl = AnnotationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ClientInfoServiceImpl = /** @class */ (function (_super) { + __extends(ClientInfoServiceImpl, _super); + function ClientInfoServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ClientInfoServiceImpl.prototype, "serviceName", { + get: function () { + return "client-info-service" /* ClientInfo */; + }, + enumerable: true, + configurable: true + }); + ClientInfoServiceImpl.prototype.getClientInfoAsync = function () { + var _a; + var verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getClientInfoAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + var clientInfo = response.result; + return clientInfo; + }); + }; + return ClientInfoServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.ClientInfoServiceImpl = ClientInfoServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var DataSource_1 = __webpack_require__(/*! ../../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +var Field_1 = __webpack_require__(/*! ../../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +var DataSourceImpl_1 = __webpack_require__(/*! ../../Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +var FieldImpl_1 = __webpack_require__(/*! ../../Impl/FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +exports.SENTINEL_LOGICAL_TABLE_INFO = { + id: InternalContract.ApiShowDataTableSentinel.SingleTableId, + caption: InternalContract.ApiShowDataTableSentinel.SingleTableCaption, +}; +// The minimum platform version when Object Model was supported +var platformVersionObjectModelSupport = { major: 1, minor: 20, fix: 1 }; +var DataSourceServiceImpl = /** @class */ (function (_super) { + __extends(DataSourceServiceImpl, _super); + // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the + // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional + // code in here for Object Model can be removed. + function DataSourceServiceImpl(dispatcher, registryId, _platformVersion) { + if (_platformVersion === void 0) { _platformVersion = platformVersionObjectModelSupport; } + var _this = _super.call(this, dispatcher, registryId) || this; + _this._platformVersion = _platformVersion; + return _this; + } + Object.defineProperty(DataSourceServiceImpl.prototype, "serviceName", { + get: function () { + return "data-source-service" /* DataSourceService */; + }, + enumerable: true, + configurable: true + }); + DataSourceServiceImpl.prototype.refreshAsync = function (dataSourceId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'refreshAsync', + _a[api_internal_contract_js_1.ParameterId.DeltaTimeMs] = 0, + _a[api_internal_contract_js_1.ParameterId.ShouldRefreshDS] = true, + _a); + // On server: Not passing the datasource id will refresh all datasources. + if (dataSourceId) { + parameters[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId; + } + return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then(function (response) { + return; + }); + }; + DataSourceServiceImpl.prototype.getActiveTablesAsync = function (dataSourceId) { + var _a; + var joinParameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getActiveTablesAsync', + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a); + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then(function (joinResponse) { + var tableInfos = joinResponse.result; + // 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; + }); + }; + DataSourceServiceImpl.prototype.getDataSourcesAsync = function (visualId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourcesAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then(function (response) { + var dataSchema = response.result; + return dataSchema; + }); + }; + DataSourceServiceImpl.prototype.getAllDataSourcesAsync = function () { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAllDataSourcesAsync', + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then(function (response) { + var dataSchema = response.result; + return dataSchema; + }); + }; + DataSourceServiceImpl.prototype.getConnectionSummariesAsync = function (dataSourceId) { + var _a; + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getConnectionSummariesAsync', + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a); + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then(function (response) { + var descriptionSummaries = response.result; + return descriptionSummaries; + }); + }; + DataSourceServiceImpl.prototype.getFieldAsync = function (globalfieldName) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFieldAsync', + _a[api_internal_contract_js_1.ParameterId.FieldId] = globalfieldName, + _a); + return this.execute(verb, parameters).then(function (response) { + var dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource]; + var field = response.result[api_internal_contract_js_1.ParameterId.Field]; + return _this.convertField(field, _this.convertDataSource(dataSource)); + }); + }; + DataSourceServiceImpl.prototype.getLogicalTablesAsync = function (dataSourceId) { + var _a; + if (!this.isObjectModelSupportedByPlatform()) { + /** + * This sentinel ID can be passed to datasource.getLogicalTableData. + * Once the desktop is upgraded to a version that supports object model, + * the sentinel ID will automatically fetch the upgraded table. + * */ + return new Promise(function (resolve) { return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); }); + } + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTablesAsync', + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then(function (response) { + return response.result; + }); + }; + DataSourceServiceImpl.prototype.getUnderlyingTablesAsync = function (visualId) { + var _a; + if (!this.isObjectModelSupportedByPlatform()) { + /** + * This sentinel ID can be passed to worksheet.getUnderlyingTableData. + * Once the desktop is upgraded to a version that supports object model, + * the sentinel ID will automatically fetch the upgraded table. + * */ + return new Promise(function (resolve) { return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); }); + } + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTablesAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then(function (response) { + return response.result; + }); + }; + DataSourceServiceImpl.prototype.convertField = function (field, dataSource) { + return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource)); + }; + DataSourceServiceImpl.prototype.convertDataSource = function (dataSource) { + return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId)); + }; + DataSourceServiceImpl.prototype.isObjectModelSupportedByPlatform = function () { + var platformVersionNoObjectModelSupport = { major: 1, minor: 13, fix: 0 }; + return InternalContract.VersionLessThan(platformVersionNoObjectModelSupport, this._platformVersion); + }; + return DataSourceServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +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 __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + 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()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ExportServiceImpl = /** @class */ (function (_super) { + __extends(ExportServiceImpl, _super); + function ExportServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ExportServiceImpl.prototype, "serviceName", { + get: function () { + return "export-service" /* Export */; + }, + enumerable: true, + configurable: true + }); + ExportServiceImpl.prototype.getExportCrosstabSheetMapAsync = function (currentSheetType) { + var _a; + var verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportCrosstabSheetMapAsync', + _a[api_internal_contract_js_1.ParameterId.CurrentSheetType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType), + _a); + return this.execute(verb, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + ExportServiceImpl.prototype.exportCrosstabAsync = function (sheetName, format, exportableWorksheetNames, currentSheetType) { + return __awaiter(this, void 0, void 0, function () { + var sheetNameToIdMap, parameters, verb; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat'); + return [4 /*yield*/, this.getExportCrosstabSheetMapAsync(currentSheetType)]; + case 1: + sheetNameToIdMap = _b.sent(); + if (!sheetNameToIdMap[sheetName]) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap'); + } + parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportCrosstabAsync', + _a[api_internal_contract_js_1.ParameterId.SheetIdentifier] = sheetNameToIdMap[sheetName], + _a[api_internal_contract_js_1.ParameterId.SendNotifications] = true, + _a); + switch (format) { + case api_external_contract_js_1.CrosstabFileFormat.CSV: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload; + // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo + parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true; + break; + case api_external_contract_js_1.CrosstabFileFormat.Excel: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.'); + } + return [2 /*return*/, this.execute(verb, parameters) + .then(function (response) { + var result = response.result; + return result; + }) + .catch(function () { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.'); + })]; + } + }); + }); + }; + ExportServiceImpl.prototype.exportDataAsync = function (visualId, options) { + var _a; + var _b; + ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options); + // Remove any duplicates from the input array + var columnsAsSet = new Set(options.columnsToIncludeById); + var columnsToIncludeById = Array.from(columnsAsSet); + var verb = api_internal_contract_js_1.VerbId.ExportDataDownload; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportDataAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = (_b = options.ignoreAliases, (_b !== null && _b !== void 0 ? _b : false)), + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = columnsToIncludeById, + _a); + return this.execute(verb, parameters) + .then(function () { }) + .catch(function () { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.'); + }); + }; + ExportServiceImpl.prototype.exportPowerPointAsync = function (sheetNames, exportScenarios) { + var _a; + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + // Note: the ExportOriginUrl param is listed as optional for the pres layer command we are invoking; however, + // recent changes were made that enforced the use of the empty string when invoking this command with no ExportOriginUrl. + // see browser-clients/export-powerpoint-options-dialog repo. + var verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPowerPointAsync', + _a[api_internal_contract_js_1.ParameterId.ExportOriginUrl] = '', + _a[api_internal_contract_js_1.ParameterId.SelectedSheetNames] = sheetNames, + _a); + return this.execute(verb, parameters) + .then(function (response) { + var result = response.result; + return result; + }) + .catch(function () { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PowerPointCreationError, 'An error occured while attempting to generate the PowerPoint file.'); + }); + }; + ExportServiceImpl.prototype.exportPDFAsync = function (sheetNames, externalExportPdfOptions, exportScenarios) { + return __awaiter(this, void 0, void 0, function () { + var internalExportPdfOptions, verb, parameters; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions); + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + return [4 /*yield*/, this.getExportPDFOptionsAsync()]; + case 1: + internalExportPdfOptions = _b.sent(); + ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames); + verb = api_internal_contract_js_1.VerbId.ExportPdfDownload; + parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPDFAsync', + _a[api_internal_contract_js_1.ParameterId.ExportPdfOptions] = internalExportPdfOptions, + _a); + return [2 /*return*/, this.execute(verb, parameters) + .then(function (response) { + var result = response.result; + return result; + }) + .catch(function () { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.'); + })]; + } + }); + }); + }; + ExportServiceImpl.prototype.getExportPDFOptionsAsync = function () { + var _a; + var verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportPdfOptionsAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + return ExportServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.ExportServiceImpl = ExportServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js": +/*!******************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js ***! + \******************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ExternalContextMenuServiceImpl = /** @class */ (function (_super) { + __extends(ExternalContextMenuServiceImpl, _super); + function ExternalContextMenuServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ExternalContextMenuServiceImpl.prototype, "serviceName", { + get: function () { + return "external-context-menu-service" /* ExternalContextMenu */; + }, + enumerable: true, + configurable: true + }); + ExternalContextMenuServiceImpl.prototype.appendContextMenuAsync = function (sheetName, targetMenu, config) { + var _a; + var verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'appendContextMenuAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName] = config.displayName, + _a); + return this.execute(verb, parameters).then(function (response) { + var newMenuItemId = response.result; + return newMenuItemId; + }); + }; + ExternalContextMenuServiceImpl.prototype.removeContextMenuAsync = function (sheetName, targetMenu, menuItemId) { + var _a; + var verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeContextMenuAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId, + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + ExternalContextMenuServiceImpl.prototype.executeContextMenuAsync = function (sheetName, targetMenu, menuItemId) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'executeContextMenuAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId, + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + ExternalContextMenuServiceImpl.prototype.renameContextMenuAsync = function (sheetName, targetMenu, menuHeader, menuDescription) { + var _a; + var verb = api_internal_contract_js_1.VerbId.RenameExternalMenu; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'renameContextMenuAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuHeader] = menuHeader, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuDescription] = menuDescription, + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + return ExternalContextMenuServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +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 __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + 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()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var FilterModels_1 = __webpack_require__(/*! ../../Models/FilterModels */ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var FilterServiceImpl = /** @class */ (function (_super) { + __extends(FilterServiceImpl, _super); + function FilterServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(FilterServiceImpl.prototype, "serviceName", { + get: function () { + return "filter-service" /* Filter */; + }, + enumerable: true, + configurable: true + }); + FilterServiceImpl.prototype.applyFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyFilterAsync', + _a); + 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(function (response) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.applyRangeFilterAsync = function (visualId, fieldName, filterOptions) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRangeFilterAsync', + _a); + if (filterOptions.min !== undefined && filterOptions.min !== null) { + var min = void 0; + 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) { + var max = void 0; + 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(function (response) { + _this.apiFilterHandlerCheckForCommandError(response.result); + return fieldName; + }); + }; + FilterServiceImpl.prototype.applyHierarchicalFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) { + var _a; + var verb = api_internal_contract_js_1.VerbId.HierarchicalFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyHierarchicalFilterAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + var 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(function (response) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.clearFilterAsync = function (visualId, fieldName) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ClearFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearFilterAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + return this.execute(verb, parameters).then(function (resposne) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.applyRelativeDateFilterAsync = function (visualId, fieldName, options) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRelativeDateFilterAsync', + _a); + 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(function (response) { + return response.result; + }); + }; + FilterServiceImpl.prototype.getFiltersAsync = function (visualId) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetFilters; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFiltersAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + return this.execute(verb, parameters).then(function (response) { + var filters = response.result; + return _this.convertDomainFilters(filters); + }); + }; + FilterServiceImpl.prototype.getCategoricalDomainAsync = function (worksheetName, fieldId, domainType) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCategoricalDomainAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then(function (response) { + var domain = response.result; + return _this.convertCategoricalDomain(domain, domainType); + }); + }; + FilterServiceImpl.prototype.getRangeDomainAsync = function (worksheetName, fieldId, domainType) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetRangeDomain; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getRangeDomainAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then(function (response) { + var domain = response.result; + return _this.convertRangeDomain(domain, domainType); + }); + }; + FilterServiceImpl.prototype.getDashboardFiltersAsync = function () { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDashboardFiltersAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + var filters = response.result; + return _this.convertDomainFilters(filters); + }); + }; + FilterServiceImpl.prototype.applyDashboardFilterAsync = function (fieldName, values, updateType, filterOptions) { + var _a; + var verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyDashboardFilterAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; + return this.execute(verb, parameters).then(function (response) { + return response.result; + }); + }; + FilterServiceImpl.prototype.getAppliedWorksheetsAsync = function (worksheetName, fieldId) { + var _a; + return __awaiter(this, void 0, void 0, function () { + var sharedFilterModel, worksheetNames; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync')]; + case 1: + sharedFilterModel = _b.sent(); + worksheetNames = []; + (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map(function (worksheetInfo) { + if (worksheetInfo.isSelected) { + worksheetNames.push(worksheetInfo.worksheetName); + } + }); + return [2 /*return*/, worksheetNames]; + } + }); + }); + }; + FilterServiceImpl.prototype.setAppliedWorksheetsAsync = function (worksheetName, fieldName, fieldId, applyToWorksheets) { + return __awaiter(this, void 0, void 0, function () { + var sharedFilterModel, allowedWorksheets, activeWorksheet, verb, parameters; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal')]; + case 1: + sharedFilterModel = _a.sent(); + if (!sharedFilterModel || !sharedFilterModel.worksheets) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets'); + } + allowedWorksheets = []; + activeWorksheet = ''; + sharedFilterModel.worksheets.forEach(function (worksheet) { + // Get active worksheet + if (worksheet.isActive) { + activeWorksheet = worksheet.worksheetName; + } + // Populate allowed worksheets + if (worksheet.isSelected || worksheet.isEnabled) { + allowedWorksheets.push(worksheet.worksheetName); + } + }); + if (activeWorksheet === '') { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet'); + } + if (!applyToWorksheets.includes(activeWorksheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, activeWorksheet + " must be included in the applied worksheets"); + } + applyToWorksheets.forEach(function (sheet) { + // check if it's present within compatible sheets + if (!allowedWorksheets.includes(sheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, "The field " + fieldName + " isn't applicable to the worksheet " + sheet); + } + }); + verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter; + parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync'; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets; + return [2 /*return*/, this.execute(verb, parameters).then(function (response) { + return applyToWorksheets; + })]; + } + }); + }); + }; + // Helper Methods + FilterServiceImpl.prototype.executeGetAppliedWorksheets = function (worksheetName, fieldId, telemetryFunctionName) { + var verb = api_internal_contract_js_1.VerbId.GetSharedFilter; + var parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = telemetryFunctionName; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + return this.execute(verb, parameters).then(function (response) { + var sharedFilterModel = response.result; + return sharedFilterModel; + }); + }; + FilterServiceImpl.prototype.convertDomainFilters = function (domainFilters) { + var _this = this; + var filters = []; + domainFilters.forEach(function (domainFilter) { + switch (domainFilter.filterType) { + case api_internal_contract_js_1.FilterType.Categorical: { + var 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: { + var 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: { + var 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: { + var filter = domainFilter; + if (filter) { + filters.push(_this.convertRelativeDateFilter(filter)); + } + else { + throw new Error('Invalid Relative Date Filter'); + } + break; + } + default: { + break; + } + } + }); + return filters; + }; + FilterServiceImpl.prototype.convertCategoricalFilter = function (domainFilter) { + var appliedValues = domainFilter.values.map(function (dv) { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv); + }); + return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Categorical, this._registryId, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected); + }; + FilterServiceImpl.prototype.convertHierarchicalFilter = function (domainFilter) { + var appliedValues = domainFilter.values.map(function (hierarchicalDataValue) { + return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level); + }); + var levelDetails = domainFilter.levelInfo.map(function (aLevel) { + return new FilterModels_1.HierarchicalLevelDetail(aLevel.name, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(aLevel.levelSelectionState)); + }); + return new FilterModels_1.HierarchicalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected); + }; + FilterServiceImpl.prototype.convertRangeFilter = function (domainFilter) { + var minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min); + var maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max); + return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Range, this._registryId, minValue, maxValue, domainFilter.includeNullValues); + }; + FilterServiceImpl.prototype.convertRelativeDateFilter = function (domainFilter) { + var anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate); + return new FilterModels_1.RelativeDateFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.RelativeDate, this._registryId, anchorDateValue, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(domainFilter.periodType), InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateRangeType.convert(domainFilter.rangeType), domainFilter.rangeN); + }; + FilterServiceImpl.prototype.convertCategoricalDomain = function (domain, domainType) { + var values = domain.values.map(function (domainDv) { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv); + }); + return new FilterModels_1.CategoricalDomain(values, domainType); + }; + FilterServiceImpl.prototype.convertRangeDomain = function (domain, domainType) { + var min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min); + var max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max); + return new FilterModels_1.RangeDomain(min, max, domainType); + }; + FilterServiceImpl.prototype.convertAnchorDate = function (anchorDate) { + // Converts a Date object into a string format that the server expects for date/time values. + // If anchorDate doesn't represent a valid Date object, any of these would be NaN. + var year = anchorDate.getUTCFullYear(); + var month = anchorDate.getUTCMonth() + 1; + var day = anchorDate.getUTCDate(); + var hh = anchorDate.getUTCHours(); + var mm = anchorDate.getUTCMinutes(); + var sec = anchorDate.getUTCSeconds(); + if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hh) || isNaN(mm) || isNaN(sec)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.InvalidDateParameter, 'Invalid date parameter: anchorDate'); + } + var result = year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + sec; + return result; + }; + FilterServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (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'); + }; + return FilterServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.FilterServiceImpl = FilterServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js": +/*!******************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***! + \******************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var uuid_1 = __webpack_require__(/*! uuid */ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js"); +var ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var GetDataModels_1 = __webpack_require__(/*! ../../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +var GetDataTableReaderModels_1 = __webpack_require__(/*! ../../Models/GetDataTableReaderModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var GetDataService_1 = __webpack_require__(/*! ../GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var GetDataServiceImpl = /** @class */ (function (_super) { + __extends(GetDataServiceImpl, _super); + function GetDataServiceImpl() { + var _this = _super !== null && _super.apply(this, arguments) || this; + // The extension/embedding instance uses the same cache for all DataTableReaders. + _this.viewDataTableCacheId = uuid_1.v4(); + return _this; + } + Object.defineProperty(GetDataServiceImpl.prototype, "serviceName", { + get: function () { + return "get-data-service" /* GetData */; + }, + enumerable: true, + configurable: true + }); + GetDataServiceImpl.prototype.getMaxRowLimit = function () { + return 10000; + }; + GetDataServiceImpl.prototype.getViewDataTableCacheId = function () { + return this.viewDataTableCacheId; + }; + GetDataServiceImpl.prototype.getLimitedMaxRows = function (requestedRows) { + var rowCountLimit = this.getMaxRowLimit() + 1; + return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit; + }; + GetDataServiceImpl.prototype.getUnderlyingDataAsync = function (visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) { + var _a; + var _this = this; + // Create all of our parameters + var summaryData = getType === GetDataService_1.GetDataType.Summary; + var functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync'; + var verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData; + var requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows) : maxRows; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = functionName, + _a); + 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); + return this.execute(verb, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, responseData.isSummary); + }); + }; + GetDataServiceImpl.prototype.getSummaryDataReaderAsync = function (visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryDataReaderAsync', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then(function (response) { + var responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); + }); + }; + GetDataServiceImpl.prototype.getSummaryColumnsInfoAsync = function (visualId) { + var _a; + // Create all the parameters for GetDataType of Summary with 1 row, and only native values + // Then return just the columns + var verb = api_internal_contract_js_1.VerbId.GetDataSummaryData; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryColumnsInfoAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = true, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = true, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = true, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = 1, + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + _a); + return this.execute(verb, parameters).then(function (response) { + var underlyingDataTable = response.result; + var dataTable = underlyingDataTable.data; + var columns = dataTable.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + return columns; + }); + }; + GetDataServiceImpl.prototype.getSelectedMarksAsync = function (visualId) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSelectedMarksAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then(function (response) { + var responseData = response.result; + return { + data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }), + }; + }); + }; + GetDataServiceImpl.prototype.getHighlightedMarksAsync = function (visualId) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getHighlightedMarksAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then(function (response) { + var responseData = response.result; + return { + data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }), + }; + }); + }; + GetDataServiceImpl.prototype.getDataSourceDataAsync = function (dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourceDataAsync', + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows), + _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = this.verifyIncludeColumnArray(columnsToInclude), + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.getLogicalTableDataAsync = function (datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataAsync', + _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = columnsToInclude, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.getLogicalTableDataReaderAsync = function (datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataReaderAsync', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then(function (response) { + var responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); + }); + }; + GetDataServiceImpl.prototype.getUnderlyingTableDataAsync = function (visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.getUnderlyingTableDataReaderAsync = function (visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataReaderAsync', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then(function (response) { + var responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); + }); + }; + GetDataServiceImpl.prototype.getPageAsync = function (tableId, pageNumber, pageSize) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getPageAsync', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId, + _a[api_internal_contract_js_1.ParameterId.DataRowIndex] = pageNumber * pageSize, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false); + }); + }; + GetDataServiceImpl.prototype.releaseAsync = function (tableId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'release', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then(function (response) { + return; + }); + }; + GetDataServiceImpl.prototype.verifyIncludeColumnArray = function (columns) { + // columns must be a valid array + if (!Array.isArray(columns)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays'); + } + // Remove any duplicates from the input array + var columnsAsSet = new Set(columns); + return Array.from(columnsAsSet); + }; + GetDataServiceImpl.prototype.processResultsTable = function (responseData, isSummary) { + var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + // TODO This should be controlled by a flag indicating whether this api will respond marks info or not + var marks; + if (responseData.marks) { + marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); }); + } + // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch. + // Remove the last element so we always return MaxRowLimit + var isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1; + if (isTotalRowCountLimited) { + responseData.dataTable.length -= 1; + } + var table = responseData.dataTable.map(function (row) { + return row.map(function (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); + }; + GetDataServiceImpl.prototype.processResultsPage = function (responseData, isSummary) { + var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + var marks; + if (responseData.marks) { + marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); }); + } + var table = responseData.dataTable.map(function (row) { + return row.map(function (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); + }; + GetDataServiceImpl.summaryTableId = ''; + return GetDataServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.GetDataServiceImpl = GetDataServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js": +/*!***********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***! + \***********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var NotificationServiceImplBase_1 = __webpack_require__(/*! ./NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +var NotificationServiceImpl = /** @class */ (function (_super) { + __extends(NotificationServiceImpl, _super); + function NotificationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(NotificationServiceImpl.prototype, "serviceName", { + get: function () { + return "notification-service" /* Notification */; + }, + enumerable: true, + configurable: true + }); + return NotificationServiceImpl; +}(NotificationServiceImplBase_1.NotificationServiceImplBase)); +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 })); +var Registration = /** @class */ (function () { + function Registration(_filterFn, _callbackFn) { + this._filterFn = _filterFn; + this._callbackFn = _callbackFn; + // Nothing Here + } + Registration.prototype.onNotification = function (notificationModel) { + if (this._filterFn(notificationModel)) { + this._callbackFn(notificationModel); + } + }; + return Registration; +}()); +exports.Registration = Registration; +var NotificationServiceImplBase = /** @class */ (function () { + function NotificationServiceImplBase(dispatcher) { + this.dispatcher = dispatcher; + this._handlers = {}; + this.dispatcher.registerNotificationHandler(this.onNotification.bind(this)); + } + NotificationServiceImplBase.prototype.registerHandler = function (id, filterFn, handler) { + var _this = this; + var handlers = this._handlers[id] || new Array(); + var registration = new Registration(filterFn, handler); + handlers.push(registration); + this._handlers[id] = handlers; + return function () { return _this.removeRegistration(id, registration); }; + }; + NotificationServiceImplBase.prototype.hasHandlersForNotificationType = function (id) { + // eslint-disable-next-line no-prototype-builtins + return this._handlers.hasOwnProperty(id); + }; + NotificationServiceImplBase.prototype.onNotification = function (notification) { + if (!this.hasHandlersForNotificationType(notification.notificationId)) { + return; + } + // Go through and check for all the handlers of this particular notification + this._handlers[notification.notificationId].forEach(function (h) { return h.onNotification(notification.data); }); + }; + NotificationServiceImplBase.prototype.removeRegistration = function (id, registration) { + if (!this.hasHandlersForNotificationType(id)) { + return; + } + this._handlers[id] = this._handlers[id].filter(function (reg) { return reg !== registration; }); + }; + return NotificationServiceImplBase; +}()); +exports.NotificationServiceImplBase = NotificationServiceImplBase; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ParameterImpl_1 = __webpack_require__(/*! ../../Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ParametersServiceImpl = /** @class */ (function (_super) { + __extends(ParametersServiceImpl, _super); + function ParametersServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ParametersServiceImpl.prototype, "serviceName", { + get: function () { + return "parameters-service" /* Parameters */; + }, + enumerable: true, + configurable: true + }); + ParametersServiceImpl.prototype.getParametersForSheetAsync = function (sheetPath) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync', + _a[api_internal_contract_js_1.ParameterId.SheetPath] = sheetPath, + _a); + return this.getParametersAsync(parameters); + }; + ParametersServiceImpl.prototype.getAllParametersAsync = function () { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync', + _a); + return this.getParametersAsync(parameters); + }; + ParametersServiceImpl.prototype.getParametersAsync = function (inputParameters) { + var _this = this; + return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then(function (response) { + var result = response.result; + return result.map(function (parameterInfo) { + return new ParameterImpl_1.ParameterImpl(parameterInfo, _this._registryId); + }); + }); + }; + ParametersServiceImpl.prototype.changeParameterValueAsync = function (fieldName, newValue) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeParameterValueAsync', + _a[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName, + _a[api_internal_contract_js_1.ParameterId.ParameterValue] = newValue, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + ParametersServiceImpl.prototype.findParameterByNameAsync = function (name) { + return this.findParameterAsync(name, undefined); + }; + ParametersServiceImpl.prototype.findParameterByGlobalFieldNameAsync = function (fieldName) { + return this.findParameterAsync(undefined, fieldName); + }; + ParametersServiceImpl.prototype.findParameterAsync = function (name, fieldName) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'findParameterAsync', + _a); + 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(function (response) { + var instanceOfParameterInfo = function (object) { + return 'fieldName' in object; + }; + // We need to check to see if we got a valid response back again + if (instanceOfParameterInfo(response.result)) { + var result = response.result; + return new ParameterImpl_1.ParameterImpl(result, _this._registryId); + } + else { + return undefined; + } + }); + }; + return ParametersServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.ParametersServiceImpl = ParametersServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var SelectionServiceImpl = /** @class */ (function (_super) { + __extends(SelectionServiceImpl, _super); + function SelectionServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(SelectionServiceImpl.prototype, "serviceName", { + get: function () { + return "selection-service" /* Selection */; + }, + enumerable: true, + configurable: true + }); + /** + * Method to clear all the selected marks for the given worksheet. + * + * @param visualId + */ + SelectionServiceImpl.prototype.clearSelectedMarksAsync = function (visualId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearSelectedMarksAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then(function (response) { + return; // Expecting an empty model and hence the void response. + }); + }; + /** + * Method to select marks for the given worksheet. + * + * @param visualId + * @param selectionCriteria + * @param selectionUpdateType + */ + SelectionServiceImpl.prototype.selectMarksByValueAsync = function (visualId, selectionCriterias, selectionUpdateType) { + var _a; + var _this = this; + if (selectionCriterias.length === 0) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value'); + } + var selectionType = this.validateSelectionUpdateType(selectionUpdateType); + var selectionModelContainer = this.parseSelectionMarks(selectionCriterias); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByValueAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType, + _a); + 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(function (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 + */ + SelectionServiceImpl.prototype.hoverTupleAsync = function (visualId, hoveredTuple, tooltip) { + var _a; + var interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, hoveredTuple, tooltip); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'hoverTupleAsync', + _a[api_internal_contract_js_1.ParameterId.HoverTupleInteraction] = interactionModel, + _a); + return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then(function (response) { + 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 + */ + SelectionServiceImpl.prototype.selectTuplesAsync = function (visualId, selectedTuples, selectOption, tooltip) { + var _a; + var option = this.validateSelectOption(selectOption); + var interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, option, tooltip); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectTuplesAsync', + _a[api_internal_contract_js_1.ParameterId.SelectTuplesInteraction] = interactionModel, + _a); + return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then(function (response) { + return; + }); + }; + SelectionServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (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 + */ + SelectionServiceImpl.prototype.selectMarksByIdAsync = function (visualId, marks, selectionUpdateType) { + var _a; + if (marks.length === 0) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id'); + } + var selectionType = this.validateSelectionUpdateType(selectionUpdateType); + var selectionModelContainer = this.parseSelectionIds(marks); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByIdAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType, + _a[api_internal_contract_js_1.ParameterId.Selection] = selectionModelContainer.selection, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then(function (response) { + // Expecting an empty model and hence the void response. + return; + // TODO Investigate the error response with multiple output params and throw error accordingly. + }); + }; + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + SelectionServiceImpl.prototype.parseSelectionIds = function (marks) { + var ids = []; + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (var i = 0; i < marks.length; i++) { + var tupleId = marks[i].tupleId; + 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 + var 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 + */ + SelectionServiceImpl.prototype.parseSelectionMarks = function (selectionCriterias) { + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (var i = 0; i < selectionCriterias.length; i++) { + var st = selectionCriterias[i]; + if (!(st.fieldName && st.value !== undefined && st.value !== null)) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'Selection Criteria parsing error'); + } + var catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g'); + var rangeOption = st.value; + if (catRegex.test(st.fieldName)) { + // Hierarchical value selection + var hierModel = this.addToParamsList(st.fieldName, st.value); + selectionModelContainer.hierModelArr.push(hierModel); + } + else if (rangeOption.min !== undefined && rangeOption.max !== undefined) { + // Range value selection + var quantModel = this.addToRangeParamsList(st.fieldName, rangeOption); + selectionModelContainer.quantModelArr.push(quantModel); + } + else { + // Dimension value selection + var 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 + */ + SelectionServiceImpl.prototype.addToParamsList = function (fieldName, value) { + var valueSelectionModel = new SelectionModels_1.ValueSelectionModel(); + var markValues = []; + if (value instanceof Array) { + var valueArr = value; + for (var 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 + */ + SelectionServiceImpl.prototype.addToRangeParamsList = function (fieldName, value) { + var 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 + */ + SelectionServiceImpl.prototype.validateSelectionUpdateType = function (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 + */ + SelectionServiceImpl.prototype.validateNullOptionType = function (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; + }; + /** + * Method to validate the select option. + * + * @param selectOption + */ + SelectionServiceImpl.prototype.validateSelectOption = function (selectOption) { + if (selectOption === Contract.SelectOptions.Simple) { + return api_internal_contract_js_1.SelectOptions.Simple; + } + else if (selectOption === Contract.SelectOptions.Toggle) { + return api_internal_contract_js_1.SelectOptions.Toggle; + } + else { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Only simple and toggle select options are currently supported'); + } + }; + return SelectionServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +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 })); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var EnumConverter_1 = __webpack_require__(/*! ../../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/** + * Each ServceImpl should extend this base class for the sake of + * proper error handling. This base handles the conversion + * from internal errors to external errors that we throw to developers + */ +var ServiceImplBase = /** @class */ (function () { + function ServiceImplBase(_dispatcher, _registryId) { + this._dispatcher = _dispatcher; + this._registryId = _registryId; + } + ServiceImplBase.prototype.execute = function (verb, params) { + return this._dispatcher.execute(verb, params).catch(function (error) { + // Any internal error that comes from the dispatcher should be converted + // to an external error using the enum mapper for error codes. + var internalError = error; + var externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No); + throw new TableauError_1.TableauError(externalErrorCode, internalError.message); + }); + }; + return ServiceImplBase; +}()); +exports.ServiceImplBase = ServiceImplBase; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var SizeServiceImpl = /** @class */ (function (_super) { + __extends(SizeServiceImpl, _super); + function SizeServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(SizeServiceImpl.prototype, "serviceName", { + get: function () { + return "size-service" /* Size */; + }, + enumerable: true, + configurable: true + }); + SizeServiceImpl.prototype.changeSizeAsync = function (name, newSize) { + var _a; + var _b, _c, _d, _e; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeSizeAsync', + _a[api_internal_contract_js_1.ParameterId.SheetName] = name, + _a[api_internal_contract_js_1.ParameterId.MinHeight] = ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.height) || 0, + _a[api_internal_contract_js_1.ParameterId.MinWidth] = ((_c = newSize.minSize) === null || _c === void 0 ? void 0 : _c.width) || 0, + _a[api_internal_contract_js_1.ParameterId.MaxHeight] = ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.height) || 0, + _a[api_internal_contract_js_1.ParameterId.MaxWidth] = ((_e = newSize.maxSize) === null || _e === void 0 ? void 0 : _e.width) || 0, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then(function (_response) { + return; + }); + }; + return SizeServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.SizeServiceImpl = SizeServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js": +/*!**************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js ***! + \**************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var StoryActivationServiceImpl = /** @class */ (function (_super) { + __extends(StoryActivationServiceImpl, _super); + function StoryActivationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(StoryActivationServiceImpl.prototype, "serviceName", { + get: function () { + return "story-activation-service" /* StoryActivation */; + }, + enumerable: true, + configurable: true + }); + StoryActivationServiceImpl.prototype.activateNextStoryPointAsync = function () { + var _a; + var verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateNextStoryPointAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + StoryActivationServiceImpl.prototype.activatePreviousStoryPointAsync = function () { + var _a; + var verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activatePreviousStoryPointAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + StoryActivationServiceImpl.prototype.activateStoryPointAsync = function (index) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateStoryPointAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + StoryActivationServiceImpl.prototype.revertStoryPointAsync = function (index) { + var _a; + var verb = api_internal_contract_js_1.VerbId.RevertStoryPoint; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'revertStoryPointAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; + return this.execute(verb, parameters).then(function (response) { + return response.result; + }); + }; + return StoryActivationServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.StoryActivationServiceImpl = StoryActivationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js": +/*!**********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js ***! + \**********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var VisualModelServiceImpl = /** @class */ (function (_super) { + __extends(VisualModelServiceImpl, _super); + function VisualModelServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(VisualModelServiceImpl.prototype, "serviceName", { + get: function () { + return "visual-model-service" /* VisualModel */; + }, + enumerable: true, + configurable: true + }); + VisualModelServiceImpl.prototype.getVisualSpecificationAsync = function (visualId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getVisualSpecificationAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = visualId.worksheet, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + return VisualModelServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.VisualModelServiceImpl = VisualModelServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js": +/*!**************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***! + \**************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var CustomViewImpl_1 = __webpack_require__(/*! ../../Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var VizServiceImpl = /** @class */ (function (_super) { + __extends(VizServiceImpl, _super); + function VizServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(VizServiceImpl.prototype, "serviceName", { + get: function () { + return "viz-service" /* Viz */; + }, + enumerable: true, + configurable: true + }); + VizServiceImpl.prototype.createVizImageAsync = function (inputSpec) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'createVizImageAsync', + _a[api_internal_contract_js_1.ParameterId.VizAPIInputJson] = JSON.stringify(inputSpec), + _a); + return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + VizServiceImpl.prototype.activateSheetAsync = function (name) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateSheetAsync', + _a[api_internal_contract_js_1.ParameterId.SwitchToSheetName] = name, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(function () { + return; + }); + }; + VizServiceImpl.prototype.getCustomViewsAsync = function () { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCustomViewsAsync', + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then(function (response) { + var customViews = response.result; + return customViews.map(function (customView) { + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }); + }; + VizServiceImpl.prototype.showCustomViewAsync = function (customViewName) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'showCustomViewAsync', + _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then(function (response) { + var customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }; + VizServiceImpl.prototype.removeCustomViewAsync = function (customViewName) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeCustomViewAsync', + _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName, + _a); + return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then(function (response) { + var customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }; + VizServiceImpl.prototype.saveCustomViewAsync = function (customViewName) { + var _a; + var _this = this; + // CustomViewIsDefault is a required parameter, but our API has not been updated to allow it to be specified yet. + // We should add a 'default' parameter to the interface. + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveCustomViewAsync', + _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName, + _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = false, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then(function (response) { + var customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }; + VizServiceImpl.prototype.setActiveCustomViewAsDefaultAsync = function () { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setActiveCustomViewAsDefaultAsync', + _a); + return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(function () { + return; + }); + }; + VizServiceImpl.prototype.saveAsync = function (customView) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveAsync', + _a[api_internal_contract_js_1.ParameterId.CustomViewLuid] = customView.luid, + _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customView.name, + _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = customView.isDefault, + _a[api_internal_contract_js_1.ParameterId.CustomViewIsPublic] = customView.shared, + _a); + return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then(function (response) { + var customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }; + VizServiceImpl.prototype.getCurrentSrcAsync = function () { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCurrentSrcAsync', + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then(function (response) { return response.result; }); + }; + return VizServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.VizServiceImpl = VizServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ZoneServiceImpl = /** @class */ (function (_super) { + __extends(ZoneServiceImpl, _super); + function ZoneServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ZoneServiceImpl.prototype, "serviceName", { + get: function () { + return "zone-service" /* Zone */; + }, + enumerable: true, + configurable: true + }); + ZoneServiceImpl.prototype.setVisibilityAsync = function (dashboard, dashboardZoneMap, zoneVisibilityMap) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setVisibilityAsync', + _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard, + _a[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap] = {}, + _a); + // zoneVisibilityMap can be either an object or a Map - convert it to a Map + var parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap'); + parameterAsMap.forEach(function (value, key) { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10)); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType'); + parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value); + }); + return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then(function (response) { + return; + }); + }; + ZoneServiceImpl.prototype.moveAndResizeAsync = function (dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard, + _a[api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList] = dashboardObjectPositionAndSizeUpdateArray, + _a); + dashboardObjectPositionAndSizeUpdateArray.forEach(function (dashboardObject) { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID); + ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject); + }); + return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then(function (response) { + return; + }); + }; + return ZoneServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +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. + */ +var TableSummary = /** @class */ (function () { + function TableSummary(_tableInfo) { + this._tableInfo = _tableInfo; + } + Object.defineProperty(TableSummary.prototype, "name", { + get: function () { + return this._tableInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "id", { + get: function () { + return this._tableInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "connectionId", { + get: function () { + return this._tableInfo.connectionId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "customSQL", { + get: function () { + return this._tableInfo.customSQL; + }, + enumerable: true, + configurable: true + }); + return TableSummary; +}()); +exports.TableSummary = TableSummary; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/TableauError.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/TableauError.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Custom error class that extends the default JavaScript Error object. + * This allows us to provide a field with a specific error code + * so that developers can more easily programmatically respond + * to error scenarios. + */ +var TableauError = /** @class */ (function (_super) { + __extends(TableauError, _super); + function TableauError(_errorCode, message) { + var _this = _super.call(this, _errorCode + ": " + message) || this; + _this._errorCode = _errorCode; + /*tslint:disable-next-line */ + // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work + // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force + // the proto chain to be built correctly. See the github link above for details. + Object.setPrototypeOf(_this, TableauError.prototype); + return _this; + } + Object.defineProperty(TableauError.prototype, "errorCode", { + get: function () { + return this._errorCode; + }, + enumerable: true, + configurable: true + }); + return TableauError; +}(Error)); +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 })); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var GetDataModels_1 = __webpack_require__(/*! ../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +/** + * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over + * in the platform. + */ +var DataValueFactory = /** @class */ (function () { + function DataValueFactory() { + } + DataValueFactory.MakeParameterDataValue = function (internalDataValue, dataType) { + // 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); + }; + DataValueFactory.MakeFilterDataValue = function (internalDataValue) { + // Filters already have native type in value, just use that for nativeValue also + return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue); + }; + DataValueFactory.MakeTableDataValue = function (internalDataValue, dataType) { + // 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); + }; + return DataValueFactory; +}()); +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 + */ +var Deferred = /** @class */ (function () { + /** + * Creates an instance of Deferred. + */ + function Deferred() { + var _this = this; + this._promise = new Promise(function (resolve, reject) { + _this._resolve = resolve; + _this._reject = reject; + }); + } + Object.defineProperty(Deferred.prototype, "promise", { + /** + * Gets the Promise. + * + * @readonly + * @type {Promise} + */ + get: function () { + return this._promise; + }, + enumerable: true, + configurable: true + }); + /** + * Resolves the wrapped Promise. + * + * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise. + * @returns {*} {void} + */ + Deferred.prototype.resolve = function (response) { + if (!this._resolve) { + return; + } + this._resolve(response); + }; + /** + * + * + * @param {TReject} [reason] The reason why the Promise rejected. + * @returns {*} {void} + */ + Deferred.prototype.reject = function (reason) { + if (!this._reject) { + return; + } + this._reject(reason); + }; + return Deferred; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * 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. + */ +var EnumConverter = /** @class */ (function () { + function EnumConverter(_mappings, _defaultVal) { + this._mappings = _mappings; + this._defaultVal = _defaultVal; + } + EnumConverter.prototype.convert = function (enumVal, throwIfMissing) { + if (throwIfMissing === void 0) { throwIfMissing = ShouldThrow.Yes; } + if (this._mappings.hasOwnProperty(enumVal)) { + return this._mappings[enumVal]; + } + if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) { + return this._defaultVal; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Enum Mapping not found for: " + enumVal); + }; + return EnumConverter; +}()); +exports.EnumConverter = EnumConverter; +var ShouldThrow; +(function (ShouldThrow) { + ShouldThrow["Yes"] = "yes"; + ShouldThrow["No"] = "no"; +})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {})); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var Param_1 = __webpack_require__(/*! ./Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +/** + * This class is used to construct common errors throughout the external + * projects (api-shared, extensions-api, etc.). It has some duplication with + * the ErrorHelpers class in api-core, but is separate due to the need to throw + * an external TableauError vs. an InternalTableauError. + */ +var ErrorHelpers = /** @class */ (function () { + function ErrorHelpers() { + } + /** + * Throws with code InternalError. + * + * @param apiName name of api that was called. + */ + ErrorHelpers.apiNotImplemented = function (apiName) { + return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, apiName + " API not yet implemented."); + }; + /** + * 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 */ + ErrorHelpers.verifyInternalValue = function (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 */ + ErrorHelpers.verifyParameter = function (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 */ + ErrorHelpers.verifyParameterType = function (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 */ + ErrorHelpers.verifyStringParameter = function (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. + * 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 */ + ErrorHelpers.verifyEnumValue = function (enumValue, enumType, enumName) { + var isValid = false; + Object.keys(enumType).forEach(function (enumKey) { + if (enumType[enumKey] === enumValue.toString()) { + isValid = true; + } + }); + if (!isValid) { + 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 + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyRange = function (value, min, max) { + var 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 + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyRangeParamType = function (min, max) { + if (!min && !max) { + 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 (min && !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 (max && !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 (min && max && 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 + */ + ErrorHelpers.verifyZoneIsValid = function (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 + */ + ErrorHelpers.verifyZoneIsValidAndFloating = function (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 + */ + ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate = function (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 + */ + ErrorHelpers.verifySheetName = function (exportableSheetNames, sheetName) { + if (!exportableSheetNames.includes(sheetName)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetName parameter must belong to a worksheet within the current view'); + } + }; + /** + * Verifies the ExportDataOptions object + * Throws with error code InvalidParameter if the parameter is not of ExportDataOptions type. + * + * @param options The ExportDataOptions object used to configure the output CSV file for exportDataAsync. + */ + ErrorHelpers.verifyExportDataOptions = function (options) { + 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. + */ + ErrorHelpers.verifySheetNamesForPDFAndPPT = function (sheetNames, exportScenarios) { + if (!Array.isArray(sheetNames)) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'sheetNames parameter must be an array'); + if (sheetNames.length === 0) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'sheetNames should not be empty'); + var isIncludedInDashboard = sheetNames.every(function (sheetName) { + return exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName); + }); + if (isIncludedInDashboard) { + return; + } + var isIncludedInWorkbook = sheetNames.every(function (sheetName) { + return exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName); + }); + if (isIncludedInWorkbook) { + return; + } + var isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName; + if (isCurrentSheet) { + return; + } + // Export requirement: all sheet names must be included in the list of exportable sheets in the dashboard or + // all sheet names must be included in the list of exportable sheets in the workbook, or the sheet name is the current sheet + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook'); + }; + /** + * Verifies the external ExportPDFOptions object's properties. + * Throws with error code InvalidParameter if the parameter is not of external ExportPDFOptions type. + * + * @param options The external user-facing ExportPDFOptions object used to configure the output PDF file for exportPDFAsync. + */ + ErrorHelpers.verifyExportPDFOptions = function (options) { + 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'); + } + }; + return ErrorHelpers; +}()); +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 })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Helper methods for Export APIs. + * + * @class ExportHelpers + */ +var ExportHelpers = /** @class */ (function () { + function 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. + */ + ExportHelpers.updateInternalExportPDFOptions = function (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. + */ + ExportHelpers.updateExportLayoutOptions = function (internalExportPdfOptions, externalExportPdfOptions) { + var 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. + */ + ExportHelpers.updateSheetOptions = function (internalExportPdfOptions, sheetNames) { + var exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions, sheetOptions = internalExportPdfOptions.sheetOptions; + // updating the export layouts options for each sheet and selecting sheet for export if included in list + for (var _i = 0, sheetOptions_1 = sheetOptions; _i < sheetOptions_1.length; _i++) { + var sheetOption = sheetOptions_1[_i]; + 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. + */ + ExportHelpers.setFitAndScaleValues = function (exportLayoutOptions, scalingSelection) { + var _a; + var _b = this.DefaultLayoutOptions, pageFitHorizontal = _b.pageFitHorizontal, pageFitVertical = _b.pageFitVertical, pageScaleMode = _b.pageScaleMode, pageScalePercent = _b.pageScalePercent; + var fitMatch = this.fitRegex.exec(scalingSelection); + var percentMatch = this.pctRegex.exec(scalingSelection); + if (fitMatch) { + _a = fitMatch.slice(1).map(function (value) { return Number(value); }), pageFitHorizontal = _a[0], pageFitVertical = _a[1]; + pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages; + } + else if (percentMatch) { + pageScalePercent = percentMatch.slice(1).map(function (value) { return Number(value); })[0]; + 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; + }; + ExportHelpers.DefaultDataOptions = { + ignoreAliases: false, + columnsToIncludeById: [], + }; + ExportHelpers.DefaultPDFOptions = { + scaling: api_external_contract_js_1.PrintScaling.Automatic, + pageSize: api_external_contract_js_1.PrintPageSize.Letter, + orientation: api_external_contract_js_1.PrintOrientation.Portrait, + }; + ExportHelpers.DefaultLayoutOptions = { + imageHeight: 0, + imageWidth: 0, + pageFitHorizontal: 1, + pageFitVertical: 1, + pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait, + pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto, + pageScalePercent: 100, + pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter, + }; + ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)'); + ExportHelpers.pctRegex = new RegExp('pct([0-9]+)'); + return ExportHelpers; +}()); +exports.ExportHelpers = ExportHelpers; + + +/***/ }), + +/***/ "../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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ./ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param = /** @class */ (function () { + function Param() { + } + /** + * serializes the date into the format that the server expects. + * @param date the date to serialize + */ + Param.serializeDateForPlatform = function (date) { + var year = date.getUTCFullYear(); + var month = date.getUTCMonth() + 1; + var day = date.getUTCDate(); + var hh = date.getUTCHours(); + var mm = date.getUTCMinutes(); + var sec = date.getUTCSeconds(); + return year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + sec; + }; + Param.serializeBooleanForPlatform = function (bool) { + return bool ? 'true' : 'false'; + }; + Param.serializeNumberForPlatform = function (num) { + return num.toString(10); + }; + /** + * Verifies the input is a number + */ + /* tslint:disable-next-line:no-any */ + Param.isTypeNumber = function (input) { + return typeof input === 'number' || input instanceof Number; + }; + /** + * Verifies the input is a Date + */ + /* tslint:disable-next-line:no-any */ + Param.isTypeDate = function (input) { + return input instanceof Date; + }; + /* tslint:disable-next-line:no-any */ + Param.isTypeString = function (input) { + return typeof input === 'string' || input instanceof String; + }; + /* tslint:disable-next-line:no-any */ + Param.isTypeBool = function (input) { + return typeof input === 'boolean' || input instanceof Boolean; + }; + /** + * Determines if the input is null or undefined + */ + /* tslint:disable-next-line:no-any */ + Param.isNullOrUndefined = function (input) { + return input === null || input === undefined; + }; + /* tslint:disable-next-line:no-any */ + Param.serializeParameterValue = function (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 + Param.convertParameterToMap = function (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 */ + Param.tryParseNumber = function (value) { + if (Param.isNullOrUndefined(value)) { + return { success: false }; + } + if (Param.isTypeNumber(value)) { + return { parsed: value, success: true }; + } + var valueString = value.toString(); + if (valueString === 'NaN') { + // 'NaN' parses as NaN which is indistinguishable from a failed parse. + return { parsed: NaN, success: true }; + } + var parsed = parseFloat(valueString); + if (isNaN(parsed)) { + return { success: false }; + } + return { parsed: parsed, success: true }; + }; + return Param; +}()); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var SheetUtils = /** @class */ (function () { + function SheetUtils() { + } + // This is a direct port from SheetSize.cs - SheetSizeFactory + SheetUtils.getSheetSizeFromSizeConstraints = function (sizeConstraint) { + var minWidth = sizeConstraint.minWidth, minHeight = sizeConstraint.minHeight, maxWidth = sizeConstraint.maxWidth, maxHeight = sizeConstraint.maxHeight; + 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 + var isDsdLayout = minWidth === 0 && maxWidth === 0; + return { + behavior: Contract.SheetSizeBehavior.Range, + minSize: { width: minWidth, height: minHeight }, + maxSize: { width: isDsdLayout ? 2147483647 : maxWidth, height: maxHeight }, + }; + }; + SheetUtils.createAutomaticSize = function () { + var behavior = Contract.SheetSizeBehavior.Automatic; + var minSize = { width: 0, height: 0 }; + var maxSize = { width: 0, height: 0 }; + return { behavior: behavior, minSize: minSize, maxSize: maxSize }; + }; + SheetUtils.getPublishedSheetInfoByName = function (name, sheetInfos) { + var sheetInfo = sheetInfos.find(function (sheet) { return sheet.name === name; }); + return sheetInfo; + }; + SheetUtils.getSheetTypeEnum = function (internalSheetType) { + var 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; + }; + SheetUtils.isValidSheetSize = function (sizeObject) { + return sizeObject.behavior !== undefined; + }; + return SheetUtils; +}()); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var Deferred_1 = __webpack_require__(/*! ./Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +/** + * 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. + * + */ +var ShortLivedDeferred = /** @class */ (function () { + function ShortLivedDeferred(_timeoutInMilliseconds) { + if (_timeoutInMilliseconds === void 0) { _timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds; } + this._timeoutInMilliseconds = _timeoutInMilliseconds; + } + ShortLivedDeferred.prototype.getNewPromiseOrThrowIfBusy = function () { + var _this = this; + if (this._deferred) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.'); + } + this._deferred = new Deferred_1.Deferred(); + this._timeoutId = setTimeout(function () { + var error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, "Api failed to complete in " + _this._timeoutInMilliseconds / 1000 + " seconds"); + _this.reject(error); + }, this._timeoutInMilliseconds); + return this._deferred.promise; + }; + ShortLivedDeferred.prototype.resolve = function (response) { + if (this._deferred) { + clearTimeout(this._timeoutId); + this._deferred.resolve(response); + this._deferred = undefined; + } + }; + ShortLivedDeferred.prototype.reject = function (error) { + if (this._deferred) { + clearTimeout(this._timeoutId); + this._deferred.reject(error); + this._deferred = undefined; + } + }; + return ShortLivedDeferred; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Represents the current version of the extensions, embedding + * and extensions-api-types library + */ +var VersionNumber = /** @class */ (function () { + // private constructor so everyone uses the singleton instance + // build numbers have this form: M.m.f-pre.N + function VersionNumber(versionString, isAlpha) { + var partStr = versionString.split('-'); + this.build = this.getBuildNumber(partStr[1]); + versionString = partStr[0]; + var parts = versionString.split('.').map(function (p) { return 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; + } + VersionNumber.prototype.getBuildNumber = function (preReleaseString) { + var noBuildNumber = -1; + if (!preReleaseString) { + return noBuildNumber; + } + // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre' + var partStr = preReleaseString.split('.'); + return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber; + }; + Object.defineProperty(VersionNumber.prototype, "formattedValue", { + get: function () { + return this.major + "." + this.minor + "." + this.fix; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(VersionNumber.prototype, "fullFormattedValue", { + get: function () { + return this.major + "." + this.minor + "." + this.fix + "-pre." + this.build; + }, + enumerable: true, + configurable: true + }); + return VersionNumber; +}()); +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 })); +var 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} + */ +var VersionedExternalApiDispatcher = /** @class */ (function () { + /** + * 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 + */ + function VersionedExternalApiDispatcher(_apiDelegateDispatcher, platformVersionNumber) { + var _this = this; + this._apiDelegateDispatcher = _apiDelegateDispatcher; + this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber); + this._notificationHandlers = []; + _apiDelegateDispatcher.registerNotificationHandler(function (notification) { + if (_this._notificationHandlers.length === 0) { + return; + } + var upgradedNotification = _this._versionConverter.upgradeNotification(notification); + _this._notificationHandlers.forEach(function (handler) { + handler(upgradedNotification); + }); + }); + } + VersionedExternalApiDispatcher.needsVersionConverter = function (platformVersion) { + // If our platform is less than external library version, then we need a converter + return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + }; + VersionedExternalApiDispatcher.prototype.execute = function (verb, parameters) { + var _this = this; + try { + var downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters); + return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then(function (response) { + var upgradeResponse = _this._versionConverter.upgradeExecuteReturn(response, verb, parameters); + return upgradeResponse; + }); + } + catch (e) { + return Promise.reject(e); + } + }; + VersionedExternalApiDispatcher.prototype.registerNotificationHandler = function (handler) { + this._notificationHandlers.push(handler); + }; + VersionedExternalApiDispatcher.prototype.unregisterNotificationHandler = function (handler) { + this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; }); + }; + return VersionedExternalApiDispatcher; +}()); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/index.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NIL: () => (/* reexport safe */ _nil_js__WEBPACK_IMPORTED_MODULE_4__["default"]), +/* harmony export */ parse: () => (/* reexport safe */ _parse_js__WEBPACK_IMPORTED_MODULE_8__["default"]), +/* harmony export */ stringify: () => (/* reexport safe */ _stringify_js__WEBPACK_IMPORTED_MODULE_7__["default"]), +/* harmony export */ v1: () => (/* reexport safe */ _v1_js__WEBPACK_IMPORTED_MODULE_0__["default"]), +/* harmony export */ v3: () => (/* reexport safe */ _v3_js__WEBPACK_IMPORTED_MODULE_1__["default"]), +/* harmony export */ v4: () => (/* reexport safe */ _v4_js__WEBPACK_IMPORTED_MODULE_2__["default"]), +/* harmony export */ v5: () => (/* reexport safe */ _v5_js__WEBPACK_IMPORTED_MODULE_3__["default"]), +/* harmony export */ validate: () => (/* reexport safe */ _validate_js__WEBPACK_IMPORTED_MODULE_6__["default"]), +/* harmony export */ version: () => (/* reexport safe */ _version_js__WEBPACK_IMPORTED_MODULE_5__["default"]) +/* harmony export */ }); +/* harmony import */ var _v1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js"); +/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js"); +/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js"); +/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js"); +/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js"); +/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js"); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); + + + + + + + + + + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* + * Browser-compatible JavaScript MD5 + * + * Modification of JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ +function md5(bytes) { + if (typeof bytes === 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + + bytes = new Uint8Array(msg.length); + + for (var i = 0; i < msg.length; ++i) { + bytes[i] = msg.charCodeAt(i); + } + } + + return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8)); +} +/* + * Convert an array of little-endian words to an array of bytes + */ + + +function md5ToHexEncodedArray(input) { + var output = []; + var length32 = input.length * 32; + var hexTab = '0123456789abcdef'; + + for (var i = 0; i < length32; i += 8) { + var x = input[i >> 5] >>> i % 32 & 0xff; + var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16); + output.push(hex); + } + + return output; +} +/** + * Calculate output length with padding and bit length + */ + + +function getOutputLength(inputLength8) { + return (inputLength8 + 64 >>> 9 << 4) + 14 + 1; +} +/* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ + + +function wordsToMd5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << len % 32; + x[getOutputLength(len) - 1] = len; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (var i = 0; i < x.length; i += 16) { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + + return [a, b, c, d]; +} +/* + * Convert an array bytes to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ + + +function bytesToWords(input) { + if (input.length === 0) { + return []; + } + + var length8 = input.length * 8; + var output = new Uint32Array(getOutputLength(length8)); + + for (var i = 0; i < length8; i += 8) { + output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; + } + + return output; +} +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ + + +function safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return msw << 16 | lsw & 0xffff; +} +/* + * Bitwise rotate a 32-bit number to the left. + */ + + +function bitRotateLeft(num, cnt) { + return num << cnt | num >>> 32 - cnt; +} +/* + * These functions implement the four basic operations the algorithm uses. + */ + + +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} + +function md5ff(a, b, c, d, x, s, t) { + return md5cmn(b & c | ~b & d, a, b, x, s, t); +} + +function md5gg(a, b, c, d, x, s, t) { + return md5cmn(b & d | c & ~d, a, b, x, s, t); +} + +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} + +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (md5); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ('00000000-0000-0000-0000-000000000000'); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + + +function parse(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + var v; + var arr = new Uint8Array(16); // Parse ########-....-....-....-............ + + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; // Parse ........-####-....-....-............ + + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; // Parse ........-....-####-....-............ + + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; // Parse ........-....-....-####-............ + + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) + + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ rng) +/* harmony export */ }); +// Unique ID creation requires a high quality random # generator. In the browser we therefore +// require the crypto API and do not support built-in fallback to lower quality random number +// generators (like Math.random()). +var getRandomValues; +var rnds8 = new Uint8Array(16); +function rng() { + // lazy load so that environments that need to polyfill have a chance to do so + if (!getRandomValues) { + // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, + // find the complete implementation of crypto (msCrypto) on IE11. + getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); + + if (!getRandomValues) { + throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); + } + } + + return getRandomValues(rnds8); +} + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js": +/*!*******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +// Adapted from Chris Veness' SHA1 code at +// http://www.movable-type.co.uk/scripts/sha1.html +function f(s, x, y, z) { + switch (s) { + case 0: + return x & y ^ ~x & z; + + case 1: + return x ^ y ^ z; + + case 2: + return x & y ^ x & z ^ y & z; + + case 3: + return x ^ y ^ z; + } +} + +function ROTL(x, n) { + return x << n | x >>> 32 - n; +} + +function sha1(bytes) { + var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + + if (typeof bytes === 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + + bytes = []; + + for (var i = 0; i < msg.length; ++i) { + bytes.push(msg.charCodeAt(i)); + } + } else if (!Array.isArray(bytes)) { + // Convert Array-like to Array + bytes = Array.prototype.slice.call(bytes); + } + + bytes.push(0x80); + var l = bytes.length / 4 + 2; + var N = Math.ceil(l / 16); + var M = new Array(N); + + for (var _i = 0; _i < N; ++_i) { + var arr = new Uint32Array(16); + + for (var j = 0; j < 16; ++j) { + arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3]; + } + + M[_i] = arr; + } + + M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32); + M[N - 1][14] = Math.floor(M[N - 1][14]); + M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff; + + for (var _i2 = 0; _i2 < N; ++_i2) { + var W = new Uint32Array(80); + + for (var t = 0; t < 16; ++t) { + W[t] = M[_i2][t]; + } + + for (var _t = 16; _t < 80; ++_t) { + W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); + } + + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + for (var _t2 = 0; _t2 < 80; ++_t2) { + var s = Math.floor(_t2 / 20); + var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + + H[0] = H[0] + a >>> 0; + H[1] = H[1] + b >>> 0; + H[2] = H[2] + c >>> 0; + H[3] = H[3] + d >>> 0; + H[4] = H[4] + e >>> 0; + } + + return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff]; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js": +/*!************************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ + +var byteToHex = []; + +for (var i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify(arr) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); + + // **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +var _nodeId; + +var _clockseq; // Previous uuid creation time + + +var _lastMSecs = 0; +var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details + +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || new Array(16); + options = options || {}; + var node = options.node || _nodeId; + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + + if (node == null || clockseq == null) { + var seedBytes = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); + + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; + } + + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + + + var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) + + var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression + + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + + + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } // Per 4.2.1.2 Throw error if too many uuids are requested + + + if (nsecs >= 10000) { + throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + + msecs += 12219292800000; // `time_low` + + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; // `time_mid` + + var tmh = msecs / 0x100000000 * 10000 & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; // `time_high_and_version` + + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + + b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + + b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` + + b[i++] = clockseq & 0xff; // `node` + + for (var n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf || (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js"); + + +var v3 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v3', 0x30, _md5_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v3); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DNS: () => (/* binding */ DNS), +/* harmony export */ URL: () => (/* binding */ URL), +/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); + + + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + + var bytes = []; + + for (var i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); + } + + return bytes; +} + +var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + if (typeof value === 'string') { + value = stringToBytes(value); + } + + if (typeof namespace === 'string') { + namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); + } + + if (namespace.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` + + + var bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + + return buf; + } + + return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bytes); + } // Function#name is not settable on some platforms (#270) + + + try { + generateUUID.name = name; // eslint-disable-next-line no-empty + } catch (err) {} // For CommonJS default export support + + + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); + + + +function v4(options, buf, offset) { + options = options || {}; + var rnds = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rnds); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js"); + + +var v5 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v5', 0x50, _sha1_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v5); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js": +/*!***********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _regex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js"); + + +function validate(uuid) { + return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__["default"].test(uuid); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/version.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + + +function version(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + return parseInt(uuid.substr(14, 1), 16); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version); + +/***/ }), + +/***/ "../api-internal-contract-js/lib/internal-contract-version.json": +/*!**********************************************************************!*\ + !*** ../api-internal-contract-js/lib/internal-contract-version.json ***! + \**********************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":153,"fix":0}'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +var exports = __webpack_exports__; +/*!**********************************!*\ + !*** ./lib/src/ExtensionsApi.js ***! + \**********************************/ + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +// The following polyfills are needed for IE11 +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +__webpack_require__(/*! core-js/es/array/find */ "../../node_modules/core-js/es/array/find.js"); +__webpack_require__(/*! core-js/es/array/from */ "../../node_modules/core-js/es/array/from.js"); +__webpack_require__(/*! core-js/es/map */ "../../node_modules/core-js/es/map/index.js"); +__webpack_require__(/*! core-js/es/number/is-integer */ "../../node_modules/core-js/es/number/is-integer.js"); +__webpack_require__(/*! core-js/es/number/is-nan */ "../../node_modules/core-js/es/number/is-nan.js"); +__webpack_require__(/*! core-js/es/number/parse-float */ "../../node_modules/core-js/es/number/parse-float.js"); +__webpack_require__(/*! core-js/es/number/parse-int */ "../../node_modules/core-js/es/number/parse-int.js"); +__webpack_require__(/*! core-js/es/object/assign */ "../../node_modules/core-js/es/object/assign.js"); +__webpack_require__(/*! core-js/es/object/entries */ "../../node_modules/core-js/es/object/entries.js"); +__webpack_require__(/*! core-js/es/object/set-prototype-of */ "../../node_modules/core-js/es/object/set-prototype-of.js"); +__webpack_require__(/*! core-js/es/promise */ "../../node_modules/core-js/es/promise/index.js"); +// Due to the way we configured webpack, we should be exporting things which will be under +// a global variable called "tableau". Export everything we want to be visible under tableau +// from this file. +var ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); +var Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "./lib/src/ExtensionsApi/Namespaces/Extensions.js"); +var isAlpha = typeof VERSION_IS_ALPHA !== 'undefined' ? VERSION_IS_ALPHA : false; +api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.11.1-pre.1" : 0, isAlpha); +var 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.SelectOptions = api_external_contract_js_1.SelectOptions; +exports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType; +exports.SheetType = api_external_contract_js_1.SheetType; +exports.SortDirection = api_external_contract_js_1.SortDirection; +exports.TableauEventType = api_external_contract_js_1.TableauEventType; +exports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType; +exports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType; +exports.VizImagePaletteType = api_external_contract_js_1.VizImagePaletteType; +exports.VizImageSizeSettingAlignmentType = api_external_contract_js_1.VizImageSizeSettingAlignmentType; +exports.VizImageSizeSettingType = api_external_contract_js_1.VizImageSizeSettingType; +exports.VizImageSortDirectionType = api_external_contract_js_1.VizImageSortDirectionType; +exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType; + +})(); + +window.tableau = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuMTEuMS1wcmUuMS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxrQkFBa0IsbUJBQU8sQ0FBQywwRkFBOEI7O0FBRXhEOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLG1CQUFPLENBQUMsd0ZBQTZCO0FBQ3JDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0pBLG1CQUFPLENBQUMsZ0dBQWlDO0FBQ3pDLG1CQUFPLENBQUMsMEVBQXNCO0FBQzlCLG1CQUFPLENBQUMsb0dBQW1DO0FBQzNDLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ05BLG1CQUFPLENBQUMsc0dBQW9DO0FBQzVDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsOEZBQWdDO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsd0dBQXFDO0FBQzdDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsb0dBQW1DO0FBQzNDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsOEZBQWdDO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsZ0dBQWlDO0FBQ3pDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0hBQTBDO0FBQ2xELFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLG1CQUFP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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixxQkFBcUIsYUFBYTtBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPLElBQUksY0FBYzs7QUFFekI7QUFDQSw2RUFBNkUsY0FBYztBQUMzRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdCQUFnQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksMENBQTBDO0FBQzlDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsSUFBSSw2Q0FBNkM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELElBQUksd0RBQXdEO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LCtDQUE0QixDQUFDLEtBQUssSUFBRywrQ0FBNEIsQ0FBQyxLQUFLO1FBQ3hFLEdBQUMsK0NBQTRCLENBQUMsTUFBTSxJQUFHLCtDQUE0QixDQUFDLE1BQU07UUFDMUUsR0FBQywrQ0FBNEIsQ0FBQyxHQUFHLElBQUcsK0NBQTRCLENBQUMsR0FBRztRQUNwRSxHQUFDLCtDQUE0QixDQUFDLEdBQUcsSUFBRywrQ0FBNEIsQ0FBQyxHQUFHO1FBQ3BFLEdBQUMsK0NBQTRCLENBQUMsSUFBSSxJQUFHLCtDQUE0QixDQUFDLElBQUk7UUFDdEUsR0FBQywrQ0FBNEIsQ0FBQyxLQUFLLElBQUcsK0NBQTRCLENBQUMsS0FBSztRQUN4RSxHQUFDLCtDQUE0QixDQUFDLFFBQVEsSUFBRywrQ0FBNEIsQ0FBQyxRQUFRO1FBQzlFLEdBQUMsK0NBQTRCLENBQUMsR0FBRyxJQUFHLCtDQUE0QixDQUFDLEdBQUc7UUFDcEUsR0FBQywrQ0FBNEIsQ0FBQyxHQUFHLElBQUcsK0NBQTRCLENBQUMsR0FBRztRQUNwRSxHQUFDLCtDQUE0QixDQUFDLE1BQU0sSUFBRywrQ0FBNEIsQ0FBQyxNQUFNO1FBQzFFLEdBQUMsK0NBQTRCLENBQUMsR0FBRyxJQUFHLCtDQUE0QixDQUFDLEdBQUc7UUFDcEUsR0FBQywrQ0FBNEIsQ0FBQyxNQUFNLElBQUcsK0NBQTRCLENBQUMsTUFBTTtRQUMxRSxHQUFDLCtDQUE0QixDQUFDLFNBQVMsSUFBRywrQ0FBNEIsQ0FBQyxTQUFTO1FBQ2hGLEdBQUMsK0NBQTRCLENBQUMsSUFBSSxJQUFHLCtDQUE0QixDQUFDLElBQUk7UUFDdEUsR0FBQywrQ0FBNEIsQ0FBQyxHQUFHLElBQUcsK0NBQTRCLENBQUMsR0FBRztRQUNwRSxHQUFDLCtDQUE0QixDQUFDLE1BQU0sSUFBRywrQ0FBNEIsQ0FBQyxNQUFNO1FBQzFFLEdBQUMsK0NBQTRCLENBQUMsTUFBTSxJQUFHLCtDQUE0QixDQUFDLE1BQU07UUFDMUUsR0FBQywrQ0FBNEIsQ0FBQyxNQUFNLElBQUcsK0NBQTRCLENBQUMsTUFBTTtRQUMxRSxHQUFD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QyxDQUFDO0FBRXhELGVBQWU7QUFDZiwrRUFBK0U7QUFDL0UseUpBeUMyQztBQXhDekMsNEVBQW1CO0FBQ25CLGtFQUFjO0FBQ2QsOERBQVk7QUFDWiwwREFBVTtBQUNWLGdGQUFxQjtBQUNyQiw0RUFBbUI7QUFDbkIsZ0dBQTZCO0FBQzdCLHNEQUFRO0FBQ1IsZ0VBQWE7QUFDYiw0REFBVztBQUNYLDhEQUFZO0FBQ1osMERBQVU7QUFDVixzRUFBZ0I7QUFDaEIsZ0VBQWE7QUFDYiw4RUFBb0I7QUFDcEIsZ0VBQWE7QUFDYixzRUFBZ0I7QUFDaEIsc0VBQWdCO0FBQ2hCLDBEQUFVO0FBQ1Ysc0VBQWdCO0FBQ2hCLG9HQUErQjtBQUMvQixvRkFBdUI7QUFDdkIsc0RBQVE7QUFDUiwwRUFBa0I7QUFDbEIsMERBQVU7QUFDViwwRUFBa0I7QUFFbEIsb0VBQWU7QUFDZixnRUFBYTtBQUNiLDRFQUFtQjtBQUNuQix3REFBUztBQUNULGdFQUFhO0FBQ2Isc0VBQWdCO0FBQ2hCLDBFQUFrQjtBQUNsQiw4RUFBb0I7QUFDcEIsNEVBQW1CO0FBQ25CLHNHQUFnQztBQUNoQyxvRkFBdUI7QUFDdkIsd0ZBQXlCO0FBQ3pCLDBFQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2FycmF5L2Zyb20uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtaW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtY2FsbGFibGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xlYXItZXJyb3Itc3RhY2suanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW50cnktdW5iaW5kLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1jbG9zZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXAuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbnkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2d1aWQvZ3VpZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0ZpbHRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1N1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdUV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdVNoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1V29ya3NoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQmVudG9uU2Fuc0ZvbnROYW1lQ29uc3RhbnRzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0Nvbm5lY3RlZFNlcnZlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uc0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1NldHRpbmdzSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9UYWJsZWF1Qm9va0ZvbnROYW1lQ29uc3RhbnRzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1VJSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL0Rhc2hib2FyZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL0Rhc2hib2FyZE9iamVjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1BhcmFtZXRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvV29ya2Jvb2sudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3Jrc2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FbnZpcm9ubWVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1NldHRpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1VJLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1dvcmtib29rRm9ybWF0dGluZ0VudlV0aWwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya3NoZWV0Q29udGVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9Jbml0aWFsaXphdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL1NldHRpbmdzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvVUlTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvUmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0VtYmVkZGluZ0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Bc2tEYXRhSW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRW51bXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1B1bHNlSW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVml6SW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvV2ViQ29tcG9uZW50SW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW51bXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvSnNBcGlJbnRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvRW51bXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L1BhcmFtZXRlcnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L1ZlcmJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvQXNrRGF0YUludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1B1bHNlSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvVnFsSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL0Nyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9NZXNzYWdlVHlwZUNoZWNrcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9WZXJzaW9uVHJhbnNsYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRmllbGQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FbnVtQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1BhcmFtLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjEuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5maW5kJyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ0FycmF5JywgJ2ZpbmQnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hcCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTWFwO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzSW50ZWdlcjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzTmFOO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5wYXJzZUZsb2F0O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIucGFyc2VJbnQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZW50cmllcztcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYW55Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlByb21pc2U7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NhbGxhYmxlKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAodHlwZW9mIGFyZ3VtZW50ID09ICdvYmplY3QnIHx8IGlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhhcmd1bWVudCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFByb3RvdHlwZSkge1xuICBpZiAoaXNQcm90b3R5cGVPZihQcm90b3R5cGUsIGl0KSkgcmV0dXJuIGl0O1xuICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogVHlwZShhcmd1bWVudCkgaXMgT2JqZWN0YFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzT2JqZWN0KGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcblxudmFyIEFycmF5ID0gZ2xvYmFsLkFycmF5O1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBJU19DT05TVFJVQ1RPUiA9IGlzQ29uc3RydWN0b3IodGhpcyk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhKHRoaXMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKE8sIGl0ZXJhdG9yTWV0aG9kKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKCkgOiBbXTtcbiAgICBmb3IgKDshKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgcmVzdWx0ID0gSVNfQ09OU1RSVUNUT1IgPyBuZXcgdGhpcyhsZW5ndGgpIDogQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4LCBmaWx0ZXJSZWplY3QgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgSVNfRklMVEVSX1JFSkVDVCA9IFRZUEUgPT0gNztcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0KTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2Uoc2VsZik7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICAgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgfHwgSVNfRklMVEVSX1JFSkVDVCA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBmYWxzZTsgICAgICAgICAgICAgLy8gZXZlcnlcbiAgICAgICAgICBjYXNlIDc6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyUmVqZWN0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4gIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgwKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbiAgbWFwOiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb21lXG4gIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoNCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxuICBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJSZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maWx0ZXJpbmdcbiAgZmlsdGVyUmVqZWN0OiBjcmVhdGVNZXRob2QoNylcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoW10uc2xpY2UpO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIEFycmF5ID0gZ2xvYmFsLkFycmF5O1xuXG4vLyBhIHBhcnQgb2YgYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmIChpc0NvbnN0cnVjdG9yKEMpICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgZWxzZSBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuIiwidmFyIGFycmF5U3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKGFycmF5U3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsQXJyYXkpKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gIH1cbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIGNhbGxlZCA9IDA7XG4gIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogISFjYWxsZWQrKyB9O1xuICAgIH0sXG4gICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFNBRkVfQ0xPU0lORyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSwgbm8tdGhyb3ctbGl0ZXJhbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoe30udG9TdHJpbmcpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gc3RyaW5nU2xpY2UodG9TdHJpbmcoaXQpLCA4LCAtMSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcblxuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIGlzQ2FsbGFibGUoTy5jYWxsZWUpID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcblxudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbnZhciBqb2luID0gdW5jdXJyeVRoaXMoW10uam9pbik7XG5cbnZhciBURVNUID0gKGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIFN0cmluZyhFcnJvcihhcmcpLnN0YWNrKTsgfSkoJ3p4Y2FzZCcpO1xudmFyIFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWSA9IC9cXG5cXHMqYXQgW146XSo6W15cXG5dKi87XG52YXIgSVNfVjhfT1JfQ0hBS1JBX1NUQUNLID0gVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZLnRlc3QoVEVTVCk7XG52YXIgSVNfRklSRUZPWF9PUl9TQUZBUklfU1RBQ0sgPSAvQFteXFxuXSpcXG4vLnRlc3QoVEVTVCkgJiYgIS96eGNhc2QvLnRlc3QoVEVTVCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0YWNrLCBkcm9wRW50cmllcykge1xuICBpZiAodHlwZW9mIHN0YWNrICE9ICdzdHJpbmcnKSByZXR1cm4gc3RhY2s7XG4gIGlmIChJU19WOF9PUl9DSEFLUkFfU1RBQ0spIHtcbiAgICB3aGlsZSAoZHJvcEVudHJpZXMtLSkgc3RhY2sgPSByZXBsYWNlKHN0YWNrLCBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlksICcnKTtcbiAgfSBlbHNlIGlmIChJU19GSVJFRk9YX09SX1NBRkFSSV9TVEFDSykge1xuICAgIHJldHVybiBqb2luKGFycmF5U2xpY2Uoc3BsaXQoc3RhY2ssICdcXG4nKSwgZHJvcEVudHJpZXMpLCAnXFxuJyk7XG4gIH0gcmV0dXJuIHN0YWNrO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5mYXN0S2V5O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBQcm90b3R5cGUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGluZGV4OiBjcmVhdGUobnVsbCksXG4gICAgICAgIGZpcnN0OiB1bmRlZmluZWQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgc2l6ZTogMFxuICAgICAgfSk7XG4gICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICB2YXIgcHJldmlvdXMsIGluZGV4O1xuICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3QgPSBlbnRyeSA9IHtcbiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbW92ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc3RhdGUuZmlyc3QpIHN0YXRlLmZpcnN0ID0gZW50cnk7XG4gICAgICAgIGlmIChwcmV2aW91cykgcHJldmlvdXMubmV4dCA9IGVudHJ5O1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKztcbiAgICAgICAgZWxzZSB0aGF0LnNpemUrKztcbiAgICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAvLyBmYXN0IGNhc2VcbiAgICAgIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgICAgIHZhciBlbnRyeTtcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdO1xuICAgICAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gICAgICBmb3IgKGVudHJ5ID0gc3RhdGUuZmlyc3Q7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm5leHQpIHtcbiAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVkZWZpbmVBbGwoUHJvdG90eXBlLCB7XG4gICAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS5jbGVhcigpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuY2xlYXJcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5jbGVhclxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBkYXRhID0gc3RhdGUuaW5kZXg7XG4gICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0O1xuICAgICAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplID0gMDtcbiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmRlbGV0ZShrZXkpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDtcbiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5pbmRleFtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHByZXYpIHByZXYubmV4dCA9IG5leHQ7XG4gICAgICAgICAgaWYgKG5leHQpIG5leHQucHJldmlvdXMgPSBwcmV2O1xuICAgICAgICAgIGlmIChzdGF0ZS5maXJzdCA9PSBlbnRyeSkgc3RhdGUuZmlyc3QgPSBuZXh0O1xuICAgICAgICAgIGlmIChzdGF0ZS5sYXN0ID09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjtcbiAgICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUtLTtcbiAgICAgICAgICBlbHNlIHRoYXQuc2l6ZS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZm9yZWFjaFxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7XG4gICAgICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0fS5wcm90b3R5cGUuaGFzKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5oYXNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5oYXNcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVkZWZpbmVBbGwoUHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyBgTWFwLnByb3RvdHlwZS5nZXQoa2V5KWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuc2V0XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5hZGRcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkoUHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkge1xuICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InO1xuICAgIHZhciBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7XG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUueyBrZXlzLCB2YWx1ZXMsIGVudHJpZXMsIEBAaXRlcmF0b3IgfSgpYCBtZXRob2RzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmVudHJpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUua2V5c1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS52YWx1ZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUtQEBpdGVyYXRvclxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5lbnRyaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmtleXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUudmFsdWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLUBAaXRlcmF0b3JcbiAgICBkZWZpbmVJdGVyYXRvcihDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgICAgdHlwZTogSVRFUkFUT1JfTkFNRSxcbiAgICAgICAgdGFyZ2V0OiBpdGVyYXRlZCxcbiAgICAgICAgc3RhdGU6IGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlKGl0ZXJhdGVkKSxcbiAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7XG4gICAgICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gICAgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0O1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgIC8vIGdldCBuZXh0IGVudHJ5XG4gICAgICBpZiAoIXN0YXRlLnRhcmdldCB8fCAhKHN0YXRlLmxhc3QgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLnN0YXRlLmZpcnN0KSkge1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGVudHJ5LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICByZXR1cm4geyB2YWx1ZTogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdLCBkb25lOiBmYWxzZSB9O1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnLCAhSVNfTUFQLCB0cnVlKTtcblxuICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlW0BAc3BlY2llc11gIGFjY2Vzc29yc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LW1hcC1AQHNwZWNpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1zZXQtQEBzcGVjaWVzXG4gICAgc2V0U3BlY2llcyhDT05TVFJVQ1RPUl9OQU1FKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FLCB3cmFwcGVyLCBjb21tb24pIHtcbiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xO1xuICB2YXIgSVNfV0VBSyA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignV2VhaycpICE9PSAtMTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgQ29uc3RydWN0b3IgPSBOYXRpdmVDb25zdHJ1Y3RvcjtcbiAgdmFyIGV4cG9ydGVkID0ge307XG5cbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgdW5jdXJyaWVkTmF0aXZlTWV0aG9kID0gdW5jdXJyeVRoaXMoTmF0aXZlUHJvdG90eXBlW0tFWV0pO1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb3RvdHlwZSwgS0VZLFxuICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSA6IEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gdW5kZWZpbmVkIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICB1bmN1cnJpZWROYXRpdmVNZXRob2QodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIHZhciBSRVBMQUNFID0gaXNGb3JjZWQoXG4gICAgQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAhaXNDYWxsYWJsZShOYXRpdmVDb25zdHJ1Y3RvcikgfHwgIShJU19XRUFLIHx8IE5hdGl2ZVByb3RvdHlwZS5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKS5lbnRyaWVzKCkubmV4dCgpO1xuICAgIH0pKVxuICApO1xuXG4gIGlmIChSRVBMQUNFKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLmVuYWJsZSgpO1xuICB9IGVsc2UgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHRydWUpKSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiBDaHJvbWl1bSA0MC0gd2Vhay1jb2xsZWN0aW9ucyB0aHJvd3Mgb24gcHJpbWl0aXZlcywgYnV0IHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICB2YXIgVEhST1dTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IGluc3RhbmNlLmhhcygxKTsgfSk7XG4gICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXcgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9IGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGl0ZXJhYmxlKTsgfSk7XG4gICAgLy8gZm9yIGVhcmx5IGltcGxlbWVudGF0aW9ucyAtMCBhbmQgKzAgbm90IHRoZSBzYW1lXG4gICAgdmFyIEJVR0dZX1pFUk8gPSAhSVNfV0VBSyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBWOCB+IENocm9taXVtIDQyLSBmYWlscyBvbmx5IHdpdGggNSsgZWxlbWVudHNcbiAgICAgIHZhciAkaW5zdGFuY2UgPSBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKTtcbiAgICAgIHZhciBpbmRleCA9IDU7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpO1xuICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTtcbiAgICB9KTtcblxuICAgIGlmICghQUNDRVBUX0lURVJBQkxFUykge1xuICAgICAgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uIChkdW1teSwgaXRlcmFibGUpIHtcbiAgICAgICAgYW5JbnN0YW5jZShkdW1teSwgTmF0aXZlUHJvdG90eXBlKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlQ29uc3RydWN0b3IoKSwgZHVtbXksIENvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IgfSwgZXhwb3J0ZWQpO1xuXG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufTtcbiIsInZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIG93bktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIGtleXMgPSBvd25LZXlzKHNvdXJjZSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFoYXNPd24odGFyZ2V0LCBrZXkpKSBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gIH1cbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEl0ZXJhdG9yc0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKTtcblxudmFyIFBST1BFUl9GVU5DVElPTl9OQU1FID0gRnVuY3Rpb25OYW1lLlBST1BFUjtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5DT05GSUdVUkFCTEU7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcbnZhciBFTlRSSUVTID0gJ2VudHJpZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhYmxlLCBOQU1FLCBJdGVyYXRvckNvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuXG4gIHZhciBnZXRJdGVyYXRpb25NZXRob2QgPSBmdW5jdGlvbiAoS0lORCkge1xuICAgIGlmIChLSU5EID09PSBERUZBVUxUICYmIGRlZmF1bHRJdGVyYXRvcikgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjtcbiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdO1xuICAgIHN3aXRjaCAoS0lORCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgRU5UUklFUzogcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzKTsgfTtcbiAgfTtcblxuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlO1xuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXVxuICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ11cbiAgICB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdO1xuICB2YXIgZGVmYXVsdEl0ZXJhdG9yID0gIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgbmF0aXZlSXRlcmF0b3IgfHwgZ2V0SXRlcmF0aW9uTWV0aG9kKERFRkFVTFQpO1xuICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7XG4gIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTtcblxuICAvLyBmaXggbmF0aXZlXG4gIGlmIChhbnlOYXRpdmVJdGVyYXRvcikge1xuICAgIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFueU5hdGl2ZUl0ZXJhdG9yLmNhbGwobmV3IEl0ZXJhYmxlKCkpKTtcbiAgICBpZiAoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICBpZiAoIUlTX1BVUkUgJiYgZ2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlKSAhPT0gSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FsbGFibGUoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSkpIHtcbiAgICAgICAgICByZWRlZmluZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheS5wcm90b3R5cGUueyB2YWx1ZXMsIEBAaXRlcmF0b3IgfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIGlmICghSVNfUFVSRSAmJiBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCAnbmFtZScsIFZBTFVFUyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBjYWxsKG5hdGl2ZUl0ZXJhdG9yLCB0aGlzKTsgfTtcbiAgICB9XG4gIH1cblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IsIHsgbmFtZTogREVGQVVMVCB9KTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIERldGVjdCBJRTgncyBpbmNvbXBsZXRlIGRlZmluZVByb3BlcnR5IGltcGxlbWVudGF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCc7XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC9pcGFkfGlwaG9uZXxpcG9kL2kudGVzdCh1c2VyQWdlbnQpICYmIGdsb2JhbC5QZWJibGUgIT09IHVuZGVmaW5lZDtcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvKD86aXBhZHxpcGhvbmV8aXBvZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3NvZihnbG9iYWwucHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC93ZWIwcyg/IS4qY2hyb21lKS9pLnRlc3QodXNlckFnZW50KTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ25hdmlnYXRvcicsICd1c2VyQWdlbnQnKSB8fCAnJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGVubyA9IGdsb2JhbC5EZW5vO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zIHx8IERlbm8gJiYgRGVuby52ZXJzaW9uO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7XG52YXIgbWF0Y2gsIHZlcnNpb247XG5cbmlmICh2OCkge1xuICBtYXRjaCA9IHY4LnNwbGl0KCcuJyk7XG4gIC8vIGluIG9sZCBDaHJvbWUsIHZlcnNpb25zIG9mIFY4IGlzbid0IFY4ID0gQ2hyb21lIC8gMTBcbiAgLy8gYnV0IHRoZWlyIGNvcnJlY3QgdmVyc2lvbnMgYXJlIG5vdCBpbnRlcmVzdGluZyBmb3IgdXNcbiAgdmVyc2lvbiA9IG1hdGNoWzBdID4gMCAmJiBtYXRjaFswXSA8IDQgPyAxIDogKyhtYXRjaFswXSArIG1hdGNoWzFdKTtcbn1cblxuLy8gQnJvd3NlckZTIE5vZGVKUyBgcHJvY2Vzc2AgcG9seWZpbGwgaW5jb3JyZWN0bHkgc2V0IGAudjhgIHRvIGAwLjBgXG4vLyBzbyBjaGVjayBgdXNlckFnZW50YCBldmVuIGlmIGAudjhgIGV4aXN0cywgYnV0IDBcbmlmICghdmVyc2lvbiAmJiB1c2VyQWdlbnQpIHtcbiAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkge1xuICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSArbWF0Y2hbMV07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1IsIE1FVEhPRCkge1xuICByZXR1cm4gdW5jdXJyeVRoaXMoZ2xvYmFsW0NPTlNUUlVDVE9SXS5wcm90b3R5cGVbTUVUSE9EXSk7XG59O1xuIiwiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgZXJyb3IgPSBFcnJvcignYScpO1xuICBpZiAoISgnc3RhY2snIGluIGVycm9yKSkgcmV0dXJuIHRydWU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdzdGFjaycsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCA3KSk7XG4gIHJldHVybiBlcnJvci5zdGFjayAhPT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuICBvcHRpb25zLm5hbWUgICAgICAgIC0gdGhlIC5uYW1lIG9mIHRoZSBmdW5jdGlvbiBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUga2V5XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlLCBlcy9uby1vYmplY3QtcHJldmVudGV4dGVuc2lvbnMgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbiIsInZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBhcHBseSA9IEZ1bmN0aW9uUHJvdG90eXBlLmFwcGx5O1xudmFyIGJpbmQgPSBGdW5jdGlvblByb3RvdHlwZS5iaW5kO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tcmVmbGVjdCAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBSZWZsZWN0ID09ICdvYmplY3QnICYmIFJlZmxlY3QuYXBwbHkgfHwgKGJpbmQgPyBjYWxsLmJpbmQoYXBwbHkpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShhcHBseSwgYXJndW1lbnRzKTtcbn0pO1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG5cbnZhciBiaW5kID0gdW5jdXJyeVRoaXModW5jdXJyeVRoaXMuYmluZCk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQpIHtcbiAgYUNhbGxhYmxlKGZuKTtcbiAgcmV0dXJuIHRoYXQgPT09IHVuZGVmaW5lZCA/IGZuIDogYmluZCA/IGJpbmQoZm4sIHRoYXQpIDogZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJ2YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbGwuYmluZCA/IGNhbGwuYmluZChjYWxsKSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoY2FsbCwgYXJndW1lbnRzKTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcbiIsInZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBiaW5kID0gRnVuY3Rpb25Qcm90b3R5cGUuYmluZDtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcbnZhciBjYWxsQmluZCA9IGJpbmQgJiYgYmluZC5iaW5kKGNhbGwpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQgPyBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuICYmIGNhbGxCaW5kKGNhbGwsIGZuKTtcbn0gOiBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuICYmIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2FsbC5hcHBseShmbiwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNDYWxsYWJsZShhcmd1bWVudCkgPyBhcmd1bWVudCA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSkgOiBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gZ2V0TWV0aG9kKGl0LCBJVEVSQVRPUilcbiAgICB8fCBnZXRNZXRob2QoaXQsICdAQGl0ZXJhdG9yJylcbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsIHVzaW5nSXRlcmF0b3IpIHtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBnZXRJdGVyYXRvck1ldGhvZChhcmd1bWVudCkgOiB1c2luZ0l0ZXJhdG9yO1xuICBpZiAoYUNhbGxhYmxlKGl0ZXJhdG9yTWV0aG9kKSkgcmV0dXJuIGFuT2JqZWN0KGNhbGwoaXRlcmF0b3JNZXRob2QsIGFyZ3VtZW50KSk7XG4gIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xufTtcbiIsInZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFDYWxsYWJsZShmdW5jKTtcbn07XG4iLCJ2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSB1bmN1cnJ5VGhpcyh7fS5oYXNPd25Qcm9wZXJ0eSk7XG5cbi8vIGBIYXNPd25Qcm9wZXJ0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWhhc293bnByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5oYXNPd24gfHwgZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5KHRvT2JqZWN0KGl0KSwga2V5KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH1cbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG52YXIgc3BsaXQgPSB1bmN1cnJ5VGhpcygnJy5zcGxpdCk7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0KGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiIsInZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gbWFrZXMgc3ViY2xhc3Npbmcgd29yayBjb3JyZWN0IGZvciB3cmFwcGVkIGJ1aWx0LWluc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJHRoaXMsIGR1bW15LCBXcmFwcGVyKSB7XG4gIHZhciBOZXdUYXJnZXQsIE5ld1RhcmdldFByb3RvdHlwZTtcbiAgaWYgKFxuICAgIC8vIGl0IGNhbiB3b3JrIG9ubHkgd2l0aCBuYXRpdmUgYHNldFByb3RvdHlwZU9mYFxuICAgIHNldFByb3RvdHlwZU9mICYmXG4gICAgLy8gd2UgaGF2ZW4ndCBjb21wbGV0ZWx5IGNvcnJlY3QgcHJlLUVTNiB3YXkgZm9yIGdldHRpbmcgYG5ldy50YXJnZXRgLCBzbyB1c2UgdGhpc1xuICAgIGlzQ2FsbGFibGUoTmV3VGFyZ2V0ID0gZHVtbXkuY29uc3RydWN0b3IpICYmXG4gICAgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmXG4gICAgaXNPYmplY3QoTmV3VGFyZ2V0UHJvdG90eXBlID0gTmV3VGFyZ2V0LnByb3RvdHlwZSkgJiZcbiAgICBOZXdUYXJnZXRQcm90b3R5cGUgIT09IFdyYXBwZXIucHJvdG90eXBlXG4gICkgc2V0UHJvdG90eXBlT2YoJHRoaXMsIE5ld1RhcmdldFByb3RvdHlwZSk7XG4gIHJldHVybiAkdGhpcztcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHVuY3VycnlUaGlzKEZ1bmN0aW9uLnRvU3RyaW5nKTtcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGBjb3JlLWpzQDMuNC4xLTMuNC40YCwgc28gd2UgY2FuJ3QgdXNlIGBzaGFyZWRgIGhlbHBlclxuaWYgKCFpc0NhbGxhYmxlKHN0b3JlLmluc3BlY3RTb3VyY2UpKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZyhpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbi8vIGBJbnN0YWxsRXJyb3JDYXVzZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtZXJyb3ItY2F1c2UvI3NlYy1lcnJvcm9iamVjdHMtaW5zdGFsbC1lcnJvci1jYXVzZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NhdXNlJyBpbiBvcHRpb25zKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sICdjYXVzZScsIG9wdGlvbnMuY2F1c2UpO1xuICB9XG59O1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xuXG52YXIgUkVRVUlSRUQgPSBmYWxzZTtcbnZhciBNRVRBREFUQSA9IHVpZCgnbWV0YScpO1xudmFyIGlkID0gMDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgaWQrKywgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIFJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhc093bihpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBlbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gIG1ldGEuZW5hYmxlID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuICBSRVFVSVJFRCA9IHRydWU7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mO1xuICB2YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdGVzdFtNRVRBREFUQV0gPSAxO1xuXG4gIC8vIHByZXZlbnQgZXhwb3Npbmcgb2YgbWV0YWRhdGEga2V5XG4gIGlmIChnZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QpLmxlbmd0aCkge1xuICAgIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGZ1bmN0aW9uIChpdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocmVzdWx0W2ldID09PSBNRVRBREFUQSkge1xuICAgICAgICAgIHNwbGljZShyZXN1bHQsIGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlLmZcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZW5hYmxlOiBlbmFibGUsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5oaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7XG4iLCJ2YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCA9ICdPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQIHx8IHNoYXJlZC5zdGF0ZSkge1xuICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpO1xuICB2YXIgd21nZXQgPSB1bmN1cnJ5VGhpcyhzdG9yZS5nZXQpO1xuICB2YXIgd21oYXMgPSB1bmN1cnJ5VGhpcyhzdG9yZS5oYXMpO1xuICB2YXIgd21zZXQgPSB1bmN1cnJ5VGhpcyhzdG9yZS5zZXQpO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHdtaGFzKHN0b3JlLCBpdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHdtc2V0KHN0b3JlLCBpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtZ2V0KHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcyhzdG9yZSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoaGFzT3duKGl0LCBTVEFURSkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzT3duKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmd1bWVudCkge1xuICByZXR1cm4gY2xhc3NvZihhcmd1bWVudCkgPT0gJ0FycmF5Jztcbn07XG4iLCIvLyBgSXNDYWxsYWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIGVtcHR5ID0gW107XG52YXIgY29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcbnZhciBjb25zdHJ1Y3RvclJlZ0V4cCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi87XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGNvbnN0cnVjdG9yUmVnRXhwLmV4ZWMpO1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSAhY29uc3RydWN0b3JSZWdFeHAuZXhlYyhub29wKTtcblxudmFyIGlzQ29uc3RydWN0b3JNb2Rlcm4gPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKCFpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0cnVjdChub29wLCBlbXB0eSwgYXJndW1lbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIGlzQ29uc3RydWN0b3JMZWdhY3kgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKCFpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGZhbHNlO1xuICBzd2l0Y2ggKGNsYXNzb2YoYXJndW1lbnQpKSB7XG4gICAgY2FzZSAnQXN5bmNGdW5jdGlvbic6XG4gICAgY2FzZSAnR2VuZXJhdG9yRnVuY3Rpb24nOlxuICAgIGNhc2UgJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nOiByZXR1cm4gZmFsc2U7XG4gICAgLy8gd2UgY2FuJ3QgY2hlY2sgLnByb3RvdHlwZSBzaW5jZSBjb25zdHJ1Y3RvcnMgcHJvZHVjZWQgYnkgLmJpbmQgaGF2ZW4ndCBpdFxuICB9IHJldHVybiBJTkNPUlJFQ1RfVE9fU1RSSU5HIHx8ICEhZXhlYyhjb25zdHJ1Y3RvclJlZ0V4cCwgaW5zcGVjdFNvdXJjZShhcmd1bWVudCkpO1xufTtcblxuLy8gYElzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9ICFjb25zdHJ1Y3QgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGVkO1xuICByZXR1cm4gaXNDb25zdHJ1Y3Rvck1vZGVybihpc0NvbnN0cnVjdG9yTW9kZXJuLmNhbGwpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZTsgfSlcbiAgICB8fCBjYWxsZWQ7XG59KSA/IGlzQ29uc3RydWN0b3JMZWdhY3kgOiBpc0NvbnN0cnVjdG9yTW9kZXJuO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IGlzQ2FsbGFibGUoZGV0ZWN0aW9uKSA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgSXNJbnRlZ3JhbE51bWJlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzaW50ZWdyYWxudW1iZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItaXNpbnRlZ2VyIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuIiwidmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyICRTeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKTtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoJFN5bWJvbCkgJiYgaXNQcm90b3R5cGVPZigkU3ltYm9sLnByb3RvdHlwZSwgT2JqZWN0KGl0KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgUmVzdWx0UHJvdG90eXBlID0gUmVzdWx0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0O1xuICB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiAgdmFyIElTX0lURVJBVE9SID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX0lURVJBVE9SKTtcbiAgdmFyIElOVEVSUlVQVEVEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklOVEVSUlVQVEVEKTtcbiAgdmFyIGZuID0gYmluZCh1bmJvdW5kRnVuY3Rpb24sIHRoYXQpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIHZhciBzdG9wID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgIGlmIChpdGVyYXRvcikgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGNvbmRpdGlvbik7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgY29uZGl0aW9uKTtcbiAgfTtcblxuICB2YXIgY2FsbEZuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKEFTX0VOVFJJRVMpIHtcbiAgICAgIGFuT2JqZWN0KHZhbHVlKTtcbiAgICAgIHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSwgc3RvcCkgOiBmbih2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgIH0gcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWUsIHN0b3ApIDogZm4odmFsdWUpO1xuICB9O1xuXG4gIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICghaXRlckZuKSB0aHJvdyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoaXRlcmFibGUpICsgJyBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9yc1xuICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGl0ZXJhYmxlKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gY2FsbEZuKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgaXNQcm90b3R5cGVPZihSZXN1bHRQcm90b3R5cGUsIHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihpdGVyYWJsZSwgaXRlckZuKTtcbiAgfVxuXG4gIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuIiwidmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBraW5kLCB2YWx1ZSkge1xuICB2YXIgaW5uZXJSZXN1bHQsIGlubmVyRXJyb3I7XG4gIGFuT2JqZWN0KGl0ZXJhdG9yKTtcbiAgdHJ5IHtcbiAgICBpbm5lclJlc3VsdCA9IGdldE1ldGhvZChpdGVyYXRvciwgJ3JldHVybicpO1xuICAgIGlmICghaW5uZXJSZXN1bHQpIHtcbiAgICAgIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaW5uZXJSZXN1bHQgPSBjYWxsKGlubmVyUmVzdWx0LCBpdGVyYXRvcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW5uZXJFcnJvciA9IHRydWU7XG4gICAgaW5uZXJSZXN1bHQgPSBlcnJvcjtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rocm93JykgdGhyb3cgdmFsdWU7XG4gIGlmIChpbm5lckVycm9yKSB0aHJvdyBpbm5lclJlc3VsdDtcbiAgYW5PYmplY3QoaW5uZXJSZXN1bHQpO1xuICByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9IEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXN0ID0ge307XG4gIC8vIEZGNDQtIGxlZ2FjeSBpdGVyYXRvcnMgY2FzZVxuICByZXR1cm4gSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdLmNhbGwodGVzdCkgIT09IHRlc3Q7XG59KTtcblxuaWYgKE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5lbHNlIGlmIChJU19QVVJFKSBJdGVyYXRvclByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLUBAaXRlcmF0b3JcbmlmICghaXNDYWxsYWJsZShJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gIHJlZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBMZW5ndGhPZkFycmF5TGlrZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWxlbmd0aG9mYXJyYXlsaWtlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRvTGVuZ3RoKG9iai5sZW5ndGgpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcbnZhciBJU19JT1NfUEVCQkxFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MtcGViYmxlJyk7XG52YXIgSVNfV0VCT1NfV0VCS0lUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbi8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2BcbnZhciBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAncXVldWVNaWNyb3Rhc2snKTtcbnZhciBxdWV1ZU1pY3JvdGFzayA9IHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciAmJiBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IudmFsdWU7XG5cbnZhciBmbHVzaCwgaGVhZCwgbGFzdCwgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47XG5cbi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kXG5pZiAoIXF1ZXVlTWljcm90YXNrKSB7XG4gIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChJU19OT0RFICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIC8vIGFsc28gZXhjZXB0IFdlYk9TIFdlYmtpdCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODk4XG4gIGlmICghSVNfSU9TICYmICFJU19OT0RFICYmICFJU19XRUJPU19XRUJLSVQgJiYgTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudCkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKCFJU19JT1NfUEVCQkxFICYmIFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgLy8gd29ya2Fyb3VuZCBvZiBXZWJLaXQgfiBpT1MgU2FmYXJpIDEwLjEgYnVnXG4gICAgcHJvbWlzZS5jb25zdHJ1Y3RvciA9IFByb21pc2U7XG4gICAgdGhlbiA9IGJpbmQocHJvbWlzZS50aGVuLCBwcm9taXNlKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBOb2RlLmpzIHdpdGhvdXQgcHJvbWlzZXNcbiAgfSBlbHNlIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5iaW5kKGdsb2JhbClcbiAgICBtYWNyb3Rhc2sgPSBiaW5kKG1hY3JvdGFzaywgZ2xvYmFsKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBtYWNyb3Rhc2soZmx1c2gpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBxdWV1ZU1pY3JvdGFzayB8fCBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICBpZiAoIWhlYWQpIHtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlO1xuIiwiLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8vIGBnZXQtb3duLXByb3BlcnR5LXN5bWJvbHNgIHBvbHlmaWxsIHN5bWJvbHMgY29udmVydGVkIHRvIG9iamVjdCBhcmUgbm90IFN5bWJvbCBpbnN0YW5jZXNcbiAgcmV0dXJuICFTdHJpbmcoc3ltYm9sKSB8fCAhKE9iamVjdChzeW1ib2wpIGluc3RhbmNlb2YgU3ltYm9sKSB8fFxuICAgIC8vIENocm9tZSAzOC00MCBzeW1ib2xzIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gRE9NIGNvbGxlY3Rpb25zIHByb3RvdHlwZXMgdG8gaW5zdGFuY2VzXG4gICAgIVN5bWJvbC5zaGFtICYmIFY4X1ZFUlNJT04gJiYgVjhfVkVSU0lPTiA8IDQxO1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNDYWxsYWJsZShXZWFrTWFwKSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoaW5zcGVjdFNvdXJjZShXZWFrTWFwKSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFDYWxsYWJsZShyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhQ2FsbGFibGUocmVqZWN0KTtcbn07XG5cbi8vIGBOZXdQcm9taXNlQ2FwYWJpbGl0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5ld3Byb21pc2VjYXBhYmlsaXR5XG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCAkZGVmYXVsdCkge1xuICByZXR1cm4gYXJndW1lbnQgPT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gJycgOiAkZGVmYXVsdCA6IHRvU3RyaW5nKGFyZ3VtZW50KTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgbiRQYXJzZUZsb2F0ID0gZ2xvYmFsLnBhcnNlRmxvYXQ7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBJVEVSQVRPUiA9IFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRk9SQ0VEID0gMSAvIG4kUGFyc2VGbG9hdCh3aGl0ZXNwYWNlcyArICctMCcpICE9PSAtSW5maW5pdHlcbiAgLy8gTVMgRWRnZSAxOC0gYnJva2VuIHdpdGggYm94ZWQgc3ltYm9sc1xuICB8fCAoSVRFUkFUT1IgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsgbiRQYXJzZUZsb2F0KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHJpbmcpIHtcbiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICB2YXIgcmVzdWx0ID0gbiRQYXJzZUZsb2F0KHRyaW1tZWRTdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIGNoYXJBdCh0cmltbWVkU3RyaW5nLCAwKSA9PSAnLScgPyAtMCA6IHJlc3VsdDtcbn0gOiBuJFBhcnNlRmxvYXQ7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyICRwYXJzZUludCA9IGdsb2JhbC5wYXJzZUludDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBoZXggPSAvXlsrLV0/MHgvaTtcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoaGV4LmV4ZWMpO1xudmFyIEZPUkNFRCA9ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcweDE2JykgIT09IDIyXG4gIC8vIE1TIEVkZ2UgMTgtIGJyb2tlbiB3aXRoIGJveGVkIHN5bWJvbHNcbiAgfHwgKElURVJBVE9SICYmICFmYWlscyhmdW5jdGlvbiAoKSB7ICRwYXJzZUludChPYmplY3QoSVRFUkFUT1IpKTsgfSkpO1xuXG4vLyBgcGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWludC1zdHJpbmctcmFkaXhcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCkge1xuICB2YXIgUyA9IHRyaW0odG9TdHJpbmcoc3RyaW5nKSk7XG4gIHJldHVybiAkcGFyc2VJbnQoUywgKHJhZGl4ID4+PiAwKSB8fCAoZXhlYyhoZXgsIFMpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHNhZmVcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgJGFzc2lnbih7IGI6IDEgfSwgJGFzc2lnbihkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHNhZmVcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChvYmplY3RLZXlzKFMpLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZSwgUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwiLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3QgLS0gb2xkIElFLCBXU0ggKi9cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7IC8vIGF2b2lkIG1lbW9yeSBsZWFrXG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBhY3RpdmVYRG9jdW1lbnQgPSBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogaWdub3JlICovIH1cbiAgTnVsbFByb3RvT2JqZWN0ID0gdHlwZW9mIGRvY3VtZW50ICE9ICd1bmRlZmluZWQnXG4gICAgPyBkb2N1bWVudC5kb21haW4gJiYgYWN0aXZlWERvY3VtZW50XG4gICAgICA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSAvLyBvbGQgSUVcbiAgICAgIDogTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lKClcbiAgICA6IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KTsgLy8gV1NIXG4gIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dO1xuICByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIgcHJvcHMgPSB0b0luZGV4ZWRPYmplY3QoUHJvcGVydGllcyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5ID0ga2V5c1tpbmRleCsrXSwgcHJvcHNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRkZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhc093bihPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLCBPLCBQKSwgT1tQXSk7XG59O1xuIiwiLyogZXNsaW50LWRpc2FibGUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZSAqL1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpLmY7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gYXJyYXlTbGljZSh3aW5kb3dOYW1lcyk7XG4gIH1cbn07XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiBjbGFzc29mKGl0KSA9PSAnV2luZG93J1xuICAgID8gZ2V0V2luZG93TmFtZXMoaXQpXG4gICAgOiAkZ2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTtcbn07XG4iLCJ2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG52YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIHZhciBvYmplY3QgPSB0b09iamVjdChPKTtcbiAgaWYgKGhhc093bihvYmplY3QsIElFX1BST1RPKSkgcmV0dXJuIG9iamVjdFtJRV9QUk9UT107XG4gIHZhciBjb25zdHJ1Y3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGlzQ2FsbGFibGUoY29uc3RydWN0b3IpICYmIG9iamVjdCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pICFoYXNPd24oaGlkZGVuS2V5cywga2V5KSAmJiBoYXNPd24oTywga2V5KSAmJiBwdXNoKHJlc3VsdCwga2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhc093bihPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCBwdXNoKHJlc3VsdCwga2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWtleXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAtLSBzYWZlICovXG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICBzZXR0ZXIgPSB1bmN1cnJ5VGhpcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQpO1xuICAgIHNldHRlcih0ZXN0LCBbXSk7XG4gICAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgYW5PYmplY3QoTyk7XG4gICAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTtcbiAgICBpZiAoQ09SUkVDVF9TRVRURVIpIHNldHRlcihPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKS5mO1xuXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSB1bmN1cnJ5VGhpcygkcHJvcGVydHlJc0VudW1lcmFibGUpO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxuLy8gYE9iamVjdC57IGVudHJpZXMsIHZhbHVlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRPX0VOVFJJRVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IG9iamVjdEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAga2V5ID0ga2V5c1tpKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZShPLCBrZXkpKSB7XG4gICAgICAgIHB1c2gocmVzdWx0LCBUT19FTlRSSUVTID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYE9iamVjdC5lbnRyaWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuICBlbnRyaWVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBPYmplY3QudmFsdWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QudmFsdWVzXG4gIHZhbHVlczogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyB7fS50b1N0cmluZyA6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgT3JkaW5hcnlUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAocHJlZiA9PT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKGlzQ2FsbGFibGUoZm4gPSBpbnB1dC52YWx1ZU9mKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBjb25jYXQoa2V5cywgZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZScpLkNPTkZJR1VSQUJMRTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICB2YXIgbmFtZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5uYW1lICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5hbWUgOiBrZXk7XG4gIHZhciBzdGF0ZTtcbiAgaWYgKGlzQ2FsbGFibGUodmFsdWUpKSB7XG4gICAgaWYgKFN0cmluZyhuYW1lKS5zbGljZSgwLCA3KSA9PT0gJ1N5bWJvbCgnKSB7XG4gICAgICBuYW1lID0gJ1snICsgU3RyaW5nKG5hbWUpLnJlcGxhY2UoL15TeW1ib2xcXCgoW14pXSopXFwpLywgJyQxJykgKyAnXSc7XG4gICAgfVxuICAgIGlmICghaGFzT3duKHZhbHVlLCAnbmFtZScpIHx8IChDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSAmJiB2YWx1ZS5uYW1lICE9PSBuYW1lKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIG5hbWUpO1xuICAgIH1cbiAgICBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgICBpZiAoIXN0YXRlLnNvdXJjZSkge1xuICAgICAgc3RhdGUuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyA/IG5hbWUgOiAnJyk7XG4gICAgfVxuICB9XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIHNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXVuc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gIH0gZWxzZSBpZiAoIW5vVGFyZ2V0R2V0ICYmIE9ba2V5XSkge1xuICAgIHNpbXBsZSA9IHRydWU7XG4gIH1cbiAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gIGVsc2UgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gaXNDYWxsYWJsZSh0aGlzKSAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpO1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxuLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7XG4gIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmIENvbnN0cnVjdG9yICYmICFDb25zdHJ1Y3RvcltTUEVDSUVTXSkge1xuICAgIGRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzT3duKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG4iLCJ2YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4xOS4wJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDIxIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY29uc3RydWN0b3InKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFDb25zdHJ1Y3RvcihTKTtcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlck9ySW5maW5pdHkocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gY2hhckNvZGVBdChTLCBwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gY2hhckF0KFMsIHBvc2l0aW9uKVxuICAgICAgICAgIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gc3RyaW5nU2xpY2UoUywgcG9zaXRpb24sIHBvc2l0aW9uICsgMilcbiAgICAgICAgICA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIHdoaXRlc3BhY2UgPSAnWycgKyB3aGl0ZXNwYWNlcyArICddJztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyB3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJyk7XG52YXIgcnRyaW0gPSBSZWdFeHAod2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKiQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltLCB0cmltU3RhcnQsIHRyaW1FbmQsIHRyaW1MZWZ0LCB0cmltUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMpIHtcbiAgICB2YXIgc3RyaW5nID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIGlmIChUWVBFICYgMSkgc3RyaW5nID0gcmVwbGFjZShzdHJpbmcsIGx0cmltLCAnJyk7XG4gICAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgcnRyaW0sICcnKTtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUxlZnQsIHRyaW1TdGFydCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltUmlnaHQsIHRyaW1FbmQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuICBlbmQ6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4gIHRyaW06IGNyZWF0ZU1ldGhvZCgzKVxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcblxudmFyIHNldCA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIEZ1bmN0aW9uID0gZ2xvYmFsLkZ1bmN0aW9uO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBsb2NhdGlvbiwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbnRyeSB7XG4gIC8vIERlbm8gdGhyb3dzIGEgUmVmZXJlbmNlRXJyb3Igb24gYGxvY2F0aW9uYCBhY2Nlc3Mgd2l0aG91dCBgLS1sb2NhdGlvbmAgZmxhZ1xuICBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICBpZiAoaGFzT3duKHF1ZXVlLCBpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4oZXZlbnQuZGF0YSk7XG59O1xuXG52YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW5cbiAgZ2xvYmFsLnBvc3RNZXNzYWdlKFN0cmluZyhpZCksIGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDEpO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBhcHBseShpc0NhbGxhYmxlKGZuKSA/IGZuIDogRnVuY3Rpb24oZm4pLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKElTX05PREUpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjRcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCAmJiAhSVNfSU9TKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJlxuICAgIGlzQ2FsbGFibGUoZ2xvYmFsLnBvc3RNZXNzYWdlKSAmJlxuICAgICFnbG9iYWwuaW1wb3J0U2NyaXB0cyAmJlxuICAgIGxvY2F0aW9uICYmIGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKHBvc3QpXG4gICkge1xuICAgIGRlZmVyID0gcG9zdDtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwidmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsInZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIHNhZmVcbiAgcmV0dXJuIG51bWJlciAhPT0gbnVtYmVyIHx8IG51bWJlciA9PT0gMCA/IDAgOiAobnVtYmVyID4gMCA/IGZsb29yIDogY2VpbCkobnVtYmVyKTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyT3JJbmZpbml0eShhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBleG90aWNUb1ByaW0gPSBnZXRNZXRob2QoaW5wdXQsIFRPX1BSSU1JVElWRSk7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChleG90aWNUb1ByaW0pIHtcbiAgICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ2RlZmF1bHQnO1xuICAgIHJlc3VsdCA9IGNhbGwoZXhvdGljVG9QcmltLCBpbnB1dCwgcHJlZik7XG4gICAgaWYgKCFpc09iamVjdChyZXN1bHQpIHx8IGlzU3ltYm9sKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICB9XG4gIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnbnVtYmVyJztcbiAgcmV0dXJuIG9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIHByZWYpO1xufTtcbiIsInZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcblxuLy8gYFRvUHJvcGVydHlLZXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3Byb3BlcnR5a2V5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsICdzdHJpbmcnKTtcbiAgcmV0dXJuIGlzU3ltYm9sKGtleSkgPyBrZXkgOiBrZXkgKyAnJztcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG5cbnZhciBTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoY2xhc3NvZihhcmd1bWVudCkgPT09ICdTeW1ib2wnKSB0aHJvdyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIHJldHVybiBTdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB0cnkge1xuICAgIHJldHVybiBTdHJpbmcoYXJndW1lbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKDEuMC50b1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArIHRvU3RyaW5nKCsraWQgKyBwb3N0Zml4LCAzNik7XG59O1xuIiwiLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTFxuICAmJiAhU3ltYm9sLnNoYW1cbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgc3ltYm9sRm9yID0gU3ltYm9sICYmIFN5bWJvbFsnZm9yJ107XG52YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzT3duKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkgfHwgIShOQVRJVkVfU1lNQk9MIHx8IHR5cGVvZiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPT0gJ3N0cmluZycpKSB7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gJ1N5bWJvbC4nICsgbmFtZTtcbiAgICBpZiAoTkFUSVZFX1NZTUJPTCAmJiBoYXNPd24oU3ltYm9sLCBuYW1lKSkge1xuICAgICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gU3ltYm9sW25hbWVdO1xuICAgIH0gZWxzZSBpZiAoVVNFX1NZTUJPTF9BU19VSUQgJiYgc3ltYm9sRm9yKSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBzeW1ib2xGb3IoZGVzY3JpcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcbiIsIi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzXG5tb2R1bGUuZXhwb3J0cyA9ICdcXHUwMDA5XFx1MDAwQVxcdTAwMEJcXHUwMDBDXFx1MDAwRFxcdTAwMjBcXHUwMEEwXFx1MTY4MFxcdTIwMDBcXHUyMDAxXFx1MjAwMicgK1xuICAnXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGNsZWFyRXJyb3JTdGFjayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGVhci1lcnJvci1zdGFjaycpO1xudmFyIGluc3RhbGxFcnJvckNhdXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBub3JtYWxpemVTdHJpbmdBcmd1bWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50Jyk7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUnKTtcblxudmFyIEVycm9yID0gZ2xvYmFsLkVycm9yO1xudmFyIHB1c2ggPSBbXS5wdXNoO1xuXG52YXIgJEFnZ3JlZ2F0ZUVycm9yID0gZnVuY3Rpb24gQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlIC8qICwgb3B0aW9ucyAqLykge1xuICB2YXIgdGhhdCA9IGlzUHJvdG90eXBlT2YoQWdncmVnYXRlRXJyb3JQcm90b3R5cGUsIHRoaXMpID8gdGhpcyA6IGNyZWF0ZShBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSk7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIHRoYXQgPSBzZXRQcm90b3R5cGVPZihuZXcgRXJyb3IodW5kZWZpbmVkKSwgZ2V0UHJvdG90eXBlT2YodGhhdCkpO1xuICB9XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCAnbWVzc2FnZScsIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KG1lc3NhZ2UsICcnKSk7XG4gIGlmIChFUlJPUl9TVEFDS19JTlNUQUxMQUJMRSkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdzdGFjaycsIGNsZWFyRXJyb3JTdGFjayh0aGF0LnN0YWNrLCAxKSk7XG4gIGluc3RhbGxFcnJvckNhdXNlKHRoYXQsIG9wdGlvbnMpO1xuICB2YXIgZXJyb3JzQXJyYXkgPSBbXTtcbiAgaXRlcmF0ZShlcnJvcnMsIHB1c2gsIHsgdGhhdDogZXJyb3JzQXJyYXkgfSk7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCAnZXJyb3JzJywgZXJyb3JzQXJyYXkpO1xuICByZXR1cm4gdGhhdDtcbn07XG5cbmlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoJEFnZ3JlZ2F0ZUVycm9yLCBFcnJvcik7XG5lbHNlIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoJEFnZ3JlZ2F0ZUVycm9yLCBFcnJvcik7XG5cbnZhciBBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSA9ICRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUgPSBjcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJEFnZ3JlZ2F0ZUVycm9yKSxcbiAgbWVzc2FnZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICcnKSxcbiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICdBZ2dyZWdhdGVFcnJvcicpXG59KTtcblxuLy8gYEFnZ3JlZ2F0ZUVycm9yYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZ2dyZWdhdGUtZXJyb3ItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUgfSwge1xuICBBZ2dyZWdhdGVFcnJvcjogJEFnZ3JlZ2F0ZUVycm9yXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbmQ7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIEZJTkQgPSAnZmluZCc7XG52YXIgU0tJUFNfSE9MRVMgPSB0cnVlO1xuXG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYgKEZJTkQgaW4gW10pIEFycmF5KDEpW0ZJTkRdKGZ1bmN0aW9uICgpIHsgU0tJUFNfSE9MRVMgPSBmYWxzZTsgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcyhGSU5EKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZnJvbScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhYmxlKTtcbn0pO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBNYXBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC1vYmplY3RzXG5jb2xsZWN0aW9uKCdNYXAnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ3JhbE51bWJlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1pbnRlZ3JhbC1udW1iZXInKTtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNpbnRlZ2VyXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzSW50ZWdlcjogaXNJbnRlZ3JhbE51bWJlclxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE51bWJlci5pc05hTmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc25hblxuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdCcpO1xuXG4vLyBgTnVtYmVyLnBhcnNlRmxvYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIucGFyc2VGbG9hdFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1wYXJzZWZsb2F0IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBOdW1iZXIucGFyc2VGbG9hdCAhPSBwYXJzZUZsb2F0IH0sIHtcbiAgcGFyc2VGbG9hdDogcGFyc2VGbG9hdFxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBwYXJzZUludCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50Jyk7XG5cbi8vIGBOdW1iZXIucGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIucGFyc2VpbnRcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItcGFyc2VpbnQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUludCAhPSBwYXJzZUludCB9LCB7XG4gIHBhcnNlSW50OiBwYXJzZUludFxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwge1xuICBhc3NpZ246IGFzc2lnblxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXknKS5lbnRyaWVzO1xuXG4vLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHtcbiAgICByZXR1cm4gJGVudHJpZXMoTyk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBzZXRQcm90b3R5cGVPZjogc2V0UHJvdG90eXBlT2Zcbn0pO1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5pZiAoIVRPX1NUUklOR19UQUdfU1VQUE9SVCkge1xuICByZWRlZmluZShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCB0b1N0cmluZywgeyB1bnNhZmU6IHRydWUgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFByb21pc2UuYWxsU2V0dGxlZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsc2V0dGxlZFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgYWxsU2V0dGxlZDogZnVuY3Rpb24gYWxsU2V0dGxlZChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uOiBlcnJvciB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbnZhciBQUk9NSVNFX0FOWV9FUlJPUiA9ICdObyBvbmUgcHJvbWlzZSByZXNvbHZlZCc7XG5cbi8vIGBQcm9taXNlLmFueWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYW55XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbnk6IGZ1bmN0aW9uIGFueShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgQWdncmVnYXRlRXJyb3IgPSBnZXRCdWlsdEluKCdBZ2dyZWdhdGVFcnJvcicpO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIHZhciBhbHJlYWR5UmVzb2x2ZWQgPSBmYWxzZTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlSZWplY3RlZCA9IGZhbHNlO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgY2FsbChwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvcnNbaW5kZXhdID0gZXJyb3I7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFBST01JU0VfQU5ZX0VSUk9SKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxuLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5XG52YXIgTk9OX0dFTkVSSUMgPSAhIU5hdGl2ZVByb21pc2UgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICBOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogTk9OX0dFTkVSSUMgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gaXNDYWxsYWJsZShvbkZpbmFsbHkpO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjZmluYWxseWAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddO1xuICBpZiAoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSAhPT0gbWV0aG9kKSB7XG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICdmaW5hbGx5JywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgTmF0aXZlUHJvbWlzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3RvcicpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWljcm90YXNrJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgaG9zdFJlcG9ydEVycm9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX0JST1dTRVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXInKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG5cbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoUFJPTUlTRSk7XG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2UgJiYgTmF0aXZlUHJvbWlzZS5wcm90b3R5cGU7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yID0gTmF0aXZlUHJvbWlzZTtcbnZhciBQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZVByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG5cbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbC5kaXNwYXRjaEV2ZW50KTtcbnZhciBOQVRJVkVfUkVKRUNUSU9OX0VWRU5UID0gaXNDYWxsYWJsZShnbG9iYWwuUHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcbnZhciBTVUJDTEFTU0lORyA9IGZhbHNlO1xuXG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlciwgbmF0aXZlVGhlbjtcblxudmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFID0gaW5zcGVjdFNvdXJjZShQcm9taXNlQ29uc3RydWN0b3IpO1xuICB2YXIgR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSA9IFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFICE9PSBTdHJpbmcoUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgLy8gVjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgLy8gV2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFICYmIFY4X1ZFUlNJT04gPT09IDY2KSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgbmVlZCBQcm9taXNlI2ZpbmFsbHkgaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICFQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10pIHJldHVybiB0cnVlO1xuICAvLyBXZSBjYW4ndCB1c2UgQEBzcGVjaWVzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoVjhfVkVSU0lPTiA+PSA1MSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UpKSByZXR1cm4gZmFsc2U7XG4gIC8vIERldGVjdCBjb3JyZWN0bmVzcyBvZiBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2VDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKDEpOyB9KTtcbiAgdmFyIEZha2VQcm9taXNlID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgfTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9O1xuICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICBTVUJDTEFTU0lORyA9IHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIGlmICghU1VCQ0xBU1NJTkcpIHJldHVybiB0cnVlO1xuICAvLyBVbmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gIHJldHVybiAhR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiBJU19CUk9XU0VSICYmICFOQVRJVkVfUkVKRUNUSU9OX0VWRU5UO1xufSk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIFByb21pc2VDb25zdHJ1Y3Rvci5hbGwoaXRlcmFibGUpWydjYXRjaCddKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgaXNDYWxsYWJsZSh0aGVuID0gaXQudGhlbikgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgY2FsbCh0aGVuLCByZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN0YXRlLnJlYWN0aW9ucyA9IFtdO1xuICAgIHN0YXRlLm5vdGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFzdGF0ZS5yZWplY3Rpb24pIG9uVW5oYW5kbGVkKHN0YXRlKTtcbiAgfSk7XG59O1xuXG52YXIgZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBwcm9taXNlLCByZWFzb24pIHtcbiAgdmFyIGV2ZW50LCBoYW5kbGVyO1xuICBpZiAoRElTUEFUQ0hfRVZFTlQpIHtcbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2ZW50LnByb21pc2UgPSBwcm9taXNlO1xuICAgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjtcbiAgICBldmVudC5pbml0RXZlbnQobmFtZSwgZmFsc2UsIHRydWUpO1xuICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSBlbHNlIGV2ZW50ID0geyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHJlYXNvbiB9O1xuICBpZiAoIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQgJiYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGwodGhlbiwgdmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdCh3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRUQpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZVByb3RvdHlwZSk7XG4gICAgYUNhbGxhYmxlKGV4ZWN1dG9yKTtcbiAgICBjYWxsKEludGVybmFsLCB0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgUHJvbWlzZVByb3RvdHlwZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgdHlwZTogUFJPTUlTRSxcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgbm90aWZpZWQ6IGZhbHNlLFxuICAgICAgcGFyZW50OiBmYWxzZSxcbiAgICAgIHJlYWN0aW9uczogW10sXG4gICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgc3RhdGU6IFBFTkRJTkcsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKFByb21pc2VQcm90b3R5cGUsIHtcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgICB2YXIgcmVhY3Rpb25zID0gc3RhdGUucmVhY3Rpb25zO1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgICAgcmVhY3Rpb24ub2sgPSBpc0NhbGxhYmxlKG9uRnVsZmlsbGVkKSA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSBpc0NhbGxhYmxlKG9uUmVqZWN0ZWQpICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgICAgcmVhY3Rpb25zW3JlYWN0aW9ucy5sZW5ndGhdID0gcmVhY3Rpb247XG4gICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZSkgJiYgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLnRoZW47XG5cbiAgICBpZiAoIVNVQkNMQVNTSU5HKSB7XG4gICAgICAvLyBtYWtlIGBQcm9taXNlI3RoZW5gIHJldHVybiBhIHBvbHlmaWxsZWQgYFByb21pc2VgIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgICByZWRlZmluZShOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgY2FsbChuYXRpdmVUaGVuLCB0aGF0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NDBcbiAgICAgIH0sIHsgdW5zYWZlOiB0cnVlIH0pO1xuXG4gICAgICAvLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNjYXRjaGAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG4gICAgICByZWRlZmluZShOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAnY2F0Y2gnLCBQcm9taXNlUHJvdG90eXBlWydjYXRjaCddLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGAuY29uc3RydWN0b3IgPT09IFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICB0cnkge1xuICAgICAgZGVsZXRlIE5hdGl2ZVByb21pc2VQcm90b3R5cGUuY29uc3RydWN0b3I7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gICAgLy8gbWFrZSBgaW5zdGFuY2VvZiBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICBzZXRQcm90b3R5cGVPZihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIGNhbGwoY2FwYWJpbGl0eS5yZWplY3QsIHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIC8vIGBQcm9taXNlLmFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyBgUHJvbWlzZS5yYWNlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJhY2VcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGFyQXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpLmNoYXJBdDtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogdG9TdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSBjaGFyQXQoc3RyaW5nLCBpbmRleCk7XG4gIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIoZnVuY3Rpb24gKCkge1xuICB2YXIgdmFsaWRhdG9yID0gbmV3IFJlZ0V4cChcIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kXCIsIFwiaVwiKTtcblxuICBmdW5jdGlvbiBnZW4oY291bnQpIHtcbiAgICB2YXIgb3V0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpPTA7IGk8Y291bnQ7IGkrKykge1xuICAgICAgb3V0ICs9ICgoKDErTWF0aC5yYW5kb20oKSkqMHgxMDAwMCl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIEd1aWQoZ3VpZCkge1xuICAgIGlmICghZ3VpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXJndW1lbnQ7IGB2YWx1ZWAgaGFzIG5vIHZhbHVlLlwiKTtcbiAgICAgIFxuICAgIHRoaXMudmFsdWUgPSBHdWlkLkVNUFRZO1xuICAgIFxuICAgIGlmIChndWlkICYmIGd1aWQgaW5zdGFuY2VvZiBHdWlkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZC50b1N0cmluZygpO1xuXG4gICAgfSBlbHNlIGlmIChndWlkICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChndWlkKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIiAmJiBHdWlkLmlzR3VpZChndWlkKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIC8vIENvbXBhcmluZyBzdHJpbmcgYHZhbHVlYCBhZ2FpbnN0IHByb3ZpZGVkIGBndWlkYCB3aWxsIGF1dG8tY2FsbFxuICAgICAgLy8gdG9TdHJpbmcgb24gYGd1aWRgIGZvciBjb21wYXJpc29uXG4gICAgICByZXR1cm4gR3VpZC5pc0d1aWQob3RoZXIpICYmIHRoaXMudmFsdWUgPT0gb3RoZXI7XG4gICAgfTtcblxuICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IEd1aWQuRU1QVFk7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIEd1aWQuRU1QVFkgPSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuXG4gIEd1aWQuaXNHdWlkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlIGluc3RhbmNlb2YgR3VpZCB8fCB2YWxpZGF0b3IudGVzdCh2YWx1ZS50b1N0cmluZygpKSk7XG4gIH07XG5cbiAgR3VpZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEd1aWQoW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKSk7XG4gIH07XG5cbiAgR3VpZC5yYXcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKTtcbiAgfTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBHdWlkO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB3aW5kb3cuR3VpZCA9IEd1aWQ7XG4gIH1cbn0pKCk7XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZywgcHJpdmF0ZSBfZmllbGRJZD86IHN0cmluZykge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oKGZpbHRlcnMpID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gdGhpcy5maWVsZElkXG4gICAgICAgID8gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZElkID09PSB0aGlzLmZpZWxkSWQsIHRoaXMpXG4gICAgICAgIDogZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZE5hbWUgPT09IHRoaXMuZmllbGROYW1lLCB0aGlzKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBQYXJhbWV0ZXJzU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZywgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5QYXJhbWV0ZXJDaGFuZ2VkLCBzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXI+IHtcbiAgICAvLyBDYWxsIGRvd24gdG8gb3VyIHNlcnZpY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgYmFjayB2aWEgaXRzIGZpZWxkIG5hbWVcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSkudGhlbigocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ1BhcmFtZXRlciwgYENhbm5vdCBmaW5kIHBhcmFtZXRlcjogJHt0aGlzLl9nbG9iYWxGaWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMuc2hlZXQpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5TdW1tYXJ5RGF0YUNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVFdmVudCB7XG4gIHByaXZhdGUgX3R5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1U2hlZXRFdmVudCB7XG4gIHByaXZhdGUgX3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldDtcblxuICBwdWJsaWMgZ2V0IHNoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzLl9zaGVldCA9IHNoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVdvcmtzaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKHR5cGUsIF93b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Zvcm1hdHRpbmc6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMgTG93LURQSSc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWkgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTWVkaXVtJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZU5hbWVzcGFjZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3dvcmtib29rSWQ/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VySWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVOYW1lc3BhY2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZU5hbWVzcGFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIERhdGFTb3VyY2UsIERhdGFTb3VyY2VJbXBsLCBEYXRhU291cmNlU2VydmljZSwgU2VydmljZU5hbWVzLCBXb3JrYm9va0ltcGwgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgZXh0ZW5kcyBXb3JrYm9va0ltcGwge1xuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goKGRzKSA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyxcbiAgRm9udE5hbWVBbmRJbmZvLFxuICBGb3JtYXR0aW5nU2hlZXQsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFBhcmFtZXRlcklkLFxuICBTaGVldFBhdGgsXG4gIFZlcmJJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBBcGlWZXJzaW9uLFxuICBEYXNoYm9hcmRJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBWaXpTZXJ2aWNlLFxuICBXb3Jrc2hlZXRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi4vTW9kZWxzL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4uL01vZGVscy9Xb3JrYm9vayc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Nb2RlbHMvV29ya3NoZWV0JztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgV29ya3NoZWV0Q29udGVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya3NoZWV0Q29udGVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMsIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVUlTZXJ2aWNlJztcbmltcG9ydCB7XG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMsXG59IGZyb20gJy4vQmVudG9uU2Fuc0ZvbnROYW1lQ29uc3RhbnRzJztcbmltcG9ydCB7IEV4dGVuc2lvbldvcmtib29rSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uV29ya2Jvb2tJbXBsJztcbmltcG9ydCB7IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciB9IGZyb20gJy4vTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyJztcbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4vU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7XG4gIFN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXMsXG4gIFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUJvb2tGb250RmFtaWx5TmFtZSxcbiAgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSxcbiAgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSxcbiAgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1U2VtaWJvbGRGb250RmFtaWx5TmFtZSxcbn0gZnJvbSAnLi9UYWJsZWF1Qm9va0ZvbnROYW1lQ29uc3RhbnRzJztcbmltcG9ydCB7IFVJSW1wbCB9IGZyb20gJy4vVUlJbXBsJztcblxuZXhwb3J0IHR5cGUgQ2FsbGJhY2tNYXAgPSB7IFtrZXk6IHN0cmluZ106ICgpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25zSW1wbCB7XG4gIHByaXZhdGUgX2luaXRpYWxpemF0aW9uUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+O1xuICBwcml2YXRlIF9zdHlsZUVsZW1lbnQ6IEhUTUxTdHlsZUVsZW1lbnQ7XG4gIHB1YmxpYyBkYXNoYm9hcmRDb250ZW50PzogRGFzaGJvYXJkQ29udGVudDtcbiAgcHVibGljIHdvcmtzaGVldENvbnRlbnQ/OiBXb3Jrc2hlZXRDb250ZW50O1xuICBwdWJsaWMgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xuICBwdWJsaWMgc2V0dGluZ3M6IFNldHRpbmdzO1xuICBwdWJsaWMgdWk6IFVJO1xuICBwdWJsaWMgd29ya2Jvb2s6IFdvcmtib29rO1xuICBwdWJsaWMgZXh0ZW5zaW9uWm9uZUlkOiBudW1iZXI7XG5cbiAgcHVibGljIGluaXRpYWxpemVBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBpbml0T3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zID0geyBpc0FscGhhOiBBcGlWZXJzaW9uLkluc3RhbmNlLmlzQWxwaGEgfTtcbiAgICAgICAgLy8gRmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbyBpcyBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBkZXNrdG9wIGRpc3BhdGNoZXIgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB1c1xuICAgICAgICBpZiAoTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLmhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShpbml0T3B0aW9ucykpIHtcbiAgICAgICAgICAvLyBSdW5uaW5nIGluIGEgcHJlLTIwMTkuMyBkZXNrdG9wLCB1c2Ugb3VyIGxlZ2FjeSBkaXNwYXRjaGVyIHByb21pc2VcbiAgICAgICAgICBjb25zdCBkZXNrdG9wRGlzcGF0Y2hlclByb21pc2UgPSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKTtcbiAgICAgICAgICBkZXNrdG9wRGlzcGF0Y2hlclByb21pc2VcbiAgICAgICAgICAgID8udGhlbigoZGlzcGF0Y2hlckZhY3RvcnkpID0+IHRoaXMub25EaXNwYXRjaGVyUmVjZWl2ZWQoZGlzcGF0Y2hlckZhY3RvcnksIGlzRXh0ZW5zaW9uRGlhbG9nLCBjb250ZXh0TWVudUNhbGxiYWNrcykpXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2UgbXVzdCBiZSBydW5uaW5nIGluIHNlcnZlciwgc28gd2Ugc2hvdWxkIHRyeSB0byBraWNrIG9mIHRoZSBzZXJ2ZXIgZGlzcGF0Y2hlciBib290c3RyYXBwaW5nXG4gICAgICAgICAgY29uc3Qgb25EaXNwYXRjaGVyUmVjZWl2ZWRDYWxsYmFjayA9IHRoaXMub25EaXNwYXRjaGVyUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgICBkb0Nyb3NzRnJhbWVCb290c3RyYXAod2luZG93LCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBpbml0T3B0aW9ucylcbiAgICAgICAgICAgIC50aGVuKChmYWN0b3J5OiBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrKGZhY3RvcnksIGlzRXh0ZW5zaW9uRGlhbG9nLCBjb250ZXh0TWVudUNhbGxiYWNrcyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKG9wZW5QYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUob3BlblBheWxvYWQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZpelNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpelNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXopO1xuXG4gICAgcmV0dXJuIHZpelNlcnZpY2UuY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWMpO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIHVpU2VydmljZS5zZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkLCB0aGlzLmV4dGVuc2lvblpvbmVJZCk7XG4gIH1cblxuICBwcml2YXRlIGlzRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcihsb2NhdG9yOiBFeHRlbnNpb25Mb2NhdG9yKTogbG9jYXRvciBpcyBEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yIHtcbiAgICBjb25zdCBkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yID0gbG9jYXRvciBhcyBEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yO1xuICAgIGlmICghZGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvci5kYXNoYm9hcmRQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgb25EaXNwYXRjaGVyUmVjZWl2ZWQoXG4gICAgZGlzcGF0Y2hlckZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksXG4gICAgaXNFeHRlbnNpb25EaWFsb2c6IGJvb2xlYW4sXG4gICAgY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyID0gZGlzcGF0Y2hlckZhY3RvcnkoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG5cbiAgICAvLyBDYWxsIHRvIHJlZ2lzdGVyIGFsbCB0aGUgc2VydmljZXMgd2hpY2ggd2lsbCB1c2UgdGhlIG5ld2x5IGluaXRpYWxpemVkIGRpc3BhdGNoZXJcbiAgICByZWdpc3RlckluaXRpYWxpemF0aW9uRXh0ZW5zaW9uc1NlcnZpY2VzKGRpc3BhdGNoZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBpbml0aWFsaXphdGlvbiBzZXJ2aWNlIGFuZCBpbml0aWFsaXplIHRoaXMgZXh0ZW5zaW9uXG4gICAgY29uc3QgaW5pdGlhbGl6YXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxJbml0aWFsaXphdGlvblNlcnZpY2U+KFxuICAgICAgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2UsXG4gICAgKTtcblxuICAgIGNvbnN0IGNhbGxiYWNrTWFwS2V5cyA9IGNvbnRleHRNZW51RnVuY3Rpb25zID8gT2JqZWN0LmtleXMoY29udGV4dE1lbnVGdW5jdGlvbnMpIDogW107XG4gICAgcmV0dXJuIGluaXRpYWxpemF0aW9uU2VydmljZS5pbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nLCBjYWxsYmFja01hcEtleXMpLnRoZW48c3RyaW5nPigocmVzdWx0KSA9PiB7XG4gICAgICAvLyBJZiB3ZSByZWNlaXZlIGFuIGludmFsaWQgcGxhZm9ybSB2ZXJzaW9uLCB0aGlzIG1lYW5zIHRoYXQgcGxhdGZvcm0gaXMgcnVubm5pbmcgMS40IG9yIDIuMSBhbmRcbiAgICAgIC8vIGRvZXNuJ3QgcGFzcyB0aGUgcGxhdGZvcm0gdmVyc2lvbiB0byBleHRlcm5hbC4gSW4gdGhpcyBjYXNlIHdlIGFzc3VtZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiB0byBiZSAxLjlcbiAgICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbiA9IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgPyByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQucGxhdGZvcm1WZXJzaW9uXG4gICAgICAgIDogeyBtYWpvcjogMSwgbWlub3I6IDksIGZpeDogMCB9O1xuXG4gICAgICAvLyBXcmFwIG91ciBleGlzdGluZyBkaXNwYXRjaGVyIGluIGEgZGlzcGF0Y2hlciB0aGF0IGNhbiBkb3duZ3JhZGUvdXBncmFkZSBmb3IgYW4gb2xkZXIgcGxhdGZvcm0uXG4gICAgICBpZiAoVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLm5lZWRzVmVyc2lvbkNvbnZlcnRlcihwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgICAgIGRpc3BhdGNoZXIgPSBuZXcgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyKGRpc3BhdGNoZXIsIHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICB9XG4gICAgICAvLyBSZWdpc3RyYXRpb24gb2Ygc2VydmljZXMgbXVzdCBoYXBwZW4gYmVmb3JlIGluaXRpYWxpemluZyBjb250ZW50IGFuZCBlbnZpcm9ubWVudFxuICAgICAgLy8gRXh0ZW5zaW9ucyBkb2Vzbid0IG5lZWQgdG8gcGFzcyBpbiBhIHJlZ2lzdHJ5SWQuIEJ5IGRlZmF1bHQsIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5IGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aCByZWdpc3RyeUlkPTAuXG4gICAgICByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkLCBwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAmJiB0aGlzLmlzRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcihyZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvcikpIHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplRGFzaGJvYXJkQ29udGVudChcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvci5kYXNoYm9hcmRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmV4dGVuc2lvblpvbmVJZCA9IHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLmV4dGVuc2lvblpvbmVJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvKSB7XG4gICAgICAgIHRoaXMud29ya3NoZWV0Q29udGVudCA9IHRoaXMuaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVudmlyb25tZW50ID0gbmV3IEVudmlyb25tZW50KHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5pbml0aWFsaXplU2V0dGluZ3MocmVzdWx0LmV4dGVuc2lvblNldHRpbmdzSW5mbyk7XG4gICAgICB0aGlzLnVpID0gbmV3IFVJKG5ldyBVSUltcGwoKSk7XG4gICAgICB0aGlzLndvcmtib29rID0gbmV3IFdvcmtib29rKG5ldyBFeHRlbnNpb25Xb3JrYm9va0ltcGwoKSk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWQsIHNldHVwIGxpc3RlbmVycyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0XG4gICAgICAvLyBhcmUgbWVhbnQgdG8gYmUgdHJpZ2dlcmVkIHdoZW5ldmVyIGEgY29udGV4dCBtZW51IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zKTtcblxuICAgICAgLy8gQWxzbyBzZXQgdXAgbGlzdGVuZXJzIGZvciBFeHRlbnNpb25TdHlsZXNDaGFuZ2VkRXZlbnRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudENhbGxiYWNrKGRpc3BhdGNoZXIpO1xuXG4gICAgICAvLyBJbiB0aGUgbm9ybWFsIGluaXRpYWxpemF0aW9uIGNhc2UsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBXaGVuIHJldHVybmluZyBmcm9tIGluaXRpYWxpemVBc3luYyB0byB0aGVcbiAgICAgIC8vIGRldmVsb3Blciwgd2UganVzdCBpbmdvcmUgdGhhdCBzdHJpbmcuICBJbiB0aGUgY2FzZSBvZiBpbml0aWFsaXppbmcgZnJvbSBhbiBleHRlbnNpb24gZGlhbG9nLCB0aGlzIHN0cmluZ1xuICAgICAgLy8gaXMgYW4gb3B0aW9uYWwgcGF5bG9hZCBzZW50IGZyb20gdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICByZXR1cm4gcmVzdWx0LmV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlBbGxGb3JtYXR0aW5nKGZvcm1hdHRpbmdNb2RlbDogV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zdHlsZUVsZW1lbnQuaWQgPSAnVGFibGVhdS1FeHRlbnNpb24tRm9ybWF0dGluZyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX3N0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgfHwgIWZvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgYXMgQ1NTU3R5bGVTaGVldDtcbiAgICB3aGlsZSAoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICB0aGlzLmFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1hdHRpbmdTaGVldFRvU3R5bGVTaGVldChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0OiBGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQpOiB2b2lkIHtcbiAgICBsZXQgc3R5bGVJbmZvID0gJyc7XG5cbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzID0gY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzO1xuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1mYW1pbHk6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFNpemUpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1zaXplOiAnICsgY3NzUHJvcGVydGllcy5mb250U2l6ZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250V2VpZ2h0KSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtd2VpZ2h0OiAnICsgY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXN0eWxlOiAnICsgY3NzUHJvcGVydGllcy5mb250U3R5bGUudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMudGV4dERlY29yYXRpb24pIHtcbiAgICAgIHN0eWxlSW5mbyArPSAndGV4dC1kZWNvcmF0aW9uOiAnICsgY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbi50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5jb2xvcikge1xuICAgICAgc3R5bGVJbmZvICs9ICdjb2xvcjogJyArIGNzc1Byb3BlcnRpZXMuY29sb3IgKyAnOyAnO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yOiBzdHJpbmcgPSAnLicgKyBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleTtcbiAgICBjb25zdCBydWxlOiBzdHJpbmcgPSBzZWxlY3RvciArICcgeyAnICsgc3R5bGVJbmZvICsgJyB9JztcbiAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50Rm9ybWF0dGluZykge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCBldmVudEZvcm1hdHRpbmcpO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHdvcmtib29rRm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nKTogdm9pZCB7XG4gICAgY29uc3QgZm9udE5hbWVzOiBNb2RlbFtdID0gWy4uLlN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMsIC4uLlN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXNdO1xuICAgIHdvcmtib29rRm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZvckVhY2goKGZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgICAgZm9udE5hbWVzLnB1c2goZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZm9udE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuRm9udE5hbWVMaXN0SXRlbXNdOiBmb250TmFtZXMgfTtcbiAgICAgIGRpc3BhdGNoZXJcbiAgICAgICAgLmV4ZWN1dGUoVmVyYklkLkdldEZvbnRzLCBwYXJhbWV0ZXJzKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRGb250cyhyZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Rm9udE5hbWVBbmRJbmZvPik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZvbnRzKGZvbnRzOiBBcnJheTxGb250TmFtZUFuZEluZm8+KTogdm9pZCB7XG4gICAgZm9udHMuZm9yRWFjaCgoZm9udE5hbWVBbmRJbmZvKSA9PiB7XG4gICAgICBpZiAoU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcy5pbmNsdWRlcyhmb250TmFtZUFuZEluZm8uZm9udE5hbWUpKSB7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm8pO1xuICAgICAgfSBlbHNlIGlmIChTdXBwb3J0ZWRCZW50b25TYW5zRm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KGluZm86IEV4dGVuc2lvbkRhc2hib2FyZEluZm8sIHNoZWV0UGF0aDogU2hlZXRQYXRoKTogRGFzaGJvYXJkQ29udGVudCB7XG4gICAgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKGluZm8ubmFtZSwgU2hlZXRUeXBlLkRhc2hib2FyZCwgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBjb25zdCBkYXNoYm9hcmRJbXBsID0gbmV3IERhc2hib2FyZEltcGwoc2hlZXRJbmZvSW1wbCwgaW5mby56b25lcywgc2hlZXRQYXRoLCBFeHRlbnNpb25zUmVnaXN0cnlJZCwgbnVsbCwgaW5mby5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgY29uc3QgZGFzaGJvYXJkID0gbmV3IERhc2hib2FyZChkYXNoYm9hcmRJbXBsKTtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZENvbnRlbnQoZGFzaGJvYXJkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk6IFdvcmtzaGVldENvbnRlbnQge1xuICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGluZm8udmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgIHsgd2lkdGg6IGluZm8uc2l6ZS53LCBoZWlnaHQ6IGluZm8uc2l6ZS5oIH0sXG4gICAgICB1bmRlZmluZWQsIC8vIGluZGV4IHByb3BlcnR5IGlzIGVtYmVkZGluZyBzcGVjaWZpY1xuICAgICAgdHJ1ZSwgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmtzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChcbiAgICAgIHNoZWV0SW5mb0ltcGwsXG4gICAgICBFeHRlbnNpb25zUmVnaXN0cnlJZCxcbiAgICAgIGluZm8udmlzdWFsSWQsXG4gICAgICBudWxsLCAvLyBwYXJlbnREYXNoYm9hcmQgaXMgYWx3YXlzIG51bGwgZm9yIHdvcmtzaGVldCBpbiBXb3Jrc2hlZXRDb250ZW50XG4gICAgICBudWxsLCAvLyBwYXJlbnRTdG9yeVBvaW50IGlzIG9ubHkgdXNlZCBmb3IgZW1iZWRkaW5nXG4gICAgKTtcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIHJldHVybiBuZXcgV29ya3NoZWV0Q29udGVudCh3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiBTZXR0aW5ncyB7XG4gICAgY29uc3Qgc2V0dGluZ3NJbXBsID0gbmV3IFNldHRpbmdzSW1wbChzZXR0aW5nc0luZm8pO1xuICAgIHJldHVybiBuZXcgU2V0dGluZ3Moc2V0dGluZ3NJbXBsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXApOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIC8vIFVucmVnaXN0ZXIgZnVuY3Rpb24gbm90IHVzZWQgc2luY2UgdGhlc2Ugbm90aWZpY2F0aW9ucyBzaG91bGQgYmVcbiAgICAvLyBvYnNlcnZlZCBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkNvbnRleHRNZW51Q2xpY2ssXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBjb250ZXh0IG1lbnUgZXZlbnQsIHRoZXNlIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG9uIGFwaS1jb3JlXG4gICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gbG9jYXRvci5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBDb250ZXh0TWVudUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgbWVudSBJRFxuICAgICAgICBpZiAoY29udGV4dE1lbnVGdW5jdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIWNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBSZWNlaXZlZCB1bmV4cGVjdGVkIGNvbnRleHQgbWVudSBJZCBmcm9tIGV2ZW50OiAke2V2ZW50LmlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUYWJsZWF1Rm9udHMoZm9udE5hbWVBbmRJbmZvOiBGb250TmFtZUFuZEluZm8pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkge1xuICAgICAgY2FzZSBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCdhdHRlbXB0ZWQgdG8gbG9hZCB1bnN1cHBvcnRlZCBmb250OiAke2ZvbnROYW1lQW5kSW5mby5mb250TmFtZX0uJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJlbnRvblNhbnNGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgc3R5bGU6ICdpdGFsaWMnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMsIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIGhhcyBiZWVuIG1vdmVkIChhbmQgcmVuYW1lZCkgZnJvbSBhcGktaW50ZXJuYWwtY29udHJhY3QuXG4gKiBJdCBzdXBwb3J0cyBydW5uaW5nIGEgbmV3ZXIgZXh0ZXJuYWwgbGlicmFyeSBhZ2FpbnN0IGEgcHJlIDIwMTkuMyBkZXNrdG9wLlxuICogU3RhcnRpbmcgaW4gMjAxOS4zLCB3ZSBoYXZlIGEgbWVyZ2VkIGJvb3RzdHJhcCBzdHlsZSBmb3IgYm90aCBkZXNrdG9wIGFuZCBzZXJ2ZXIuXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGFscGhhIGNoZWNraW5nIHRoYXQgaXMgaGFwcGVuaW5nIGhlcmUgaXMgbm90IG5lY2Vzc2FyeSBpbiBleHRlcm5hbC1hcGktanNcbiAqICBhZnRlciAyMDE5LjMgYmVjYXVzZSB0aGF0IGNoZWNraW5nIGhhcHBlbnMgaW4gYXBpLXBsYXRmb3JtLWpzIChBcGlEaXNwYXRjaGVyVGVzdC50cylcbiAqIFRGU0lEOiAxMDkxNTYxIHRyYWNrcyBhbiBpbXByb3ZlbWVudCB0byB0aGlzIHN5c3RlbSB0byBtYWtlIGl0IGxlc3MgY29tcGxleCBhbmQgdGllIGl0IGRpcmVjdGx5IHRvXG4gKiAgdGFibGVhdSBiZXRhIHJlbGVhc2UgdmVyc2lvbnMuXG4gKiBAZGVwcmVjYXRlZFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIge1xuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4gfCB1bmRlZmluZWQge1xuICAgIGlmICgoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMuaXNBbHBoYSA9PT0gJ3VuZGVmaW5lZCcpICYmICF3aW5kb3cuX193YXJuaW5nSXNzdWVkKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdUaGlzIGlzIGEgYmV0YSB2ZXJzaW9uIG9mIHRoZSBFeHRlbnNpb25zIEFQSS4gUGxlYXNlIHVwZ3JhZGUgdG8gYW4gb2ZmaWNpYWwgcmVsZWFzZS4nKTtcbiAgICAgIHdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaXNBbHBoYSAmJiB3aW5kb3cuX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlKSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXJcbiAgICAgICAgLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICAgICAgICAgIGRpc3BhdGNoZXIuZXhlY3V0ZShWZXJiSWQuQmxvY2tFeHRlbnNpb24sIHt9KS5jYXRjaCgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHByb21pc2UgaXMgcmVqZWN0ZWQgb3IgdGhyb3dzXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT47XG4gICAgX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlOiBib29sZWFuO1xuICAgIF9fd2FybmluZ0lzc3VlZDogYm9vbGVhbjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvblNldHRpbmdzSW5mbywgTm90aWZpY2F0aW9uSWQsIFNldHRpbmdzRXZlbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBFcnJvckhlbHBlcnMsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG5jbGFzcyBTZXR0aW5nc0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlNldHRpbmdzQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ld1NldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdTZXR0aW5ncygpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZXdTZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NJbXBsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQVNZTkNfU0FWRV9JTl9QUk9HUkVTUyA9ICdBc3luYyBTYXZlIGlzIGluIHByb2dyZXNzLCB1cGRhdGluZyBzZXR0aW5ncyBpcyBub3QgYWxsb3dlZC4nO1xuICBwcml2YXRlIF9pc01vZGlmaWVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jdXJyZW50U2V0dGluZ3M6IFNldHRpbmdzQ29sbGVjdGlvbjtcblxuICAvLyBTaW5jZSBwcm9taXNlcyBjYW4ndCBiZSBpbnRyb3NwZWN0ZWQgZm9yIHN0YXRlLCBrZWVwIGEgdmFyaWFibGUgdGhhdFxuICAvLyBpbmRpY2F0ZXMgYSBzYXZlIGlzIGluIHByb2dyZXNzLCBzbyB0aGF0IHNldC9lcmFzZSBjYW4ndCBiZSBjYWxsZWQgZHVyaW5nIGEgc2F2ZS5cbiAgcHJpdmF0ZSBfc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pIHtcbiAgICB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm8pO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIC8vIE9ubHkgbWFrZSBhIG1vZGlmaWNhdGlvbiBpZiB3ZSBoYXZlIHRoZSBrZXkgYWxyZWFkeVxuICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSkge1xuICAgICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAgIGRlbGV0ZSB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgLy8gUmV0dXJucyBhIG11dGFibGUgY29weSBvZiB0aGUgc2V0dGluZ3NcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIC8vIEp1c3QgcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBzZXR0aW5ncyBhcmUgdW5jaGFuZ2VkXG4gICAgaWYgKCF0aGlzLl9pc01vZGlmaWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlPFNldHRpbmdzQ29sbGVjdGlvbj4odGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICAvLyBVc2UgdGhlIHNldHRpbmdzIHNlcnZpY2UgdG8gc2F2ZSBzZXR0aW5ncyB0byB0d2JcbiAgICBjb25zdCBzZXR0aW5nc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNldHRpbmdzU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldHRpbmdzU2VydmljZS5zYXZlU2V0dGluZ3NBc3luYyh0aGlzLl9jdXJyZW50U2V0dGluZ3MpLnRoZW48U2V0dGluZ3NDb2xsZWN0aW9uPihcbiAgICAgIChuZXdTZXR0aW5ncykgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IG5ld1NldHRpbmdzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1NldHRpbmdzO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihrZXksICdrZXknKTsgLy8gS2V5IHNob3VsZG4ndCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZSwgJ3ZhbHVlJyk7IC8vIEVtcHR5IHN0cmluZyB2YWx1ZSBpcyBhbGxvd2VkLlxuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIHNldHRpbmdzIG9iamVjdC4gIFRoaXMgaXMgb25seSBhIHNldHRpbmdzVXBkYXRlIGV2ZW50IGN1cnJlbnRseS5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFNldHRpbmdzQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TZXR0aW5nc0NoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBTZXR0aW5nc0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IGV2ZW50Lm5ld1NldHRpbmdzO1xuICAgICAgICBzZXR0aW5nc0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KGV2ZW50Lm5ld1NldHRpbmdzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goc2V0dGluZ3NDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLCAnc2V0dGluZ3NJbmZvJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXMsICdzZXR0aW5nc0luZm8uU2V0dGluZ3NWYWx1ZXMnKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcztcblxuICAgIC8vIFJlc2V0IHRoZSBpc01vZGlmaWVkIGZsYWdcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBoZWxwZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGxvY2FsIHVwZGF0ZSB0byB0aGlzLmN1cnJlbnRTZXR0aW5ncy5cbiAgICogQ2hlY2tzIGlmIGEgY3VycmVudCBzYXZlIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzby5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2F2ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5TZXR0aW5nU2F2ZUluUHJvZ3Jlc3MsIFNldHRpbmdzSW1wbC5BU1lOQ19TQVZFX0lOX1BST0dSRVNTKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb29rJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IExpZ2h0JztcbmV4cG9ydCBjb25zdCBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTWVkaXVtJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaWJvbGRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IFNlbWlib2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5cbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5leHBvcnQgY29uc3QgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgU2VtaSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERpYWxvZ1VwZGF0ZUV2ZW50LCBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIE5vdGlmaWNhdGlvblNlcnZpY2UsIFNlcnZpY2VOYW1lcywgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVUlTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFVJSW1wbCB7XG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVpU2VydmljZVxuICAgICAgICAuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCB8fCAnJywgb3B0aW9ucylcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVucmVnaXN0ZXJGbiA9IG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgICAgICAgTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nVXBkYXRlLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBMZXQgdGhyb3VnaCBhbnkgZGlhbG9nIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXZlbnQ6IERpYWxvZ1VwZGF0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5pc0Nsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2xvc2VQYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnY2xvc2VQYXlsb2FkIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50LmNsb3NlUGF5bG9hZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dDbG9zZWRCeVVzZXIsICdFeHRlbnNpb24gZGlhbG9nIGNsb3NlZCBieSB1c2VyLicpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHVucmVnaXN0ZXJGbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICB1aVNlcnZpY2UuY2xvc2VEaWFsb2cocGF5bG9hZCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBUYWJsZWF1RXZlbnRUeXBlLCBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0RXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRGFzaGJvYXJkSW1wbCxcbiAgRGFzaGJvYXJkT2JqZWN0SW1wbCxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFdvcmtzaGVldEltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3QgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCkge1xuICAgIHN1cGVyKF9kYXNoYm9hcmRJbXBsKTtcbiAgICBfZGFzaGJvYXJkSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHMoKTogQXJyYXk8Q29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwud29ya3NoZWV0c0ltcGwubWFwKCh3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh3b3Jrc2hlZXRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmRPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5vYmplY3RzLm1hcCgoZGFzaGJvYXJkT2JqZWN0SW1wbDogRGFzaGJvYXJkT2JqZWN0SW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBEYXNoYm9hcmRPYmplY3QoZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmROYW1lO1xuICB9XG5cbiAgcHVibGljIHNldFpvbmVWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXA6IENvbnRyYWN0LlpvbmVWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKHpvbmVWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLl9kYXNoYm9hcmRJbXBsLmdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICAgIHJldHVybiB6b25lICYmIG5ldyBEYXNoYm9hcmRPYmplY3Qoem9uZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcblxuICAgIC8vIEluaXRpYWxpemluZyBldmVudHMgYW5kIHJlZ2lzdGVyaW5nIG5vdGlmaWNhdGlvbiBzZXJ2aWNlXG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm4gKGFsbG93cyB1bml0IHRlc3Rpbmcgd2l0aG91dCBOb3RpZmljYXRpb25TZXJ2aWNlIG1vY2spXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudDogRGFzaGJvYXJkTGF5b3V0RXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0Q2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyA9IHRoaXMuX2Rhc2hib2FyZEltcGwudXBkYXRlWm9uZXMoXG4gICAgICAgICAgZXZlbnQuem9uZXMsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlWm9uZUlkLFxuICAgICAgICAgIGV2ZW50LmFjdGl2ZURhc2hib2FyZE5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IERhc2hib2FyZExheW91dENoYW5nZWRFdmVudChkYXNoYm9hcmRPYmplY3RDaGFuZ2VzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KTtcblxuICAgIGNvbnN0IHdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudD4oXG4gICAgICBUYWJsZWF1RXZlbnRUeXBlLldvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQsXG4gICAgKTtcblxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KGV2ZW50Rm9ybWF0dGluZykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwubW92ZUFuZFJlc2l6ZURhc2hib2FyZE9iamVjdHNBc3luYyhkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnJlcGxheUFuaW1hdGlvbkFzeW5jKHJlcGxheVNwZWVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIG5ldyBEYXNoYm9hcmQodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5kYXNoYm9hcmRJbXBsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC50eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwucG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwud29ya3NoZWV0SW1wbCkge1xuICAgICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXQodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlzVmlzaWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBFdmVudExpc3RlbmVyTWFuYWdlcixcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgUGFyYW1ldGVySW1wbCxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgICAgIH0sXG4gICAgICAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU2l6ZSh0aGlzLl9zaGVldEltcGwuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTaXplKHNpemU6IGFueSk6IHNpemUgaXMgQ29udHJhY3QuU2l6ZSB7XG4gICAgY29uc3QgdGVzdFNpemUgPSBzaXplIGFzIENvbnRyYWN0LlNpemU7XG4gICAgaWYgKHRlc3RTaXplLndpZHRoICE9PSB1bmRlZmluZWQgJiYgdGVzdFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcCgocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge31cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSW1wbC5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb2x1bW4sIEZpbHRlclVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsIFRhYmxlYXVFdmVudFR5cGUsIFRvb2x0aXBDb250ZXh0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpbHRlckV2ZW50LCBOb3RpZmljYXRpb25JZCwgU3VtbWFyeURhdGFFdmVudCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBXb3Jrc2hlZXRJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEZpbHRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgTWFya3NTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudCc7XG5pbXBvcnQgeyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgU2hlZXQgfSBmcm9tICcuL1NoZWV0JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldCBleHRlbmRzIFNoZWV0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkge1xuICAgIHN1cGVyKF93b3Jrc2hlZXRJbXBsKTtcblxuICAgIC8vIENhbGwgdG8gaW5pdGlhbGl6ZSBldmVudHMgYW5kIHRoZW4gY2FsbCBkb3duIHRvIHRoZSBldmVudCBsaXN0ZW5lciBtYW5hZ2VyIHRvIGhhbmRsZSB0aGluZ3NcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudERhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBmb3IgRXh0ZW5zaW9ucyBpZiB0aGUgRGFzaGJvYXJkSW1wbHMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgUGFyZW50IGRhc2hib2FyZCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsSWQgPSBtb2RlbCBhcyBWaXN1YWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQpO1xuICAgICAgfSxcbiAgICAgICgpID0+IG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPEZpbHRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkZpbHRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIEZpbHRlckV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgICAgZmlsdGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBGaWx0ZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZmllbGROYW1lLCBldmVudC5maWVsZElkKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlN1bW1hcnlEYXRhQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBTdW1tYXJ5RGF0YUV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBTdW1tYXJ5RGF0YUV2ZW50KSA9PiB7XG4gICAgICAgIHN1bW1hcnlEYXRhRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCh0aGlzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2gobWFya3NFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKGZpbHRlckV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goc3VtbWFyeURhdGFFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb2x1bW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SURBc3luYyhtYXJrc0luZm86IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgdXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdE1hcmtzQnlJZEFzeW5jKG1hcmtzSW5mbywgdXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmMobWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hbm5vdGF0ZU1hcmtBc3luYyhtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0QW5ub3RhdGlvbnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwucmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb24pO1xuICB9XG5cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGU6IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZSwgdG9vbHRpcCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0VHVwbGVzQXN5bmMoc2VsZWN0ZWRUdXBsZXM6IEFycmF5PG51bWJlcj4sIHNlbGVjdE9wdGlvbjogQ29udHJhY3QuU2VsZWN0T3B0aW9ucywgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0VHVwbGVzQXN5bmMoc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwcml2YXRlIHZpc3VhbElkc0FyZUVxdWFsKGE6IFZpc3VhbElkLCBiOiBWaXN1YWxJZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhICYmXG4gICAgICBiICYmXG4gICAgICBhLndvcmtzaGVldCA9PT0gYi53b3Jrc2hlZXQgJiZcbiAgICAgIGEuZGFzaGJvYXJkID09PSBiLmRhc2hib2FyZCAmJlxuICAgICAgYS5zdG9yeWJvYXJkID09PSBiLnN0b3J5Ym9hcmQgJiZcbiAgICAgIGEuc3RvcnlQb2ludElEID09PSBiLnN0b3J5UG9pbnRJRFxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIERhc2hib2FyZENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBEYXNoYm9hcmRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZDogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbkVudmlyb25tZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVZlcnNpb24sIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENvbm5lY3RlZFNlcnZlciB9IGZyb20gJy4uL0ltcGwvQ29ubmVjdGVkU2VydmVyJztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwgfSBmcm9tICcuL1dvcmtib29rRm9ybWF0dGluZ0VudlV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudCBuYW1lc3BhY2UuXG4gKiBFbnZpcm9ubWVudCBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpc1xuICoganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqIEZpcnN0IGNsYXNzIGV4dGVuc2lvbnMgY2FuIGdldCB0byBDb25uZWN0ZWRTZXJ2ZXIgd2l0aDogZW52aXJvbm1lbnRbJ2Nvbm5lY3RlZFNlcnZlciddXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgLyoqVGhlIGZvbGxvd2luZyBpcyBhbiBpbmRleCBzaWduYXR1cmUuIEl0IGFsbG93cyBwcm9wZXJ0aWVzIHRvIGJlIGFjY2Vzc2VkIGJ5IG5hbWUuXG4gICAqIFRoaXMgYWxsb3dzIHVzIHRvIGFkZCBwcm9wZXJ0aWVzIGR5bmFtaWNhbGx5IChzZWUgdXNhZ2Ugb2YgdGhpcy5jb25uZWN0ZWRTZXJ2ZXIgYmVsb3cpIHdpdGhvdXQgVHlwZXNjcmlwdCBlcnJvcnMuXG4gICAqIFRoZSByZWFzb24gd2UgZG8gdGhpcyBpcyBzbyB0aGF0IDNyZC1wYXJ0eSBleHRlbnNpb24gZGV2ZWxvcGVycyBkbyBub3Qgc2VlIHRoZSBjb25uZWN0ZWRTZXJ2ZXIgcHJvcGVydHlcbiAgICogdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSB0byBmaXJzdCBjbGFzcyBleHRlbnNpb24gZGV2ZWxvcGVycy5cbiAgICogVGhlIHR5cGUgb2YgdGhlIGluZGV4IHNpZ2F0dXJlIG5lZWRzIHRvIGJlIGEgdW5pb24gb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9iamVjdCwgc2luY2Ugd2UgY291bGRcbiAgICogYWNjZXNzIGFueSBwcm9wZXJ0eSB1c2luZyB0aGUgcHJvcGVydHkgaW5kZXggbWV0aG9kLlxuICAgKi9cbiAgW3g6IHN0cmluZ106IENvbm5lY3RlZFNlcnZlciB8IHN0cmluZyB8IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hcGlWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRleHQ6IENvbnRyYWN0LkV4dGVuc2lvbkNvbnRleHQ7XG4gIHByaXZhdGUgX2Zvcm1hdHRpbmc/OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvdW50cnk/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nO1xuICBwcml2YXRlIF9tb2RlOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlO1xuICBwcml2YXRlIF9vcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbiAgcHJpdmF0ZSBfdGFibGVhdVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfdW5pcXVlVXNlcklkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQpIHtcbiAgICB0aGlzLl9hcGlWZXJzaW9uID0gQXBpVmVyc2lvbi5JbnN0YW5jZSAmJiBBcGlWZXJzaW9uLkluc3RhbmNlLmZvcm1hdHRlZFZhbHVlOyAvLyBtYWoubWluLmZpeCAobm8gYnVpbGQpXG4gICAgdGhpcy5fY29udGV4dCA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Db250ZXh0LmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCk7XG4gICAgdGhpcy5fZm9ybWF0dGluZyA9IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgdGhpcy5fbGFuZ3VhZ2UgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25MYW5ndWFnZTtcbiAgICB0aGlzLl9jb3VudHJ5ID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ291bnRyeTtcbiAgICB0aGlzLl9sb2NhbGUgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Mb2NhbGU7XG4gICAgdGhpcy5fbW9kZSA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Nb2RlLmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTW9kZSk7XG4gICAgdGhpcy5fb3BlcmF0aW5nU3lzdGVtID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQub3BlcmF0aW5nU3lzdGVtO1xuICAgIHRoaXMuX3RhYmxlYXVWZXJzaW9uID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudGFibGVhdVZlcnNpb247XG4gICAgdGhpcy5fdW5pcXVlVXNlcklkID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudW5pcXVlVXNlcklkO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHVzZXJJZCwgdGhlbiB3ZSBhcmUgYSBmaXJzdCBjbGFzcyBleHRlbnNpb25cbiAgICBpZiAoZXh0ZW5zaW9uRW52aXJvbm1lbnQudXNlcklkKSB7XG4gICAgICB0aGlzLmNvbm5lY3RlZFNlcnZlciA9IG5ldyBDb25uZWN0ZWRTZXJ2ZXIoXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnVzZXJJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQuc2l0ZUlkLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC5zaXRlTmFtZXNwYWNlLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0lkLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5mZWF0dXJlRmxhZ3MgPSBleHRlbnNpb25FbnZpcm9ubWVudC5mZWF0dXJlRmxhZ3M7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhcGlWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rRm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY291bnRyeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb3VudHJ5O1xuICB9XG5cbiAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2RlKCk6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBvcGVyYXRpbmdTeXN0ZW0oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW5nU3lzdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJsZWF1VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZWF1VmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5pcXVlVXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VuaXF1ZVVzZXJJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENhbGxiYWNrTWFwLCBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4uL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBFeHRlbnNpb25zIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnMgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25zIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uSW1wbDogRXh0ZW5zaW9uc0ltcGwpIHtcbiAgICB0aGlzLmV4dGVuc2lvbkltcGwgPSBleHRlbnNpb25JbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRDb250ZW50KCk6IENvbnRyYWN0LkRhc2hib2FyZENvbnRlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZGFzaGJvYXJkQ29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0Q29udGVudCgpOiBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLndvcmtzaGVldENvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVudmlyb25tZW50KCk6IENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmVudmlyb25tZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBDb250cmFjdC5TZXR0aW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5zZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdWkoKTogQ29udHJhY3QuVUkge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwudWk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rKCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtib29rIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLndvcmtib29rO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZXh0ZW5zaW9uWm9uZUlkO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVBc3luYyhjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5pbml0aWFsaXplQXN5bmMoZmFsc2UsIGNvbnRleHRNZW51Q2FsbGJhY2tzKS50aGVuPHZvaWQ+KCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURpYWxvZ0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5pbml0aWFsaXplQXN5bmModHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNldHRpbmdzIGFzIFNldHRpbmdzQ29udHJhY3QgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4uL0ltcGwvU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIHNldHRpbmdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBTZXR0aW5nc0NvbnRyYWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldHRpbmdzSW1wbDogU2V0dGluZ3NJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuZXJhc2Uoa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0KGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5nZXRBbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmlzTW9kaWZpZWQ7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8U2V0dGluZ3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5zYXZlQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuc2V0KGtleSwgdmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBpbXBsZW1lbnRzIENvbnRyYWN0LlVJIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ltcGw6IFVJSW1wbCkge31cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGwuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2ltcGwuY2xvc2VEaWFsb2cocGF5bG9hZCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvbGliL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB7XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKHdvcmtib29rRm9ybWF0dGluZ01vZGVsPzogV29ya2Jvb2tGb3JtYXR0aW5nKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXdvcmtib29rRm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmb3JtYXR0aW5nTWFwOiBBcnJheTxDb250cmFjdC5Gb3JtYXR0aW5nU2hlZXQ+ID0gd29ya2Jvb2tGb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGluZ1NoZWV0OiBDb250cmFjdC5Gb3JtYXR0aW5nU2hlZXQgPSB7XG4gICAgICAgICAgY2xhc3NOYW1lS2V5OiBFbnVtTWFwcGluZ3MuY2xhc3NOYW1lS2V5LmNvbnZlcnQoY3VycmVudEZvcm1hdHRpbmdTaGVldC5jbGFzc05hbWVLZXkpLFxuICAgICAgICAgIGNzc1Byb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgICAgICAgICAgZm9udFNpemU6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LFxuICAgICAgICAgICAgZm9udFN0eWxlOiBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb246IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbixcbiAgICAgICAgICAgIGNvbG9yOiBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuY29sb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRpbmdTaGVldDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgPSB7XG4gICAgICAgIGZvcm1hdHRpbmdTaGVldHM6IGZvcm1hdHRpbmdNYXAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFdvcmtzaGVldENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBXb3Jrc2hlZXRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFeHRlbnNpb25Cb290c3RyYXBJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHNdOiBjb250ZXh0TWVudUlkcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Jc0V4dGVuc2lvbkRpYWxvZ106IGlzRXh0ZW5zaW9uRGlhbG9nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Jbml0aWFsaXplRXh0ZW5zaW9uLCBwYXJhbXMpLnRoZW48RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBUT0RPIC0gVmFsaWRhdGUgcmV0dXJuIHZhbHVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NldHRpbmdzU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2V0dGluZ3NTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3NBc3luYyhzZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZVNldHRpbmdzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNldHRpbmdzVmFsdWVzXTogc2V0dGluZ3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNhdmVFeHRlbnNpb25TZXR0aW5ncywgcGFyYW1ldGVycykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0IGFzIEV4dGVuc2lvblNldHRpbmdzSW5mbztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zZXR0aW5nc1ZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3Igc2F2aW5ncyBzZXR0aW5ncy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdC5zZXR0aW5nc1ZhbHVlcztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlhbG9nT3B0aW9ucywgRGlhbG9nU3R5bGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCwgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMsIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncywgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVCA9IDQwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19XSURUSCA9IDYwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19TVFlMRTogRGlhbG9nU3R5bGUgPSBEaWFsb2dTdHlsZS5XaW5kb3c7XG5cbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVUlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZywgb3B0aW9ucz86IERpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZGlzcGxheURpYWxvZ0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxdOiB1cmwsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF06IHBheWxvYWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGg6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5oZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSBvcHRpb25zICYmIG9wdGlvbnMud2lkdGggPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG4gICAgY29uc3QgZGlhbG9nU3R5bGU6IERpYWxvZ1N0eWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRpYWxvZ1N0eWxlID8gb3B0aW9ucy5kaWFsb2dTdHlsZSA6IERFRkFVTFRfRElBTE9HX1NUWUxFO1xuXG4gICAgLy8gT24gdGhlIHBsYXRmb3JtIHNpZGUsIHdlIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIHJlZ2FyZGVzcyBvZiB3aGV0aGVyIHRoZSBwYXNzZWRcbiAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiAgQnV0IHRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGRldmVsb3BlciBlcnJvcixcbiAgICAvLyBzbyB3ZSB0aHJvdyBhbiBlcnJvciBoZXJlIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gICAgaWYgKGggPD0gMCB8fCB3IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2l6ZSBwYXJhbWV0ZXJzIGZvciBkaXNwbGF5RGlhbG9nQXN5bmMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nSF0gPSBoO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nV10gPSB3O1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGlhbG9nU3R5bGU+KGRpYWxvZ1N0eWxlLCBEaWFsb2dTdHlsZSwgJ0RpYWxvZ1N0eWxlJyk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dTdHlsZV0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MuZGlhbG9nU3R5bGVzLmNvbnZlcnQoZGlhbG9nU3R5bGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRGlzcGxheURpYWxvZywgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZXMuSW52YWxpZERvbWFpbkRpYWxvZyxcbiAgICAgICAgICAgICdUaGUgdXJsIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgbXVzdCBtYXRjaCB0aGUgZG9tYWluIG9mIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBTdWNjZXNzIGNhc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbG9zZURpYWxvZycsXG4gICAgfTtcblxuICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbiwgZXh0ZW5zaW9uWm9uZUlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShjbGlja1Rocm91Z2hFbmFibGVkLCAnYm9vbGVhbicsICdjbGlja1Rocm91Z2hFbmFibGVkJyk7XG5cbiAgICBpZiAoZXh0ZW5zaW9uWm9uZUlkID09PSB1bmRlZmluZWQgfHwgZXh0ZW5zaW9uWm9uZUlkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnRXh0ZW5zaW9uIElkIGlzIGludmFsaWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uWm9uZUlkXTogZXh0ZW5zaW9uWm9uZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLkNsaWNrVGhyb3VnaEVuYWJsZWRdOiBjbGlja1Rocm91Z2hFbmFibGVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRDbGlja1Rocm91Z2gsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFVJU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvVUlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZXR0aW5nc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVUlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG59XG4iLCJleHBvcnQgY29uc3QgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgPSAwO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvQXNrRGF0YUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRGV2aWNlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgVGFibGVhdUV2ZW50VHlwZSBhcyBFbWJlZGRpbmdUYWJsZWF1RXZlbnRUeXBlLFxuICBGaWxlRm9ybWF0cyxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBTaGVldFNpemVCZWhhdmlvcixcbiAgVGFibGVhdURpYWxvZ1R5cGUsXG4gIFRvb2xiYXIsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRW51bXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tVmlld0V2ZW50LFxuICBDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCBhcyBFbWJlZGRpbmdDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCxcbiAgRmlsdGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ0ZpbHRlckNoYW5nZWRFdmVudCxcbiAgTWFya3NTZWxlY3RlZEV2ZW50IGFzIEVtYmVkZGluZ01hcmtTZWxlY3RlZEV2ZW50LFxuICBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LFxuICBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCxcbiAgVGFibGVhdVNoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVNoZWV0RXZlbnQsXG4gIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBhcyBFbWJlZGRpbmdUYWJsZWF1V29ya3NoZWV0RXZlbnQsXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQsXG4gIEZpcnN0Vml6U2l6ZUtub3duRXZlbnQsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZEV2ZW50LFxuICBUYWJTd2l0Y2hlZEV2ZW50LFxuICBVcmxBY3Rpb25FdmVudCxcbiAgVml6TG9hZEVycm9yRXZlbnQsXG4gIFdvcmtib29rUHVibGlzaGVkQXNFdmVudCxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FdmVudEludGVyZmFjZXMnO1xuZXhwb3J0IHsgUGFyYW1ldGVyIGFzIEVtYmVkZGluZ1BhcmFtZXRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1B1bHNlSW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBDb250ZXh0TWVudU9wdGlvbnMsXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnksXG4gIEF1dGhvcmluZ1dvcmtzaGVldCBhcyBFbWJlZGRpbmdBdXRob3JpbmdXb3Jrc2hlZXQsXG4gIERhc2hib2FyZCBhcyBFbWJlZGRpbmdEYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFbWJlZGRpbmdEYXNoYm9hcmRPYmplY3QsXG4gIFNoZWV0IGFzIEVtYmVkZGluZ1NoZWV0LFxuICBFbWJlZGRpbmdWaXpTdGF0ZVdpdGhEYXRhTW9kZWwsXG4gIFdvcmtzaGVldCBhcyBFbWJlZGRpbmdXb3Jrc2hlZXQsXG4gIEhpZXJhcmNoaWNhbExldmVscyxcbiAgU2hlZXRJbmZvLFxuICBTaGVldFNpemUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFN0b3J5LCBTdG9yeVBvaW50LCBTdG9yeVBvaW50SW5mbyB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU3RvcnlJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVGFibGVhdUVycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVml6SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tVmlldyxcbiAgQXV0aG9yaW5nV29ya2Jvb2sgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya2Jvb2ssXG4gIFdvcmtib29rIGFzIEVtYmVkZGluZ1dvcmtib29rLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dvcmtib29rSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvLyBUaGlzIGZpbGUgcmUtZXhwb3J0cyBldmVyeXRoaW5nIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGV4dGVuc2lvbnMgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvRXZlbnRJbnRlcmZhY2UnO1xuZXhwb3J0IHsgRGFzaGJvYXJkQ29udGVudCB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudCc7XG5leHBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvRW52aXJvbm1lbnQnO1xuZXhwb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvRXh0ZW5zaW9ucyc7XG5leHBvcnQgeyBTZXR0aW5ncyB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvU2V0dGluZ3MnO1xuZXhwb3J0IHtcbiAgRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFZpekltYWdlUGFsZXR0ZVR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdBbGlnbm1lbnRUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nVHlwZSxcbiAgVml6SW1hZ2VTb3J0RGlyZWN0aW9uVHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVUknO1xuZXhwb3J0IHsgV29ya3NoZWV0Q29udGVudCB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvV29ya3NoZWV0Q29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9QYXJhbWV0ZXJJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXAsXG4gIERhc2hib2FyZCBhcyBFeHRlbnNpb25EYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFeHRlbnNpb25EYXNoYm9hcmRPYmplY3QsXG4gIFNoZWV0IGFzIEV4dGVuc2lvblNoZWV0LFxuICBXb3Jrc2hlZXQgYXMgRXh0ZW5zaW9uV29ya3NoZWV0LFxuICBQb2ludCxcbiAgWm9uZVZpc2liaWxpdHlNYXAsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9UYWJsZWF1RXJyb3InO1xuZXhwb3J0IHsgV29ya2Jvb2sgYXMgRXh0ZW5zaW9uV29ya2Jvb2sgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9Xb3JrYm9va0ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9FbWJlZGRpbmdBcGlFeHRlcm5hbENvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncywgV2ViQ29tcG9uZW50U2V0dGluZ3NTaGFyZWQgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1hc2stZGF0YT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBlbnVtIEFza0RhdGFBdHRyaWJ1dGVzIHtcbiAgT3JpZ2luID0gJ29yaWdpbicsXG4gIFNob3dFbWJlZCA9ICdzaG93LWVtYmVkJyxcbiAgU2hvd1BpbiA9ICdzaG93LXBpbicsXG4gIFNob3dTYXZlID0gJ3Nob3ctc2F2ZScsXG4gIFNob3dTaGFyZSA9ICdzaG93LXNoYXJlJyxcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGFTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWJlZCBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1lbWJlZD5cbiAgICogYGBgXG4gICAqL1xuICBzaG93RW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGluIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXBpbj5cbiAgICogYGBgXG4gICAqL1xuICBzaG93UGluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNhdmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2F2ZT5cbiAgICogYGBgXG4gICAqL1xuICBzaG93U2F2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzaGFyZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1zaGFyZT5cbiAgICogYGBgXG4gICAqL1xuICBzaG93U2hhcmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiAgVXNlZCBmb3IgdGVsZW1ldHJ5XG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgb3JpZ2luPVwiZW1iZWRkaW5nU2l0ZVwiPlxuICAgKiBgYGBcbiAgICovXG4gIG9yaWdpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEFza0RhdGEgb2JqZWN0LlxuICogQGRlcHJlY2F0ZWRcbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrRGF0YSBleHRlbmRzIEFza0RhdGFTZXR0aW5ncyB7fVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEVtYmVkZGluZyBkZXZlbG9wZXJzLlxuLy8gRW51bXMgc2hvdWxkIGJlIGtlcHQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLlxuLy8gTW9zdCBvZiB0aGVtIHNob3VsZCBtYXRjaCBhbiBlbnVtIG9uIHRoZSBzZXJ2ZXIgZGVmaW5lZCBhdFxuLy8gd29ya2dyb3VwL3ZxbHdlYi9zY3JpcHRzaGFycC9zcmMvQXBpU2hhcmVkL1B1YmxpY0VudW1zLmNzI0wzOTg6MTdcblxuLyoqXG4gKiBDcm9zc3RhYiBmaWxlIGZvcm1hdHMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZXhwb3J0Q3Jvc3N0YWJBc3luY31cbiAqL1xuZXhwb3J0IGVudW0gQ3Jvc3N0YWJGaWxlRm9ybWF0IHtcbiAgQ1NWID0gJ2NzdicsXG4gIEV4Y2VsID0gJ3hsc3gnLFxufVxuXG4vKipcbiAqIERldmljZSB0eXBlcyBhdmFpbGFibGUgdG8gdXNlIHdpdGgge0BsaW5rIFZpei5kZXZpY2V9XG4gKi9cbmV4cG9ydCBlbnVtIERldmljZVR5cGUge1xuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBUYWJsZXQgPSAndGFibGV0JyxcbiAgUGhvbmUgPSAncGhvbmUnLFxufVxuXG4vKipcbiAqIEFsbCBlcnJvciBjb2RlcyB1c2VkIGJ5IHRoZSBFbWJlZGRpbmcgQVBJLlxuICovXG5leHBvcnQgZW51bSBFbWJlZGRpbmdFcnJvckNvZGVzIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgcmVxdWVzdCB0byB0aGUgYXV0aCBlbmRwb2ludCBmYWlscy5cbiAgICovXG4gIEF1dGhGYWlsZWQgPSAnYXV0aC1mYWlsZWQnLFxuICAvKipcbiAgICogVGhlIGJyb3dzZXIgaXMgbm90IGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJXG4gICAqL1xuICBCcm93c2VyTm90Q2FwYWJsZSA9ICdicm93c2VyLW5vdC1jYXBhYmxlJyxcbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9ucyBvbiBhIHdvcmtib29rIG9yIGEgdmlldyBkbyBub3QgYWxsb3cgZG93bmxvYWRpbmcgdGhlIHdvcmtib29rLlxuICAgKi9cbiAgRG93bmxvYWRXb3JrYm9va05vdEFsbG93ZWQgPSAnZG93bmxvYWQtd29ya2Jvb2stbm90LWFsbG93ZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBhIGZpbHRlciBvcGVyYXRpb24uXG4gICAqL1xuICBGaWx0ZXJDYW5ub3RCZVBlcmZvcm1lZCA9ICdmaWx0ZXItY2Fubm90LWJlLXBlcmZvcm1lZCcsXG4gIC8qKlxuICAgKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN3aXRjaCB0byBhIHNoZWV0IGJ5IGluZGV4IHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgSW5kZXhPdXRPZlJhbmdlID0gJ2luZGV4LW91dC1vZi1yYW5nZScsXG4gIC8qKlxuICAgKiBUaHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgd2l0aGluIHRoZSBUYWJsZWF1IEVtYmVkZGluZyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGN1c3RvbSB2aWV3IHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBJbnZhbGlkQ3VzdG9tVmlld05hbWUgPSAnaW52YWxpZC1jdXN0b20tdmlldy1uYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgZGF0ZSB3YXMgc3BlY2lmaWVkIGluIGEgbWV0aG9kIHRoYXQgcmVxdWlyZWQgYSBkYXRlIHBhcmFtZXRlci5cbiAgICovXG4gIEludmFsaWREYXRlUGFyYW1ldGVyID0gJ2ludmFsaWQtZGF0ZS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogRWl0aGVyIGEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgZmllbGQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UsIG9yIHRoZSB2YWx1ZSBzdXBwbGllZFxuICAgKiBpbiB0aGUgZmlsdGVyIG9wZXJhdGlvbiBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIGludmFsaWRGaWx0ZXJGaWVsZE5hbWVPclZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkLW5hbWUnLFxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgaXMgbm90IHRoZSBjb3JyZWN0IGRhdGEgdHlwZSBvciBmb3JtYXQuIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBFcnJvci5tZXNzYWdlXG4gICAqIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFBhcmFtZXRlciA9ICdpbnZhbGlkLXBhcmFtZXRlcicsXG4gIC8qKlxuICAgKiBBIG5lZ2F0aXZlIHNpemUgd2FzIHNwZWNpZmllZCBvciB0aGUgbWF4U2l6ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gbWluU2l6ZSBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKS5cbiAgICovXG4gIEludmFsaWRTaXplID0gJ2ludmFsaWQtc2l6ZScsXG4gIC8qKlxuICAgKiBBdHRlbXB0ZWQgdG8gZ2V0IGFuIGF1dGhvcmluZyB3b3Jrc2hlZXQgd2hlbiB0aGUgY3VycmVudCBzaGVldCBpcyBub3QgYSB3b3Jrc2hlZXQuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEludmFsaWRTaGVldFR5cGUgPSAnaW52YWxpZC1zaGVldC10eXBlJyxcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3IgdmFsdWUgd2FzIGZvdW5kIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBTaGVldFNpemVCZWhhdmlvciBlbnVtLlxuICAgKi9cbiAgSW52YWxpZFNpemVCZWhhdmlvciA9ICdpbnZhbGlkLXNpemUtYmVoYXZpb3InLFxuICAvKipcbiAgICogQSBiZWhhdmlvciBvdGhlciB0aGFuIFNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYyB3YXMgc3BlY2lmaWVkIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gdGhlIHNoZWV0IGlzIGFcbiAgICogV29ya3NoZWV0IGluc3RhbmNlLlxuICAgKi9cbiAgSW52YWxpZFNpemVCZWhhdmlvck9uV29ya3NoZWV0ID0gJ2ludmFsaWQtc2l6ZS1iZWhhdmlvci1vbi13b3Jrc2hlZXQnLFxuICAvKipcbiAgICogVGhlIFVSTCBzcGVjaWZpZWQgaW4gdGhlIFZpeiBjbGFzcyBjb25zdHJ1Y3RvciBpcyBub3QgdmFsaWQuXG4gICAqL1xuICBJbnZhbGlkVXJsID0gJ2ludmFsaWQtdXJsJyxcbiAgLyoqXG4gICAqIFRoZSBtYXhTaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TW9zdC5cbiAgICovXG4gIE1pc3NpbmdNYXhTaXplID0gJ21pc3NpbmctbWF4LXNpemUnLFxuICAvKipcbiAgICogVGhlIG1pblNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdC5cbiAgICovXG4gIE1pc3NpbmdNaW5TaXplID0gJ21pc3NpbmctbWluLXNpemUnLFxuICAvKipcbiAgICogVGhlIG1pblNpemUgb3IgbWF4U2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5SYW5nZS5cbiAgICovXG4gIE1pc3NpbmdNaW5NYXhTaXplID0gJ21pc3NpbmctbWluLW1heC1zaXplJyxcbiAgLyoqXG4gICAqIENhbiBvY2N1ciBpZiB0aGUgZW1iZWRkaW5nIGFwcCBpbnRlcmFjdHMgd2l0aCBhIHBhcmFtZXRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgKi9cbiAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIC8qKlxuICAgKiBUaGUgcmFuZ2VOIGZpZWxkIGlzIG1pc3NpbmcgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIgb2YgdHlwZSBMQVNUTiBvciBORVhUTi5cbiAgICovXG4gIE1pc3NpbmdSYW5nZU5Gb3JSZWxhdGl2ZURhdGVGaWx0ZXJzID0gJ21pc3NpbmctcmFuZ2Utbi1mb3ItcmVsYXRpdmUtZGF0ZS1maWx0ZXJzJyxcbiAgLyoqXG4gICAqIEFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYWNjZXNzIFNoZWV0LmdldFVybCgpIG9uIGEgaGlkZGVuIHNoZWV0LiBIaWRkZW4gc2hlZXRzIGRvIG5vdCBoYXZlIFVSTHMuXG4gICAqL1xuICBOb1VybEZvckhpZGRlbldvcmtzaGVldCA9ICduby11cmwtZm9yLWhpZGRlbi13b3Jrc2hlZXQnLFxuICAvKipcbiAgICogT25lIG9yIGJvdGggb2YgdGhlIHBhcmVudEVsZW1lbnQgb3IgdGhlIFVSTCBwYXJhbWV0ZXJzIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIFZpeiBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIE5vVXJsT3JQYXJlbnRFbGVtZW50Tm90Rm91bmQgPSAnbm8tdXJsLW9yLXBhcmVudC1lbGVtZW50LW5vdC1mb3VuZCcsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHNoZWV0IHRoYXQgaXMgbm90IGFjdGl2ZSBvciBlbWJlZGRlZCB3aXRoaW4gdGhlIGFjdGl2ZSBkYXNoYm9hcmQuXG4gICAqL1xuICBOb3RBY3RpdmVTaGVldCA9ICdub3QtYWN0aXZlLXNoZWV0JyxcbiAgLyoqXG4gICAqIEEgcmVxdWlyZWQgcGFyYW1ldGVyIHdhcyBub3Qgc3BlY2lmaWVkLCBudWxsLCBvciBhbiBlbXB0eSBzdHJpbmcvYXJyYXkuXG4gICAqL1xuICBOdWxsT3JFbXB0eVBhcmFtZXRlciA9ICdudWxsLW9yLWVtcHR5LXBhcmFtZXRlcicsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHNoZWV0IHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgU2hlZXROb3RJbldvcmtib29rID0gJ3NoZWV0LW5vdC1pbi13b3JrYm9vaycsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGEgQ3VzdG9tVmlldyBvYmplY3QgdGhhdCBpcyBubyBsb25nZXIgdmFsaWQgKGl0IGhhcyBiZWVuIHJlbW92ZWQpLlxuICAgKi9cbiAgU3RhbGVEYXRhUmVmZXJlbmNlID0gJ3N0YWxlLWRhdGEtcmVmZXJlbmNlJyxcbiAgLyoqXG4gICAqIFVua25vd24gZXJyb3IgdHJpZ2dlcmVkIGR1cmluZyB0aGUgYXV0aCBmbG93LlxuICAgKi9cbiAgVW5rbm93bkF1dGhFcnJvciA9ICd1bmtub3duLWF1dGgtZXJyb3InLFxuICAvKipcbiAgICogQW4gdW5rbm93biBldmVudCBuYW1lIHdhcyBzcGVjaWZpZWQgaW4gdGhlIGNhbGwgdG8gVml6LmFkZEV2ZW50TGlzdGVuZXIgb3IgVml6LnJlbW92ZUV2ZW50TGlzdGVuZXIuXG4gICAqL1xuICBVbnN1cHBvcnRlZEV2ZW50TmFtZSA9ICd1bnN1cHBvcnRlZC1ldmVudC1uYW1lJyxcbiAgLyoqXG4gICAqIEEgVml6IG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50RWxlbWVudCBzcGVjaWZpZWQgaW4gdGhlIFZpeiBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIFZpekFscmVhZHlJbk1hbmFnZXIgPSAndml6LWFscmVhZHktaW4tbWFuYWdlcicsXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBlbWJlZGRpbmcgYXBpLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBATm90SW1wbGVtZW50ZWRcbiAgICovXG4gIE5vdEltcGxlbWVudGVkID0gJ25vdC1pbXBsZW1lbnRlZCcsXG4gIC8qKlxuICAgKiBVbmtub3duIGVycm9yIGR1cmluZyBldmVudCBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgRXZlbnRJbml0aWFsaXphdGlvbkVycm9yID0gJ2V2ZW50LWluaXRpYWxpemF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIGVtYmVkZGluZyBhcGkgbm90IHN1cHBvcnRlZCBieSB0aGUgdmVyc2lvbiBvZiB0YWJsZWF1XG4gICAqL1xuICBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IgPSAnaW5jb21wYXRpYmxlLXZlcnNpb24tZXJyb3InLFxuXG4gIC8qKlxuICAgKiBVbmtub3duIHtAbGluayBUYWJsZWF1RGlhbG9nVHlwZX0gcGFzc2VkIGluIHRvIFZpei5kaXNwbGF5RGlhbG9nQXN5bmMuXG4gICAqL1xuICBVbmtub3duRGlhbG9nVHlwZSA9ICd1bmtub3duLWRpYWxvZy10eXBlJyxcblxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHRoZSBBUEkgaW50ZXJhY3RzIHdpdGggYSBmaWx0ZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldC5cbiAgICogQ2FuIGFsc28gb2NjdXJzIGlmIGEge0BsaW5rIEZpbHRlclR5cGV9IGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZC5cbiAgICovXG4gIEZpbHRlck1pc3NpbmdPck5vdEltcGxlbWVudGVkID0gJ2ZpbHRlci1taXNzaW5nLW5vdC1pbXBsZW1lbnRlZCcsXG5cbiAgLyoqXG4gICAqIENhbiBvY2N1ciBpZiBzdG9yeSBwb2ludCBpZHMgbm8gbG9uZ2VyIG1hdGNoLlxuICAgKi9cbiAgU3RvcnlQb2ludElkTWlzbWF0Y2ggPSAnc3Rvcnlwb2ludC1pZC1taXNtYXRjaCcsXG59XG5cbi8qKlxuICogRm9ybWF0cyBhdmFpbGFibGUgdG8gdXNlIHdpdGggZGlzcGxheVN0YXRpY0ltYWdlIGluIEBWaXpJbnRlcmZhY2VzXG4gKi9cbmV4cG9ydCBlbnVtIEZpbGVGb3JtYXRzIHtcbiAgUERGID0gJ3BkZicsXG4gIFBORyA9ICdwbmcnLFxufVxuXG5leHBvcnQgZW51bSBQcmludE9yaWVudGF0aW9uIHtcbiAgUG9ydHJhaXQgPSAncG9ydHJhaXQnLFxuICBMYW5kc2NhcGUgPSAnbGFuZHNjYXBlJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRQYWdlU2l6ZSB7XG4gIExldHRlciA9ICdsZXR0ZXInLFxuICBMZWdhbCA9ICdsZWdhbCcsXG4gIE5vdGUgPSAnbm90ZScsXG4gIEZvbGlvID0gJ2ZvbGlvJyxcbiAgVGFibG9pZCA9ICd0YWJsb2lkJyxcbiAgTGVkZ2VyID0gJ2xlZGdlcicsXG4gIFN0YXRlbWVudCA9ICdzdGF0ZW1lbnQnLFxuICBFeGVjdXRpdmUgPSAnZXhlY3V0aXZlJyxcbiAgQTMgPSAnQTMnLFxuICBBNCA9ICdBNCcsXG4gIEE1ID0gJ0E1JyxcbiAgQjQgPSAnQjQnLFxuICBCNSA9ICdCNScsXG4gIFF1YXJ0byA9ICdxdWFydG8nLFxuICBVbnNwZWNpZmllZCA9ICd1bnNwZWNpZmllZCcsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50U2NhbGluZyB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBQZXJjMjUgPSAnMjUlJyxcbiAgUGVyYzUwID0gJzUwJScsXG4gIFBlcmM2MCA9ICc2MCUnLFxuICBQZXJjNzUgPSAnNzUlJyxcbiAgUGVyYzgwID0gJzgwJScsXG4gIFBlcmM5MCA9ICc5MCUnLFxuICBQZXJjMTAwID0gJzEwMCUnLFxuICBQZXJjMjAwID0gJzIwMCUnLFxuICBQZXJjNDAwID0gJzQwMCUnLFxuICBBdE1vc3QxUGFnZUhpZ2ggPSAnYXQtbW9zdC0xLXBhZ2UtaGlnaCcsXG4gIEF0TW9zdDJQYWdlc0hpZ2ggPSAnYXQtbW9zdC0yLXBhZ2VzLWhpZ2gnLFxuICBBdE1vc3QxUGFnZVdpZGUgPSAnYXQtbW9zdC0xLXBhZ2Utd2lkZScsXG4gIEF0TW9zdDJQYWdlc1dpZGUgPSAnYXQtbW9zdC0yLXBhZ2VzLXdpZGUnLFxufVxuXG5leHBvcnQgZW51bSBSZXZlcnRWaXpTZWxlY3Rpb24ge1xuICBBbGwgPSAnYWxsJyxcbiAgQXhlcyA9ICdheGVzJyxcbiAgRmlsdGVycyA9ICdmaWx0ZXJzJyxcbiAgU29ydHMgPSAnc29ydHMnLFxuICBTaGVsdmVzID0gJ3NoZWx2ZXMnLFxufVxuXG5leHBvcnQgZW51bSBUb29sYmFyQnV0dG9ucyB7XG4gIEFsZXJ0cyA9ICdhbGVydHMnLFxuICBBc2tEYXRhID0gJ2Fza0RhdGEnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b21WaWV3cycsXG4gIERhdGFEZXRhaWxzID0gJ2RhdGFEZXRhaWxzJyxcbiAgU2hhcmUgPSAnc2hhcmUnLFxuICBTdWJzY3JpYmUgPSAnc3Vic2NyaWJlJyxcbn1cblxuZXhwb3J0IGVudW0gVG9vbGJhciB7XG4gIFRvcCA9ICd0b3AnLFxuICBCb3R0b20gPSAnYm90dG9tJyxcbiAgSGlkZGVuID0gJ2hpZGRlbicsXG59XG5cbmV4cG9ydCBlbnVtIFNoZWV0U2l6ZUJlaGF2aW9yIHtcbiAgQXV0b21hdGljID0gJ2F1dG9tYXRpYycsXG4gIEV4YWN0bHkgPSAnZXhhY3RseScsXG4gIFJhbmdlID0gJ3JhbmdlJyxcbiAgQXRMZWFzdCA9ICdhdGxlYXN0JyxcbiAgQXRNb3N0ID0gJ2F0bW9zdCcsXG59XG5cbi8qKlxuICogQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBuZXcgZXZlbnQgdHlwZXMuIEV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBmb2xsb3cgdHdvIGRpZmZlcmVudCBwYXR0ZXJucyBvbiBob3cgZXZlbnRzIGFyZSBuYW1lZC5cbiAqIEV2ZW50cyBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UgYW5kIHdpdGhvdXQgaHlwaGVucyBvciB1bmRlcnNjb3Jlcy5cbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGFibGVhdSBlbWJlZGRpbmcgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdMb2FkZWQgPSAnY3VzdG9tdmlld2xvYWRlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdSZW1vdmVkID0gJ2N1c3RvbXZpZXdyZW1vdmVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdTYXZlZCA9ICdjdXN0b212aWV3c2F2ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tdmlld3NldGRlZmF1bHQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRWRpdEJ1dHRvbkNsaWNrZWQgPSAnZWRpdGJ1dHRvbmNsaWNrZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgSW4gRGVza3RvcCBCdXR0b24uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmdcbiAgICovXG4gIEVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ2VkaXRpbmRlc2t0b3BidXR0b25jbGlja2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRmlsdGVyQ2hhbmdlZCA9ICdmaWx0ZXJjaGFuZ2VkJyxcblxuICAvKiogRmlyZWQgd2hlbiB2aXogc2l6ZSBpcyBrbm93blxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdHZpenNpemVrbm93bicsXG5cbiAgLyoqIEZpcmVkIHdoZW4gYSB2aXogZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBGaXJzdEludGVyYWN0aXZlID0gJ2ZpcnN0aW50ZXJhY3RpdmUnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSBtYXJrIGNvbnRleHQgbWVudSBpcyBjbGlja2VkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnY3VzdG9tbWFya2NvbnRleHRtZW51JyxcblxuICAvKiogVGhlIHNlbGVjdGVkIG1hcmtzIG9uIGEgdmlzdWFsaXphdGlvbiBoYXZlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIE1hcmtTZWxlY3Rpb25DaGFuZ2VkID0gJ21hcmtzZWxlY3Rpb25jaGFuZ2VkJyxcblxuICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICd0b29sYmFyc3RhdGVjaGFuZ2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGlzIHJlYWR5IHRvIGNsb3NlLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1JlYWR5VG9DbG9zZSA9ICd3b3JrYm9va3JlYWR5dG9jbG9zZScsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkID0gJ3dvcmtib29rcHVibGlzaGVkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICd3b3JrYm9va3B1Ymxpc2hlZGFzJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVXJsQWN0aW9uID0gJ3VybGFjdGlvbicsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCBhZnRlciBhIHRhYiBzd2l0Y2ggb2NjdXJzICh0aGUgYWN0aXZlIHNoZWV0IGhhcyBjaGFuZ2VkKS4gR3VhcmFudGVlcyB0aGUgdml6IG9iamVjdCB3aWxsIGJlIGludGVyYWN0aXZlIGFmdGVyIHRoaXMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBUYWJTd2l0Y2hlZCA9ICd0YWJzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSBuZXcgc3RvcnkgcG9pbnQgYmVjb21lcyBhY3RpdmUuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdG9yeVBvaW50U3dpdGNoZWQgPSAnc3Rvcnlwb2ludHN3aXRjaGVkJyxcbiAgLyoqXG4gICAqXG4gICAqIFJhaXNlZCB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgd2ViY29tcG9uZW50LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBBc2tEYXRhXG4gICAqL1xuICBWaXpMb2FkRXJyb3IgPSAndml6bG9hZGVycm9yJyxcbiAgLyoqXG4gICAqIFJhaXNlZCBhZnRlciB0aGUgaWZyYW1lIHNyYyBhdHRyaWJ1dGUgaGFzIGJlZW4gdXBkYXRlZFxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBBc2tEYXRhXG4gICAqL1xuICBJZnJhbWVTcmNVcGRhdGVkID0gJ2lmcmFtZXNyY3VwZGF0ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBjaGFuZ2VzIGFyZSBtYWRlIHRvIHN1bW1hcnkgZGF0YS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5ZGF0YWNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiB0YWJsZWF1ICh2aXotY2xpZW50KSBpcyByZWFkeSB0byByZWNlaXZlIGFuIGF1dGggdG9rZW4uXG4gICAqIFVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGluIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGUuXG4gICAqXG4gICAqIEBoaWRkZW5cbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZyxcbiAgICovXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5dG9yZWNlaXZlYXV0aHRva2VuJyxcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiBhIGNvbnRleHQgbWVudSB3aGVyZSB1c2VycyBjYW4gYWRkIGV4dGVybmFsIG1lbnUgaXRlbXMuXG4gKi9cbmV4cG9ydCBlbnVtIEFwaU1lbnVUeXBlIHtcbiAgLyoqIEV4dGVybmFsIG1lbnUgaXRlbSB3aWxsIGJlIGluamVjdGVkIGluIHViZXJ0aXAgZGlhbG9nICovXG4gIFViZXJ0aXAgPSAndWJlcnRpcCcsXG59XG5cbi8qKiBZb3UgY2FuIHVzZSB0aGlzIHR5cGUgd2l0aCBhIHtAbGluayBWaXp9IG9iamVjdC4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlYXVEaWFsb2dUeXBlIHtcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgUERGIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydFBERiA9ICdleHBvcnQtcGRmJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgUG93ZXJQb2ludCBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRQb3dlclBvaW50ID0gJ2V4cG9ydC1wb3dlcnBvaW50JyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgRGF0YSBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnREYXRhID0gJ2V4cG9ydC1kYXRhJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgQ3Jvc3NUYWIgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0Q3Jvc3NUYWIgPSAnZXhwb3J0LWNyb3NzLXRhYicsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFdvcmtib29rIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydFdvcmtib29rID0gJ2V4cG9ydC13b3JrYm9vaycsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIFNoYXJlIGRpYWxvZy5cbiAgICovXG4gIFNoYXJlID0gJ3NoYXJlJyxcbn1cbiIsImltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1wdWxzZT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gUHVsc2VBdHRyaWJ1dGVzIHtcbiAgRGlzYWJsZUV4cGxvcmVGaWx0ZXIgPSAnZGlzYWJsZS1leHBsb3JlLWZpbHRlcicsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRva2VuIHVzZWQgZm9yIGF1dGhvcml6YXRpb25cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AtbGV2ZWwgUHVsc2Ugb2JqZWN0LlxuICoqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZSBleHRlbmRzIFB1bHNlU2V0dGluZ3Mge31cbiIsImltcG9ydCB7XG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRGV2aWNlVHlwZSxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBUYWJsZWF1RGlhbG9nVHlwZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVG9vbGJhcixcbn0gZnJvbSAnLi9FbnVtcyc7XG5pbXBvcnQgeyBTaGVldFNpemUgfSBmcm9tICcuL1NoZWV0SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4vV29ya2Jvb2tJbnRlcmZhY2UnO1xuXG4vKipcbiAqIFRoZSBzaGFyZWQgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS12aXo+IGFuZCA8dGFibGVhdS1hdXRob3Jpbmctdml6PiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBWaXpTaGFyZWRBdHRyaWJ1dGVzIHtcbiAgVG91Y2hPcHRpbWl6ZSA9ICd0b3VjaC1vcHRpbWl6ZScsXG4gIEhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uID0gJ2hpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbicsXG4gIFN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvciA9ICdzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3InLFxuICBEaXNhYmxlVmVyc2lvbkNoZWNrID0gJ2Rpc2FibGUtdmVyc2lvbi1jaGVjaycsXG4gIE9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCcsXG4gIE9uRmlyc3RWaXpTaXplS25vd24gPSAnb25GaXJzdFZpelNpemVLbm93bicsXG4gIE9uRmlyc3RJbnRlcmFjdGl2ZSA9ICdvbkZpcnN0SW50ZXJhY3RpdmUnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF0dHJpYnV0ZXMge1xuICBEaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9ICdkaXNhYmxlLXVybC1hY3Rpb25zJyxcbiAgSGlkZVRhYnMgPSAnaGlkZS10YWJzJyxcbiAgVG9vbGJhciA9ICd0b29sYmFyJyxcbiAgSW5zdGFuY2VJZFRvQ2xvbmUgPSAnaW5zdGFuY2UtaWQtdG8tY2xvbmUnLFxuICBEZXZpY2UgPSAnZGV2aWNlJyxcbiAgSGlkZUVkaXRCdXR0b24gPSAnaGlkZS1lZGl0LWJ1dHRvbicsXG4gIE9uRWRpdEJ1dHRvbkNsaWNrZWQgPSAnb25FZGl0QnV0dG9uQ2xpY2tlZCcsXG4gIE9uRmlsdGVyQ2hhbmdlZCA9ICdvbkZpbHRlckNoYW5nZWQnLFxuICBPbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ29uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQnLFxuICBPbk1hcmtTZWxlY3Rpb25DaGFuZ2VkID0gJ29uTWFya1NlbGVjdGlvbkNoYW5nZWQnLFxuICBPblBhcmFtZXRlckNoYW5nZWQgPSAnb25QYXJhbWV0ZXJDaGFuZ2VkJyxcbiAgT25Ub29sYmFyU3RhdGVDaGFuZ2VkID0gJ29uVG9vbGJhclN0YXRlQ2hhbmdlZCcsXG4gIE9uVXJsQWN0aW9uID0gJ29uVXJsQWN0aW9uJyxcbiAgT25UYWJTd2l0Y2hlZCA9ICdvblRhYlN3aXRjaGVkJyxcbiAgT25DdXN0b21WaWV3TG9hZGVkID0gJ29uQ3VzdG9tVmlld0xvYWRlZCcsXG4gIE9uQ3VzdG9tVmlld1JlbW92ZWQgPSAnb25DdXN0b21WaWV3UmVtb3ZlZCcsXG4gIE9uQ3VzdG9tVmlld1NhdmVkID0gJ29uQ3VzdG9tVmlld1NhdmVkJyxcbiAgT25DdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdvbkN1c3RvbVZpZXdTZXREZWZhdWx0JyxcbiAgT25TdG9yeVBvaW50U3dpdGNoZWQgPSAnb25TdG9yeVBvaW50U3dpdGNoZWQnLFxuICBPblN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdvblN1bW1hcnlEYXRhQ2hhbmdlZCcsXG4gIE9uUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4gPSAnb25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbicsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF1dGhvcmluZ0F0dHJpYnV0ZXMge1xuICBPbldvcmtib29rUHVibGlzaGVkID0gJ29uV29ya2Jvb2tQdWJsaXNoZWQnLFxuICBPbldvcmtib29rUHVibGlzaGVkQXMgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZEFzJyxcbiAgT25Xb3JrYm9va1JlYWR5VG9DbG9zZSA9ICdvbldvcmtib29rUmVhZHlUb0Nsb3NlJyxcbiAgSGlkZUNsb3NlQnV0dG9uID0gJ2hpZGUtY2xvc2UtYnV0dG9uJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiBhbmQgVGFibGVhdUF1dGhvcmluZ1ZpeiBjdXN0b20gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGZpbHRlciBwYXJhbWV0ZXJzLiBBdmFpbGFibGUgb25seSBpbiB2aWV3aW5nIG1vZGUuXG4gICAqL1xuICBWaXpGaWx0ZXIgPSAndml6LWZpbHRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbmFtZSBhbmQgdmFsdWUgZm9yIGEgcGFyYW1ldGVyLiBBdmFpbGFibGUgb25seSBpbiB2aWV3aW5nIG1vZGUuXG4gICAqL1xuICBWaXpQYXJhbWV0ZXIgPSAndml6LXBhcmFtZXRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcbn1cblxuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AgbGV2ZWwgVml6IG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6IGV4dGVuZHMgVml6U2V0dGluZ3MsIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogT25lIFdvcmtib29rIGlzIHN1cHBvcnRlZCBwZXIgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rPzogV29ya2Jvb2s7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEF1dGhvcmluZyBWaXogb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcmluZ1ZpeiBleHRlbmRzIFZpekF1dGhvcmluZ1NldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgLSBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgdml6XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6QWN0aW9ucyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhdXRvbWF0aWMgdXBkYXRlcyBhcmUgY3VycmVudGx5IHBhdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF1dG9tYXRpY1VwZGF0ZXNBcmVQYXVzZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdXNlIGxheW91dCB1cGRhdGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlc2l6aW5nIHRoZSB2aXN1YWxpemF0aW9uIG9yIHBlcmZvcm1pbmcgbXVsdGlwbGUgY2FsbHMgdGhhdCBjb3VsZCBhZmZlY3QgdGhlIGxheW91dC5cbiAgICovXG4gIHBhdXNlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBsYXlvdXQgdXBkYXRlcy5cbiAgICovXG4gIHJlc3VtZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICB0b2dnbGVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiB0aGUgUmV2ZXJ0IEFsbCB0b29sYmFyIGJ1dHRvbiwgd2hpY2ggcmVzdG9yZXMgdGhlIHdvcmtib29rIHRvIGl0cyBzdGFydGluZyBzdGF0ZS5cbiAgICovXG4gIHJldmVydEFsbEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJlZnJlc2ggRGF0YSB0b29sYmFyIGJ1dHRvbi5cbiAgICovXG4gIHJlZnJlc2hEYXRhQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiBEb3dubG9hZCA+IEltYWdlIGZyb20gdGhlIHRvb2xiYXIsIHdoaWNoIGNyZWF0ZXMgYSBQTkcgZmlsZSBvZiB0aGUgY3VycmVudCB2aXN1YWxpemF0aW9uLlxuICAgKi9cbiAgZXhwb3J0SW1hZ2VBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBjcm9zc3RhYiBvZiBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3IHRvIGFcbiAgICogc3BlY2lmaWVkIGZvcm1hdCAoQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKS5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzaGVldCBuYW1lIGRvZXMgbm90IG1hdGNoIGFueSB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgYWN0aXZlIHNoZWV0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNyb3NzdGFiIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydENyb3NzdGFiQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogdml6LmV4cG9ydENyb3NzdGFiQXN5bmMoJ1NhbGVzIGJ5IFNlZ21lbnQnLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRDcm9zc3RhYkFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIHN1bW1hcnkgZGF0YSBzaG93biBpbiB0aGUgVmlldyBEYXRhIHdpbmRvd1xuICAgKiAoc2hvd24gd2hlbiB5b3UgY2xpY2sgRG93bmxvYWQgPiBEYXRhIGZyb20gdGhlIHRvb2xiYXIgZm9yIGFueSBnaXZlbiB3b3Jrc2hlZXQgd2l0aGluIHRoZSBjdXJyZW50IHZpZXcpLlxuICAgKiBUaGUgY3VycmVudCBmaWxlIGZvcm1hdCBpcyBDU1YuIFRoZXJlIGlzIG5vIGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCBvZiBzdW1tYXJ5IGRhdGEgeW91IGNhbiBleHBvcnQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZC5cbiAgICogTm90ZTogZXhwb3J0RGF0YUFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gdml6Lndvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAqICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IGFjdGl2ZVNoZWV0LmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk7XG4gICAqICAgLy8gR2V0dGluZyBmaWVsZElkJ3MgZm9yIExhdGl0dWRlIGFuZCBMb25naXR1ZGUgY29sdW1uc1xuICAgKiAgIGNvbnN0IGNvbHVtbnNUb0luY2x1ZGVCeUlkID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgKiAgICAgaWYgKGNvbHVtbi5maWVsZE5hbWUgPT09ICdMYXRpdHVkZScgfHwgY29sdW1uLmZpZWxkTmFtZSA9PT0gJ0xvbmdpdHVkZScpIHtcbiAgICogICAgICAgcmV0dXJuIGNvbHVtbi5maWVsZElkO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMoYWN0aXZlU2hlZXQubmFtZSwgeyBjb2x1bW5zVG9JbmNsdWRlQnlJZCB9KTtcbiAgICogfVxuICAgKiBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgaW4gdGhlIGRhc2hib2FyZCB3aGlsZSBhbHNvIGlnbm9yaW5nIGFsaWFzZXNcbiAgICogICBmb3IgKGNvbnN0IHdvcmtzaGVldCBvZiBhY3RpdmVTaGVldC53b3Jrc2hlZXRzKSB7XG4gICAqICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKHdvcmtzaGVldC5uYW1lLCB7IGlnbm9yZUFsaWFzZXM6IHRydWUgfSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGVsc2VcbiAgICoge1xuICAgKiAgIC8vIGFjdGl2ZVNoZWV0IGlzIGEgU3RvcnkgYW5kIHdlIHdhbnQgdG8gZXhwb3J0IHdvcmtzaGVldHMgd2l0aGluIHRoZSBjdXJyZW50IHZpZXdcbiAgICogICBjb25zdCBjb250YWluZWRTaGVldCA9IGFjdGl2ZVNoZWV0LmFjdGl2ZVN0b3J5UG9pbnQuY29udGFpbmVkU2hlZXQ7XG4gICAqICAgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgc3VtbWFyeSBkYXRhIG9mIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgYWN0aXZlIHN0b3J5IHBvaW50XG4gICAqICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGNvbnRhaW5lZFNoZWV0Lm5hbWUpO1xuICAgKiAgIH0gZWxzZSBpZiAoY29udGFpbmVkU2hlZXQgIT09IHVuZGVmaW5lZCAmJiBjb250YWluZWRTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICAgIC8vIEV4cG9ydGluZyB0aGUgc3VtbWFyeSBkYXRhIGZvciBlYWNoIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgY29udGFpbmVkU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKHdvcmtzaGVldC5uYW1lKTtcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBleHBvcnREYXRhQXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBFeHBvcnREYXRhT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGxpc3Qgb2Ygc2hlZXRzIHRvIGEgUG93ZXJQb2ludCBmaWxlLiBJZiBubyBzaGVldHMgYXJlIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2hlZXQgaXMgZXhwb3J0ZWQuXG4gICAqIFRoZSBvcmRlciB0aGUgc2hlZXRzIGFwcGVhciBpbiB0aGUgbGlzdCBpcyB0aGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIFBvd2VyUG9pbnQgZmlsZS5cbiAgICogVGhlIGxpc3Qgb2Ygc2hlZXRzIGNhbiBlaXRoZXIgZXhjbHVzaXZlbHkgaW5jbHVkZSB0aGUgd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgb3IgZXhjbHVzaXZlbHkgaW5jbHVkZSB0aGUgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBsaXN0IG9mIHNoZWV0cyBjb250YWlucyBib3RoIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIGFuZCBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIFBvd2VyUG9pbnQgZmlsZSBmYWlscyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBOb3RlOiBleHBvcnRQb3dlclBvaW50QXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCk7XG4gICAqIH0gZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSAgU2hlZXRUeXBlLkRhc2hib2FyZCkge1xuICAgKiAgIGNvbnN0IHdvcmtzaGVldE5hbWVzID0gYWN0aXZlU2hlZXQud29ya3NoZWV0cy5tYXAoKHdvcmtzaGVldCkgPT4gd29ya3NoZWV0Lm5hbWUpO1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQb3dlclBvaW50QXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUG93ZXJQb2ludFxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHB1Ymxpc2hlZFNoZWV0TmFtZXMpO1xuICAgKiBgYGBcbiAgICovXG4gIGV4cG9ydFBvd2VyUG9pbnRBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGxpc3Qgb2Ygc2hlZXRzIHdpdGggdGhlIGdpdmVuIHtAbGluayBFeHBvcnRQREZPcHRpb25zfSBvcHRpb25zLiBJZiBubyBzaGVldHMgYXJlIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2hlZXQgaXMgZXhwb3J0ZWQuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIElmIG5vIEV4cG9ydFBERk9wdGlvbnMgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXJlOiBTY2FsaW5nID0gQXV0b21hdGljLCBQYWdlU2l6ZSA9IExldHRlciwgYW5kIE9yaWVudGF0aW9uID0gUG9ydHJhaXQuXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQREYgZmlsZSBmYWlscyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBOb3RlOiBleHBvcnRQREZBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCB3b3JrYm9vayA9IHZpei53b3JrYm9vaztcbiAgICogY29uc3QgYWN0aXZlU2hlZXQgPSB3b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCB8fCBhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5TdG9yeSkge1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQREZBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUERGXG4gICAqIGNvbnN0IHB1Ymxpc2hlZFNoZWV0TmFtZXMgPSB3b3JrYm9vay5wdWJsaXNoZWRTaGVldHNJbmZvLm1hcCgocHVibGlzaGVkU2hlZXRJbmZvKSA9PiBwdWJsaXNoZWRTaGVldEluZm8ubmFtZSk7XG4gICAqIGF3YWl0IHZpei5leHBvcnRQREZBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQREZBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPiwgb3B0aW9ucz86IEV4cG9ydFBERk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG9uZSBvZiB0aGUgZXhwb3J0IGRpYWxvZ3MgYmFzZWQgb24gdGhlIGRpYWxvZ1R5cGUgcGFyYW1ldGVyXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBkaWFsb2dUeXBlIGlzIGludmFsaWRcbiAgICovXG4gIGRpc3BsYXlEaWFsb2dBc3luYyhkaWFsb2dUeXBlOiBUYWJsZWF1RGlhbG9nVHlwZSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFJlZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICByZWRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5kb2VzIHRoZSBsYXN0IGFjdGlvbiBwZXJmb3JtZWQgb24gYSBzaGVldC5cbiAgICovXG4gIHVuZG9Bc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqXG4gICAqIGBgYFxuICAgKiBhc3luYyBmdW5jdGlvbiBnZXRTZWxlY3RlZE1hcmtzKGV2ZW50KSB7XG4gICAqICAgICBjb25zdCBtYXJrc1NlbGVjdGVkID0gYXdhaXQgZXZlbnQuZGV0YWlsLmdldE1hcmtzQXN5bmMoKTtcbiAgICogICAgIGNvbnN0IG51bU1hcmtzID0gbWFya3NTZWxlY3RlZC5kYXRhWzBdLmRhdGEubGVuZ3RoO1xuICAgKiAgICAgY29uc29sZS5sb2coYCR7bnVtTWFya3N9IG1hcmtzIFNlbGVjdGVkYCk7XG4gICAqIH1cbiAgICpcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5hZGRFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5yZW1vdmVFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIHZpeiBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSB2aXouXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDx2aXotZmlsdGVyPmAgZWxlbWVudCBpbiB0aGUgYDx0YWJsZWF1LXZpej5gIHdlYiBjb21wb25lbnQsXG4gICAqIHlvdSBtaWdodCBleHBlcmllbmNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlIFNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiB2aXouYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXpTaXplIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNoZWV0U2l6ZSByZWNvcmQgZm9yIHRoZSBjdXJyZW50IHNoZWV0XG4gICAqL1xuICByZWFkb25seSBzaGVldFNpemU6IFNoZWV0U2l6ZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBUYWJsZWF1IFVJIGVsZW1lbnRzICh0aGUgY2hyb21lKSBzdXJyb3VuZGluZyB0aGUgdmlldy5cbiAgICovXG4gIHJlYWRvbmx5IGNocm9tZUhlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGUuXG4gKi9cbmludGVyZmFjZSBWaXpTZXR0aW5nc1NoYXJlZCBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHRvdWNoIG9wdGltaXplIHZpeiBjb250cm9scy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRvdWNoLW9wdGltaXplIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG91Y2hPcHRpbWl6ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogYGBgXG4gICAqL1xuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGVkaXQgYmVoYXZpb3IgaXMgc3VwcHJlc3NlZC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIG5vdCBzdXBwcmVzc2VkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHN1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIGBgYFxuICAgKi9cbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPVwib25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzaXplIG9mIHRoZSB2aXogaXMga25vd24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gcGVyZm9ybSB0YXNrcyBzdWNoIGFzIHJlc2l6aW5nXG4gICAqIHRoZSBlbGVtZW50cyBzdXJyb3VuZGluZyB0aGUgVml6IG9iamVjdCBvbmNlIHRoZSBvYmplY3QncyBzaXplIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdFZpelNpemVLbm93blwiPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlyc3RWaXpTaXplS25vd249XCJvbkZpcnN0Vml6U2l6ZUtub3duSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdFZpelNpemVLbm93bj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIFZpeiBvYmplY3QgZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZS4gVGhpcyBpcyBvbmx5IHJhaXNlZCBvbmNlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdEludGVyYWN0aXZlXCI9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0SW50ZXJhY3RpdmU9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpcnN0SW50ZXJhY3RpdmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIHZpZXcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHN1cHByZXNzIHRoZSBleGVjdXRpb24gb2YgVVJMIGFjdGlvbnMuIFRoaXMgb3B0aW9uIGRvZXMgbm90IHByZXZlbnQgdGhlIFVSTCBhY3Rpb25cbiAgICogZXZlbnQgZnJvbSBiZWluZyByYWlzZWQuIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBJZiBzZXRcbiAgICogdG8gdHJ1ZSBhbmQgeW91IGNyZWF0ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIFVSTF9BQ1RJT04gZXZlbnQsIHlvdSBjYW4gdXNlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqIGhhbmRsZXIgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRpc2FibGUtdXJsLWFjdGlvbnMgLz5cbiAgICogYGBgXG4gICAqL1xuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYnMgYXJlIGhpZGRlbiBvciBzaG93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgaGlkZS10YWJzIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZVRhYnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sYmFyLCBpZiBpdCBpcyBzaG93bi4gVGhlIHZhbHVlcyBjYW4gYmUgVG9vbGJhci5Ub3AsXG4gICAqIFRvb2xiYXIuQm90dG9tIG9yIFRvb2xiYXIuSGlkZGVuLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBUb29sYmFyLkJvdHRvbS5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgdG9vbGJhcj1cImhpZGRlblwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9vbGJhcj86IFRvb2xiYXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGRldmljZSBsYXlvdXQgZm9yIGEgZGFzaGJvYXJkLCBpZiBpdCBleGlzdHMuXG4gICAqIFZhbHVlcyBjYW4gYmUgZGVmYXVsdCwgZGVza3RvcCwgdGFibGV0LCBvciBwaG9uZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gbG9hZGluZyBhIGxheW91dCBiYXNlZCBvbiB0aGVcbiAgICogc21hbGxlc3QgZGltZW5zaW9uIG9mIHRoZSBob3N0aW5nIGlmcmFtZSBlbGVtZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBkZXZpY2U9XCJkZXNrdG9wXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBkZXZpY2U/OiBEZXZpY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIElEIG9mIGFuIGV4aXN0aW5nIGluc3RhbmNlIHRvIG1ha2UgYSBjb3B5IChjbG9uZSkgb2YuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlIGFuYWx5c2lzIG9mIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb25cbiAgICogd2l0aG91dCBsb3NpbmcgdGhlIHN0YXRlIG9mIHRoZSBvcmlnaW5hbC4gSWYgdGhlIElEIGRvZXMgbm90IHJlZmVyIHRvIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb24sXG4gICAqIHRoZSBjbG9uZWQgdmVyc2lvbiBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGluc3RhbmNlLWlkLXRvLWNsb25lPVwiaWQxXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpbnN0YW5jZUlkVG9DbG9uZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEVkaXQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25FZGl0QnV0dG9uQ2xpY2tlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlsdGVyQ2hhbmdlZD1cIm9uRmlsdGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlsdGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50PVwib25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD1cIm9uTWFya1NlbGVjdGlvbkNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIHBhcmFtZXRlciBoYXMgaGFkIGl0cyB2YWx1ZSBtb2RpZmllZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tQYXJhbWV0ZXJdXSBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uUGFyYW1ldGVyQ2hhbmdlZD1cIm9uUGFyYW1ldGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uUGFyYW1ldGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSB0b29sYmFyIGJ1dHRvbiBvciBjb250cm9sIGJlY29tZXMgYXZhaWxhYmxlIG9yIGJlY29tZXMgdW5hdmFpbGFibGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPVwib25Ub29sYmFyU3RhdGVDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBTZWUgdGhlIHtAbGluayBVcmxBY3Rpb25FdmVudH0gY2xhc3MuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25VcmxBY3Rpb249XCJvblVybEFjdGlvbkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVXJsQWN0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVGFiU3dpdGNoZWQ9XCJvblRhYlN3aXRjaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25UYWJTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrXG4gICAqIGZ1bmN0aW9uIGZvciB7QGxpbmsgRmlyc3RJbnRlcmFjdGl2ZX0gKGlmIGFueSkgaGFzIGJlZW4gY2FsbGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld0xvYWRlZD1cIm9uQ3VzdG9tVmlld0xvYWRlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld0xvYWRlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiByZW1vdmVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1JlbW92ZWQ9XCJvbkN1c3RvbVZpZXdSZW1vdmVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3UmVtb3ZlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdTYXZlZD1cIm9uQ3VzdG9tVmlld1NhdmVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2F2ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0IGFzIHRoZSBkZWZhdWx0IHZpZXcgZm9yIGEgd29ya2Jvb2suXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2V0RGVmYXVsdD1cIm9uQ3VzdG9tVmlld1NldERlZmF1bHRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdTZXREZWZhdWx0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSBuZXcgc3RvcnkgcG9pbnQgYmVjb21lcyBhY3RpdmUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdG9yeVBvaW50U3dpdGNoZWQ9XCJvblN0b3J5UG9pbnRTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3RvcnlQb2ludFN3aXRjaGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc3VtbWFyeSBkYXRhIG9uIGEgdmlzdWFsaXphdGlvbiBoYXZlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblN1bW1hcnlEYXRhQ2hhbmdlZD1cIm9uU3VtbWFyeURhdGFDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25TdW1tYXJ5RGF0YUNoYW5nZWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogKEJldGEpIFJlcHJlc2VudHMgdGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIGF1dGhvcmluZyBtb2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekF1dGhvcmluZ1NldHRpbmdzIGV4dGVuZHMgVml6U2V0dGluZ3NTaGFyZWQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIENsb3NlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgQ2xvc2UgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtY2xvc2UtYnV0dG9uIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUNsb3NlQnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGhhcyBiZWVuIHB1Ymxpc2hlZC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZD1cIm9uV29ya2Jvb2tQdWJsaXNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUHVibGlzaGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBcInB1Ymxpc2ggYXNcIiBpcyBzdWNjZXNzZnVsLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbldvcmtib29rUHVibGlzaGVkQXM9XCJvbldvcmtib29rUHVibGlzaGVkQXNIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUHVibGlzaGVkQXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT1cIm9uV29ya2Jvb2tSZWFkeVRvQ2xvc2VIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUmVhZHlUb0Nsb3NlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlclBhcmFtZXRlcnMge1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZpelBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gc2V0IFBhcmFtZXRlciB2YWx1ZXMgb24gdGhlIHZpei5cbiAqXG4gKiAqIGBgYFxuICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICogIDx2aXotcGFyYW1ldGVyIG5hbWU9XCJwYXJhbWV0ZXItbmFtZVwiIHZhbHVlPVwicGFyYW1ldGVyLXZhbHVlXCI+PC92aXotcGFyYW1ldGVyPlxuICogPC90YWJsZWF1LXZpej5cbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpQYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDdXN0b21QYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHBhc3MgYWxvbmcgc2V0dGluZ3MsIGluZm9ybWF0aW9uLCBldGMuLCB0aGF0IGFyZW4ndCBleHBvc2VkIG9uIHRoZVxuICogdGFibGVhdS12aXogZWxlbWVudC4gQ3VzdG9tUGFyYW1ldGVycyB3aWxsIG92ZXJyaWRlIGF0dHJpYnV0ZXMsIG9yIGZpbHRlcnMsIHNldCBvbiB0aGUgdGFibGVhdS12aXogZWxlbWVudC5cbiAqXG4gKiAqIGBgYFxuICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICogIDxjdXN0b20tcGFyYW1ldGVyIG5hbWU9XCJwYXJhbWV0ZXItbmFtZVwiIHZhbHVlPVwicGFyYW1ldGVyLXZhbHVlXCI+PC9jdXN0b20tcGFyYW1ldGVyPlxuICogPC90YWJsZWF1LXZpej5cbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21QYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgZXhwb3J0aW5nIGRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0RGF0YU9wdGlvbnMge1xuICAvKipcbiAgICogRG8gbm90IHVzZSBhbGlhc2VzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBzb3VyY2UgaW4gVGFibGVhdS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAgICovXG4gIGlnbm9yZUFsaWFzZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGNvbHVtbnMgdG8gaW5jbHVkZSBzcGVjaWZpZWQgYnkgZmllbGQgaWQsIGluY2x1ZGVzIGFsbCBieSBkZWZhdWx0LlxuICAgKiBUaGUgb3JkZXIgb2YgdGhlIGNvbHVtbiBpZHMgaW4gdGhlIGFycmF5IGRldGVybWluZXMgdGhlIGNvbHVtbiBvcmRlciBzaG93biBpbiB0aGUgc3VtbWFyeSBkYXRhIHRhYmxlLlxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFBERk9wdGlvbnMge1xuICBzY2FsaW5nOiBQcmludFNjYWxpbmc7XG4gIHBhZ2VTaXplOiBQcmludFBhZ2VTaXplO1xuICBvcmllbnRhdGlvbjogUHJpbnRPcmllbnRhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50IHtcbiAgY3VycmVudFNoZWV0TmFtZTogc3RyaW5nO1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21EYXNoYm9hcmQ6IEFycmF5PHN0cmluZz47XG4gIGV4cG9ydGFibGVTaGVldE5hbWVzRnJvbVdvcmtib29rOiBBcnJheTxzdHJpbmc+O1xufVxuIiwiLyoqXG4gKiBVc2VyIHN1cHBsaWVkIG9wdGlvbnMgdGhhdCBkbyBub3QgZ2V0IHBhc3NlZCBhcyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gbG9hZCBhIFRhYmxlYXUgdml6LCBUYWJsZWF1IGFza2RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFRoZSB2aXogc3JjXG4gICAqL1xuICBzcmM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHdpZHRoIGluIHBpeGVsc1xuICAgKiBDYW4gYmUgYW55IHZhbGlkIENTUyBzaXplIHNwZWNpZmllci4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHB1Ymxpc2hlZCB3aWR0aCBvZiB0aGUgdmlldy5cbiAgICovXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGhlaWdodCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgaGVpZ2h0IG9mIHRoZSB2aWV3LlxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHdlYmNvbXBvbmVudCB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdml6IGFuZCBhc2tkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbiB1c2VkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vbi1taW5pZmllZCB2ZXJzaW9uIG9mIEphdmFTY3JpcHQgaXMgbG9hZGVkLiBJZiBzcGVjaWZpZWQgKG9yIHNldCB0byB0cnVlKSwgdGhlXG4gICAqIG5vbi1taW5pZmllZCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGJvdGggdGhlIGxvY2FsIGNvbXBvbmVudCBhbmQgdGhlIFRhYmxlYXUgU2VydmVyIHZpc3VhbGl6YXRpb24gKGlmIGVuYWJsZWQpLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkIChvciBzZXQgdG8gZmFsc2UpLCB0aGUgbWluaWZpZWQgdmVyc2lvbiBvZiB0aGUgSmF2YVNjcmlwdCBmaWxlcyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgZGVidWcgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIGRlYnVnIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgdGhlIG9sZCBhdXRoIG1lY2hhbmlzbSBmb3IgYXV0aGVudGljYXRpb24gd2hpY2ggaGFwcGVucyBpbnNpZGUgdGhlIGlmcmFtZS4gSWYgc3BlY2lmaWVkLCBWaXpMb2FkRXJyb3JFdmVudHNcbiAgICogdHJpZ2dlcmVkIGR1ZSB0byBhdXRoIGZhaWx1cmVzIHdpbGwgbm90IGJlIHRocm93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdXRoIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF1dGg/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgY29tbW9uIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgdGFibGVhdSB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRBdHRyaWJ1dGVzIHtcbiAgU3JjID0gJ3NyYycsXG4gIFdpZHRoID0gJ3dpZHRoJyxcbiAgSGVpZ2h0ID0gJ2hlaWdodCcsXG4gIFRva2VuID0gJ3Rva2VuJyxcbiAgRGVidWcgPSAnZGVidWcnLFxuICBJZnJhbWVBdXRoID0gJ2lmcmFtZS1hdXRoJyxcbiAgT25WaXpMb2FkRXJyb3IgPSAnb252aXpsb2FkZXJyb3InLFxuICBGb3JjZVRva2VuU3luYyA9ICdmb3JjZS10b2tlbi1zeW5jJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIEV4dGVuc2lvbnMgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAqL1xuICBleHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgICBWaWV3aW5nID0gJ3ZpZXdpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gQ2xhc3NOYW1lS2V5IHtcbiAgICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gICAgV29ya3NoZWV0ID0gJ3RhYmxlYXUtd29ya3NoZWV0JyxcbiAgICBUb29sdGlwID0gJ3RhYmxlYXUtdG9vbHRpcCcsXG4gICAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgICBEYXNoYm9hcmRUaXRsZSA9ICd0YWJsZWF1LWRhc2hib2FyZC10aXRsZScsXG4gIH1cblxuICAvKipcbiAgICogV2hhdCB0aGUgb2JqZWN0IHJlcHJlc2VudHMgaW4gYSBkYXNoYm9hcmQuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgICBCbGFuayA9ICdibGFuaycsXG4gICAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gICAgUXVpY2tGaWx0ZXIgPSAncXVpY2stZmlsdGVyJyxcbiAgICBQYXJhbWV0ZXJDb250cm9sID0gJ3BhcmFtZXRlci1jb250cm9sJyxcbiAgICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgICBMZWdlbmQgPSAnbGVnZW5kJyxcbiAgICBUaXRsZSA9ICd0aXRsZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBJbWFnZSA9ICdpbWFnZScsXG4gICAgV2ViUGFnZSA9ICd3ZWItcGFnZScsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LlxuICAgKiBAc2luY2UgMS43LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIHtcbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvbiB0aGUgdmlzaWJpbGl0eSBvZiBhIGRhc2hib2FyZCBvYmplY3QuKi9cbiAgICBTaG93ID0gJ3Nob3cnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHR1cm5pbmcgb2ZmIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIEhpZGUgPSAnaGlkZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIGEgdmFsdWUgY2FuIGhhdmVcbiAgICovXG4gIGV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgICBJbnQgPSAnaW50JyxcbiAgICBGbG9hdCA9ICdmbG9hdCcsXG4gICAgQm9vbCA9ICdib29sJyxcbiAgICBEYXRlID0gJ2RhdGUnLFxuICAgIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gICAgU3BhdGlhbCA9ICdzcGF0aWFsJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBjaGFuZ2VzIHRoYXQgb2NjdXIgdG8gYSBkYXNoYm9hcmQgb2JqZWN0LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkTGF5b3V0Q2hhbmdlIHtcbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyBhZGRlZCAqL1xuICAgIEFkZGVkID0gJ2FkZGVkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIHJlbW92ZWQgKi9cbiAgICBSZW1vdmVkID0gJ3JlbW92ZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIGZsb2F0aW5nIHN0YXRlIGNoYW5nZWQgKi9cbiAgICBJc0Zsb2F0aW5nQ2hhbmdlZCA9ICdpcy1mbG9hdGluZy1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyB2aXNpYmlsaXR5IGNoYW5nZWQgKi9cbiAgICBJc1Zpc2libGVDaGFuZ2VkID0gJ2lzLXZpc2libGUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgcG9zaXRpb24gY2hhbmdlZCAqL1xuICAgIFBvc2l0aW9uQ2hhbmdlZCA9ICdwb3NpdGlvbi1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBzaXplIGNoYW5nZWQgKi9cbiAgICBTaXplQ2hhbmdlZCA9ICdzaXplLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVuYW1lZCAqL1xuICAgIE5hbWVDaGFuZ2VkID0gJ25hbWUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIHNlbGVjdGVkICovXG4gICAgU2VsZWN0ZWQgPSAnc2VsZWN0ZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCBpcyBkZXNlbGVjdGVkICovXG4gICAgRGVzZWxlY3RlZCA9ICdkZXNlbGVjdGVkJyxcblxuICAgIC8qKiBOYXZpZ2F0ZSB0byBhbm90aGVyIGRhc2hib2FyZCAqL1xuICAgIERhc2hib2FyZENoYW5nZWQgPSAnZGFzaGJvYXJkLWNoYW5nZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkIGRhdGUgcmFuZ2VzIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0ZVJhbmdlVHlwZSB7XG4gICAgTGFzdCA9ICdsYXN0JyxcbiAgICBMYXN0TiA9ICdsYXN0LW4nLFxuICAgIE5leHQgPSAnbmV4dCcsXG4gICAgTmV4dE4gPSAnbmV4dC1uJyxcbiAgICBDdXJyZW50ID0gJ2N1cnJlbnQnLFxuICAgIFRvRGF0ZSA9ICd0by1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZXMgb2YgZGlhbG9nIHBvcHVwIHN0eWxlcy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERpYWxvZ1N0eWxlIHtcbiAgICBXaW5kb3cgPSAnd2luZG93JyxcbiAgICBNb2RhbCA9ICdtb2RhbCcsXG4gICAgTW9kZWxlc3MgPSAnbW9kZWxlc3MnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gRW5jb2RpbmdUeXBlIHtcbiAgICBDb2x1bW4gPSAnY29sdW1uJyxcbiAgICBSb3cgPSAncm93JyxcbiAgICBQYWdlID0gJ3BhZ2UnLFxuICAgIEZpbHRlciA9ICdmaWx0ZXInLFxuICAgIE1hcmtzVHlwZSA9ICdtYXJrcy10eXBlJyxcbiAgICBNZWFzdXJlVmFsdWVzID0gJ21lYXN1cmUtdmFsdWVzJyxcbiAgICBDb2xvciA9ICdjb2xvcicsXG4gICAgU2l6ZSA9ICdzaXplJyxcbiAgICBMYWJlbCA9ICdsYWJlbCcsXG4gICAgRGV0YWlsID0gJ2RldGFpbCcsXG4gICAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgUGF0aCA9ICdwYXRoJyxcbiAgICBBbmdsZSA9ICdhbmdsZScsXG4gICAgR2VvbWV0cnkgPSAnZ2VvbWV0cnknLFxuICAgIEN1c3RvbSA9ICdjdXN0b20nLFxuICB9XG5cbiAgLyoqXG4gICAqICBUeXBlIG9mIGFnZ3JlZ2F0aW9uIG9uIGEgZmllbGQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgU3VtID0gJ3N1bScsXG4gICAgQXZnID0gJ2F2ZycsXG4gICAgTWluID0gJ21pbicsXG4gICAgTWF4ID0gJ21heCcsXG4gICAgU3RkZXYgPSAnc3RkZXYnLFxuICAgIFN0ZGV2cCA9ICdzdGRldnAnLFxuICAgIFZhciA9ICd2YXInLFxuICAgIFZhcnAgPSAndmFycCcsXG4gICAgQ29sbGVjdCA9ICdjb2xsZWN0JyxcbiAgICBDb3VudCA9ICdjb3VudCcsXG4gICAgQ291bnRkID0gJ2NvdW50ZCcsXG4gICAgTWVkaWFuID0gJ21lZGlhbicsXG4gICAgQXR0ciA9ICdhdHRyJyxcbiAgICBOb25lID0gJ25vbmUnLFxuICAgIFllYXIgPSAneWVhcicsXG4gICAgUXRyID0gJ3F0cicsXG4gICAgTW9udGggPSAnbW9udGgnLFxuICAgIERheSA9ICdkYXknLFxuICAgIEhvdXIgPSAnaG91cicsXG4gICAgTWludXRlID0gJ21pbnV0ZScsXG4gICAgU2Vjb25kID0gJ3NlY29uZCcsXG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBXZWVrZGF5ID0gJ3dlZWtkYXknLFxuICAgIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgICBNZHkgPSAnbWR5JyxcbiAgICBFbmQgPSAnZW5kJyxcbiAgICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gICAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgICBUcnVuY01vbnRoID0gJ3RydW5jLW1vbnRoJyxcbiAgICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gICAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgICBUcnVuY0hvdXIgPSAndHJ1bmMtaG91cicsXG4gICAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICAgIFF1YXJ0MSA9ICdxdWFydDEnLFxuICAgIFF1YXJ0MyA9ICdxdWFydDMnLFxuICAgIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgICBLdXJ0b3NpcyA9ICdrdXJ0b3NpcycsXG4gICAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgICBVc2VyID0gJ3VzZXInLFxuICB9XG5cbiAgLyoqXG4gICAqIFJvbGUgb2YgYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkUm9sZVR5cGUge1xuICAgIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICAgIE1lYXN1cmUgPSAnbWVhc3VyZScsXG4gICAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgdmFsaWQgdHlwZXMgb2YgZmlsdGVycyB0aGF0IGNhbiBiZSBhcHBsaWVkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gICAgQ2F0ZWdvcmljYWwgPSAnY2F0ZWdvcmljYWwnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgICBIaWVyYXJjaGljYWwgPSAnaGllcmFyY2hpY2FsJyxcbiAgICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmUtZGF0ZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpZmZlcmVudCB1cGRhdGUgdHlwZXMgZm9yIGFwcGx5aW5nIGZpbHRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyVXBkYXRlVHlwZSB7XG4gICAgQWRkID0gJ2FkZCcsXG4gICAgQWxsID0gJ2FsbCcsXG4gICAgUmVwbGFjZSA9ICdyZXBsYWNlJyxcbiAgICBSZW1vdmUgPSAncmVtb3ZlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIHR5cGUgZm9yIGEgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZG9tYWluIHZhbHVlcyB0aGF0IGFyZSByZWxldmFudCB0byB0aGUgc3BlY2lmaWVkIGZpbHRlclxuICAgICAqIGkuZS4gdGhlIGRvbWFpbiBpcyByZXN0cmljdGVkIGJ5IGEgcHJldmlvdXMgZmlsdGVyXG4gICAgICovXG4gICAgUmVsZXZhbnQgPSAncmVsZXZhbnQnLFxuICAgIC8qKlxuICAgICAqIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIGRvbWFpbiB2YWx1ZXMgZnJvbSBkYXRhYmFzZVxuICAgICAqL1xuICAgIERhdGFiYXNlID0gJ2RhdGFiYXNlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmdcbiAgICogSW5kaWNhdGVzIHdoYXQgdG8gZG8gd2l0aCBudWxsIHZhbHVlcyBmb3IgYSBnaXZlbiBmaWx0ZXIgb3IgbWFyayBzZWxlY3Rpb24gY2FsbC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICAgIE51bGxWYWx1ZXMgPSAnbnVsbC12YWx1ZXMnLFxuICAgIE5vbk51bGxWYWx1ZXMgPSAnbm9uLW51bGwtdmFsdWVzJyxcbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHNlcnZlcyBhcyBhIGZpbHRlciBvbiB0aGUgRGF0YVZhbHVlcyByZXR1cm5lZCBmcm9tIGBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jYCxcbiAgICogYGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luY2AgYW5kIGBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmNgLlxuICAgKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBvZiByZXR1cm5lZCBkYXRhIHZhbHVlcyBvbmx5LiBUYWJsZWF1IHZlcnNpb25zIHByaW9yIHRvIDIwMjEuMlxuICAgKiB3aWxsIHBhc3MgdGhlIGRhdGEgYWNyb3NzIGFuZCBwb3B1bGF0ZSB0aGUgRGF0YVZhbHVlIHByb3BlcnRpZXMuXG4gICAqIFBsZWFzZSBub3RlIHRoYXQgYWxsIHByb3BlcnRpZXMgbm90IHJlcXVlc3RlZCB3aWxsIGJlIGB1bmRlZmluZWRgIGluIHRoZSBEYXRhVmFsdWUgcmVzdWx0cy5cbiAgICogQHNpbmNlIDEuNS4wXG4gICAqL1xuICBleHBvcnQgZW51bSBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB7XG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBpbmNsdWRlIGFsbCBwcm9wZXJ0aWVzLiovXG4gICAgQWxsVmFsdWVzID0gJ2FsbC12YWx1ZXMnLFxuXG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBvbmx5IGluY2x1ZGUgdmFsdWUgYW5kIG5hdGl2ZVZhbHVlIHByb3BlcnRpZXMuKi9cbiAgICBPbmx5TmF0aXZlVmFsdWVzID0gJ29ubHktbmF0aXZlLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSBmb3JtYXR0ZWRWYWx1ZSBwcm9wZXJ0aWVzLiAqL1xuICAgIE9ubHlGb3JtYXR0ZWRWYWx1ZXMgPSAnb25seS1mb3JtYXR0ZWQtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUeXBlIG9mIG1hcmsgZm9yIGEgZ2l2ZW4gbWFya3MgY2FyZCBpbiBhIHZpei5cbiAgICovXG4gIGV4cG9ydCBlbnVtIE1hcmtUeXBlIHtcbiAgICBCYXIgPSAnYmFyJyxcbiAgICBMaW5lID0gJ2xpbmUnLFxuICAgIEFyZWEgPSAnYXJlYScsXG4gICAgU3F1YXJlID0gJ3NxdWFyZScsXG4gICAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gICAgU2hhcGUgPSAnc2hhcGUnLFxuICAgIFRleHQgPSAndGV4dCcsXG4gICAgTWFwID0gJ21hcCcsXG4gICAgUGllID0gJ3BpZScsXG4gICAgR2FudHRCYXIgPSAnZ2FudHQtYmFyJyxcbiAgICBQb2x5Z29uID0gJ3BvbHlnb24nLFxuICAgIEhlYXRtYXAgPSAnaGVhdG1hcCcsXG4gICAgVml6RXh0ZW5zaW9uID0gJ3Zpei1leHRlbnNpb24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBhbGxvd2FibGUgdmFsdWVzLlxuICAgKiBUaGlzIGlzIHVzZWQgZm9yIHJlc3RyaWN0aW5nIHRoZSBkb21haW4gb2YgYSBwYXJhbWV0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIFBhcmFtZXRlclZhbHVlVHlwZSB7XG4gICAgQWxsID0gJ2FsbCcsXG4gICAgTGlzdCA9ICdsaXN0JyxcbiAgICBSYW5nZSA9ICdyYW5nZScsXG4gIH1cblxuICAvKipcbiAgICogRGF0ZSBwZXJpb2QgdXNlZCBpbiBmaWx0ZXJzIGFuZCBpbiBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGVyaW9kVHlwZSB7XG4gICAgWWVhcnMgPSAneWVhcnMnLFxuICAgIFF1YXJ0ZXJzID0gJ3F1YXJ0ZXJzJyxcbiAgICBNb250aHMgPSAnbW9udGhzJyxcbiAgICBXZWVrcyA9ICd3ZWVrcycsXG4gICAgRGF5cyA9ICdkYXlzJyxcbiAgICBIb3VycyA9ICdob3VycycsXG4gICAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgICBTZWNvbmRzID0gJ3NlY29uZHMnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gUXVpY2tUYWJsZUNhbGNUeXBlIHtcbiAgICBSdW5uaW5nVG90YWwgPSAncnVubmluZy10b3RhbCcsXG4gICAgRGlmZmVyZW5jZSA9ICdkaWZmZXJlbmNlJyxcbiAgICBQZXJjZW50RGlmZmVyZW5jZSA9ICdwZXJjZW50LWRpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnRPZlRvdGFsID0gJ3BlcmNlbnQtb2YtdG90YWwnLFxuICAgIFJhbmsgPSAncmFuaycsXG4gICAgUGVyY2VudGlsZSA9ICdwZXJjZW50aWxlJyxcbiAgICBNb3ZpbmdBdmVyYWdlID0gJ21vdmluZy1hdmVyYWdlJyxcbiAgICBZVERUb3RhbCA9ICd5dGQtdG90YWwnLFxuICAgIENvbXBvdW5kR3Jvd3RoUmF0ZSA9ICdjb21wb3VuZC1ncm93dGgtcmF0ZScsXG4gICAgWWVhck92ZXJZZWFyR3Jvd3RoID0gJ3llYXItb3Zlci15ZWFyLWdyb3d0aCcsXG4gICAgWVRER3Jvd3RoID0gJ3l0ZC1ncm93dGgnLFxuICAgIFVuZGVmaW5lZCA9ICd1bmRlZmluZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdGlvbiB0eXBlIGZvciBzZWxlY3QgbWFya3MgYXBpLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gICAgUmVwbGFjZSA9ICdzZWxlY3QtcmVwbGFjZScsXG4gICAgQWRkID0gJ3NlbGVjdC1hZGQnLFxuICAgIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Qgb3B0aW9uIGZvciB0aGUge0BsaW5rIFdvcmtzaGVldC5zZWxlY3RUdXBsZXNBc3luY30gbWV0aG9kLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gU2VsZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgc2VsZWN0aW5nIHRoZSB0dXBsZXMgc3BlY2lmaWVkXG4gICAgICovXG4gICAgU2ltcGxlID0gJ3NlbGVjdC1vcHRpb25zLXNpbXBsZScsXG4gICAgLyoqXG4gICAgICogQWRkcyBzcGVjaWZpZWQgdHVwbGVzIHRvIHRoZSBleGlzdGluZyBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBUb2dnbGUgPSAnc2VsZWN0LW9wdGlvbnMtdG9nZ2xlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzaGVldCBhIFtbU2hlZXRdXSBvYmplY3QgcmVwcmVzZW50c1xuICAgKi9cbiAgZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBTdG9yeSA9ICdzdG9yeScsXG4gICAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIH1cblxuICBleHBvcnQgZW51bSBTb3J0RGlyZWN0aW9uIHtcbiAgICBJbmNyZWFzaW5nID0gJ2luY3JlYXNpbmcnLFxuICAgIERlY3JlYXNpbmcgPSAnZGVjcmVhc2luZycsXG4gIH1cblxuICBleHBvcnQgZW51bSBUcmVuZExpbmVNb2RlbFR5cGUge1xuICAgIExpbmVhciA9ICdsaW5lYXInLFxuICAgIExvZ2FyaXRobWljID0gJ2xvZ2FyaXRobWljJyxcbiAgICBFeHBvbmVudGlhbCA9ICdleHBvbmVudGlhbCcsXG4gICAgUG9seW5vbWlhbCA9ICdwb2x5bm9taWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbi5cbiAgICogQHNpbmNlIDEuNy4wXG4gICAqL1xuICBleHBvcnQgZW51bSBSZXBsYXlTcGVlZFR5cGUge1xuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDAuNXguKi9cbiAgICBTbG93ID0gJ3Nsb3cnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHNldHRpbmcgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24gdG8gMS4weC4qL1xuICAgIE5vcm1hbCA9ICdub3JtYWwnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHNldHRpbmcgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24gdG8gMi4weC4qL1xuICAgIEZhc3QgPSAnZmFzdCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBhIGxldmVsIGluIGEgaGllcmFyY2hpY2FsIGZpbHRlclxuICAgKiBAc2luY2UgRXh0ZW5zaW9ucyAxLjEwLjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIEFsbFNlbGVjdGVkID0gJ2FsbC1zZWxlY3RlZCcsXG4gICAgTm9uZVNlbGVjdGVkID0gJ25vbmUtc2VsZWN0ZWQnLFxuICAgIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgICBVbmtub3duU2VsZWN0ZWQgPSAndW5rbm93bi1zZWxlY3RlZCcsXG4gIH1cblxuICAvKipcbiAgICogWm9uZVZpc2liaWxpdHlUeXBlXG4gICAqIEBkZXByZWNhdGVkIHVzZSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZVxuICAgKi9cbiAgZXhwb3J0IGRlY2xhcmUgdHlwZSBab25lVmlzaWJpbGl0eVR5cGUgPSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZTtcbiAgZXhwb3J0IGNvbnN0IFpvbmVWaXNpYmlsaXR5VHlwZSA9IHsgLi4uRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUgfTtcbn1cbmV4cG9ydCA9IFRhYmxlYXU7XG4iLCIvLyBUaGlzIGZpbGUgcmUtZXhwb3J0cyBldmVyeXRoaW5nIHdoaWNoIGlzIHBhcnQgb2YgdGhlIHNoYXJlZCBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0Fubm90YXRpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVNvdXJjZUludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9EYXRhVGFibGVJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnZpcm9ubWVudEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9GaWx0ZXJJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEFuYWx5dGljc09iamVjdFR5cGUsXG4gIEFubm90YXRpb25UeXBlLFxuICBDbGFzc05hbWVLZXksXG4gIENvbHVtblR5cGUsXG4gIERhc2hib2FyZExheW91dENoYW5nZSxcbiAgRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSxcbiAgRW5jb2RpbmdUeXBlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIE1hcmtUeXBlLFxuICBQYXJhbWV0ZXJWYWx1ZVR5cGUsXG4gIFBlcmlvZFR5cGUsXG4gIFF1aWNrVGFibGVDYWxjVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTZWxlY3RPcHRpb25zLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1NlbGVjdGlvbkludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9WaXN1YWxNb2RlbEludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1dvcmtib29rRm9ybWF0dGluZ0ludGVyZmFjZXMnO1xuIiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG4vLyBUaGUgZm9sbG93aW5nIHBvbHlmaWxscyBhcmUgbmVlZGVkIGZvciBJRTExXG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL2lzLWludGVnZXInO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1uYW4nO1xuaW1wb3J0ICdjb3JlLWpzL2VzL29iamVjdC9hc3NpZ24nO1xuLy8gRXhwb3J0IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0byBiZSBhdmFpbGFibGUgYXQgcnVudGltZVxuLy8gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgeWFybiBwdWJsaXNoOmJ1bXAgdmlhIHNjcmlwdHMvcHVibGlzaC1jaGVjay50c1xuLy8gIHVwZGF0ZUludGVybmFsQ29udHJhY3RSdW50aW1lVmVyc2lvbiBpbiB0aGUgbW9ub3JlcG8gcm9vdC5cbmltcG9ydCAqIGFzIGludGVybmFsQ29udHJhY3RWZXJzaW9uIGZyb20gJy4uL2ludGVybmFsLWNvbnRyYWN0LXZlcnNpb24uanNvbic7XG5leHBvcnQgY29uc3QgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiA9IGludGVybmFsQ29udHJhY3RWZXJzaW9uO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvRW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Nb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvUGFyYW1ldGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1ZlcmJzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL1ZxbEludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWVzc2FnaW5nIGZvciBjb25zdW1lcnMgdG8gdXNlLlxuLy8gQmUgdmVyeSBjYXJlZnVsIG1ha2luZyBhbnkgdXBkYXRlcyB0byB0aGlzIGNvbnRyYWN0IHdoaWNoIGJyZWFrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IDEsXG4gIG1pbm9yOiAwLFxuICBmaXg6IDAsXG59O1xuIiwiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL0VudW1zJztcblxuZXhwb3J0IGNsYXNzIERhdGFUeXBlQ29udmVydGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaXNTcGVjaWFsKHZhbHVlQXNTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFByaW9yIHRvIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIGNvbWUgdG8gdXMgYXNcbiAgICAvLyAnJW51bGwlJywgJyVhbGwlJywgJyV3aWxkY2FyZCUnLCAnJW1pc3NpbmclJy4uLlxuICAgIC8vIFdoaWxlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gdHJ1ZSBmb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCBjb252ZXJzaW9uLFxuICAgIC8vIGl0IGlzIGFzIGNoZWFwIGFzIHBhc3NpbmcgYXJvdW5kIGEgdmVyc2lvbiBhbmQgY2hlY2tpbmcgdGhhdC5cbiAgICAvLyAoU2VlIERhdGFWYWx1ZUZvcm1hdHRlci5jcHApXG5cbiAgICBpZiAodmFsdWVBc1N0cmluZy5sZW5ndGggPiAyICYmIHZhbHVlQXNTdHJpbmdbMF0gPT09ICclJyAmJiB2YWx1ZUFzU3RyaW5nW3ZhbHVlQXNTdHJpbmcubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNwZWNpYWxWYWx1ZUluZGljYXRvciA9ICclbnVsbCUnO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKGJvb2xlYW5TdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4gfCBzdHJpbmcge1xuICAgIC8vIGJvb2xlYW4gdmFsdWVzIGNvbWUgdG8gdXMgYXMgJ3RydWUnfCdmYWxzZSdcbiAgICBjb25zdCBub3JtYWxpemVkQm9vbGVhbjogc3RyaW5nID0gYm9vbGVhblN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ3RydWUnICYmIG5vcm1hbGl6ZWRCb29sZWFuICE9PSAnZmFsc2UnID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiBub3JtYWxpemVkQm9vbGVhbiA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEYXRlKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIE5vdGUgdGhhdCB3aXRob3V0IGEgdGltZSwgdGhlIGRhdGUgaXMgYXNzdW1lZCB0byBiZSBVVENcbiAgICAvLyBJbnB1dCBvZiAyMDIwLTAzLTI1IGlzIHByaW50ZWQgYXM6IE1hciAyNCAyMDIwIDE3OjAwOjAwIEdNVC0wNzAwXG4gICAgLy8gVGhpcyBtYXRjaGVzIHN0eWxlIHVzZWQgaW4gZXhpc3RpbmcgY29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsXG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZVRpbWUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gV2l0aCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDLlxuICAgIC8vIE91ciBkYXRlIGZvcm1hdCBpcyBhbHdheXM6IHl5eXktbW0tZGQgaGg6bW06c3NcbiAgICAvLyBVbmZvcnR1bmF0ZWx5LCBJRTExIGNhbid0IHBhcnNlIHRoYXQgZm9ybWF0IHNvIHdlIGFkZCBhIFQgYmV0d2VlbiB0aGUgZGF5IGFuZCB0aW1lLlxuICAgIC8vIFdlIGFsc28gYWRkIGEgWiBzbyB0aGF0IGl0IGlzIFVUQy4gKFdpdGhvdXQgdGhlIFosIHNvbWUgYnJvd3NlcnMgYXNzdW1lIGxvY2FsLCBhbmQgb3RoZXJzIFVUQylcbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlU3RyaW5nOiBzdHJpbmcgPSBkYXRlQXNTdHJpbmcucmVwbGFjZSgnICcsICdUJykuY29uY2F0KCdaJyk7XG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXR0ZWREYXRlU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlQXNTdHJpbmc6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIGlzIGJvdGggRGF0YURpY3Rpb25hcnkgYW5kIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29tcGF0aWJsZS5cbiAgICAvLyBJbiB0aGUgRGF0YURpY3Rpb25hcnksIHZhbHVlQXNTdHJpbmcgY2FuIGJlICclbnVsbCUnIG9yICclbWlzc2luZyUnLCB3aGlsZSBpblxuICAgIC8vIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHdlIGNhbiBnZXQgJ251bGwnIG9yICdtaXNzaW5nJywgb3IgJyVudWxsJScgZm9yIHN0cmluZyBzcGVjaWFsIHZhbHVlcy5cbiAgICAvLyBGb3IgZWl0aGVyIG9mIHRoZXNlIGNhc2VzLCB3ZSByZXR1cm4gc3BlY2lhbFZhbHVlSW5kaWNhdG9yIChvciB0aGUgb3JpZ2luYWwgc3BlY2lhbCBzdHJpbmcpLlxuICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsdHksIHRoaXMgY29udmVydGVyOlxuICAgIC8vIDEuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBzcGVjaWFsIHZhbHVlc1xuICAgIC8vIDIuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBkYXRlXG5cbiAgICAvLyBQYXJhbWV0ZXIgbWluL21heCB2YWx1ZXMgY2FuIGJlIHVuZGVmaW5lZCwgc28gcmVzdWx0IGlzIGFsc28gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZUFzU3RyaW5nID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQm9vbGVhbih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5JbnQ6XG4gICAgICBjYXNlIERhdGFUeXBlLkZsb2F0OlxuICAgICAgICAvLyBSZXR1cm4gc3BlY2lhbCB2YWx1ZSAnJW51bGwlJyBmb3IgYW55IGZhaWx1cmUgaW4gcGFyc2luZy5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCB3aWxsIGdpdmUgdXMgc3RyaW5ncyBsaWtlICdudWxsJ1xuICAgICAgICAvLyBmb3Igc3BlY2lhbCB2YWx1ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJScuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJ1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGNvbnZlcnRzIGZyb20gb3VyIDEuMiBBUEkgdGhhdCByZXR1cm5zIHN0cmluZ3MgZm9yIHNwZWNpYWxzLCBhbmQgZGF0ZXMgYXMgc3RyaW5ncy5cbiAgICAvLyBJdCB0YWtlcyB0aGUgc3BlY2lhbCBjYXNlIG9mICclbnVsbCUnIGFuZCByZXR1cm5zIGEgbnVsbC5cbiAgICAvLyBGb3IgZGF0ZXMsIGl0IHJldHVybnMgYSBEYXRlIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIGJ1aWxkIGEgRGF0YVZhbHVlLm5hdGl2ZVZhbHVlIGZpZWxkLlxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggY2FuIGJlIHVuZGVmaW5lZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgbmF0aXZlVmFsdWUgaXMgdHJlYXRlZCBsaWtlIGEgc3BlY2lhbFxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTcGVjaWFsKHZhbHVlKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgZGlyZWN0bHkgdG8gbmF0aXZlIHZhbHVlIGZvciBhbGwgdHlwZXNcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHRoaXMuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0eXBlKSwgdHlwZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBTZXJ2ZXIgPSAnc2VydmVyJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRXh0ZW5zaW9uTW9kZSB7XG4gIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICBWaWV3aW5nID0gJ3ZpZXdpbmcnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG5leHBvcnQgZW51bSBBbm5vdGF0ZUVudW0ge1xuICBNYXJrID0gJ21hcmsnLFxuICBQb2ludCA9ICdwb2ludCcsXG4gIEFyZWEgPSAnYXJlYScsXG59XG5cbmV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICBEaXNjcmV0ZSA9ICdkaXNjcmV0ZScsXG4gIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG59XG5cbmV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICBCbGFuayA9ICdibGFuaycsXG4gIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICBQYXJhbWV0ZXJDb250cm9sID0gJ3BhcmFtZXRlci1jb250cm9sJyxcbiAgUGFnZUZpbHRlciA9ICdwYWdlLWZpbHRlcicsXG4gIExlZ2VuZCA9ICdsZWdlbmQnLFxuICBUaXRsZSA9ICd0aXRsZScsXG4gIFRleHQgPSAndGV4dCcsXG4gIEltYWdlID0gJ2ltYWdlJyxcbiAgV2ViUGFnZSA9ICd3ZWItcGFnZScsXG4gIEV4dGVuc2lvbiA9ICdleHRlbnNpb24nLFxufVxuXG5leHBvcnQgZW51bSBEYXRhVHlwZSB7XG4gIFN0cmluZyA9ICdzdHJpbmcnLFxuICBJbnQgPSAnaW50JyxcbiAgRmxvYXQgPSAnZmxvYXQnLFxuICBCb29sID0gJ2Jvb2wnLFxuICBEYXRlID0gJ2RhdGUnLFxuICBEYXRlVGltZSA9ICdkYXRlLXRpbWUnLFxuICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG5leHBvcnQgZW51bSBEaWFsb2dTdHlsZSB7XG4gIFdpbmRvdyA9ICd3aW5kb3cnLFxuICBNb2RhbCA9ICdtb2RhbCcsXG4gIE1vZGVsZXNzID0gJ21vZGVsZXNzJyxcbn1cblxuZXhwb3J0IGVudW0gRW5jb2RlZERhdGFUeXBlIHtcbiAgTnVtYmVyID0gJ251bWJlcicsXG4gIFN0cmluZyA9ICdzdHJpbmcnLFxuICBEYXRlID0gJ2RhdGUnLFxuICBCb29sZWFuID0gJ2Jvb2xlYW4nLFxufVxuXG5leHBvcnQgZW51bSBFcnJvckNvZGVzIHtcbiAgSU5JVElBTElaQVRJT05fRVJST1IgPSAnaW5pdGlhbGl6YXRpb24tZXJyb3InLFxuICBJTlRFUk5BTF9FUlJPUiA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIE1JU1NJTkdfRU5VTV9NQVBQSU5HID0gJ21pc3NpbmctZW51bS1tYXBwaW5nJyxcbiAgTUlTU0lOR19QQVJBTUVURVIgPSAnbWlzc2luZy1wYXJhbWV0ZXInLFxuICBQRVJNSVNTSU9OX0RFTklFRCA9ICdwZXJtaXNzaW9uLWRlbmllZCcsXG4gIFBSRVNfTU9ERUxfUEFSU0lOR19FUlJPUiA9ICdwcmVzLW1vZGVsLXBhcnNpbmctZXJyb3InLFxuICBWRVJTSU9OX05PVF9DT05GSUdVUkVEID0gJ3ZlcnNpb24tbm90LWNvbmZpZ3VyZWQnLFxuICBWSVNJQklMSVRZX0VSUk9SID0gJ3Zpc2liaWxpdHktZXJyb3InLFxuICBVTktOT1dOX1ZFUkJfSUQgPSAndW5rbm93bi12ZXJiLWlkJyxcbn1cblxuZXhwb3J0IGVudW0gRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICBTdW0gPSAnc3VtJyxcbiAgQXZnID0gJ2F2ZycsXG4gIE1pbiA9ICdtaW4nLFxuICBNYXggPSAnbWF4JyxcbiAgU3RkZXYgPSAnc3RkZXYnLFxuICBTdGRldnAgPSAnc3RkZXZwJyxcbiAgVmFyID0gJ3ZhcicsXG4gIFZhcnAgPSAndmFycCcsXG4gIENvbGxlY3QgPSAnY29sbGVjdCcsXG4gIENvdW50ID0gJ2NvdW50JyxcbiAgQ291bnRkID0gJ2NvdW50ZCcsXG4gIE1lZGlhbiA9ICdtZWRpYW4nLFxuICBBdHRyID0gJ2F0dHInLFxuICBOb25lID0gJ25vbmUnLFxuICBZZWFyID0gJ3llYXInLFxuICBRdHIgPSAncXRyJyxcbiAgTW9udGggPSAnbW9udGgnLFxuICBEYXkgPSAnZGF5JyxcbiAgSG91ciA9ICdob3VyJyxcbiAgTWludXRlID0gJ21pbnV0ZScsXG4gIFNlY29uZCA9ICdzZWNvbmQnLFxuICBXZWVrID0gJ3dlZWsnLFxuICBXZWVrZGF5ID0gJ3dlZWtkYXknLFxuICBNb250aFllYXIgPSAnbW9udGgteWVhcicsXG4gIE1keSA9ICdtZHknLFxuICBFbmQgPSAnZW5kJyxcbiAgVHJ1bmNZZWFyID0gJ3RydW5jLXllYXInLFxuICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICBUcnVuY01vbnRoID0gJ3RydW5jLW1vbnRoJyxcbiAgVHJ1bmNXZWVrID0gJ3RydW5jLXdlZWsnLFxuICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICBUcnVuY0hvdXIgPSAndHJ1bmMtaG91cicsXG4gIFRydW5jTWludXRlID0gJ3RydW5jLW1pbnV0ZScsXG4gIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gIFF1YXJ0MSA9ICdxdWFydDEnLFxuICBRdWFydDMgPSAncXVhcnQzJyxcbiAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICBLdXJ0b3NpcyA9ICdrdXJ0b3NpcycsXG4gIEluT3V0ID0gJ2luLW91dCcsXG4gIFVzZXIgPSAndXNlcicsXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkUm9sZVR5cGUge1xuICBEaW1lbnNpb24gPSAnZGltZW5zaW9uJyxcbiAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuLyoqXG4gKiAgVGhlIGRpZmZlcmVudCB1cGRhdGUgdHlwZXMgZm9yIGFwcGx5aW5nIGZpbHRlci5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVXBkYXRlVHlwZSB7XG4gIEFkZCA9ICdhZGQnLFxuICBBbGwgPSAnYWxsJyxcbiAgUmVwbGFjZSA9ICdyZXBsYWNlJyxcbiAgUmVtb3ZlID0gJ3JlbW92ZScsXG59XG5cbmV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBTdG9yeSA9ICdzdG9yeScsXG4gIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxufVxuXG5leHBvcnQgZW51bSBEb21haW5SZXN0cmljdGlvblR5cGUge1xuICBBbGwgPSAnYWxsJyxcbiAgTGlzdCA9ICdsaXN0JyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxufVxuXG5leHBvcnQgZW51bSBEYXRlU3RlcFBlcmlvZCB7XG4gIFllYXJzID0gJ3llYXJzJyxcbiAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICBNb250aHMgPSAnbW9udGhzJyxcbiAgV2Vla3MgPSAnd2Vla3MnLFxuICBEYXlzID0gJ2RheXMnLFxuICBIb3VycyA9ICdob3VycycsXG4gIE1pbnV0ZXMgPSAnbWludXRlcycsXG4gIFNlY29uZHMgPSAnc2Vjb25kcycsXG59XG5cbi8qKlxuICogVGhlIG9wdGlvbiBmb3Igc3BlY2lmeWluZyB3aGljaCB2YWx1ZXMgdG8gaW5jbHVkZSBmb3IgZmlsdGVyaW5nLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJOdWxsT3B0aW9uIHtcbiAgTnVsbFZhbHVlcyA9ICdudWxsdmFsdWVzJyxcbiAgTm9uTnVsbFZhbHVlcyA9ICdub25udWxsdmFsdWVzJyxcbiAgQWxsVmFsdWVzID0gJ2FsbHZhbHVlcycsXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgZmlsdGVyIGRvbWFpblxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJEb21haW5UeXBlIHtcbiAgUmVsZXZhbnQgPSAncmVsZXZhbnQnLFxuICBEYXRhYmFzZSA9ICdkYXRhYmFzZScsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdGlvblVwZGF0ZVR5cGUge1xuICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgQWRkID0gJ3NlbGVjdC1hZGQnLFxuICBSZW1vdmUgPSAnc2VsZWN0LXJlbW92ZScsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0IG9wdGlvbiBmb3IgdGhlIHNlbGVjdCB0dXBsZXMgYXBpLlxuICovXG5leHBvcnQgZW51bSBTZWxlY3RPcHRpb25zIHtcbiAgU2ltcGxlID0gJ3NlbGVjdC1vcHRpb25zLXNpbXBsZScsXG4gIFRvZ2dsZSA9ICdzZWxlY3Qtb3B0aW9ucy10b2dnbGUnLFxuICBNZW51ID0gJ3NlbGVjdC1vcHRpb25zLW1lbnUnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG4gIFJhbmdlID0gJ3NlbGVjdC1vcHRpb25zLXJhbmdlJywgLy8gbm90IGltcGxlbWVudGVkIGluIHRoZSBleHRlcm5hbCBjb250cmFjdFxuICBTZWFyY2ggPSAnc2VsZWN0LW9wdGlvbnMtc2VhcmNoJywgLy8gbm90IGltcGxlbWVudGVkIGluIHRoZSBleHRlcm5hbCBjb250cmFjdFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIGluY2x1ZGVkIHZhbHVlcyB0eXBlIGZvciByYW5nZSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzIHtcbiAgSW5jbHVkZU51bGwgPSAnaW5jbHVkZS1udWxsJyxcbiAgSW5jbHVkZU5vbk51bGwgPSAnaW5jbHVkZS1ub24tbnVsbCcsXG4gIEluY2x1ZGVBbGwgPSAnaW5jbHVkZS1hbGwnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgYSBoaWVyYXJjaGljYWwgbGV2ZWwgc2VsZWN0aW9uIHN0YXRlLlxuICovXG5leHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgQWxsU2VsZWN0ZWQgPSAnYWxsLXNlbGVjdGVkJyxcbiAgTm9uZVNlbGVjdGVkID0gJ25vbmUtc2VsZWN0ZWQnLFxuICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gIFVua25vd25TZWxlY3RlZCA9ICd1bmtub3duLXNlbGVjdGVkJyxcbn1cblxuLyoqXG4gKiBUeXBlIG9mIG1hcmsgZm9yIGEgZ2l2ZW4gbWFya3MgY2FyZCBpbiBhIHZpei5cbiAqL1xuZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICBCYXIgPSAnYmFyJyxcbiAgTGluZSA9ICdsaW5lJyxcbiAgQXJlYSA9ICdhcmVhJyxcbiAgU3F1YXJlID0gJ3NxdWFyZScsXG4gIENpcmNsZSA9ICdjaXJjbGUnLFxuICBTaGFwZSA9ICdzaGFwZScsXG4gIFRleHQgPSAndGV4dCcsXG4gIE1hcCA9ICdtYXAnLFxuICBQaWUgPSAncGllJyxcbiAgR2FudHRCYXIgPSAnZ2FudHQtYmFyJyxcbiAgUG9seWdvbiA9ICdwb2x5Z29uJyxcbiAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgVml6RXh0ZW5zaW9uID0gJ3Zpei1leHRlbnNpb24nLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlclR5cGUge1xuICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gIFJhbmdlID0gJ3JhbmdlJyxcbiAgUmVsYXRpdmVEYXRlID0gJ3JlbGF0aXZlRGF0ZScsXG4gIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIERhdGVSYW5nZVR5cGUgb2YgYSByZWxhdGl2ZSBkYXRlIGZpbHRlclxuICovXG5leHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIExhc3QgPSAnbGFzdCcsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGxhc3QgTiBkYXlzLCB3ZWVrcywgbW9udGhzLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIExhc3ROID0gJ2xhc3ROJyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIE5leHQgPSAnbmV4dCcsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIG5leHQgTiBkYXlzLCB3ZWVrcywgbW9udGhzLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIE5leHROID0gJ25leHROJyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgY3VycmVudCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gZXZlcnl0aGluZyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgVG9EYXRlID0gJ3RvRGF0ZScsXG59XG5cbi8qKlxuICogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGxhdW5jaGluZyBvZiBhbiBleHRlbnNpb24gZGlhbG9nIHN1Y2NlZWRlZCBvciBmYWlsZWQuXG4gKi9cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCB7XG4gIERpYWxvZ0FscmVhZHlPcGVuID0gJ2RpYWxvZy1hbHJlYWR5LW9wZW4nLFxuICBJbnZhbGlkRG9tYWluID0gJ2ludmFsaWQtZG9tYWluJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbn1cblxuLy8gRW51bWVyYXRpb24gZm9yIEFwaVNob3dEYXRhIHRhYmxlIGlkIHNlbnRpbmVscy5cbmV4cG9ydCBlbnVtIEFwaVNob3dEYXRhVGFibGVTZW50aW5lbCB7XG4gIC8vIGZpbmQgdGhlIG9uZSBsb2dpY2FsIHRhYmxlIC0gdXNlZCBpbiB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgY2hlY2sgZm9yIGdldFVuZGVybHlpbmdEYXRhVGFibGUgYW5kIGdldExvZ2ljYWxEYXRhVGFibGUgY29tbWFuZHNcbiAgU2luZ2xlVGFibGVJZCA9ICdzaW5nbGUtdGFibGUtaWQtc2VudGluZWwnLFxuICBTaW5nbGVUYWJsZUNhcHRpb24gPSAnU2luZ2xlIHRhYmxlIGlkIHNlbnRpbmVsJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIG9wdGltaXplIHRoZSBnZXRTdW1tYXJ5RGF0YS9nZXRVbmRlcmx5aW5nVGFibGVEYXRhIHJlc3VsdHNcbiAqIE1hcHBlZCBmcm9tIGV4dGVybmFsIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIEFwaVNob3dEYXRhVGFibGVGb3JtYXQge1xuICBOYXRpdmVWYWx1ZXNPbmx5ID0gJ25hdGl2ZS12YWx1ZXMtb25seScsXG4gIEZvcm1hdHRlZFZhbHVlc09ubHkgPSAnZm9ybWF0dGVkLXZhbHVlcy1vbmx5JyxcbiAgTmF0aXZlQW5kRm9ybWF0dGVkVmFsdWVzID0gJ25hdGl2ZS1hbmQtZm9ybWF0dGVkLXZhbHVlcycsXG59XG5cbi8qKlxuICogVXNlZCB0byBkZW5vdGUgdGhlIHNlY3Rpb25zIG9mIGZvcm1hdHRpbmcgd2l0aGluIHRhYmxlYXVcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQ2xhc3NOYW1lS2V5IHtcbiAgV29ya3NoZWV0VGl0bGUgPSAndGFibGVhdS13b3Jrc2hlZXQtdGl0bGUnLFxuICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICBUb29sdGlwID0gJ3RhYmxlYXUtdG9vbHRpcCcsXG4gIFN0b3J5VGl0bGUgPSAndGFibGVhdS1zdG9yeS10aXRsZScsXG4gIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIHNldCBwYWdlIHNpemUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gUGFnZVNpemVPcHRpb24ge1xuICBMZXR0ZXIgPSAnbGV0dGVyJyxcbiAgTGVnYWwgPSAnbGVnYWwnLFxuICBOb3RlID0gJ25vdGUnLFxuICBGb2xpbyA9ICdmb2xpbycsXG4gIFRhYmxvaWQgPSAndGFibG9pZCcsXG4gIExlZGdlciA9ICdsZWRnZXInLFxuICBTdGF0ZW1lbnQgPSAnc3RhdGVtZW50JyxcbiAgRXhlY3V0aXZlID0gJ2V4ZWN1dGl2ZScsXG4gIEEzID0gJ2EzJyxcbiAgQTQgPSAnYTQnLFxuICBBNSA9ICdhNScsXG4gIEI0ID0gJ2I0JyxcbiAgQjUgPSAnYjUnLFxuICBRdWFydG8gPSAncXVhcnRvJyxcbiAgVW5zcGVjaWZpZWQgPSAndW5zcGVjaWZpZWQnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHRoZSBwYWdlIG9yaWVudGF0aW9uIG1vZGUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gUGFnZU9yaWVudGF0aW9uIHtcbiAgUHJpbnRlciA9ICdwcmludGVyJyxcbiAgUG9ydHJhaXQgPSAncG9ydHJhaXQnLFxuICBMYW5kc2NhcGUgPSAnbGFuZHNjYXBlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIHNldCBzY2FsZSBtb2RlIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFNjYWxlTW9kZSB7XG4gIFNjYWxlQXV0byA9ICdhdXRvJyxcbiAgU2NhbGVQZXJjZW50YWdlID0gJ3BlcmNlbnQnLFxuICBTY2FsZUZpdFBhZ2VzID0gJ2ZpdC1wYWdlcycsXG59XG5cbi8qKlxuICogVXNlZCBieSBzZXRGaXRBbmRTY2FsZVZhbHVlcyB0byBzY2FsZSBwZXJjZW50IHZhbHVlc1xuICovXG5leHBvcnQgZW51bSBQYWdlU2NhbGluZ09wdGlvbiB7XG4gIFNjYWxlUGN0QXV0byA9ICdhdXRvJyxcbiAgU2NhbGVQY3Q0MDAgPSAncGN0NDAwJyxcbiAgU2NhbGVQY3QyMDAgPSAncGN0MjAwJyxcbiAgU2NhbGVQY3QxMDAgPSAncGN0MTAwJyxcbiAgU2NhbGVQY3Q5MCA9ICdwY3Q5MCcsXG4gIFNjYWxlUGN0ODAgPSAncGN0ODAnLFxuICBTY2FsZVBjdDc1ID0gJ3BjdDc1JyxcbiAgU2NhbGVQY3Q2MCA9ICdwY3Q2MCcsXG4gIFNjYWxlUGN0NTAgPSAncGN0NTAnLFxuICBTY2FsZVBjdDI1ID0gJ3BjdDI1Jyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IHNldEZpdEFuZFNjYWxlVmFsdWVzIHRvIHNjYWxlIGZpdCBwYWdlIHZhbHVlc1xuICovXG5leHBvcnQgZW51bSBGaXRQYWdlcyB7XG4gIEZpdE9uZUhpZ2ggPSAnZml0MHgxJyxcbiAgRml0VHdvSGlnaCA9ICdmaXQweDInLFxuICBGaXRPbmVXaWRlID0gJ2ZpdDF4MCcsXG4gIEZpdFR3b1dpZGUgPSAnZml0MngwJyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IGdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luY1xuICovXG5leHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICBDb2xvciA9ICdjb2xvcicsXG4gIFNpemUgPSAnc2l6ZScsXG4gIExhYmVsID0gJ2xhYmVsJyxcbiAgRGV0YWlsID0gJ2RldGFpbCcsXG4gIFRvb2x0aXAgPSAndG9vbHRpcCcsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgUGF0aCA9ICdwYXRoJyxcbiAgQW5nbGUgPSAnYW5nbGUnLFxuICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gIEN1c3RvbSA9ICdjdXN0b20nLFxufVxuIiwiZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uSWQge1xuICBDdXN0b21NYXJrQ29udGV4dE1lbnVDbGlja2VkID0gJ2N1c3RvbS1tYXJrLWNvbnRleHQtbWVudS1jbGlja2VkJyxcbiAgQ29udGV4dE1lbnVDbGljayA9ICdjb250ZXh0LW1lbnUtY2xpY2snLFxuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b20tdmlldy1yZW1vdmVkJyxcbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbS12aWV3LXNhdmVkJyxcbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tLXZpZXctc2V0LWRlZmF1bHQnLFxuICBDdXN0b21WaWV3c0xvYWRlZCA9ICdjdXN0b20tdmlld3MtbG9hZGVkJyxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWJ1dHRvbi1jbGlja2VkJyxcbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbi1jbGlja2VkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXBkYXRlID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXBkYXRlJyxcbiAgRmlsdGVyQ2hhbmdlZCA9ICdmaWx0ZXItY2hhbmdlZCcsXG4gIEZpcnN0Vml6U2l6ZUtub3duID0gJ2ZpcnN0LXZpei1zaXplLWtub3duJyxcbiAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBTZXR0aW5nc0NoYW5nZWQgPSAnc2V0dGluZ3MtY2hhbmdlZCcsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG4gIFRlc3RDb252ZXJzaW9uTm90aWZpY2F0aW9uID0gJ3Rlc3QtY29udmVyc2lvbi1ub3RpZmljYXRpb24nLFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkID0gJ3Rvb2xiYXItc3RhdGUtY2hhbmdlZCcsXG4gIFZpekludGVyYWN0aXZlID0gJ3Zpei1pbnRlcmFjdGl2ZScsXG4gIEFza0RhdGFJbnRlcmFjdGl2ZSA9ICdhc2stZGF0YS1pbnRlcmFjdGl2ZScsXG4gIFdvcmtib29rUmVhZHlUb0Nsb3NlID0gJ3dvcmtib29rLXJlYWR5LXRvLWNsb3NlJyxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9vay1wdWJsaXNoZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzID0gJ3dvcmtib29rLXB1Ymxpc2hlZC1hcycsXG4gIFVybEFjdGlvbiA9ICd1cmwtYWN0aW9uJyxcbiAgVGFiU3dpdGNoZWQgPSAndGFiLXN3aXRjaGVkJyxcbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5LXBvaW50LXN3aXRjaGVkJyxcbiAgUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4gPSAncmVhZHktdG8tcmVjZWl2ZS1hdXRoLXRva2VuJyxcbn1cbiIsIi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gUGFyYW1ldGVySWQge1xuICBBY3RpdmVUYWJsZXNJbmZvID0gJ2FjdGl2ZS10YWJsZXMtaW5mbycsXG4gIEFuY2hvckRhdGUgPSAnYW5jaG9yLWRhdGUnLFxuICBBbm5vdGF0ZUVudW0gPSAnYW5ub3RhdGUtZW51bScsXG4gIEFubm90YXRpb25MaXN0ID0gJ2Fubm90YXRpb24tbGlzdCcsXG5cbiAgQ2F0ZWdvcmljYWxEb21haW4gPSAnY2F0ZWdvcmljYWwtZG9tYWluJyxcbiAgQ2xpY2tUaHJvdWdoRW5hYmxlZCA9ICdjbGljay10aHJvdWdoLWVuYWJsZWQnLFxuICBDb2x1bW5zVG9JbmNsdWRlID0gJ2NvbHVtbnMtdG8taW5jbHVkZScsXG4gIENvbHVtbnNUb0luY2x1ZGVCeUlkID0gJ2NvbHVtbnMtdG8taW5jbHVkZS1ieS1pZCcsXG4gIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdjb25uZWN0aW9uLWRlc2NyaXB0aW9uLXN1bW1hcmllcycsXG4gIEN1cnJlbnRTaGVldFR5cGUgPSAnY3VycmVudC1zaGVldC10eXBlJyxcbiAgQ3VzdG9tVmlldyA9ICdjdXN0b20tdmlldycsXG4gIEN1c3RvbVZpZXdJc0RlZmF1bHQgPSAnY3VzdG9tLXZpZXctaXMtZGVmYXVsdCcsXG4gIEN1c3RvbVZpZXdJc1B1YmxpYyA9ICdjdXN0b20tdmlldy1pcy1wdWJsaWMnLFxuICBDdXN0b21WaWV3THVpZCA9ICdjdXN0b20tdmlldy1sdWlkJyxcbiAgQ3VzdG9tVmlld05hbWUgPSAnY3VzdG9tLXZpZXctbmFtZScsXG4gIEN1c3RvbVZpZXdzID0gJ2N1c3RvbS12aWV3cycsXG5cbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIERhc2hib2FyZEZpbHRlcnMgPSAnZGFzaGJvYXJkLWZpbHRlcnMnLFxuICBEYXNoYm9hcmROYW1lID0gJ2Rhc2hib2FyZCcsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSA9ICdkYXNoYm9hcmQtb2JqZWN0LXBvc2l0aW9uLWFuZC1zaXplLXVwZGF0ZScsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3QgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUtbGlzdCcsXG4gIERhdGFSb3dJbmRleCA9ICdkYXRhLXJvdy1pbmRleCcsXG4gIERhdGFTY2hlbWEgPSAnZGF0YS1zY2hlbWEnLFxuICBEYXRhU291cmNlID0gJ2RhdGEtc291cmNlJyxcbiAgRGF0YVNvdXJjZURhdGFUYWJsZSA9ICdkYXRhLXNvdXJjZS1kYXRhLXRhYmxlJyxcbiAgRGF0YVNvdXJjZUlkID0gJ2RhdGEtc291cmNlLWlkJyxcbiAgRGF0YVNvdXJjZU5hbWUgPSAnZGF0YS1zb3VyY2UtbmFtZScsXG4gIERhdGFUYWJsZSA9ICdkYXRhLXRhYmxlJyxcbiAgRGF0YVRhYmxlUmVhZGVyID0gJ2RhdGEtdGFibGUtcmVhZGVyJyxcbiAgRGF0ZVJhbmdlVHlwZSA9ICdkYXRlLXJhbmdlLXR5cGUnLFxuICBEZWx0YVRpbWVNcyA9ICdkZWx0YS10aW1lLW1zJyxcbiAgRGltVmFsU2VsZWN0aW9uTW9kZWxzID0gJ2RpbWVuc2lvblZhbHVlU2VsZWN0aW9uTW9kZWxzJyxcbiAgRG9tYWluVHlwZSA9ICdkb21haW4tdHlwZScsXG5cbiAgRW1iZWRkaW5nQWJzdHJhY3RRdWVyeSA9ICdlbWJlZGRpbmctYWJzdHJhY3QtcXVlcnknLFxuICBFbWJlZGRpbmdCb290c3RyYXBJbmZvID0gJ2VtYmVkZGluZy1ib290c3RyYXAtaW5mbycsXG4gIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSAnZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEV4cG9ydEZpbGUgPSAnZXhwb3J0LWZpbGUnLFxuICBFeHBvcnRPcmlnaW5VcmwgPSAnZXhwb3J0LW9yaWdpbi11cmwnLFxuICBFeHBvcnRQZGZPcHRpb25zID0gJ2V4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gPSAnZXh0ZW5zaW9uLWJvb3RzdHJhcC1pbmZvJyxcbiAgRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHMgPSAnZXh0ZW5zaW9uLWNvbnRleHQtbWVudS1pZHMnLFxuICBFeHRlbnNpb25EaWFsb2dIID0gJ2V4dGVuc2lvbi1kaWFsb2ctaGVpZ2h0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZCA9ICdleHRlbnNpb24tZGlhbG9nLXBheWxvYWQnLFxuICBFeHRlbnNpb25EaWFsb2dSZXN1bHQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1yZXN1bHQnLFxuICBFeHRlbnNpb25EaWFsb2dTdHlsZSA9ICdleHRlbnNpb24tZGlhbG9nLXN0eWxlJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXJsID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXJsJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVyA9ICdleHRlbnNpb24tZGlhbG9nLXdpZHRoJyxcbiAgRXh0ZW5zaW9uTG9jYXRvciA9ICdleHRlbnNpb24tbG9jYXRvcicsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyA9ICdleHRlbnNpb24tc2V0dGluZ3MtaW5mbycsXG4gIEV4dGVuc2lvblpvbmVJZCA9ICdleHRlbnNpb24tem9uZS1pZCcsXG4gIEV4dGVybmFsTWVudURlc2NyaXB0aW9uID0gJ2V4dGVybmFsLW1lbnUtZGVzY3JpcHRpb24nLFxuICBFeHRlcm5hbE1lbnVIZWFkZXIgPSAnZXh0ZXJuYWwtbWVudS1oZWFkZXInLFxuICBFeHRlcm5hbE1lbnVJdGVtRGlzcGxheU5hbWUgPSAnZXh0ZXJuYWwtbWVudS1pdGVtLWRpc3BsYXktbmFtZScsXG4gIEV4dGVybmFsTWVudUl0ZW1JZCA9ICdleHRlcm5hbC1tZW51LWl0ZW0taWQnLFxuXG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgRmllbGRJZCA9ICdmaWVsZC1pZCcsXG4gIEZpZWxkTmFtZSA9ICdmaWVsZC1uYW1lJyxcbiAgRmlsdGVyTGV2ZWxzID0gJ2ZpbHRlci1sZXZlbHMnLFxuICBGaWx0ZXJSYW5nZU1heCA9ICdmaWx0ZXItcmFuZ2UtbWF4JyxcbiAgRmlsdGVyUmFuZ2VNaW4gPSAnZmlsdGVyLXJhbmdlLW1pbicsXG4gIEZpbHRlclJhbmdlTnVsbE9wdGlvbiA9ICdmaWx0ZXItcmFuZ2UtbnVsbC1vcHRpb24nLFxuICBGaWx0ZXJVcGRhdGVUeXBlID0gJ2ZpbHRlci11cGRhdGUtdHlwZScsXG4gIEZpbHRlclZhbHVlcyA9ICdmaWx0ZXItdmFsdWVzJyxcbiAgRm9udE5hbWVMaXN0SXRlbXMgPSAnZm9udC1uYW1lLWxpc3QtaXRlbXMnLFxuICBGb3JtYXR0ZWRUZXh0ID0gJ2Zvcm1hdHRlZC10ZXh0JyxcbiAgRnVuY3Rpb25OYW1lID0gJ2Z1bmN0aW9uLW5hbWUnLFxuXG4gIEhpZXJWYWxTZWxlY3Rpb25Nb2RlbHMgPSAnaGllcmFyY2hpY2FsVmFsdWVTZWxlY3Rpb25Nb2RlbHMnLFxuICBIaWdobGlnaHRlZERhdGEgPSAnaGlnaGxpZ2h0ZWQtZGF0YScsXG4gIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiA9ICdob3Zlci10dXBsZS1pbnRlcmFjdGlvbicsXG5cbiAgSWdub3JlQWxpYXNlcyA9ICdpZ25vcmUtYWxpYXNlcycsXG4gIElnbm9yZVNlbGVjdGlvbiA9ICdpZ25vcmUtc2VsZWN0aW9uJyxcbiAgSW5jbHVkZUFsbENvbHVtbnMgPSAnaW5jbHVkZS1hbGwtY29sdW1ucycsXG4gIEludmFsaWRBZ2dGaWVsZE5hbWUgPSAnaW52YWxpZC1hZ2ctZmllbGQtbmFtZScsXG4gIEludmFsaWREYXRlcyA9ICdpbnZhbGlkLWRhdGVzJyxcbiAgSW52YWxpZEZpZWxkQ2FwdGlvbiA9ICdpbnZhbGlkLWZpZWxkLWNhcHRpb24nLFxuICBJbnZhbGlkRmllbGRzID0gJ2ludmFsaWQtZmllbGRzJyxcbiAgSW52YWxpZFZhbHVlcyA9ICdpbnZhbGlkLXZhbHVlcycsXG4gIElzRXhjbHVkZU1vZGUgPSAnaXMtZXhjbHVkZScsXG4gIElzRXh0ZW5zaW9uRGlhbG9nID0gJ2lzLWV4dGVuc2lvbi1kaWFsb2cnLFxuXG4gIEpvaW5EZXNjcmlwdGlvbiA9ICdqb2luLWRlc2NyaXB0aW9uJyxcblxuICBMb2dpY2FsVGFibGVJZCA9ICdsb2dpY2FsLXRhYmxlLWlkJyxcbiAgTG9naWNhbFRhYmxlSW5mb0xpc3QgPSAnbG9naWNhbC10YWJsZS1pbmZvLWxpc3QnLFxuXG4gIE1heEhlaWdodCA9ICdtYXgtaGVpZ2h0JyxcbiAgTWF4Um93cyA9ICdtYXgtcm93cycsXG4gIE1heFdpZHRoID0gJ21heC13aWR0aCcsXG4gIE1pbkhlaWdodCA9ICdtaW4taGVpZ2h0JyxcbiAgTWluV2lkdGggPSAnbWluLXdpZHRoJyxcblxuICBQYWdlUm93Q291bnQgPSAncGFnZS1yb3ctY291bnQnLFxuICBQYXJhbWV0ZXJDYXB0aW9uID0gJ3BhcmVtZXRlci1jYXB0aW9uJyxcbiAgUGFyYW1ldGVyRXJyb3IgPSAncGFyYW1ldGVyLWVycm9yJyxcbiAgUGFyYW1ldGVyRmllbGROYW1lID0gJ3BhcmFtZXRlci1maWVsZC1uYW1lJyxcbiAgUGFyYW1ldGVySW5mbyA9ICdwYXJhbWV0ZXItaW5mbycsXG4gIFBhcmFtZXRlckluZm9zID0gJ3BhcmFtZXRlci1pbmZvcycsXG4gIFBhcmFtZXRlclZhbHVlID0gJ3BhcmFtZXRlci12YWx1ZScsXG4gIFBlcmlvZFR5cGUgPSAncGVyaW9kLXR5cGUnLFxuXG4gIFF1YW50aXRhdGl2ZURvbWFpbiA9ICdxdWFudGl0YXRpdmUtZG1haW4nLFxuICBRdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzID0gJ3F1YW50YXRpdmVSYW5nZVNlbGVjdGlvbk1vZGVscycsXG5cbiAgUmFuZ2VOID0gJ3JhbmdlLW4nLFxuICBSZXBsYXlTcGVlZCA9ICdyZXBsYXktc3BlZWQnLFxuXG4gIFNlbGVjdGVkRGF0YSA9ICdzZWxlY3RlZC1kYXRhJyxcbiAgU2VsZWN0ZWRTaGVldE5hbWVzID0gJ3NlbGVjdGVkLXNoZWV0LW5hbWVzJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbicsXG4gIFNlbGVjdGlvbkxpc3QgPSAnc2VsZWN0aW9uLWxpc3QnLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlID0gJ3NlbGVjdGlvblVwZGF0ZVR5cGUnLFxuICBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiA9ICdzZWxlY3QtdHVwbGVzLWludGVyYWN0aW9uJyxcbiAgU2VuZE5vdGlmaWNhdGlvbnMgPSAnc2VuZC1ub3RpZmljYXRpb25zJyxcbiAgU2V0dGluZ3NWYWx1ZXMgPSAnc2V0dGluZ3MtdmFsdWVzJyxcbiAgU2hhcmVkRmlsdGVyU2hlZXRzID0gJ3NoYXJlZC1maWx0ZXItc2hlZXRzJyxcbiAgU2hhcmVkRmlsdGVyc0luZm8gPSAnc2hhcmVkLWZpbHRlcnMtaW5mbycsXG4gIFNoZWV0SWRlbnRpZmllciA9ICdzaGVldC1pZGVudGlmaWVyJyxcbiAgU2hlZXROYW1lID0gJ3NoZWV0LW5hbWUnLFxuICBTaGVldFBhdGggPSAnc2hlZXQtcGF0aCcsXG4gIFNob3VsZFJlZnJlc2hEUyA9ICdzaG91bGQtcmVmcmVzaC1kcycsXG4gIFNob3dEYXRhVGFibGVGb3JtYXQgPSAnc2hvdy1kYXRhLXRhYmxlLWZvcm1hdCcsXG4gIFN0YXRlID0gJ3N0YXRlJyxcbiAgU3RvcnlQb2ludEluZGV4ID0gJ3N0b3J5LXBvaW50LWluZGV4JyxcbiAgU3RvcnlQb2ludEluZm8gPSAnc3RvcnktcG9pbnQtaW5mbycsXG4gIFN3aXRjaFRvU2hlZXROYW1lID0gJ3N3aXRjaC10by1zaGVldC1uYW1lJyxcblxuICBUYXJnZXRQb2ludCA9ICd0YXJnZXQtcG9pbnQnLFxuICBUZXN0Q29udmVyc2lvblBhcmFtZXRlciA9ICd0ZXN0LWNvbnZlcnNpb24tcGFyYW1ldGVyJyxcbiAgVGV4dCA9ICdmb3JtYXR0ZWQtdGV4dCcsXG4gIFRvb2x0aXBDb250ZXh0ID0gJ3Rvb2x0aXAtY29udGV4dCcsXG5cbiAgVW5kZXJseWluZ0RhdGFUYWJsZSA9ICd1bmRlcmx5aW5nLWRhdGEtdGFibGUnLFxuICBVbmRlcmx5aW5nU3VtbWFyeURhdGFUYWJsZSA9ICd1bmRlcmx5aW5nLXN1bW1hcnktZGF0YS10YWJsZScsXG4gIFVybCA9ICd1cmwnLFxuICBVc2VUYWJEZWxpbWl0ZXJzID0gJ3VzZS10YWItZGVsaW1pdGVycycsXG5cbiAgVmlld0RhdGFUYWJsZUNhY2hlSWQgPSAndmlldy1kYXRhLXRhYmxlLWNhY2hlLWlkJyxcbiAgVmlld0RhdGFUYWJsZUlkID0gJ3ZpZXctZGF0YS10YWJsZS1pZCcsXG4gIFZpc3VhbElkID0gJ3Zpc3VhbC1pZCcsXG4gIFZpc3VhbFNwZWNpZmljYXRpb24gPSAndmlzdWFsLXNwZWNpZmljYXRpb24nLFxuICBWaXpBUElJbnB1dEpzb24gPSAndml6YXBpLWlucHV0LWpzb24nLFxuICBWaXpBUElTdGF0ZVdpdGhEYXRhTW9kZWwgPSAndml6YXBpLXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIFZpekFQSVN0YXRlV2FybmluZ01zZyA9ICd2aXphcGktc3RhdGUtd2FybmluZy1tc2cnLFxuICBWaXpBUElTVkcgPSAndml6YXBpLXN2ZycsXG5cbiAgV29ya3NoZWV0TmFtZSA9ICd3b3Jrc2hlZXQtbmFtZScsXG4gIFdvcmtzaGVldEZpbHRlcnMgPSAnd29ya3NoZWV0LWZpbHRlcnMnLFxuXG4gIFpvbmVJZHNWaXNpYmlsaXR5TWFwID0gJ3pvbmUtaWRzLXZpc2liaWxpdHktbWFwJyxcbn1cbiIsIi8vIERlY2xhcmUgdGhpcyBrZXkgdHlwZSBhbmQgZXhwb3J0IHRoZSBOb3RpZmljYXRpb25JZCB0byBtYWtlIHRoaXMgYmVoYXZlIGxpa2UgYSBzdHJpbmcgZW51bS5cbi8vXG4vLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFZlcmJJZCB7XG4gIEFjdGl2YXRlTmV4dFN0b3J5UG9pbnQgPSAnYWN0aXZhdGUtbmV4dC1zdG9yeS1wb2ludCcsXG4gIEFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50ID0gJ2FjdGl2YXRlLXByZXZpb3VzLXN0b3J5LXBvaW50JyxcbiAgQWN0aXZhdGVTaGVldCA9ICdhY3RpdmF0ZVNoZWV0JyxcbiAgQWN0aXZhdGVTdG9yeVBvaW50ID0gJ2FjdGl2YXRlLXN0b3J5LXBvaW50JyxcbiAgQXBwZW5kRXh0ZXJuYWxNZW51SXRlbSA9ICdhcHBlbmQtZXh0ZXJuYWwtbWVudS1pdGVtJyxcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIEFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyID0gJ2FwcGx5LXJlbGF0aXZlLWRhdGUtRmlsdGVyJyxcbiAgQXV0aGVudGljYXRlID0gJ2F1dGhlbnRpY2F0ZScsXG5cbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcblxuICBDaGFuZ2VQYXJhbWV0ZXJWYWx1ZSA9ICdjaGFuZ2UtcGFyYW1ldGVyLXZhbHVlJyxcbiAgQ2hhbmdlU2hhcmVkRmlsdGVyID0gJ2NoYW5nZS1zaGFyZWQtZmlsdGVyJyxcbiAgQ2xlYXJGaWx0ZXIgPSAnY2xlYXItZmlsdGVyJyxcbiAgQ2xlYXJTZWxlY3RlZE1hcmtzID0gJ2NsZWFyLXNlbGVjdGVkLW1hcmtzJyxcbiAgQ2xvc2VEaWFsb2cgPSAnY2xvc2UtZGlhbG9nJyxcbiAgQ3JlYXRlQW5ub3RhdGlvbiA9ICdjcmVhdGUtYW5ub3RhdGlvbicsXG5cbiAgRGFzaGJvYXJkQ2F0ZWdvcmljYWxGaWx0ZXIgPSAnZGFzaGJvYXJkLWNhdGVnb3JpY2FsLWZpbHRlcicsXG4gIERpc3BsYXlEaWFsb2cgPSAnZGlzcGxheS1kaWFsb2cnLFxuICBEb3dubG9hZFdvcmtib29rID0gJ2Rvd25sb2FkLXdvcmtib29rJyxcblxuICBFeGVjdXRlRXh0ZXJuYWxNZW51SXRlbSA9ICdleGVjdXRlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIEV4cG9ydENyb3NzdGFiID0gJ2V4cG9ydC1jcm9zc3RhYicsXG4gIEV4cG9ydENyb3NzdGFiQ3N2RG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWNzdi1kb3dubG9hZCcsXG4gIEV4cG9ydENyb3NzdGFiRXhjZWxEb3dubG9hZCA9ICdleHBvcnQtY3Jvc3N0YWItZXhjZWwtZG93bmxvYWQnLFxuICBFeHBvcnREYXRhID0gJ2V4cG9ydC1kYXRhJyxcbiAgRXhwb3J0RGF0YURvd25sb2FkID0gJ2V4cG9ydC1kYXRhLWRvd25sb2FkJyxcbiAgRXhwb3J0SW1hZ2UgPSAnZXhwb3J0LWltYWdlJyxcbiAgRXhwb3J0UGRmID0gJ2V4cG9ydC1wZGYnLFxuICBFeHBvcnRQZGZEb3dubG9hZCA9ICdleHBvcnQtcGRmLWRvd25sb2FkJyxcbiAgRXhwb3J0UG93ZXJwb2ludCA9ICdleHBvcnQtcG93ZXJwb2ludCcsXG4gIEV4cG9ydFBvd2VycG9pbnREb3dubG9hZCA9ICdleHBvcnQtcG93ZXJwb2ludC1kb3dubG9hZCcsXG5cbiAgRmluZFBhcmFtZXRlciA9ICdmaW5kLXBhcmFtZXRlcicsXG5cbiAgR2V0QWN0aXZlVGFibGVzID0gJ2dldC1hY3RpdmUtdGFibGVzJyxcbiAgR2V0QWxsRGF0YVNvdXJjZXMgPSAnZ2V0LWFsbC1kYXRhLXNvdXJjZXMnLFxuICBHZXRBbm5vdGF0aW9ucyA9ICdnZXQtYW5ub3RhdGlvbnMnLFxuICBHZXRDYXRlZ29yaWNhbERvbWFpbiA9ICdnZXQtY2F0ZWdvcmljYWwtZG9tYWluJyxcbiAgR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzID0gJ2dldC1jb25uZWN0aW9uLWRlc2NyaXB0aW9uLXN1bW1hcmllcycsXG4gIEdldEN1cnJlbnRTcmMgPSAnZ2V0LWN1cnJlbnQtc3JjJyxcbiAgR2V0Q3VzdG9tVmlld3MgPSAnZ2V0LWN1c3RvbS12aWV3cycsXG4gIEdldERhc2hib2FyZEZpbHRlcnMgPSAnZ2V0LWRhc2hib2FyZC1maWx0ZXJzJyxcbiAgR2V0RGF0YVNvdXJjZSA9ICdnZXQtZGF0YXNvdXJjZScsXG4gIEdldERhdGFTb3VyY2VEYXRhID0gJ2dldC1kYXRhc291cmNlLWRhdGEnLFxuICBHZXREYXRhU291cmNlcyA9ICdnZXQtZGF0YS1zb3VyY2VzJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhID0gJ2dldC1zdW1tYXJ5LWRhdGEnLFxuICBHZXREYXRhU3VtbWFyeURhdGFSZWFkZXIgPSAnZ2V0LXN1bW1hcnktZGF0YS1yZWFkZXInLFxuICBHZXREYXRhVGFibGVSZWFkZXJQYWdlID0gJ2dldC1kYXRhLXRhYmxlLXJlYWRlci1wYWdlJyxcbiAgR2V0RW1iZWRkaW5nQWJzdHJhY3RRdWVyeVdpdGhEYXRhTW9kZWwgPSAnZ2V0LWVtYmVkZGluZy1hYnN0cmFjdC1xdWVyeS13aXRoLWRhdGEtbW9kZWwnLFxuICBHZXRFbWJlZGRpbmdDbGllbnRJbmZvID0gJ2dldC1lbWJlZGRpbmctY2xpZW50LWluZm8nLFxuICBHZXRWaXpTdGF0ZVdpdGhEYXRhTW9kZWwgPSAnZ2V0LXZpei1zdGF0ZS13aXRoLWRhdGEtbW9kZWwnLFxuICBHZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwID0gJ2dldC1leHBvcnQtY3Jvc3N0YWItc2hlZXQtbWFwJyxcbiAgR2V0RXhwb3J0UGRmT3B0aW9ucyA9ICdnZXQtZXhwb3J0LXBkZi1vcHRpb25zJyxcbiAgR2V0RmllbGQgPSAnZ2V0LWZpZWxkJyxcbiAgR2V0RmllbGRBbmREYXRhU291cmNlID0gJ2dldC1maWVsZC1hbmQtZGF0YXNvdXJjZScsXG4gIEdldFZpc3VhbFNwZWNpZmljYXRpb24gPSAnZ2V0LXZpc3VhbC1zcGVjaWZpY2F0aW9uJyxcbiAgR2V0RmlsdGVycyA9ICdnZXQtZmlsdGVycycsXG4gIEdldEZvbnRzID0gJ2dldC1mb250cycsXG4gIEdldEhpZ2hsaWdodGVkTWFya3MgPSAnZ2V0LWhpZ2hsaWdodGVkLW1hcmtzJyxcbiAgR2V0Sm9pbkRlc2NyaXB0aW9uID0gJ2dldC1qb2luLWRlc2NyaXB0aW9uJyxcbiAgR2V0TG9naWNhbFRhYmxlRGF0YSA9ICdnZXQtbG9naWNhbC10YWJsZS1kYXRhJyxcbiAgR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciA9ICdnZXQtbG9naWNhbC10YWJsZS1kYXRhLXJlYWRlcicsXG4gIEdldExvZ2ljYWxUYWJsZXMgPSAnZ2V0LWxvZ2ljYWwtdGFibGVzJyxcbiAgR2V0UGFyYW1ldGVyc0ZvclNoZWV0ID0gJ2dldC1wYXJhbWV0ZXJzLWZvci1zaGVldCcsXG4gIEdldFJhbmdlRG9tYWluID0gJ2dldC1yYW5nZS1kb21haW4nLFxuICBHZXRTZWxlY3RlZE1hcmtzID0gJ2dldC1zZWxlY3RlZC1tYXJrcycsXG4gIEdldFNoYXJlZEZpbHRlciA9ICdnZXQtc2hhcmVkLWZpbHRlcicsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEtcmVhZGVyJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlcyA9ICdnZXQtdW5kZXJseWluZy10YWJsZXMnLFxuXG4gIEhpZXJhcmNoaWNhbEZpbHRlciA9ICdoaWVyYWNoaWNhbC1maWx0ZXInLFxuXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuXG4gIE1vdmVBbmRSZXNpemVab25lcyA9ICdtb3ZlLWFuZC1yZXNpemUtem9uZXMnLFxuXG4gIFJhaXNlSG92ZXJUdXBsZU5vdGlmaWNhdGlvbiA9ICdyYWlzZS1ob3Zlci10dXBsZS1ub3RpZmljYXRpb24nLFxuICBSYWlzZVNlbGVjdFR1cGxlc05vdGlmaWNhdGlvbiA9ICdyYWlzZS1zZWxlY3QtdHVwbGVzLW5vdGlmaWNhdGlvbicsXG4gIFJlZG8gPSAncmVkbycsXG4gIFJlZnJlc2hEYXRhU291cmNlID0gJ3JlZnJlc2gtZGF0YS1zb3VyY2UnLFxuICBSZWxlYXNlRGF0YVRhYmxlUmVhZGVyID0gJ3JlbGVhc2UtZGF0YS10YWJsZS1yZWFkZXInLFxuICBSZW1vdmVBbm5vdGF0aW9uID0gJ3JlbW92ZS1hbm5vdGF0aW9uJyxcbiAgUmVtb3ZlQ3VzdG9tVmlldyA9ICdyZW1vdmUtY3VzdG9tLXZpZXcnLFxuICBSZW1vdmVFeHRlcm5hbE1lbnVJdGVtID0gJ3JlbW92ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBSZW5hbWVFeHRlcm5hbE1lbnUgPSAncmVuYW1lLWV4dGVybmFsLW1lbnUnLFxuICBSZXBsYXlBbmltYXRpb24gPSAncmVwbGF5LWFuaW1hdGlvbicsXG4gIFJldmVydFN0b3J5UG9pbnQgPSAncmV2ZXJ0LXN0b3J5LXBvaW50JyxcbiAgUmV2ZXJ0V29ya2Jvb2sgPSAncmV2ZXJ0LXdvcmtib29rJyxcblxuICBTYXZlRXh0ZW5zaW9uU2V0dGluZ3MgPSAnc2F2ZS1leHRlbnNpb24tc2V0dGluZ3MnLFxuICBTYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcgPSAnc2F2ZS13b3JrYm9vay1hcy1jdXN0b20tdmlldycsXG4gIFNlbGVjdEJ5VmFsdWUgPSAnc2VsZWN0LWJ5LXZhbHVlJyxcbiAgU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCA9ICdzZXQtYWN0aXZlLWN1c3RvbS12aWV3LWFzLWRlZmF1bHQnLFxuICBTZXRBdXRvVXBkYXRlID0gJ3NldC1hdXRvLXVwZGF0ZScsXG4gIFNldENsaWNrVGhyb3VnaCA9ICdzZXQtY2xpY2stdGhyb3VnaCcsXG4gIFNldFZpelN0YXRlV2l0aERhdGFNb2RlbCA9ICdzZXQtdml6LXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIFNldFNoZWV0U2l6ZSA9ICdzZXQtc2hlZXQtc2l6ZScsXG4gIFNldFpvbmVWaXNpYmlsaXR5ID0gJ3NldC16b25lLXZpc2liaWxpdHknLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFNob3dDdXN0b21WaWV3ID0gJ3Nob3ctY3VzdG9tLXZpZXcnLFxuXG4gIFRlc3RDb252ZXJzaW9uVmVyYiA9ICd0ZXN0LWNvbnZlcnNpb24tdmVyYicsXG5cbiAgVW5kbyA9ICd1bmRvJyxcbiAgVXBkYXRlQ3VzdG9tVmlldyA9ICd1cGRhdGUtY3VzdG9tLXZpZXcnLFxuXG4gIFZpekFQSSA9ICd2aXotYXBpJyxcbn1cbiIsImV4cG9ydCBlbnVtIEFza0RhdGFPcHRpb25OYW1lcyB7XG4gIHRva2VuID0gJ3Rva2VuJyxcbiAgb3JpZ2luID0gJ29yaWdpbicsXG4gIHNob3dFbWJlZCA9ICdzaG93RW1iZWQnLFxuICBzaG93UGluID0gJ3Nob3dQaW4nLFxuICBzaG93U2F2ZSA9ICdzaG93U2F2ZScsXG4gIHNob3dTaGFyZSA9ICdzaG93U2hhcmUnLFxuICBkZWJ1ZyA9ICc6anNkZWJ1ZycsXG4gIEFwaUlEID0gJzphcGlJRCcsXG4gIEFwaUV4dGVybmFsVmVyc2lvbiA9ICc6YXBpRXh0ZXJuYWxWZXJzaW9uJyxcbiAgQXBpSW50ZXJuYWxWZXJzaW9uID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBBc2tEYXRhV2ViQ29tcG9uZW50ID0gJzphc2tEYXRhV2ViQ29tcG9uZW50Jyxcbn1cbiIsImV4cG9ydCBlbnVtIFB1bHNlT3B0aW9uTmFtZXMge1xuICBlbWJlZCA9ICdlbWJlZCcsXG4gIHRva2VuID0gJ3Rva2VuJyxcbiAgZGlzYWJsZUV4cGxvcmVGaWx0ZXIgPSAnZGlzYWJsZUV4cGxvcmVGaWx0ZXInLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgUHVsc2VXZWJDb21wb25lbnQgPSAnOnB1bHNlV2ViQ29tcG9uZW50Jyxcbn1cbiIsIi8qKlxuICogVGhlc2Ugc3RyaW5ncyB3ZXJlICptYW51YWxseSBjb3BpZWQqIGZyb20gdGhlIHNlcnZlcixcbiAqIHdvcmtncm91cC9zcmMvc2lsb3MvdGFibGVhdS1zZXJ2ZXIvbGlicmFyaWVzL3RhYi1jb250cm9sbGVyLXZpenFsL3NyYy9jb20vdGFibGVhdXNvZnR3YXJlL1xuICogY29udHJvbGxlci92aXpxbC9jb25zdGFudHMvUGFyYW1ldGVyS2V5cy5qYXZhI0w5XG4gKiBzaG91bGQgYmUgZXhwb3J0ZWQgaW5zdGVhZFxuICogcGFyYW1ldGVycyB0aGF0IHZpenFsIHdpbGwgYWNjZXB0IGluIGFuIGVtYmVkZGluZyBVUkxcbiAqKi9cbmVudW0gVnFsUGFyYW1ldGVyTmFtZXMge1xuICBPTkUgPSAnMScsXG4gIEFMRVJUUyA9ICc6YWxlcnRzJyxcbiAgQUxJQVMgPSAnYWxpYXMnLFxuICBBTExPV19ERUZFUlJFRF9CT09UU1RSQVAgPSAnOmFsbG93RGVmZXJyZWRCb290c3RyYXAnLFxuICBBTExPV19BVVRPR0VOX1dPUktTSEVFVF9QSE9ORV9MQVlPVVRTID0gJ2FsbG93QXV0b2dlbldvcmtzaGVldFBob25lTGF5b3V0cycsXG4gIEFQSV9JRCA9ICc6YXBpSUQnLFxuICBBUFAgPSAnOmFwcCcsXG4gIEFUVEFDSE1FTlQgPSAnYXR0YWNobWVudCcsXG4gIElTX0lQQURfQVBQID0gJ2FwcCcsXG4gIEFOSU1BVEVfVFJBTlNJVElPTiA9ICc6YW5pbWF0ZV90cmFuc2l0aW9uJyxcbiAgQVNDRU5ESU5HID0gJ2FzY2VuZGluZycsXG4gIEFVVEhFTlRJQ0FUSU9OID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQVRUUklCVVRFUyA9ICdhdHRyaWJ1dGVzJyxcbiAgQVVUSE9SSU5HX1NIRUVUID0gJzphdXRoU2hlZXQnLFxuICBBWElTID0gJ2F4aXMnLFxuICBCT09UU1RSQVBfV0hFTl9OT1RJRklFRCA9ICc6Ym9vdHN0cmFwV2hlbk5vdGlmaWVkJyxcbiAgQlJPV1NFUl9CQUNLX0JVVFRPTl9VTkRPID0gJzpicm93c2VyQmFja0J1dHRvblVuZG8nLFxuICBCUk9XU0VSX1JFTkRFUklOR19PTiA9ICdpc0Jyb3dzZXJSZW5kZXJpbmcnLFxuICBCUk9XU0VSX1JFTkRFUklOR19USFJFU0hPTEQgPSAnYnJvd3NlclJlbmRlcmluZ1RocmVzaG9sZCcsXG4gIENIQVJTRVQgPSAnY2hhcnNldCcsXG4gIENMSUVOVF9ESU1FTlNJT04gPSAnY2xpZW50RGltZW5zaW9uJyxcbiAgQ0xJRU5UX0lQID0gJ2NsaWVudF9pcCcsXG4gIENMSUVOVF9OVU0gPSAnY2xpZW50TnVtJyxcbiAgQ09MT05fRU1CRURERUQgPSAnOmVtYmVkZGVkJyxcbiAgQ09MT05fTU9CSUxFID0gJzptb2JpbGUnLFxuICBDT0xPTl9ERUVQX0xJTktJTkdfRElTQUJMRUQgPSAnOmRlZXBMaW5raW5nRGlzYWJsZWQnLFxuICBDT0xPTl9XQVRFUk1BUksgPSAnOndhdGVybWFyaycsXG4gIENPTU1FTlRTID0gJzpjb21tZW50cycsXG4gIENPTU1FTlRJTkdfRU5BQkxFRCA9ICc6Y29tbWVudGluZ0VuYWJsZWQnLFxuICBDT01NRU5USU5HX01FTlRJT05TX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdNZW50aW9ucycsXG4gIENPTk5FQ1RJT04gPSAnY29ubmVjdGlvbicsXG4gIENSRUFURURfQllfRkVBVFVSRSA9ICdjcmVhdGVkQnlGZWF0dXJlJyxcbiAgQ1JZUFRFRF9QQVNTV09SRCA9ICdjcnlwdGVkJyxcbiAgQ1NTREVCVUcgPSAnOmNzc2RlYnVnJyxcbiAgQ1NWID0gJ2NzdicsXG4gIENVU1RPTV9WSUVXUyA9ICc6Y3VzdG9tVmlld3MnLFxuICBDViA9ICc6Y3YnLFxuICBDVl9JRCA9ICdjdklkJyxcbiAgREFTSEJPQVJEX1BPUlRfU0laRSA9ICdkYXNoYm9hcmRQb3J0U2l6ZScsXG4gIERBVEFfREVUQUlMUyA9ICc6ZGF0YURldGFpbHMnLFxuICBEQVRBU09VUkNFID0gJ2RhdGFzb3VyY2UnLFxuICBERUJVRyA9ICc6ZGVidWcnLFxuICBERUxBWSA9ICc6ZGVsYXknLFxuICBERVBUSCA9ICdkZXB0aCcsXG4gIERFVklDRV9UWVBFID0gJzpkZXZpY2UnLFxuICBERVZJQ0VfUElYRUxfUkFUSU8gPSAnZGV2aWNlUGl4ZWxSYXRpbycsXG4gIERFVklDRV9QUkVWSUVXX01PREUgPSAnOmRldmljZXByZXZpZXdtb2RlJyxcbiAgRElNRU5TSU9OUyA9ICc6ZGltZW5zaW9ucycsXG4gIERJU0FCTEVfU0hBUkVEX1NFU1NJT05TID0gJzpkaXNhYmxlX3NoYXJlZF9zZXNzaW9ucycsXG4gIERJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTID0gJzpkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcycsXG4gIERJUkVDVElPTiA9ICdkaXJlY3Rpb24nLFxuICBESVNQTEFZX09WRVJMQVkgPSAnOmRpc3BsYXlfb3ZlcmxheScsXG4gIERJU1BMQVlfU0hBUkUgPSAnOmRpc3BsYXlfc2hhcmUnLFxuICBESVNQTEFZX1NQSU5ORVIgPSAnOmRpc3BsYXlfc3Bpbm5lcicsXG4gIERJU1BMQVlfU1RBVElDX0lNQUdFID0gJzpkaXNwbGF5X3N0YXRpY19pbWFnZScsXG4gIERJU1BMQVlfVEFCUyA9ICdkaXNwbGF5X3RhYnMnLFxuICBESVNQTEFZX1ZJRVdfQ09VTlQgPSAnOmRpc3BsYXlfY291bnQnLFxuICBJR05PUkVfU1RJQ0tZX1NFU1NJT04gPSAnOmlnbm9yZV9zdGlja3lfc2Vzc2lvbicsXG4gIElOQ1JFTUVOVF9WSUVXX0NPVU5UID0gJzppbmNyZW1lbnRfdmlld19jb3VudCcsXG4gIERPQ01PREUgPSAnZG9jbW9kZScsXG4gIERPTUFJTiA9ICdkb21haW4nLFxuICBET19XT1JLID0gJ2RvX3dvcmsnLFxuICBEWCA9ICdkeCcsXG4gIERZID0gJ2R5JyxcbiAgRURJVF9EQVRBX0FMRVJUID0gJzplZGl0RGF0YUFsZXJ0JyxcbiAgRU1CRUQgPSAnOmVtYmVkJyxcbiAgRU1CRURERUQgPSAnZW1iZWRkZWQnLFxuICBFTkNSWVBURUQgPSAnZW5jcnlwdGVkJyxcbiAgQVBJX0VYVEVSTkFMX1ZFUlNJT04gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFQSV9JTlRFUk5BTF9WRVJTSU9OID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBFWENMVURFID0gJ2V4Y2x1ZGUnLFxuICBFWFBPUlRfRk9STUFUID0gJzpleHBvcnRfZm9ybWF0JyxcbiAgRklFTEROQU1FID0gJ2ZpZWxkbmFtZScsXG4gIEZJRUxEX05BTUUgPSAnZmllbGRfbmFtZScsXG4gIEZJRUxEX1NFUCA9ICdmaWVsZF9zZXAnLFxuICBGSUxFID0gJ2ZpbGUnLFxuICBGSUxURVJfVElMRV9TSVpFID0gJ2ZpbHRlclRpbGVTaXplJyxcbiAgRk4gPSAnZm4nLFxuICBGT0NVUyA9ICdmb2N1cycsXG4gIEZPUkNFX0NBQ0hFID0gJ2ZvcmNlX2NhY2hlJyxcbiAgRk9STUFUID0gJ2Zvcm1hdCcsXG4gIEZPUk1BVF9EQVRBX1ZBTFVFX0xPQ0FMTFkgPSAnZm9ybWF0RGF0YVZhbHVlTG9jYWxseScsXG4gIEZST01fV0cgPSAnOmZyb21fd2cnLFxuICBHUkFQSFFMX0RBVEFCQVNFX0lEID0gJzpncmFwaFFMRGF0YWJhc2VJZCcsXG4gIEdSQVBIUUxfVEFCTEVfSUQgPSAnOmdyYXBoUUxUYWJsZUlkJyxcbiAgR1VJRCA9ICc6Z3VpZCcsXG4gIEggPSAnaCcsXG4gIEhJRERFTiA9ICdoaWRkZW4nLFxuICBISURFX0NMT1NFX0JVVFRPTiA9ICc6aGlkZUNsb3NlQnV0dG9uJyxcbiAgSElERV9FRElUX0JVVFRPTiA9ICc6aGlkZUVkaXRCdXR0b24nLFxuICBISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04gPSAnOmhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uJyxcbiAgSElHSF9EUEkgPSAnOmhpZ2hkcGknLFxuICBJTUFHRV9TSVpFX0xJTUlUID0gJ2ltYWdlU2l6ZUxpbWl0JyxcbiAgVFJBTlNQQVJFTlRfTElORV9NQVJLU19MSU1JVCA9ICd0cmFuc3BhcmVudExpbmVNYXJrTGltaXQnLFxuICBDTElFTlRfUkVOREVSX1BJWEVMX0xJTUlUID0gJ2NsaWVudFJlbmRlclBpeGVsTGltaXQnLFxuICBJTiA9ICdpbicsXG4gIElOU1RBTkNFX0lEID0gJzppaWQnLFxuICBJU19HVUVTVF9SRURJUkVDVF9GUk9NX1ZJWlBPUlRBTCA9ICc6aXNHdWVzdFJlZGlyZWN0RnJvbVZpenBvcnRhbCcsXG4gIElTX01BUktfQU5JTUFUSU9OX0VOQUJMRUQgPSAnaXNNYXJrQW5pbWF0aW9uRW5hYmxlZCcsXG4gIElTX1ZJWlBPUlRBTCA9ICc6aXNWaXpQb3J0YWwnLFxuICBJTlBVVF8gPSAnaW5wdXRfc3RyaW5nJyxcbiAgSlNERUJVRyA9ICc6anNkZWJ1ZycsXG4gIEpTT04gPSAnanNvbicsXG4gIEpTT05fT05MWSA9ICc6anNvbk9ubHknLFxuICBLRUVQRklMRSA9ICdrZWVwZmlsZScsXG4gIEtFWSA9ICdrZXknLFxuICBMQU5HVUFHRSA9ICdsYW5ndWFnZScsXG4gIExBTkdVQUdFX1JFUVVFU1RFRCA9ICc6bGFuZ3VhZ2UnLFxuICBMSU5LVEFSR0VUID0gJzpsaW5rdGFyZ2V0JyxcbiAgTE9BRF9PUkRFUl9JRCA9ICc6bG9hZE9yZGVySUQnLCAvLyB1c2VkIGZvciBQdWJsaWNcbiAgTE9BRF9ORVdFU1RfUkVWSVNJT04gPSAnOmxvYWROZXdlc3RSZXZpc2lvbicsXG4gIExPQ0FMX1BBVEhTID0gJzpsb2NhbFBhdGhzJyxcbiAgTE9DQUxFID0gJ2xvY2FsZScsXG4gIExPQ0FUSU9OX0lEID0gJ2xvY2F0aW9uaWQnLFxuICBMT0NBVElPTl9UWVBFID0gJ2xvY2F0aW9udHlwZScsXG4gIFdPUktCT09LX0xPQ0FMRSA9ICd3b3JrYm9va0xvY2FsZScsXG4gIE1BWFJPV1MgPSAnbWF4cm93cycsXG4gIE1BWF9BR0UgPSAnbWF4QWdlJyxcbiAgTUFYX1JPV1MgPSAnbWF4Um93cycsXG4gIE1FVEhPRCA9ICdtZXRob2QnLFxuICBNT0JJTEUgPSAnbW9iaWxlJyxcbiAgTU9ESUZJRVIgPSAnbW9kaWZpZXInLFxuICBOQU1FID0gJ25hbWUnLFxuICBOQVZfVFlQRSA9ICduYXZUeXBlJyxcbiAgTkFWX1NSQyA9ICduYXZTcmMnLFxuICBOT0FUVEFDSE1FTlQgPSAnbm8tYXR0YWNobWVudCcsXG4gIE5PX09WRVJXUklURSA9ICdub19vdmVyd3JpdGUnLFxuICBPUEVOX0FVVEhPUklOR19JTl9UT1BfV0lORE9XID0gJzpvcGVuQXV0aG9yaW5nSW5Ub3BXaW5kb3cnLFxuICBPUEVOSURfSEQgPSAnOm9wZW5pZF9oZCcsXG4gIE9QRU5JRF9MT0dJTl9ISU5UID0gJzpvcGVuaWRfbG9naW5faGludCcsXG4gIE9BVVRIUkVRVUVTVCA9ICdvYXV0aHJlcXVlc3QnLFxuICBPQVVUSF9DUkVERU5USUFMX0lEUyA9ICdvYXV0aF9jcmVkZW50aWFsX2lkcycsXG4gIE9GRkxJTkVfTU9ERSA9ICc6b2ZmbGluZW1vZGUnLFxuICBPUklHSU4gPSAnOm9yaWdpbicsXG4gIE9WRVJMQVkgPSAnOm92ZXJsYXknLFxuICBQID0gJ3AnLFxuICBQQVRIID0gJ3BhdGgnLFxuICBQQU5FX1JFU09MVkVSX1ggPSAncGFuZVJlc29sdmVyWCcsXG4gIFBBTkVfUkVTT0xWRVJfWSA9ICdwYW5lUmVzb2x2ZXJZJyxcbiAgUEFSQU0gPSAncGFyYW0nLFxuICBQQVJFTlRfSUQgPSAncGFyZW50X2lkJyxcbiAgUEFTU1dPUkQgPSAncGFzc3dvcmQnLFxuICBQQVRURVJOID0gJ3BhdHRlcm4nLFxuICBQSVhFTF9SQVRJTyA9ICc6cGl4ZWxyYXRpbycsXG4gIFBSRUZJWCA9ICc6cHJlZml4JyxcbiAgUFJFVklFVyA9ICc6cHJldmlldycsXG4gIFBSSU1BUllfQ09OVEVOVF9VUkwgPSAncHJpbWFyeV9jb250ZW50X3VybCcsXG4gIFBST0pFQ1QgPSAncHJvamVjdCcsXG4gIFBST1RPQ09MID0gJ3Byb3RvY29sJyxcbiAgUFNFVURPID0gJzpwc2V1ZG8nLFxuICBRVUVSWSA9ICdxdWVyeScsXG4gIFIgPSAncicsXG4gIFJBTkdFX1RZUEUgPSAncmFuZ2VfdHlwZScsXG4gIFJFQ09SRF9TRVAgPSAncmVjb3JkX3NlcCcsXG4gIFJFQ09SRF9DTElFTlRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9jbGllbnRfcGVyZm9ybWFuY2UnLFxuICBSRUNPUkRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9wZXJmb3JtYW5jZScsXG4gIFJFQ09WRVJfT0xEX1NFU1NJT05fSUQgPSAnOnJlY292ZXJfb2xkX3Nlc3Npb25faWQnLFxuICBSRUNPVkVSX1NFU1NJT05fU1RBVEVfVElDS0VUUyA9ICc6cmVjb3Zlcl9zZXNzaW9uX3N0YXRlX3RpY2tldHMnLFxuICBSRUZSRVNIID0gJzpyZWZyZXNoJyxcbiAgUkVGUkVTSFVOTU9ESUZJRUQgPSAnOnJlZnJlc2h1bm1vZGlmaWVkJyxcbiAgUkVHSU9OID0gJ3JlZ2lvbicsXG4gIFJFTE9BRF9PTl9DVVNUT01fVklFV19TQVZFID0gJzpyZWxvYWRPbkN1c3RvbVZpZXdTYXZlJyxcbiAgUkVOREVSID0gJzpyZW5kZXInLFxuICBSRU5ERVJfTUFQU19DTElFTlRfU0lERSA9ICdyZW5kZXJNYXBzQ2xpZW50U2lkZScsXG4gIFJFVFJZID0gJzpyZXRyeScsXG4gIFJFVVNFID0gJ3JldXNlJyxcbiAgUkVVU0VfRk9SRVZFUiA9ICdyZXVzZV9mb3JldmVyJyxcbiAgUkVWRVJUID0gJzpyZXZlcnQnLFxuICBTQVZFX0RCX1BBU1NXT1JEUyA9ICdzYXZlX2RiX3Bhc3N3b3JkcycsXG4gIFNFTEVDVF9YID0gJ3NlbGVjdF94JyxcbiAgU0VMRUNUX1kgPSAnc2VsZWN0X3knLFxuICBTRVNTSU9OX0ZFQVRVUkVfUFJFRklYID0gJzpmZl8nLFxuICBTRVNTSU9OX0ZMQUdTID0gJzpzZXNzaW9uX2ZlYXR1cmVfZmxhZ3MnLFxuICBTSEFSRV9CVVRUT04gPSAnc2hhcmVfYnV0dG9uJyxcbiAgU0hFRVRfSUQgPSAnc2hlZXRfaWQnLFxuICBTSEFSRUQgPSAnc2hhcmVkJyxcbiAgU0hPV0FMTCA9ICdzaG93YWxsJyxcbiAgU0hPV19BUFBfQkFOTkVSID0gJzpzaG93QXBwQmFubmVyJyxcbiAgU0hPV19BU0tfREFUQSA9ICc6c2hvd0Fza0RhdGEnLFxuICBTSE9XX1BBUkFNUyA9ICdzaG93UGFyYW1zJyxcbiAgU0hPV19TSEFSRV9PUFRJT05TID0gJzpzaG93U2hhcmVPcHRpb25zJyxcbiAgU0laRSA9ICc6c2l6ZScsXG4gIFNPVVJDRSA9ICdzb3VyY2UnLFxuICBTVEFURSA9ICdzdGF0ZScsXG4gIFNUSUNLWV9TRVNTSU9OX0tFWSA9ICdzdGlja3lTZXNzaW9uS2V5JyxcbiAgU1VCU0NSSVBUSU9OUyA9ICc6c3Vic2NyaXB0aW9ucycsXG4gIFNVTU1BUlkgPSAnc3VtbWFyeScsXG4gIFNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUiA9ICc6c3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yJyxcbiAgU1lOQ19TRVNTSU9OID0gJzpzeW5jX3Nlc3Npb24nLFxuICBTWU5DX1NFU1NJT05fU1RBVEUgPSAnc3luY19zZXNzaW9uX3N0YXRlJyxcbiAgVEFCUyA9ICc6dGFicycsXG4gIFRBUkdFVCA9ICd0YXJnZXQnLFxuICBUQVJHRVRfU0lURSA9ICd0YXJnZXRfc2l0ZScsXG4gIFRPT0xCQVIgPSAnOnRvb2xiYXInLFxuICBUT09MVElQID0gJzp0b29sdGlwJyxcbiAgVFMgPSAndHMnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0lEID0gJ3VuZGVybHlpbmdfdGFibGVfaWQnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0NBUFRJT04gPSAndW5kZXJseWluZ190YWJsZV9jYXB0aW9uJyxcbiAgVVBEQVRFX1RZUEUgPSAndXBkYXRlX3R5cGUnLFxuICBVU0VfR1VFU1QgPSAnOnVzZUd1ZXN0JyxcbiAgVVNFX0lOTElORV9JTUFHRVMgPSAndXNlX2lubGluZV9pbWFnZXMnLFxuICBVU0VSQUdFTlQgPSAndXNlcmFnZW50JyxcbiAgVVNFUk5BTUUgPSAndXNlcm5hbWUnLFxuICBWQUxVRSA9ICd2YWx1ZScsXG4gIFZFUkJPU0VfTU9ERSA9ICd2ZXJib3NlTW9kZScsXG4gIFZJRVdfSUQgPSAndmlld3NfaWQnLFxuICBWSVpfU05BUFNIT1RfSUQgPSAndml6X3NuYXBzaG90X2lkJyxcbiAgVlcgPSAnOnZ3JyxcbiAgVyA9ICd3JyxcbiAgV09SS1NIRUVUX1BPUlRfU0laRSA9ICd3b3Jrc2hlZXRQb3J0U2l6ZScsXG4gIFdBVEVSTUFSSyA9ICd3YXRlcm1hcmsnLFxuICBXQVRFUk1BUktfTUFSR0lOID0gJzp3YXRlcm1hcmtfbWFyZ2luJyxcbiAgV0IgPSAnOndiJyxcbiAgV0hJQ0ggPSAnd2hpY2gnLFxuICBYID0gJ3gnLFxuICBZID0gJ3knLFxuICBaSUQgPSAnemlkJyxcbiAgWk9ORV9JRCA9ICd6b25lX2lkJyxcbiAgS0VZQ0hBSU5fVkVSU0lPTiA9ICdrZXljaGFpbl92ZXJzaW9uJyxcbiAgREFUQVNPVVJDRV9JRCA9ICdkYXRhc291cmNlX2lkJyxcbiAgREFUQVNPVVJDRV9OQU1FID0gJ2RhdGFzb3VyY2VfbmFtZScsXG4gIExFTlNfSUQgPSAnbGVuc19pZCcsXG4gIFdJRFRIID0gJ3dpZHRoJyxcbiAgSEVJR0hUID0gJ2hlaWdodCcsXG5cbiAgLy8gRGVmYXVsdCBMYXlvdXQgcGFyYW1zXG4gIExBWU9VVF9WSUVXUyA9ICd2aWV3cycsXG4gIExBWU9VVF9NRU5VUyA9ICdtZW51cycsXG4gIExBWU9VVF9HRU9NRVRSWSA9ICdnZW9tZXRyeScsXG4gIExBWU9VVF9QQUdFUyA9ICdwYWdlcycsXG4gIExBWU9VVF9DQUNIRVVSTCA9ICdjYWNoZXVybCcsXG4gIExBWU9VVF9TSEVFVCA9ICdzaGVldCcsXG4gIExBWU9VVF9ERVBUSCA9ICdkZXB0aCcsXG59XG5cbi8qKlxuICogcGFyYW1ldGVycyB0aGF0IGFyZSBvbmx5IHJlbGV2YW50IHdoZW4gd29ya2luZyB3aXRoIFRhYmxlYXUgUHVibGljXG4gKiBtYXliZSBub3QgcmVhbGx5IG5lY2Vzc3J5IHRvIHNwbGl0IHRoZW0gb3V0XG4gKi9cbmVudW0gUHVibGljUGFyYW1ldGVyTmFtZXMge1xuICBTSE9XX1ZJWl9IT01FID0gJzpzaG93Vml6SG9tZScsXG4gIC8vIGRpc3BsYXkgdmlldyBjb3VudFxufVxuXG4vKipcbiAqIE1hcCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFzIHVzZWQgaW4gdGhlIHVybCB0byB3aGF0IHdlIGNhbGwgdGhlbSBwdWJsaWNseSBpbiB0aGUgZW1iZWRkaW5nIGxpYnJhcnkuXG4gKiBUaGUgb25seSBwYXJhbWV0ZXJzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSB0aGUgb25lcyB0aGF0IGdldCBzZW50IHRvIHZpenFsXG4gKiAgLSB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJmYWNlIGF0IGV4dGVybmFsLWNvbnRyYWN0OlZpekludGVyZmFjZXM6Vml6U2V0dGluZ3NcbiAqL1xuZXhwb3J0IGVudW0gVml6T3B0aW9uTmFtZXMge1xuICAvLyBwdWJsaWNOYW1lID0gaW50ZXJuYWxTdHJpbmdWYWx1ZVxuICBTaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuU0laRSxcbiAgRW1iZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5FTUJFRCxcbiAgQXBpSW50ZXJuYWxWZXJzaW9uID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0lOVEVSTkFMX1ZFUlNJT04sXG4gIEFwaUV4dGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9FWFRFUk5BTF9WRVJTSU9OLFxuICBTaG93Vml6SG9tZSA9IFB1YmxpY1BhcmFtZXRlck5hbWVzLlNIT1dfVklaX0hPTUUsXG4gIEpzZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBCb290c3RyYXBXaGVuTm90aWZpZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5CT09UU1RSQVBfV0hFTl9OT1RJRklFRCxcbiAgTmF2VHlwZSA9IFZxbFBhcmFtZXRlck5hbWVzLk5BVl9UWVBFLFxuICBOYXZTcmMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfU1JDLFxuICBkZWJ1ZyA9IFZxbFBhcmFtZXRlck5hbWVzLkpTREVCVUcsXG4gIEFwaUlEID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0lELFxuXG4gIGRpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gVnFsUGFyYW1ldGVyTmFtZXMuRElTQUJMRV9VUkxfQUNUSU9OU19QT1BVUFMsXG4gIGhpZGVUYWJzID0gVnFsUGFyYW1ldGVyTmFtZXMuVEFCUyxcbiAgdG9vbGJhciA9IFZxbFBhcmFtZXRlck5hbWVzLlRPT0xCQVIsXG4gIGRldmljZSA9IFZxbFBhcmFtZXRlck5hbWVzLkRFVklDRV9UWVBFLFxuICBpbnN0YW5jZUlkVG9DbG9uZSA9IFZxbFBhcmFtZXRlck5hbWVzLklOU1RBTkNFX0lELFxuICB0b3VjaE9wdGltaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuTU9CSUxFLFxuICBoaWRlRWRpdEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9CVVRUT04sXG4gIGhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OLFxuICBzdXBwcmVzc0RlZmF1bHRFZGl0QmVoYXZpb3IgPSBWcWxQYXJhbWV0ZXJOYW1lcy5TVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IsXG4gIGhpZGVDbG9zZUJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfQ0xPU0VfQlVUVE9OLFxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmltcG9ydCB7IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL0Nyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgaXNDb21tYW5kTWVzc2FnZSxcbiAgaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBpc0hhbmRzaGFrZU1lc3NhZ2UsXG4gIGlzSW5pdE1lc3NhZ2UsXG4gIGlzTWVzc2FnZSxcbiAgaXNOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL01lc3NhZ2VUeXBlQ2hlY2tzJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlSGFuZGxlcixcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIsXG4gIEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyLFxuICBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlTGlzdGVuZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IE1lc3NlbmdlciB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vKipcbiAqIFRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGlzIHRoZSBwcmltYXJ5IGV4cG9ydCBmcm9tIHRoZSBhcGktbWVzc2FnaW5nIG1vZHVsZS4gQW4gaW5zdGFuY2Ugb2ZcbiAqIHRoaXMgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZCBvbiBib3RoIHNpZGVzIG9mIGEgZnJhbWUgYm91bmRhcnkgdG8gZmFjaWxpdGF0ZSBjb21tdW5pY2F0aW9uXG4gKiBpbiBib3RoIGRpcmVjdGlvbnMgYmV0d2VlbiB0aGUgZnJhbWVzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYm90aCB0aGUgZGlzcGF0Y2hlciBhbmQgdGhlIGxpc3RlbmVyXG4gKiBwb3J0aW9ucywgYnV0IGRvZXNuJ3QgcmVxdWlyZSBjYWxsZXJzIHRvIGNhcmUgYWJvdXQgYm90aC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVNZXNzZW5nZXIgaW1wbGVtZW50cyBNZXNzZW5nZXIge1xuICBwcml2YXRlIHVucmVnaXN0ZXJGdW5jdGlvbj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZE1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lTWVzc2VuZ2VyLiBJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgYXMgYSBNZXNzYWdlTGlzdGVuZXIsXG4gICAqIGJlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZyBhbmQgcmVnaXN0ZXIgbWVzc2FnZSBoYW5kbGVycy5cbiAgICogQHBhcmFtIHRoaXNXaW5kb3cgVGhlIHdpbmRvdyBvYmplY3Qgd2hpY2ggdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgbGl2ZXMuIEFuIG9uTWVzc2FnZSBsaXN0ZW5lciB3aWxsIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3ddIE9wdGlvbmFsIG90aGVyV2luZG93IHdoaWNoIG1lc3NhZ2VzIHdpbGwgYmUgcG9zdGVkIHRvLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiBkZWZpbmVkLCBpbmNvbWluZyBtZXNzYWdlcyBtdXN0IG9yaWdpbmF0ZSBmcm9tIG90aGVyV2luZG93IHRvIGJlIHBhc3NlZCBvblxuICAgKiBAcGFyYW0gW290aGVyV2luZG93T3JpZ2luXSBUaGUgdGFyZ2V0IG9yaWdpbiB3aGljaCBvdGhlcldpbmRvdyBtdXN0IGhhdmUgaW4gb3JkZXIgdG8gcmVjZWl2ZSBkaXNwYXRjaGVkIG1lc3NhZ2VzLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgc2VudCBhcyB0aGUgdGFyZ2V0T3JpZ2luIG9mIGEgcG9zdE1lc3NhZ2VcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvcG9zdE1lc3NhZ2UpXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSB0aGlzV2luZG93OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3c/OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3dPcmlnaW4/OiBzdHJpbmcpIHtcbiAgICAvLyBNYWtlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZ1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZUxpc3RlbmVyIEltcGxlbWVudGF0aW9uXG5cbiAgcHVibGljIHN0YXJ0TGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgYXJlIGxpc3RlbmluZywgaWYgbm90LCBob29rIHVwIGEgbWVzc2FnZSBsaXN0ZW5lclxuICAgIGlmICghdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IGJvdW5kSGFuZGxlciA9IHRoaXMub25NZXNzYWdlUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudGhpc1dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gKCkgPT4gdGhpcy50aGlzV2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdG9wTGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIFN0b3AgbGlzdGVuaW5nIGlmIHdlIGhhdmUgc3RhcnRlZCBsaXN0ZW5pbmdcbiAgICBpZiAodGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKCk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0SW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0SGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvLy8vLyBNZXNzYWdlRGlzcGF0Y2hlciBJbXBsZW1lbnRhdGlvblxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXBpVmVyc2lvbiBhcGktaW50ZXJuYWwtY29udHJhY3QtanMgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIGNyb3NzRnJhbWVWZXJzaW9uIGNyb3NzZnJhbWUgbWVzc2FnaW5nIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBvcHRpb25zIGFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXQgaW5pdGlhbGl6YXRpb24gKGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mXG4gICAqICAgICAgICAgICAgICAgIGV4dGVybmFsIGJlaW5nIHVzZWQgZm9yIGV4YW1wbGUpXG4gICAqL1xuICBwdWJsaWMgcHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShcbiAgICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gICk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBjcm9zc0ZyYW1lVmVyc2lvbixcbiAgICAgIGFwaVZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZE1lc3NhZ2UodmVyYklkOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgICAgdmVyYklkOiB2ZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShjb21tYW5kR3VpZDogc3RyaW5nLCBkYXRhOiBNb2RlbCB8IHVuZGVmaW5lZCwgZXJyb3I6IE1vZGVsIHwgdW5kZWZpbmVkKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICAgIGNvbW1hbmRHdWlkOiBjb21tYW5kR3VpZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgLy8gc3RyaW5naWZ5IGVycm9yIG9iamVjdCB0byByZW1vdmUgdW5zZXJpYWxpemFibGUgZmllbGRzIGxpa2UgZnVuY3Rpb25zIGFuZCBwcmV2ZW50IHNlcmlhbGl6YXRpb24gZXJyb3JzXG4gICAgICBtZXNzYWdlLmVycm9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVOb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZCwgZGF0YTogTW9kZWwpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLFxuICAgICAgbm90aWZpY2F0aW9uSWQ6IG5vdGlmaWNhdGlvbklkLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUFja01lc3NhZ2UoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkFjayxcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBwZW5kaW5nIG1lc3NhZ2UgZm9yIHNlbmRpbmcgYW5kIHJldHVybnMgdGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICpcbiAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBiZSBzZW50IHRvIHRoaXMub3RoZXJXaW5kb3dcbiAgICogQHJldHVybnMgVGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgcHJlcGFyZU1lc3NhZ2UobXNnOiBNZXNzYWdlKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBpZiAoIXRoaXMub3RoZXJXaW5kb3cgfHwgIXRoaXMub3RoZXJXaW5kb3dPcmlnaW4pIHtcbiAgICAgIHRocm93ICdPdGhlciB3aW5kb3cgbm90IGluaXRpYWxpemVkLCBjYW5ub3QgZGlzcGF0Y2ggbWVzc2FnZXMnO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXBhcmVkTWVzc2FnZSA9IG5ldyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlKG1zZywgdGhpcy5vdGhlcldpbmRvdywgdGhpcy5vdGhlcldpbmRvd09yaWdpbik7XG4gICAgcmV0dXJuIHByZXBhcmVkTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuIERvZXMgc29tZSB2YWxpZGF0aW9uIG9mIHRoZSBtZXNzYWdlLCBhbmQgdGhlblxuICAgKiBjYWxscyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGhhbmRsZXIgaWYgb25lIGlzIGRlZmluZWRcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBpbmNvbWluZyBNZXNzYWdlRXZlbnRcbiAgICovXG4gIHByaXZhdGUgb25NZXNzYWdlUmVjZWl2ZWQoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gb3RoZXJXaW5kb3cgZGVmaW5lZCwgbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGlzIGNvbWluZyBmcm9tIHRoZXJlXG4gICAgaWYgKHRoaXMub3RoZXJXaW5kb3cgJiYgZXZlbnQuc291cmNlICE9PSB0aGlzLm90aGVyV2luZG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG8gc29tZSB2YWxpZGF0aW9uIG9uIGV2ZW50LmRhdGEgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhIHJlYWwgbWVzc2FnZVxuICAgIGlmICghZXZlbnQuZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhO1xuICAgIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIG1lc3NhZ2UgdHlwZSwgdmFsaWRhdGUgdGhlIG1lc3NhZ2UsIGFuZCBjYWxsIGFuIGFwcHJvcHJpYXRlIGhhbmRlciBpZiBvbmUgZXhpc3RzXG4gICAgc3dpdGNoIChtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZToge1xuICAgICAgICBpZiAoIWlzSW5pdE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZToge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmQ6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb246IHtcbiAgICAgICAgaWYgKCFpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5IYW5kc2hha2U6IHtcbiAgICAgICAgaWYgKCFpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIEp1c3QgaWdub3JlIHRoaXMgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHR5cGVcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3cob3RoZXJXaW5kb3c6IFdpbmRvdyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3cgPSBvdGhlcldpbmRvdztcbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvd09yaWdpbihvcmlnaW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4gPSBvcmlnaW47XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJlcGFyZWRNZXNzYWdlIGludGVyZmFjZSB1c2VkIHRvIHBvc3QgbWVzc2FnZXMgYmV0d2VlblxuICogdHdvIGZyYW1lcyB1c2luZyB3aW5kb3cucG9zdE1lc3NhZ2VcbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgaW1wbGVtZW50cyBQcmVwYXJlZE1lc3NhZ2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLlxuICAgKiBAcGFyYW0gX21lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudFxuICAgKiBAcGFyYW0gX3RhcmdldCBUaGUgdGFyZ2V0IHdpbmRvdyB3aGVyZSB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnRcbiAgICogQHBhcmFtIF9vcmlnaW4gVGhlIHRhcmdldE9yaWdpbiB3aGVyZSB0aGlzIG1lc3NhZ2UgY2FuIGJlIHJlY2VpdmVkXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWVzc2FnZTogTWVzc2FnZSwgcHJpdmF0ZSBfdGFyZ2V0OiBXaW5kb3csIHByaXZhdGUgX29yaWdpbjogc3RyaW5nKSB7fVxuXG4gIHB1YmxpYyBnZXQgbWVzc2FnZUd1aWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZS5tc2dHdWlkO1xuICB9XG5cbiAgcHVibGljIHNlbmQoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICB0aGlzLl90YXJnZXQucG9zdE1lc3NhZ2UodGhpcy5fbWVzc2FnZSwgdGhpcy5fb3JpZ2luKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlL1ZlcnNpb25OdW1iZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcblxuY29uc3QgZXhwZWN0ZWRFbXB0eU5vdGlmaWNhdGlvbnMgPSBuZXcgU2V0KFtcbiAgTm90aWZpY2F0aW9uSWQuRWRpdEJ1dHRvbkNsaWNrZWQsXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va1B1Ymxpc2hlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tSZWFkeVRvQ2xvc2UsXG4gIE5vdGlmaWNhdGlvbklkLlJlYWR5VG9SZWNlaXZlQXV0aFRva2VuLFxuXSk7XG5cbi8qIHRzbGludDpkaXNhYmxlIG5vLWFueSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWVzc2FnZShkYXRhOiBNZXNzYWdlIHwgYW55KTogZGF0YSBpcyBNZXNzYWdlIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGRhdGEgYXMgTWVzc2FnZTtcbiAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLm1zZ0d1aWQgfHwgIW1lc3NhZ2UubXNnVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQobWVzc2FnZS5tc2dHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbWVzc2FnZS5tc2dUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2VUeXBlczogQXJyYXk8c3RyaW5nPiA9IFtcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLFxuICAgIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICBNZXNzYWdlVHlwZS5IYW5kc2hha2UsXG4gIF07XG5cbiAgaWYgKG1lc3NhZ2VUeXBlcy5pbmRleE9mKG1lc3NhZ2UubXNnVHlwZSkgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnNpb24odmVyc2lvbk51bWJlcjogVmVyc2lvbk51bWJlciB8IGFueSk6IHZlcnNpb25OdW1iZXIgaXMgVmVyc2lvbk51bWJlciB7XG4gIGlmICghdmVyc2lvbk51bWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHYgPSB2ZXJzaW9uTnVtYmVyIGFzIFZlcnNpb25OdW1iZXI7XG5cbiAgaWYgKHR5cGVvZiB2ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygdi5maXggIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1pbm9yICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5tYWpvciAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5pdE1lc3NhZ2UobWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEluaXRpYWxpemVNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpbml0TWVzc2FnZSA9IG1lc3NhZ2UgYXMgSW5pdGlhbGl6ZU1lc3NhZ2U7XG4gIGlmIChpbml0TWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5hcGlWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3JNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlO1xuICBpZiAoY3JNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQoY3JNZXNzYWdlLmNvbW1hbmRHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY3JNZXNzYWdlLmRhdGEgJiYgIWNyTWVzc2FnZS5lcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZE1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmRNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kTWVzc2FnZTtcbiAgaWYgKGNvbW1hbmRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS52ZXJiSWQgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnZlcmJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBOb3RpZmljYXRpb25NZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0gbWVzc2FnZSBhcyBOb3RpZmljYXRpb25NZXNzYWdlO1xuICBpZiAobm90aWZpY2F0aW9uTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2UuZGF0YSAmJiAhZXhwZWN0ZWRFbXB0eU5vdGlmaWNhdGlvbnMuaGFzKG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkIHx8IHR5cGVvZiBub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEhhbmRzaGFrZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRzaGFrZU1lc3NhZ2UgPSBtZXNzYWdlIGFzIEhhbmRzaGFrZU1lc3NhZ2U7XG4gIGlmIChoYW5kc2hha2VNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkhhbmRzaGFrZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBOb3RpZmljYXRpb25JZCwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuXG4vKipcbiAqIEVudW0gZGVmaW5pbmcgdGhlIDQgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzIHdlIGhhdmUgZGVmaW5lZFxuICovXG5leHBvcnQgZW51bSBNZXNzYWdlVHlwZSB7XG4gIEluaXRpYWxpemUgPSAnaW5pdGlhbGl6ZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24nLFxuICBDb21tYW5kID0gJ2NvbW1hbmQnLFxuICBDb21tYW5kUmVzcG9uc2UgPSAnY29tbWFuZC1yZXNwb25zZScsXG4gIEhhbmRzaGFrZSA9ICd2LWhhbmRzaGFrZScsXG4gIEFjayA9ICd2LWFjaycsXG59XG5cbi8qKlxuICogVGhlIE1lc3NhZ2UgaW50ZXJmYWNlIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIHRoZSBvdGhlclxuICogbWVzc2FnZSB0eXBlIGludGVyZmFjZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlXG4gICAqL1xuICBtc2dHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnVHlwZTogTWVzc2FnZVR5cGU7XG59XG5cbi8qKlxuICogVGhlIGluaXRpYWxpemUgbWVzc2FnZSBpcyB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHNlbnRcbiAqIGZyb20gdGhlIGphdmFzY3JpcHQgdG8gc2V0IHVwIGNvbW11bmljYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6ZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcGkgd2hpY2ggdGhlIHNlbmRlciB3YW50cyB0byB1c2VcbiAgICovXG4gIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoaXMgbWVzc2FnaW5nIGNvbnRyYWN0IHRvIGJlIHVzZWQuIEZvciBub3csIHRoZXJlXG4gICAqIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHZlcnNpb24gYnV0IHNlbmRpbmcgdGhpcyBhbG9uZyBzaG91bGQgaGVscFxuICAgKiBpZiB3ZSBuZWVkIHRvIGFkZCBhIG5ldyB2ZXJzaW9uIGluIGEgZnV0dXJlIHJlbGVhc2VcbiAgICovXG4gIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IHRoZSB0aW1lIG9mIGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gYSBub3RpZmljYXRpb24gb2NjdXJzIGZyb20gdGhlIHByZXNsYXllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBmb3IgdGhpcyB0eXBlIG9mIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgbm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB3aGljaCBjYW1lIGFsb25nIHdpdGggdGhlIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgZGF0YTogTW9kZWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBjYWxsaW5nIGFuIGludGVybmFsIGNvbnRyYWN0IGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBjb21tYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZFxuICAgKi9cbiAgdmVyYklkOiBWZXJiSWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZFxuICAgKi9cbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7XG59XG5cbi8qKlxuICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBDb21tYW5kTWVzc2FnZSB3aXRoIHRoZVxuICogcmVzdWx0IG9mIHRoYXQgY29tbWFuZHMgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEd1aWQgb2YgdGhlIENvbW1hbmRNZXNzYWdlIHdoaWNoIHRoaXMgaXMgaW4gcmVzcG9uc2UgdG9cbiAgICovXG4gIGNvbW1hbmRHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZXR1cm5lZCBmcm9tIHRoZSBjb21tYW5kLCB0aGlzIHdpbGwgYmUgZGVmaW5lZFxuICAgKiBhbmQgY29udGFpbiB0aGUgZXJyb3JcbiAgICovXG4gIGVycm9yPzogTW9kZWw7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBjb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGNvbW1hbmQgcmVzdWx0XG4gICAqL1xuICBkYXRhPzogTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZHNoYWtlTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogSW50ZXJuYWwgQVBJIGNvbnRyYWN0IHZlcnNpb25cbiAgICovXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgaW50ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyYjogdmVyYiBhcyBWZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIGFzIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhlIG9ubHlcbiAqIG1vZGUgaXQgc3VwcG9ydHMgaXMgZXh0ZXJuYWwncyB2ZXJzaW9uIDw9IHBsYXRmb3JtJ3MgdmVyc2lvbi4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIHVwZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIGRvd25ncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LiBTaW1pbGFybHkgZm9yIG5vdGlmaWNhdGlvbnMsIGl0IGNhblxuICogZG93bmdyYWRlIHRob3NlIG9uIHRoZSB3YXkgZnJvbSBwbGF0Zm9ybSB0byBleHRlcm5hbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1WZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApOiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIge1xuICAgIHJldHVybiBuZXcgdGhpcyhcbiAgICAgIGV4dGVybmFsVmVyc2lvbi5tYWpvcixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbi5tYWpvcixcbiAgICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybU1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2V4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbiA+IHRoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IGJldHdlZW4gZXh0ZXJuYWwgdmVyc2lvbiAke3RoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9ufSBhbmQgJHt0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgdXBncmFkZWQgPSB7IHZlcmI6IHZlcmIsIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQudmVyYiwgdXBncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIERvd25ncmFkZSB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gZXhlY3V0ZVJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlELCBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyB9IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGxocy5taW5vciA8IHJocy5taW5vcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGhzLm1ham9yID09PSByaHMubWFqb3IgJiYgbGhzLm1pbm9yID09PSByaHMubWlub3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHtcbiAgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTtcbn1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IE5vdGlmaWNhdGlvbk1pbm9yRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0ge1xuICAxOiB7XG4gICAgOTogW10sXG4gICAgMTA6IFtEb3duZ3JhZGVGbGlwYm9hcmRab25lSURdLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMsXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlVXBncmFkZXMsXG4gICAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24gPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBjb25zdCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpKTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGV4dGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoaXMgY29udmVydGVyXG4gKiBzdXBwb3J0cyBleHRlcm5hbCdzIHZlcnNpb24obWlub3IpID49IHBsYXRmb3JtJ3MgdmVyc2lvbihtaW5vcikuIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byBkb3duZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIHVwZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gZG93bmdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZCBpcyBleGVjdXRlZFxuICAgKiBAcGFyYW0gX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHVwZ3JhZGUgbm90ZmljYXRpb25zIHRvIHBlcmZvcm0gb24gZXZlbnRzXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3IgPiB0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxWZXJzaW9uLm1ham9yfVxuICAgICAgYW5kICR7dGhpcy5fcGxhdGZvcm1WZXJzaW9uLm1ham9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSBkb3duZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkLnZlcmIsIGRvd25ncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgdXBncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVOb3RpZmljYXRpb24gb2YgdGhpcy5fdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlTm90aWZpY2F0aW9uKHVwZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgR2V0TWF4aW11bU1pbm9ySW5kZXgsIE1ham9yTWlub3JUcmFuc2xhdG9ycywgVmVyc2lvbkVxdWFsVG8gfSBmcm9tICcuLi9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNFeHRlcm5hbCBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQge1xuICBEb3duZ3JhZGVMb2dpY2FsVGFibGVEYXRhQXN5bmMsXG4gIERvd25ncmFkZVVuZGVybHlpbmdUYWJsZURhdGFBc3luYyxcbiAgVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zLFxuICBVcGdyYWRlRGF0YVRhYmxlVHlwZXMsXG59IGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gICAgMTM6IFtEb3duZ3JhZGVVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMsIERvd25ncmFkZUxvZ2ljYWxUYWJsZURhdGFBc3luY10sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW1VwZ3JhZGVEYXRhVGFibGVUeXBlc10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICAgIDI5OiBbVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zXSwgLy8gMjAyMS4xIHdhcyByZWxlYXNlZCB3aXRoIDEuMjkuIFVwZ3JhZGUgZnJvbSAxLjI5IGluIHRoZSBbMV1bMjldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCJpbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwsXG4gIERhdGFIZWFkZXIsXG4gIERhdGFUYWJsZSxcbiAgRGF0YVR5cGVDb252ZXJ0ZXIsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEludGVybmFsVGFibGVhdUVycm9yLFxuICBOb3RpZmljYXRpb24sXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbn0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgbmV3ZXIgdmVyc2lvbiBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb25cbiAqICBUaGUgdmVyYiBhbmQgcGFyYW1ldGVycyBwcm92aWRlIGEgY29udGV4dCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlUmV0dXJuID0gKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiBFeGVjdXRlUmVzcG9uc2U7XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byB1cGdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgVXBncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyAxLjIgLT4gMS4wIFRyYW5zbGF0aW9uc1xuLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBpbXBvcnQgZnJvbSB0aGUgVjEgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4vLyBpbXBvcnQgKiBhcyBWMSBmcm9tICdAdGFibGVhdS1hcGktaW50ZXJuYWwtY29udHJhY3QtanNfdjEnO1xuXG4vKipcbiAqIFByaW9yIHRvIDIwMTkuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuOSksIERhdGFWYWx1ZS52YWx1ZSB3ZXJlIGFsbCBzdHJpbmdzLlxuICogR28gdGhyb3VnaCBhbGwgRGF0YVZhbHVlIG9iamVjdHMuIElmIHdlIGhhdmUgYSBzdHJpbmcsIGJ1dCB0aGUgdHlwZSBzaG91bGQgbm90IGJlIGEgc3RyaW5nLFxuICogY29udmVydCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLiBUaGUgdHlwZSBvZiBEYXRhVmFsdWUudmFsdWUgaXMgJ2FueScgaW4gdGhlIGNvbnRyYWN0LCBzb1xuICogdGhpcyBjaGFuZ2UgZG9lc24ndCBuZWVkIGFueSB1cGRhdGVzIHRvIGNsYXNzZXMgb3IgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVcGdyYWRlRGF0YVRhYmxlVHlwZXMoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoIWV4ZWN1dGVSZXNwb25zZSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCBvbGRVbmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAob2xkVW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2xkVW5kZXJseWluZ0RhdGFUYWJsZS5pc1N1bW1hcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnZlcnREYXRhVmFsdWVzKG9sZFVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSk7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IG9sZFNlbGVjdGVkTWFya3NUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICBpZiAob2xkU2VsZWN0ZWRNYXJrc1RhYmxlLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhKSkge1xuICAgIG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhLmZvckVhY2goKG1hcmtzVGFibGUpID0+IHtcbiAgICAgIGNvbnZlcnREYXRhVmFsdWVzKG1hcmtzVGFibGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vKipcbiAqIFByaW9yIHRvIDIwMjAuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuMTMgYW5kIG9sZGVyKSwgd29ya3NoZWV0LmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXRVbmRlcmx5aW5nRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlVW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gIH07XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMC4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4xMyBhbmQgb2xkZXIpLCBkYXRhc291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXREYXRhU291cmNlRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlTG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhVmFsdWVzKHRhYmxlOiBEYXRhVGFibGUpOiB2b2lkIHtcbiAgLy8gZGF0YVRhYmxlIGlzIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IG9mIGRhdGEuIEZpcnN0IGluZGV4IGlzIHRoZSByb3csIHNlY29uZCBpcyB0aGUgY29sdW1uLlxuICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCB8fCB0YWJsZS5kYXRhVGFibGUgPT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheSh0YWJsZS5kYXRhVGFibGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFibGUuZGF0YVRhYmxlLmZvckVhY2goKHJvdykgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChkYXRhVmFsdWUsIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFWYWx1ZS52YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBkYXRhVmFsdWUudmFsdWUgPSBEYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWUsIHRhYmxlLmhlYWRlcnNbY29sdW1uSW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIFRvRG86IFRGUzEwNjkwMjcgUmVmYWN0b3IgaW5wdXQgdmVyYnMgJiBwYXJhbWV0ZXJzIGluIGFwaS1pbnRlcm5hbC1jb250cmFjdCBVcGdyYWRlL0Rvd25ncmFkZSBmcmFtZXdvcmtcbmZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiB2b2lkIHtcbiAgaWYgKHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdICE9PSBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2dpY2FsIHRhYmxlIGlkIHBhc3NlZCB0byAke3ZlcmJ9LmApIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMS4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4yOSBhbmQgYmVsb3cpLCBnZXRTdW1tYXJ5RGF0YUFzeW5jIGRpZCBub3Qgc3VwcG9ydCBtYXhSb3dzLFxuICogYW5kIGFueSBnZXQuLi5EYXRhQXN5bmMgZGlkIG5vdCBzdXBwb3J0IGNvbHVtbnNUb0luY2x1ZGVCeUlkLlxuICogVHJpbSByZXN1bHQgdG8gbWF4Um93cyBpZiBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgZ2V0U3VtbWFyeURhdGFBc3luY1xuICogVHJpbSBjb2x1bW5zIHRvIGNvbHVtbnNUb0luY2x1ZGUgaWYgaW5jbHVkZWQgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBnZXQuLi5EYXRhQXN5bmNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVwZ3JhZGVEYXRhVGFibGVSb3dzQW5kQ29sdW1ucyhcbiAgZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsXG4gIHZlcmI6IFZlcmJJZCxcbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMsXG4pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoaXNHZXRTdW1tYXJ5RGF0YVZlcmIodmVyYikgJiYgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSkge1xuICAgIGV4ZWN1dGVSZXNwb25zZSA9IGFkanVzdERhdGFSb3dMZW5ndGgoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLk1heFJvd3NdIGFzIG51bWJlcik7XG4gIH1cblxuICBpZiAoaXNHZXRUYWJsZURhdGFWZXJiKHZlcmIpICYmIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdKSB7XG4gICAgZXhlY3V0ZVJlc3BvbnNlID0gYWRqdXN0RGF0YUNvbHVtbnMoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSBhcyBzdHJpbmdbXSk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc0dldFN1bW1hcnlEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGE7XG59XG5cbmZ1bmN0aW9uIGlzR2V0VGFibGVEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhIHx8XG4gICAgdmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEgfHxcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU291cmNlRGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YVxuICApO1xufVxuXG5mdW5jdGlvbiBhZGp1c3REYXRhUm93TGVuZ3RoKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBtYXhSb3dzOiBudW1iZXIpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBpZiAobWF4Um93cyA+IDAgJiYgbWF4Um93cyA8IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUubGVuZ3RoKSB7XG4gICAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZS5sZW5ndGggPSBtYXhSb3dzO1xuICB9XG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGFkanVzdERhdGFDb2x1bW5zKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBjb2x1bW5zVG9JbmNsdWRlOiBzdHJpbmdbXSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIGlmIChjb2x1bW5zVG9JbmNsdWRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICAvLyB2ZXJpZnkgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgVW5kZXJseWluZ0RhdGFUYWJsZVxuICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycykpIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgLy8gMS4gZmlsdGVyIHRoZSBoZWFkZXJzIHRvIG9ubHkgY29sdW1uc1RvSW5jbHVkZVxuICAvLyAyLiB1c2UgdGhlIG5ldyBoZWFkZXJzIHRvIGZpbHRlciBhbGwgcm93c1xuICAvLyAzLiB1cGRhdGUgdGhlIGluZGljZXMgaW4gb3VyIG5ldyBoZWFkZXJzXG4gIGNvbnN0IG5ld0hlYWRlcnM6IERhdGFIZWFkZXJbXSA9IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5oZWFkZXJzLmZpbHRlcigoaGVhZGVyLCBpbmRleCkgPT5cbiAgICBjb2x1bW5zVG9JbmNsdWRlLmZpbmQoKG5hbWUpID0+IG5hbWUgPT09IGhlYWRlci5maWVsZE5hbWUpLFxuICApO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlW2luZGV4XSA9IHJvdy5maWx0ZXIoXG4gICAgICAodmFsdWUsIHZhbHVlSW5kZXgpID0+IG5ld0hlYWRlcnMuZmluZEluZGV4KChoZWFkZXIpID0+IGhlYWRlci5pbmRleCA9PT0gdmFsdWVJbmRleCkgIT09IC0xLFxuICAgICk7XG4gIH0pO1xuICBsZXQgbmV3SW5kZXggPSAwO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycyA9IG5ld0hlYWRlcnMubWFwKChoZWFkZXIpID0+IHtcbiAgICBoZWFkZXIuaW5kZXggPSBuZXdJbmRleCsrO1xuICAgIHJldHVybiBoZWFkZXI7XG4gIH0pO1xuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uTW9kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc01vZGUsIEV4dGVybmFsRXh0ZW5zaW9uc01vZGU+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZyxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNvbHVtblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENvbHVtblR5cGUsIEV4dGVybmFsQ29sdW1uVHlwZT4oe1xuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuQ29udGludW91c106IEV4dGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuRGlzY3JldGVdOiBFeHRlcm5hbENvbHVtblR5cGUuRGlzY3JldGUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3Npc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDFdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3MsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZFJvbGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZFJvbGVUeXBlLCBFeHRlcm5hbEZpZWxkUm9sZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb24sXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmUsXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxTaGVldFR5cGUsIEV4dGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0ludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEV4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFUeXBlLCBFeHRlcm5hbERhdGFUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YVR5cGUuQm9vbF06IEV4dGVybmFsRGF0YVR5cGUuQm9vbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVUaW1lXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlVGltZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5GbG9hdF06IEV4dGVybmFsRGF0YVR5cGUuRmxvYXQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuSW50XTogRXh0ZXJuYWxEYXRhVHlwZS5JbnQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3RyaW5nXTogRXh0ZXJuYWxEYXRhVHlwZS5TdHJpbmcsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYWxsb3dhYmxlVmFsdWVzID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUsIEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlPih7XG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLkFsbF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkFsbCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuTGlzdF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QsXG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLlJhbmdlXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVN0ZXBQZXJpb2QgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGVTdGVwUGVyaW9kLCBFeHRlcm5hbERhdGVQZXJpb2Q+KHtcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5ZZWFyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5ZZWFycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5RdWFydGVyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5RdWFydGVycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Nb250aHNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTW9udGhzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLldlZWtzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLldlZWtzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkRheXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuRGF5cyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Ib3Vyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Ib3VycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5NaW51dGVzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLk1pbnV0ZXMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuU2Vjb25kc106IEV4dGVybmFsRGF0ZVBlcmlvZC5TZWNvbmRzLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhdGVSYW5nZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGVSYW5nZVR5cGUsIEV4dGVybmFsRGF0ZVJhbmdlVHlwZT4oe1xuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdE5dOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdE4sXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZV06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXJyb3JDb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFcnJvckNvZGVzLCBFeHRlcm5hbEVycm9yQ29kZXM+KFxuICAgIHtcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuSU5JVElBTElaQVRJT05fRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuSU5URVJOQUxfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuTUlTU0lOR19FTlVNX01BUFBJTkddOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuTUlTU0lOR19QQVJBTUVURVJdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuUEVSTUlTU0lPTl9ERU5JRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlVOS05PV05fVkVSQl9JRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5WRVJTSU9OX05PVF9DT05GSUdVUkVEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkFQSU5vdEluaXRpYWxpemVkLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5WSVNJQklMSVRZX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLlZpc2liaWxpdHlFcnJvcixcbiAgICB9LFxuICAgIEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICApO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmlsdGVyVHlwZSwgRXh0ZXJuYWxGaWx0ZXJUeXBlPih7XG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5IaWVyYXJjaGljYWwsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgY2xhc3NOYW1lS2V5ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxDbGFzc05hbWVLZXksIEV4dGVybmFsQ2xhc3NOYW1lS2V5Pih7XG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LkRhc2hib2FyZFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuVG9vbHRpcCxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0XTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICAgIC8vIFRlbXBvcmFyeSB1bnRpbCB3ZSBmaXggMTMxNzI2NiAtIFBsYXRmb3JtIGhhc24ndCBiZWVuIHVwZGF0ZWQgY3VycmVudGx5IGJlY2F1c2UgbmVhciBicmFuY2ggaXMgY2xvc2VkXG4gICAgWydkYXNoYm9hcmQtdGl0bGUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGUsXG4gICAgWydzdG9yeS10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlLFxuICAgIFsndG9vbHRpcCddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFsnd29ya3NoZWV0J106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldCxcbiAgICBbJ3dvcmtzaGVldC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBoaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlID0gbmV3IEVudW1Db252ZXJ0ZXI8XG4gICAgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICAgIEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZVxuICA+KHtcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLk5vbmVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Tb21lU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuVW5rbm93blNlbGVjdGVkLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGFubm90YXRpb25UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxBbm5vdGF0aW9uVHlwZSwgRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZT4oe1xuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLkFyZWFdOiBFeHRlcm5hbEFubm90YXRpb25UeXBlLkFyZWEsXG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuTWFya106IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuTWFyayxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludF06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuUG9pbnQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgbWFya1R5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbE1hcmtUeXBlLCBFeHRlcm5hbE1hcmtUeXBlPih7XG4gICAgW0ludGVybmFsTWFya1R5cGUuQXJlYV06IEV4dGVybmFsTWFya1R5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5CYXJdOiBFeHRlcm5hbE1hcmtUeXBlLkJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5DaXJjbGVdOiBFeHRlcm5hbE1hcmtUeXBlLkNpcmNsZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5HYW50dEJhcl06IEV4dGVybmFsTWFya1R5cGUuR2FudHRCYXIsXG4gICAgW0ludGVybmFsTWFya1R5cGUuSGVhdG1hcF06IEV4dGVybmFsTWFya1R5cGUuSGVhdG1hcCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5MaW5lXTogRXh0ZXJuYWxNYXJrVHlwZS5MaW5lLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLk1hcF06IEV4dGVybmFsTWFya1R5cGUuTWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBpZV06IEV4dGVybmFsTWFya1R5cGUuUGllLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBvbHlnb25dOiBFeHRlcm5hbE1hcmtUeXBlLlBvbHlnb24sXG4gICAgW0ludGVybmFsTWFya1R5cGUuU2hhcGVdOiBFeHRlcm5hbE1hcmtUeXBlLlNoYXBlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlNxdWFyZV06IEV4dGVybmFsTWFya1R5cGUuU3F1YXJlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlRleHRdOiBFeHRlcm5hbE1hcmtUeXBlLlRleHQsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVml6RXh0ZW5zaW9uXTogRXh0ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb24sXG4gIH0pO1xufVxuLyogdHNsaW50OmVuYWJsZTp0eXBlZGVmICovXG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQ2xhc3MgZGVzaWduZWQgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgaGFuZGxlcnMgZnJvbSBhIHVzZXIuIE9ubHkgdGhvc2UgZXZlbnRzXG4gKiB3aGljaCBhcmUgYWRkZWQgdmlhIEFkZE5ld0V2ZW50VHlwZSB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGlzIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LkV2ZW50TGlzdGVuZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBfZXZlbnRMaXN0ZW5lck1hbmFnZXJzOiB7IFt0YWJsZWF1RXZlbnRUeXBlOiBzdHJpbmddOiBTaW5nbGVFdmVudE1hbmFnZXIgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzID0ge307XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IGFkZCBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCByZW1vdmUgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZE5ld0V2ZW50VHlwZShldmVudE1hbmFnZXI6IFNpbmdsZUV2ZW50TWFuYWdlcik6IHZvaWQge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudE1hbmFnZXIuZXZlbnRUeXBlXSA9IGV2ZW50TWFuYWdlcjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbHVtblR5cGUsIERhdGFUeXBlLCBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRmllbGRSb2xlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ltcGwvRmllbGRJbXBsJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkIGltcGxlbWVudHMgQ29udHJhY3QuRmllbGQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbXBsOiBGaWVsZEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmFnZ3JlZ2F0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9sZSgpOiBGaWVsZFJvbGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLnJvbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtblR5cGUoKTogQ29sdW1uVHlwZSB7XG4gICAgdGhyb3cgRXJyb3JIZWxwZXJzLmFwaU5vdEltcGxlbWVudGVkKCdGaWVsZC5jb2x1bW5UeXBlJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDdXN0b21WaWV3TW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMsIFZpelNlcnZpY2UgfSBmcm9tICcuLi8uLi9BcGlTaGFyZWQnO1xuZXhwb3J0IGNsYXNzIEN1c3RvbVZpZXdJbXBsIHtcbiAgcHJpdmF0ZSBfbHVpZDogc3RyaW5nO1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NoYXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNEZWZhdWx0OiBib29sZWFuO1xuICBwcml2YXRlIF9vd25lck5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjdXN0b21WaWV3TW9kZWw6IEN1c3RvbVZpZXdNb2RlbCwgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5fbHVpZCA9IGN1c3RvbVZpZXdNb2RlbC5sdWlkO1xuICAgIHRoaXMuX25hbWUgPSBjdXN0b21WaWV3TW9kZWwubmFtZTtcbiAgICB0aGlzLl9zaGFyZWQgPSBjdXN0b21WaWV3TW9kZWwuc2hhcmVkO1xuICAgIHRoaXMuX2lzRGVmYXVsdCA9IGN1c3RvbVZpZXdNb2RlbC5pc0RlZmF1bHQ7XG4gICAgdGhpcy5fb3duZXJOYW1lID0gY3VzdG9tVmlld01vZGVsLm93bmVyLnVzZXJGcmllbmRseU5hbWU7XG4gICAgdGhpcy5fdXJsID0gY3VzdG9tVmlld01vZGVsLnVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbHVpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbHVpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hhcmVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoYXJlZChzaGFyZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaGFyZWQgPSBzaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIHNldCBpc0RlZmF1bHQoaXNEZWZhdWx0OiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gaXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIGdldCBvd25lck5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX293bmVyTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCkge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpelNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXopO1xuICAgIHJldHVybiBzZXJ2aWNlLnNhdmVBc3luYyh0aGlzKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERhc2hib2FyZExheW91dENoYW5nZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyxcbiAgRXJyb3JDb2RlcyxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSwgRGFzaGJvYXJkWm9uZSwgU2hlZXRQYXRoLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vUG9pbnQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHJpdmF0ZSBfd29ya3NoZWV0c0ltcGw6IEFycmF5PFdvcmtzaGVldEltcGw+O1xuICBwcml2YXRlIF9vYmplY3RzOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPjtcbiAgcHJpdmF0ZSB6b25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgX3NoZWV0SW5mbzogU2hlZXRJbmZvSW1wbCxcbiAgICBwcml2YXRlIF96b25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT4sXG4gICAgcHJpdmF0ZSBfc2hlZXRQYXRoOiBTaGVldFBhdGgsXG4gICAgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2FjdGl2ZURhc2hib2FyZE9iamVjdElkOiBudW1iZXIgPSAwLFxuICApIHtcbiAgICBzdXBlcihfc2hlZXRJbmZvLCBfcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHNJbXBsKCk6IEFycmF5PFdvcmtzaGVldEltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0c0ltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdHMoKTogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFBhdGguc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpOiB2b2lkIHtcbiAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbCA9IG5ldyBBcnJheTxXb3Jrc2hlZXRJbXBsPigpO1xuICAgIHRoaXMuX29iamVjdHMgPSBuZXcgQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcbiAgICB0aGlzLnpvbmVNYXAgPSBuZXcgTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcblxuICAgIC8vIFByb2Nlc3MgYWxsIHRoZSB6b25lcyB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoaXMgZGFzaGJvYXJkXG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBsZXQgd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgem9uZVNpemU6IENvbnRyYWN0LlNpemUgPSB7IHdpZHRoOiB6b25lLndpZHRoLCBoZWlnaHQ6IHpvbmUuaGVpZ2h0IH07XG4gICAgICAvLyBBcyB0aGUgZGFzaGJvYXJkIGlzIGFjdGl2ZSwgYWxsIG90aGVyIHpvbmVzIGluIHRoZSBkYXNoYm9hcmQgYXJlIGluYWN0aXZlLlxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBmYWxzZTtcblxuICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICAgIGxldCB3b3Jrc2hlZXROYW1lID0gJyc7XG4gICAgICAgIGxldCB3b3Jrc2hlZXRVcmwgPSAnJztcbiAgICAgICAgbGV0IGlzSGlkZGVuID0gZmFsc2U7XG4gICAgICAgIGlmICh6b25lLnNoZWV0SW5mbykge1xuICAgICAgICAgIC8vIHpvbmUuc2hlZXRJbmZvIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW50ZXJuYWwtY29udHJhY3QgMS42LjBcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcblxuICAgICAgICAgIC8vIHdvcmtzaGVldFVybCAmIGlzSGlkZGVuIGlzIGZvciBFbWJlZGRpbmcgb25seVxuICAgICAgICAgIHdvcmtzaGVldFVybCA9IHpvbmUuc2hlZXRJbmZvLnVybCB8fCAnJztcbiAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgdXJsLCB0aGVuIGl0J3Mgbm90IGhpZGRlblxuICAgICAgICAgIGlzSGlkZGVuID0gd29ya3NoZWV0VXJsID09PSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lID0gem9uZS5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluZGV4ZXMsIGlzQWN0aXZlIGFuZCBzb21lIG1vcmUgcHJvcGVydGllcyBpbiBzaGVldEluZm9JbXBsIGFyZSBlbWJlZGRpbmcgc3BlY2lmaWMuXG4gICAgICAgIC8vIEJ1dCB3ZSBpbml0IHRoZW0gZm9yIGJvdGggZXh0ZW5zaW9ucyBhbmQgZW1iZWRkaW5nIGFzIHRoZSBNb2RlbHMgd2lsbCBvbmx5IHVzZSB3aGF0IGlzIHJlbGV2YW50LlxuICAgICAgICBjb25zdCBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoXG4gICAgICAgICAgd29ya3NoZWV0TmFtZSxcbiAgICAgICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgICAgIHpvbmVTaXplLFxuICAgICAgICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsLmxlbmd0aCxcbiAgICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgICBpc0hpZGRlbixcbiAgICAgICAgICB3b3Jrc2hlZXRVcmwsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgdml6SWQ6IFZpc3VhbElkID0ge1xuICAgICAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICAgICAgICBkYXNoYm9hcmQ6IHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgICBzdG9yeWJvYXJkOiB0aGlzLl9zaGVldFBhdGguc3Rvcnlib2FyZCxcbiAgICAgICAgICBmbGlwYm9hcmRab25lSUQ6IHRoaXMuX3NoZWV0UGF0aC5mbGlwYm9hcmRab25lSUQsXG4gICAgICAgICAgc3RvcnlQb2ludElEOiB0aGlzLl9zaGVldFBhdGguc3RvcnlQb2ludElELFxuICAgICAgICB9O1xuXG4gICAgICAgIHdvcmtzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChzaGVldEluZm9JbXBsLCB0aGlzLl9yZWdpc3RyeUlkLCB2aXpJZCwgdGhpcywgdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwpO1xuICAgICAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbC5wdXNoKHdvcmtzaGVldEltcGwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB6b25lUG9pbnQgPSBuZXcgUG9pbnQoem9uZS54LCB6b25lLnkpO1xuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RJbXBsID0gbmV3IERhc2hib2FyZE9iamVjdEltcGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXNoYm9hcmRPYmplY3RUeXBlLmNvbnZlcnQoem9uZS56b25lVHlwZSksXG4gICAgICAgIHpvbmVQb2ludCxcbiAgICAgICAgem9uZVNpemUsXG4gICAgICAgIHdvcmtzaGVldEltcGwsXG4gICAgICAgIHpvbmUubmFtZSxcbiAgICAgICAgem9uZS5pc0Zsb2F0aW5nICE9PSB1bmRlZmluZWQgPyB6b25lLmlzRmxvYXRpbmcgOiBmYWxzZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzRmxvYXRpbmcsIHNvIHdlIGFzc3VtZSBmYWxzZVxuICAgICAgICB6b25lLmlzVmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gem9uZS5pc1Zpc2libGUgOiB0cnVlLCAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNWaXNpYmxlLCBzbyB3ZSBhc3N1bWUgdHJ1ZVxuICAgICAgICB6b25lLnpvbmVJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX29iamVjdHMucHVzaChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICAgIHRoaXMuem9uZU1hcC5zZXQoem9uZS56b25lSWQsIGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCB8IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHpvbmVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFpvbmVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuWm9uZSk7XG5cbiAgICByZXR1cm4gem9uZVNlcnZpY2Uuc2V0VmlzaWJpbGl0eUFzeW5jKC8qRGFzaGJvYXJkIE5hbWUqLyB0aGlzLm5hbWUsIHRoaXMuem9uZU1hcCwgZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZDogbnVtYmVyKTogRGFzaGJvYXJkT2JqZWN0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU1hcC5nZXQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVpvbmVzKG5ld1pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPiwgbmV3QWN0aXZlWm9uZUlkID0gMCwgbmV3QWN0aXZlRGFzaGJvYXJkTmFtZSA9ICcnKTogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgLy8gZ2V0dGluZyBwcmV2aW91cyBkYXNoYm9hcmQgb2JqZWN0cywgYWN0aXZlIHpvbmUgSUQgYW5kIGFjdGl2ZSBkYXNoYm9hcmQgbmFtZVxuICAgIGNvbnN0IG9sZERhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG9sZFpvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgY29uc3Qgb2xkQWN0aXZlWm9uZUlkID0gdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gICAgY29uc3Qgb2xkQWN0aXZlRGFzaGJvYXJkTmFtZSA9IHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gICAgLy8gdXBkYXRpbmcgem9uZXMgYW5kIHJlaW5pdGlhbGl6aW5nIGluc3RhbmNlIHZhcmlhYmxlc1xuICAgIHRoaXMuX3pvbmVzID0gbmV3Wm9uZXM7XG4gICAgdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQgPSBuZXdBY3RpdmVab25lSWQ7XG4gICAgaWYgKG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lID0gbmV3QWN0aXZlRGFzaGJvYXJkTmFtZTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICAvLyBnZXR0aW5nIG5ldyBkYXNoYm9hcmQgb2JqZWN0c1xuICAgIGNvbnN0IG5ld0Rhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG5ld1pvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgLy8gaW5pdGlhbGl6aW5nIG1hcCBmb3IgY2hhbmdlc1xuICAgIGNvbnN0IHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gY29tcGFyaW5nIG9sZCBkYXNoYm9hcmQgb2JqZWN0cyB3aXRoIG5ldyBvbmVzXG4gICAgb2xkRGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChvbGRPYmplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9sZElkOiBudW1iZXIgPSBvbGRPYmplY3QuaWQ7XG5cbiAgICAgIC8vIGNoZWNraW5nIGlmIHpvbmUgd2FzIHJlbW92ZWRcbiAgICAgIGlmICghbmV3Wm9uZU1hcC5oYXMob2xkSWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlJlbW92ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IG5ld1pvbmVNYXAuZ2V0KG9sZElkKTtcbiAgICAgIGlmIChvbGRPYmplY3QuaXNGbG9hdGluZyAhPT0gbmV3T2JqZWN0IS5pc0Zsb2F0aW5nKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzRmxvYXRpbmdDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5pc1Zpc2libGUgIT09IG5ld09iamVjdCEuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzVmlzaWJsZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0Lm5hbWUgIT09IG5ld09iamVjdCEubmFtZSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5OYW1lQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QucG9zaXRpb24ueCAhPT0gbmV3T2JqZWN0IS5wb3NpdGlvbi54IHx8IG9sZE9iamVjdC5wb3NpdGlvbi55ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uLnkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuUG9zaXRpb25DaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5zaXplLndpZHRoICE9PSBuZXdPYmplY3QhLnNpemUud2lkdGggfHwgb2xkT2JqZWN0LnNpemUuaGVpZ2h0ICE9PSBuZXdPYmplY3QhLnNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlNpemVDaGFuZ2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGZvciBhbnkgYWRkZWQgem9uZXNcbiAgICBuZXdEYXNoYm9hcmRPYmplY3RzLmZvckVhY2goKG5ld09iamVjdCkgPT4ge1xuICAgICAgaWYgKCFvbGRab25lTWFwLmhhcyhuZXdPYmplY3QuaWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG5ld09iamVjdC5pZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5BZGRlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBpZiB6b25lIHNlbGVjdGlvbiBoYXMgY2hhbmdlZFxuICAgIGlmIChvbGRBY3RpdmVab25lSWQgIT09IG5ld0FjdGl2ZVpvbmVJZCkge1xuICAgICAgaWYgKG5ld0FjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShuZXdBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuU2VsZWN0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKG9sZEFjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGVzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tpbmcgaWYgc3dpdGNoZWQgdG8gYW5vdGhlciBkYXNoYm9hcmRcbiAgICBpZiAobmV3QWN0aXZlRGFzaGJvYXJkTmFtZSAmJiBvbGRBY3RpdmVEYXNoYm9hcmROYW1lICE9PSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lKSB7XG4gICAgICB0aGlzLmFkZENoYW5nZSgwLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkRhc2hib2FyZENoYW5nZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB6b25lQ2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2hhbmdlKHpvbmVJZDogbnVtYmVyLCB6b25lQ2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscywgY2hhbmdlOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UpOiB2b2lkIHtcbiAgICBpZiAoIXpvbmVDaGFuZ2VzLmhhcyh6b25lSWQpKSB7XG4gICAgICB6b25lQ2hhbmdlcy5zZXQoem9uZUlkLCBbXSk7XG4gICAgfVxuXG4gICAgem9uZUNoYW5nZXMuZ2V0KHpvbmVJZCkhLnB1c2goY2hhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5tb3ZlQW5kUmVzaXplQXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuaW1hdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5pbWF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFuaW1hdGlvbik7XG5cbiAgICByZXR1cm4gYW5pbWF0aW9uU2VydmljZS5yZXBsYXlBc3luYyhyZXBsYXlTcGVlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhc2hib2FyZEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdGaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBAVy0xMjk4NjQzOTogcmVtb3ZlIG9uY2UgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzIGlzIG1vdmVkIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzc1xuICAvLyBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBzaW5jZSB3b3Jrc2hlZXRzSW1wbCBjYW4gYmUgdW5kZWZpbmVkLCBidXQgd2UgbmVlZCB0aGUgd29ya3NoZWV0IG5hbWVzIGluIHRoZSBFeHBvcnQgQVBJc1xuICBwdWJsaWMgZ2V0V29ya3NoZWV0TmFtZXNGcm9tWm9uZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBpZiAoem9uZS56b25lVHlwZSAhPT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICBjb25zdCB3b3Jrc2hlZXROYW1lID0gem9uZS5zaGVldEluZm8gPyB6b25lLnNoZWV0SW5mby5uYW1lIDogem9uZS5uYW1lO1xuICAgICAgd29ya3NoZWV0TmFtZXMucHVzaCh3b3Jrc2hlZXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVEYXNoYm9hcmQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLnBhcmVudFN0b3J5UG9pbnQgIT0gbnVsbCAmJiB0aGlzLnBhcmVudFN0b3J5UG9pbnQuYWN0aXZlO1xuICAgIGlmICghaXNSb290QW5kQWN0aXZlRGFzaGJvYXJkICYmICFpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL1dvcmtzaGVldEltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCxcbiAgICBwcml2YXRlIF90eXBlOiBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICAgIHByaXZhdGUgX3Bvc2l0aW9uOiBDb250cmFjdC5Qb2ludCxcbiAgICBwcml2YXRlIF9zaXplOiBDb250cmFjdC5TaXplLFxuICAgIHByaXZhdGUgX3dvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2lzRmxvYXRpbmc6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNWaXNpYmxlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lkOiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZEltcGwoKTogRGFzaGJvYXJkSW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldEltcGwoKTogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblN1bW1hcnkgfSBmcm9tICcuLi9Db25uZWN0aW9uU3VtbWFyeSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL0ZpZWxkJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVGFibGVTdW1tYXJ5IH0gZnJvbSAnLi4vVGFibGVTdW1tYXJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ZpZWxkSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlSW1wbCB7XG4gIHByaXZhdGUgX2ZpZWxkczogQXJyYXk8RmllbGQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW5mbzogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlLCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9maWVsZHMgPSBfZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcCgoZmllbGRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCB0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1B1Ymxpc2hlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNQdWJsaXNoZWQ7XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLnB1Ymxpc2hlZFVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPigoc3VtbWFyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4gbmV3IENvbm5lY3Rpb25TdW1tYXJ5KHN1bW1hcnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PigodGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MubWFwKCh0YWJsZUluZm8pID0+IG5ldyBUYWJsZVN1bW1hcnkodGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoZGF0YVNvdXJjZSwgJ2RhdGFTb3VyY2UnKTtcblxuICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoKGZpZWxkTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgZGF0YVNvdXJjZSk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyh0aGlzLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgRmllbGRBZ2dyZWdhdGlvblR5cGUsIEZpZWxkUm9sZVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5cbmV4cG9ydCBjbGFzcyBGaWVsZEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbmZvOiBJbnRlcm5hbENvbnRyYWN0LkZpZWxkLCBwcml2YXRlIF9wYXJlbnREYXRhU291cmNlPzogQ29udHJhY3QuRGF0YVNvdXJjZSkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5kYXRhVHlwZSA/PyBEYXRhVHlwZS5Vbmtub3duO1xuICB9XG5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbigpOiBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5maWVsZEFnZ3JlZ2F0aW9uVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5hZ2dyZWdhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnREYXRhU291cmNlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzb3VyY2UgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBmaWVsZC4gUGxlYXNlIHVzZSBnZXRGaWVsZEFzeW5jIG1ldGhvZCB0byBnZXQgZmllbGQncyBkYXRhIHNvdXJjZSBpbmZvcm1hdGlvbmAsXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IEZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRSb2xlVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5yb2xlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDYWxjdWxhdGVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0NhbGN1bGF0ZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDb21iaW5lZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDb21iaW5lZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlLCBQZXJpb2RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckltcGwge1xuICBwcml2YXRlIF9hbGxvd2FibGVWYWx1ZXM6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uO1xuICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbywgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlckluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IERhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh0aGlzLl9wYXJhbWV0ZXJJbmZvLmN1cnJlbnRWYWx1ZSwgdGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGFUeXBlLmNvbnZlcnQodGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbEZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxEYXRhVmFsdWU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG5ld1ZhbHVlLCAnbmV3VmFsdWUnKTtcblxuICAgIGNvbnN0IGNvZXJjZWRWYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKG5ld1ZhbHVlKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzU2VydmljZS5jaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSwgY29lcmNlZFZhbHVlKS50aGVuKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICB0aGlzLnNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbyk7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbyk6IHZvaWQge1xuICAgIHRoaXMuX3BhcmFtZXRlckluZm8gPSBwYXJhbWV0ZXJJbmZvO1xuICAgIHRoaXMuX2dsb2JhbEZpZWxkTmFtZSA9IHBhcmFtZXRlckluZm8uZmllbGROYW1lO1xuXG4gICAgY29uc3QgdHlwZSA9IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbGxvd2FibGVWYWx1ZXMuY29udmVydChwYXJhbWV0ZXJJbmZvLmFsbG93YWJsZVZhbHVlc1R5cGUpO1xuICAgIGxldCBsaXN0VmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBtaW5WYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtYXhWYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdGVwU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBkYXRlU3RlcFBlcmlvZDogUGVyaW9kVHlwZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCkge1xuICAgICAgY29uc3QgdmFsdWVzID0gcGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXMgfHwgW107XG4gICAgICBsaXN0VmFsdWVzID0gdmFsdWVzLm1hcCgodmFsKSA9PiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodmFsLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2UpIHtcbiAgICAgIG1pblZhbHVlID0gcGFyYW1ldGVySW5mby5taW5WYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5taW5WYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBtYXhWYWx1ZSA9IHBhcmFtZXRlckluZm8ubWF4VmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWF4VmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgc3RlcFNpemUgPSBwYXJhbWV0ZXJJbmZvLnN0ZXBTaXplO1xuICAgICAgZGF0ZVN0ZXBQZXJpb2QgPSBwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kICYmIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRlU3RlcFBlcmlvZC5jb252ZXJ0KHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QpO1xuICAgIH1cblxuICAgIHRoaXMuX2FsbG93YWJsZVZhbHVlcyA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBhbGxvd2FibGVWYWx1ZXM6IGxpc3RWYWx1ZXMsXG4gICAgICBtaW5WYWx1ZTogbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsXG4gICAgICBzdGVwU2l6ZTogc3RlcFNpemUsXG4gICAgICBkYXRlU3RlcFBlcmlvZDogZGF0ZVN0ZXBQZXJpb2QsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2hlZXRVdGlscyB9IGZyb20gJy4uL1V0aWxzL1NoZWV0VXRpbHMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcblxuaW50ZXJmYWNlIFBhcnRpYWxTaGVldFNpemUge1xuICAvKipcbiAgICogQ29udGFpbnMgYW4gZW51bWVyYXRpb24gdmFsdWUgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmc6IEFVVE9NQVRJQywgRVhBQ1RMWSwgUkFOR0UsIEFUTEVBU1QsIGFuZCBBVE1PU1QuXG4gICAqL1xuICByZWFkb25seSBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFLCBvciBBVExFQVNULlxuICAgKi9cbiAgcmVhZG9ubHkgbWluU2l6ZT86IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT47XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFIG9yIEFUTU9TVC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemU/OiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+O1xufVxuXG5leHBvcnQgY2xhc3MgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCwgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFBhdGgoKTogU2hlZXRQYXRoIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFBhdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRTaXplO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW47XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaXNIaWRkZW4gbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBhY3RpdmUgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXg7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaW5kZXggbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLnVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC51cmw7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgdXJsIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGVldFNpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBpZiAoIVNoZWV0VXRpbHMuaXNWYWxpZFNoZWV0U2l6ZSh0aGlzLnNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NpemUgaXMgbm90IG9mIHR5cGUgU2hlZXRTaXplJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lLCAncGFyYW1ldGVyTmFtZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeU5hbWVBc3luYyhwYXJhbWV0ZXJOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyh0aGlzLnNoZWV0UGF0aCk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlU2l6ZUFzeW5jKG5ld1NpemU6IENvbnRyYWN0LlNoZWV0U2l6ZSk6IFByb21pc2U8Q29udHJhY3QuU2hlZXRTaXplPiB7XG4gICAgY29uc3QgaW52YWxpZFNpemVFcnJvciA9IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICBpZiAoIW5ld1NpemUgfHwgIW5ld1NpemUuYmVoYXZpb3IpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGlhbFNoZWV0U2l6ZSA9IHRoaXMubm9ybWFsaXplU2hlZXRTaXplKG5ld1NpemUpO1xuXG4gICAgY29uc3QgaXNBdXRvbWF0aWMgPSBwYXJ0aWFsU2hlZXRTaXplLmJlaGF2aW9yID09PSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiAhcGFydGlhbFNoZWV0U2l6ZS5taW5TaXplICYmICFwYXJ0aWFsU2hlZXRTaXplLm1heFNpemUpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiB0aGlzLnNoZWV0VHlwZSA9PT0gQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQsXG4gICAgICAgICdPbmx5IFNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYyBpcyBhbGxvd2VkIG9uIFdvcmtzaGVldHMnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBdXRvbWF0aWMgJiYgdGhpcy5nZXRTaGVldFNpemUoKS5iZWhhdmlvciA9PT0gcGFydGlhbFNoZWV0U2l6ZS5iZWhhdmlvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdTaXplKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jZXNzZWROZXdTaXplID0gdGhpcy5wcm9jZXNzTmV3U2l6ZShwYXJ0aWFsU2hlZXRTaXplKTtcblxuICAgIGNvbnN0IHNpemVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNpemVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2l6ZSk7XG4gICAgcmV0dXJuIHNpemVTZXJ2aWNlLmNoYW5nZVNpemVBc3luYyh0aGlzLm5hbWUsIHByb2Nlc3NlZE5ld1NpemUpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mb1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Q2xpZW50SW5mb1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvKTtcblxuICAgICAgcmV0dXJuIGNsaWVudEluZm9TZXJ2aWNlLmdldENsaWVudEluZm9Bc3luYygpLnRoZW4oKGJvb3RzdHJhcEluZm8pID0+IHtcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBib290c3RyYXBJbmZvLnB1Ymxpc2hlZFNoZWV0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHRoaXMubmFtZSk7XG4gICAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYENhbid0IGZpbmQgc2hlZXQgd2l0aCBuYW1lICR7dGhpcy5uYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hlZXRTaXplID0gU2hlZXRVdGlscy5nZXRTaGVldFNpemVGcm9tU2l6ZUNvbnN0cmFpbnRzKHNoZWV0LnNpemVDb25zdHJhaW50KTtcbiAgICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemUgPSBzaGVldFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHNoZWV0U2l6ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTaGVldFNpemUobmV3U2l6ZTogQ29udHJhY3QuU2hlZXRTaXplKTogUGFydGlhbFNoZWV0U2l6ZSB7XG4gICAgY29uc3QgeyBiZWhhdmlvciB9ID0gbmV3U2l6ZTtcblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I+KGJlaGF2aW9yLCBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvciwgJ1NoZWV0U2l6ZUJlaGF2aW9yJyk7XG5cbiAgICBjb25zdCBtaW5TaXplID0gU2hlZXRJbXBsLnBhcnNlRGltZW5zaW9ucyhuZXdTaXplLm1pblNpemUpO1xuICAgIGNvbnN0IG1heFNpemUgPSBTaGVldEltcGwucGFyc2VEaW1lbnNpb25zKG5ld1NpemUubWF4U2l6ZSk7XG5cbiAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTmV3U2l6ZShuZXdTaXplOiBQYXJ0aWFsU2hlZXRTaXplKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IGJlaGF2aW9yLCBtaW5TaXplOiBtaW5TaXplTWF5YmUsIG1heFNpemU6IG1heFNpemVNYXliZSB9ID0gbmV3U2l6ZTtcblxuICAgIGNvbnN0IGhhc01pbldpZHRoID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1pblNpemVNYXliZT8ud2lkdGgpO1xuICAgIGNvbnN0IGhhc01pbkhlaWdodCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtaW5TaXplTWF5YmU/LmhlaWdodCk7XG4gICAgY29uc3QgaGFzTWF4V2lkdGggPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWF4U2l6ZU1heWJlPy53aWR0aCk7XG4gICAgY29uc3QgaGFzTWF4SGVpZ2h0ID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1heFNpemVNYXliZT8uaGVpZ2h0KTtcbiAgICBjb25zdCBoYXNWYWxpZE1pblNpemUgPSBoYXNNaW5XaWR0aCAmJiBoYXNNaW5IZWlnaHQ7XG4gICAgY29uc3QgaGFzVmFsaWRNYXhTaXplID0gaGFzTWF4V2lkdGggJiYgaGFzTWF4SGVpZ2h0O1xuXG4gICAgc3dpdGNoIChiZWhhdmlvcikge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM6IHtcbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3Q6IHtcbiAgICAgICAgaWYgKCFtYXhTaXplTWF5YmUgfHwgIWhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWF4U2l6ZSwgJ01pc3NpbmcgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhTaXplID0geyB3aWR0aDogbWF4U2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtYXhTaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWF4U2l6ZS53aWR0aCA8IDAgfHwgbWF4U2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtYXhTaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdDoge1xuICAgICAgICBpZiAoIW1pblNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNaW5TaXplLCAnTWlzc2luZyBtaW5TaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWluU2l6ZS53aWR0aCA8IDAgfHwgbWluU2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2U6IHtcbiAgICAgICAgaWYgKCFtaW5TaXplTWF5YmUgfHwgIW1heFNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplIHx8ICFoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01pbk1heFNpemUsICdNaXNzaW5nIG1pblNpemUgb3IgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1pblNpemUud2lkdGggPCAwIHx8XG4gICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPCAwIHx8XG4gICAgICAgICAgbWF4U2l6ZS53aWR0aCA8IDAgfHxcbiAgICAgICAgICBtYXhTaXplLmhlaWdodCA8IDAgfHxcbiAgICAgICAgICBtaW5TaXplLndpZHRoID4gbWF4U2l6ZS53aWR0aCB8fFxuICAgICAgICAgIG1pblNpemUuaGVpZ2h0ID4gbWF4U2l6ZS5oZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnTWlzc2luZyBtaW5TaXplIG9yIG1heFNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkV4YWN0bHk6IHtcbiAgICAgICAgaWYgKG1pblNpemVNYXliZSAmJiBtYXhTaXplTWF5YmUpIHtcbiAgICAgICAgICBpZiAoaGFzVmFsaWRNaW5TaXplICYmIGhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgICAgIGlmIChtaW5TaXplLndpZHRoICE9PSBtYXhTaXplLndpZHRoIHx8IG1pblNpemUuaGVpZ2h0ICE9PSBtYXhTaXplLmhlaWdodCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdDb25mbGljdGluZyBzaXplIHZhbHVlcyBmb3IgU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1pblNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZTogbWluU2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZTogbWF4U2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuc3VwcG9ydGVkIHNoZWV0IHNpemUgYmVoYXZpb3I6ICR7YmVoYXZpb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEaW1lbnNpb25zID0gKHNpemU6IENvbnRyYWN0LlNpemUgfCB1bmRlZmluZWQpOiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+ID0+IHtcbiAgICBjb25zdCBlbXB0eSA9IHsgd2lkdGg6IHVuZGVmaW5lZCwgaGVpZ2h0OiB1bmRlZmluZWQgfTtcblxuICAgIGlmICghc2l6ZSkge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3VjY2Vzczogd2lkdGhQYXJzZWQsIHBhcnNlZDogcGFyc2VkV2lkdGggfSA9IFBhcmFtLnRyeVBhcnNlTnVtYmVyKHNpemUud2lkdGgpO1xuICAgIGNvbnN0IHsgc3VjY2VzczogaGVpZ2h0UGFyc2VkLCBwYXJzZWQ6IHBhcnNlZEhlaWdodCB9ID0gUGFyYW0udHJ5UGFyc2VOdW1iZXIoc2l6ZS5oZWlnaHQpO1xuXG4gICAgaWYgKHdpZHRoUGFyc2VkICYmIGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgd2lkdGg6IHBhcnNlZFdpZHRoISwgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgaWYgKHdpZHRoUGFyc2VkKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogcGFyc2VkV2lkdGghIH07XG4gICAgfVxuXG4gICAgaWYgKGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgU2hlZXRTaXplIGFzIEVtYmVkZGluZ1NoZWV0U2l6ZSwgU2l6ZSBhcyBFeHRlbnNpb25TaGVldFNpemUsIFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfc2hlZXRUeXBlOiBTaGVldFR5cGUsXG4gICAgcHJpdmF0ZSBfc2hlZXRTaXplOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUsXG4gICAgcHJpdmF0ZSBfaW5kZXg/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNBY3RpdmU/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzSGlkZGVuPzogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cmw/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShzaGVldE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBzaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0U2l6ZSgpOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoZWV0U2l6ZSh2YWx1ZTogRXh0ZW5zaW9uU2hlZXRTaXplIHwgRW1iZWRkaW5nU2hlZXRTaXplKSB7XG4gICAgdGhpcy5fc2hlZXRTaXplID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBTaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB7XG4gICAgICBzaGVldE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGlzRGFzaGJvYXJkOiB0aGlzLnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICAgIC8vIFRPRE8gLSBTdG9yaWVzXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQWN0aXZlID0gYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4uL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBTaW5nbGVFdmVudE1hbmFnZXIgaW50ZXJmYWNlIGZvciBhIHNpbmdsZSB0eXBlIG9mIFRhYmxlYXUgZXZlbnRcbiAqXG4gKiBAdGVtcGxhdGUgVEV2ZW50VHlwZSBUaGUgVGFibGVhdSBldmVudCB0eXBlIHRoaXMgY2xhc3Mgc3BlY2lhbGl6ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZUV2ZW50TWFuYWdlckltcGw8VEV2ZW50VHlwZSBleHRlbmRzIENvbnRyYWN0LlRhYmxlYXVFdmVudD4gaW1wbGVtZW50cyBTaW5nbGVFdmVudE1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiBBcnJheTwoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9ldmVudFR5cGUgPSBldmVudFR5cGU7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXZlbnRUeXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9ldmVudFR5cGU7XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyOiAoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQpOiBDb250cmFjdC5UYWJsZWF1RXZlbnRVbnJlZ2lzdGVyRm4ge1xuICAgIHRoaXMuX2hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJlZm9yZUNvdW50ID0gdGhpcy5faGFuZGxlcnMubGVuZ3RoO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gdGhpcy5faGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgICByZXR1cm4gYmVmb3JlQ291bnQgPiB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckV2ZW50KGV2ZW50R2VuZXJhdG9yOiAoKSA9PiBURXZlbnRUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuX2hhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBldmVudE1vZGVsID0gZXZlbnRHZW5lcmF0b3IoKTtcbiAgICAgICAgaGFuZGxlcihldmVudE1vZGVsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU2luY2UgdGhpcyBoYW5kbGVyIGNvdWxkIGJlIG91dHNpZGUgb3VyIGNvbnRyb2wsIGp1c3QgY2F0Y2ggYW55dGhpbmcgaXQgdGhyb3dzIGFuZCBjb250aW51ZSBvblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldEluZm8sIFN0b3J5TW9kZWwsIFN0b3J5UG9pbnRNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFNob3J0TGl2ZWREZWZlcnJlZCB9IGZyb20gJy4uL1V0aWxzL1Nob3J0TGl2ZWREZWZlcnJlZCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeUltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF9hY3RpdmVTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGw7XG4gIHByaXZhdGUgX3N0b3J5UG9pbnRJbmZvSW1wbHM6IEFycmF5PFN0b3J5UG9pbnRJbmZvSW1wbD4gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmZXJyZWQ6IFNob3J0TGl2ZWREZWZlcnJlZDxTdG9yeVBvaW50SW1wbD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBzdG9yeU1vZGVsOiBTdG9yeU1vZGVsLFxuICAgIHByaXZhdGUgX3B1Ymxpc2hlZFNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm9JbXBsLCBfcmVnaXN0cnlJZCk7XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgU2hvcnRMaXZlZERlZmVycmVkPFN0b3J5UG9pbnRJbXBsPigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN0b3J5KHN0b3J5TW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU3Rvcnkoc3RvcnlNb2RlbDogU3RvcnlNb2RlbCkge1xuICAgIHN0b3J5TW9kZWwuc3RvcnlQb2ludHMuZm9yRWFjaCgoc3RvcnlQb2ludE1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleCA9PT0gc3RvcnlNb2RlbC5hY3RpdmVTdG9yeVBvaW50SW5kZXg7XG4gICAgICBjb25zdCBzdG9yeVBvaW50SW5mb0ltcGwgPSBuZXcgU3RvcnlQb2ludEluZm9JbXBsKFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbixcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLmluZGV4LFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkLFxuICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5wdXNoKHN0b3J5UG9pbnRJbmZvSW1wbCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0b3J5SW5mbyhpbmRleDogbnVtYmVyLCBzdG9yeVBvaW50TW9kZWw6IFN0b3J5UG9pbnRNb2RlbCkge1xuICAgIGlmICghdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdG9yeUluZm9JbXBsID0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsc1tpbmRleF07XG4gICAgaWYgKHN0b3J5SW5mb0ltcGwuc3RvcnlQb2ludElkICE9PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLlN0b3J5UG9pbnRJZE1pc21hdGNoLFxuICAgICAgICBgV2Ugc2hvdWxkIG5vdCBiZSB1cGRhdGluZyBhIHN0b3J5IHBvaW50IHdoZW4gdGhlIElEcyBkb24ndCBtYXRjaC4gRXhpc3Rpbmcgc3RvcnlQb2ludElEPSR7c3RvcnlJbmZvSW1wbC5zdG9yeVBvaW50SWR9LCBuZXdTdG9yeVBvaW50SUQ9JHtzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBzdG9yeUluZm9JbXBsLmNhcHRpb24gPSBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbjtcbiAgICBzdG9yeUluZm9JbXBsLnVwZGF0ZWQgPSBzdG9yeVBvaW50TW9kZWwudXBkYXRlZDtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5zdG9yeVBvaW50SWQgPT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLnVwZGF0ZWQgPSBzdG9yeUluZm9JbXBsLnVwZGF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVN0b3J5KHN0b3J5UG9pbnRNb2RlbDogU3RvcnlQb2ludE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5mb3JFYWNoKChzdG9yeVBvaW50SW5mb0ltcGwpID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZCA9PT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZDtcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlXG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uID0gc3RvcnlQb2ludE1vZGVsLmNhcHRpb247XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5pbmRleCA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleDtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkID0gc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQ7XG5cbiAgICAgICAgLy8gcmUtaW5pdGlhbGl6ZSBhY3RpdmVTdG9yeVBvaW50SW1wbFxuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzZXQgb2xkIG9uZXMgdG8gZmFsc2VcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmFjdGl2ZVN0b3J5UG9pbnQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlU3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50c0luZm8oKTogQXJyYXk8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTxTdG9yeVBvaW50SW1wbD4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCA9PT0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCk7XG4gICAgfVxuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5nZXROZXdQcm9taXNlT3JUaHJvd0lmQnVzeSgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcbiAgICBzZXJ2aWNlLmFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLnJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleCkudGhlbjxTdG9yeVBvaW50SW5mb0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdG9yeUluZm8ocmVzcG9uc2UuaW5kZXgsIHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHN0b3J5UG9pbnRJbmZvSW1wbCA9IG5ldyBTdG9yeVBvaW50SW5mb0ltcGwoXG4gICAgICAgIHJlc3BvbnNlLmNhcHRpb24sXG4gICAgICAgIHJlc3BvbnNlLmluZGV4LFxuICAgICAgICByZXNwb25zZS5zdG9yeVBvaW50SWQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICByZXNwb25zZS51cGRhdGVkLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdG9yeVBvaW50SW5mb0ltcGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJQZW5kaW5nUHJvbWlzZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RlZmVycmVkKSB7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoJ0FsbCBwZW5kaW5nIHByb21pc2VzIGNsZWFyZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgU2hlZXRJbmZvLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi4vVXRpbHMvU2hlZXRVdGlscyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEluZm9JbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW5mb0ltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeVBvaW50SW1wbCB7XG4gIHByaXZhdGUgX2NvbnRhaW5lZFNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SW5mb0ltcGw6IFN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBjb250YWluZWRTaGVldEluZm8/OiBDb250YWluZWRTaGVldEluZm9Nb2RlbCxcbiAgKSB7XG4gICAgaWYgKGNvbnRhaW5lZFNoZWV0SW5mbykge1xuICAgICAgdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsID0gdGhpcy5jcmVhdGVDb250YWluZWRTaGVldChjb250YWluZWRTaGVldEluZm8sIHNoZWV0SW5mb3MsIHJlZ2lzdHJ5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVwZGF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKHVwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwudXBkYXRlZCA9IHVwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCk6IFN0b3J5SW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5wYXJlbnRTdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udGFpbmVkU2hlZXQoKTogU2hlZXRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29udGFpbmVkU2hlZXQoY29udGFpbmVkU2hlZXRJbmZvOiBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgc2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPiwgcmVnaXN0cnlJZDogbnVtYmVyKTogU2hlZXRJbXBsIHtcbiAgICBjb25zdCBjb250YWluZWRTaGVldElkeCA9IC0xO1xuXG4gICAgY29uc3QgcHVibGlzaGVkU2hlZXRJbmZvID0gU2hlZXRVdGlscy5nZXRQdWJsaXNoZWRTaGVldEluZm9CeU5hbWUoY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsIHNoZWV0SW5mb3MpO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0U2l6ZSA9IFNoZWV0VXRpbHMuY3JlYXRlQXV0b21hdGljU2l6ZSgpO1xuICAgIGNvbnN0IGlzQ29udGFpbmVkU2hlZXRIaWRkZW4gPSBwdWJsaXNoZWRTaGVldEluZm8gPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250YWluZWRTaGVldFVybCA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA/IHB1Ymxpc2hlZFNoZWV0SW5mby51cmwgOiAnJztcbiAgICAvLyBDb250YWluZWQgc2hlZXRzIGFyZW4ndCBhY3RpdmUgLSB0aGUgY29udGFpbmluZyBzaGVldCBpcyBhY3RpdmUuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRBY3RpdmUgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGNvbnRhaW5lZFNoZWV0SW5mby5uYW1lLFxuICAgICAgU2hlZXRVdGlscy5nZXRTaGVldFR5cGVFbnVtKGNvbnRhaW5lZFNoZWV0SW5mby5zaGVldFR5cGUpLFxuICAgICAgY29udGFpbmVkU2hlZXRTaXplLFxuICAgICAgY29udGFpbmVkU2hlZXRJZHgsXG4gICAgICBjb250YWluZWRTaGVldEFjdGl2ZSxcbiAgICAgIGlzQ29udGFpbmVkU2hlZXRIaWRkZW4sXG4gICAgICBjb250YWluZWRTaGVldFVybCxcbiAgICApO1xuXG4gICAgbGV0IHNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICAgIHN3aXRjaCAoY29udGFpbmVkU2hlZXRJbmZvSW1wbC5zaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiBjb250YWluZWRTaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoY29udGFpbmVkU2hlZXRJbmZvSW1wbCwgcmVnaXN0cnlJZCwgdml6SWQsIG51bGwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBjb25zdCBzaGVldFBhdGg6IFNoZWV0UGF0aCA9IHtcbiAgICAgICAgICBzaGVldE5hbWU6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgICBpc0Rhc2hib2FyZDogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCBjb250YWluZWRTaGVldEluZm8uZGFzaGJvYXJkWm9uZXMsIHNoZWV0UGF0aCwgcmVnaXN0cnlJZCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuU2VydmVyRXJyb3IsICdJbnZhbGlkIFNoZWV0VHlwZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaGVldEltcGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0b3J5SW1wbCB9IGZyb20gJy4vU3RvcnlJbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5UG9pbnRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hY3RpdmU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfdXBkYXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeUltcGw6IFN0b3J5SW1wbCxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2FwdGlvbihjYXB0aW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jYXB0aW9uID0gY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG5cbiAgcHVibGljIHNldCBpbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5faW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RvcnlQb2ludElkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBpc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXBkYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdXBkYXRlZChpc1VwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91cGRhdGVkID0gaXNVcGRhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlJbXBsO1xuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgV29ya2Jvb2tJbXBsIHt9XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENvbnRleHRNZW51T3B0aW9ucyxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIFBlcmlvZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFRvb2x0aXBDb250ZXh0LFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbywgVmlzdWFsSWQsIFdvcmtzaGVldERhdGFTb3VyY2VJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9EYXRhU291cmNlJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSwgR2V0RGF0YVR5cGUgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9WaXN1YWxNb2RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi9EYXRhU291cmNlSW1wbCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsXG4gICAgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF92aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcHJpdmF0ZSBfcGFyZW50RGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfcGFyZW50U3RvcnlQb2ludEltcGw6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIoc2hlZXRJbmZvSW1wbCwgX3JlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnREYXNoYm9hcmQoKTogRGFzaGJvYXJkSW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXN1YWxJZCgpOiBWaXN1YWxJZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc3VhbElkO1xuICB9XG5cbiAgcHVibGljIGdldE1heFBhZ2VSb3dMaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiAxMDAwMDtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyTnVsbE9wdGlvbj4oZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uLCBGaWx0ZXJOdWxsT3B0aW9uLCAnRmlsdGVyTnVsbE9wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2VQYXJhbVR5cGUoZmlsdGVyT3B0aW9ucy5taW4sIGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJhbmdlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlcywgJ3ZhbHVlcycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJiAhdmFsdWVzLmxldmVscykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5IG9yIGNvbnRhaW4gYSBsZXZlbHMga2V5JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFBlcmlvZFR5cGU+KG9wdGlvbnMucGVyaW9kVHlwZSwgUGVyaW9kVHlwZSwgJ1BlcmlvZFR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhdGVSYW5nZVR5cGU+KG9wdGlvbnMucmFuZ2VUeXBlLCBEYXRlUmFuZ2VUeXBlLCAnRGF0ZVJhbmdlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGF0YVNvdXJjZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YVNvdXJjZUluZm86IFdvcmtzaGVldERhdGFTb3VyY2VJbmZvID0gZGF0YVNjaGVtYS53b3Jrc2hlZXREYXRhU2NoZW1hTWFwW3RoaXMubmFtZV07XG5cbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCwgYWRkIHRoZSBwcmltYXJ5IGRhdGFzb3VyY2UuICBCeSBjb252ZW50aW9uLCBpdCBjb21lcyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAgICBjb25zdCBwcmltYXJ5SWQ6IHN0cmluZyA9IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnByaW1hcnlEYXRhU291cmNlO1xuICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3ByaW1hcnlJZF0pKTtcblxuICAgICAgLy8gVGhlbiwgbG9vcCB0aHJvdWdoIGFueSBzZWNvbmRhcnkgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5SWQgb2Ygd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucmVmZXJlbmNlZERhdGFTb3VyY2VMaXN0KSB7XG4gICAgICAgIGlmIChzZWNvbmRhcnlJZCAhPT0gcHJpbWFyeUlkKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3NlY29uZGFyeUlkXSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWx0ZXJzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIEdldERhdGFUeXBlLlN1bW1hcnksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudDogbnVtYmVyLCBvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLCAvLyBpbmNsdWRlQWxsQ29sdW1ucyAoY2FuIGJlIG92ZXJyaWRkZW4gYnkgY29sdW1uc1RvSW5jbHVkZUJ5SWQpXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5VbmRlcmx5aW5nLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PigobG9naWNhbFRhYmxlSW5mb3MpID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAoKGxvZ2ljYWxUYWJsZUluZm8pID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ/OiBudW1iZXIsXG4gICAgb3B0aW9ucz86IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICAhIW9wdGlvbnMuaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPiwgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2VsZWN0aW9ucywgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8U2VsZWN0aW9uVXBkYXRlVHlwZT4oc2VsZWN0aW9uVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgJ1NlbGVjdGlvblVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2VsZWN0aW9ucywgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8U2VsZWN0aW9uVXBkYXRlVHlwZT4oc2VsZWN0aW9uVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgJ1NlbGVjdGlvblVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlJZEFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGFubm90YXRlTWFya0FzeW5jKG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihtYXJrLCAnbWFyaycpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5hbm5vdGF0ZU1hcmtBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEFubm90YXRpb25zQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFubm90YXRpb24sICdhbm5vdGF0aW9uJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUFubm90YXRpb25Bc3luYyh0aGlzLnZpc3VhbElkLCBhbm5vdGF0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBlbmRDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGVuZENvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVJdGVtSWQpO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZXhlY3V0ZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVJdGVtSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVuYW1lQ29udGV4dE1lbnVBc3luYyh0aGlzLnZpc3VhbElkLndvcmtzaGVldCwgdGFyZ2V0TWVudSwgbWVudUhlYWRlciwgbWVudURlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBob3ZlclR1cGxlQXN5bmMoaG92ZXJlZFR1cGxlOiBudW1iZXIsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBob3ZlclR1cGxlQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2ApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmhvdmVyVHVwbGVBc3luYyh0aGlzLnZpc3VhbElkLCBob3ZlcmVkVHVwbGUsIHRvb2x0aXApO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBzZWxlY3RUdXBsZXNBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0VHVwbGVzQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0KCkge1xuICAgIGNvbnN0IGlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCA9IHRoaXMuYWN0aXZlO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkID0gdGhpcy5pc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBpZiAoIWlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCAmJiAhaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQgJiYgIWlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLk5vdEFjdGl2ZVNoZWV0LCAnT3BlcmF0aW9uIG5vdCBhbGxvd2VkIG9uIG5vbi1hY3RpdmUgc2hlZXQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwgJiYgdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCAmJiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgIT09IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGxvZ2ljYWwgdGFibGUuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpY2FsVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5Mb2dpY2FsVGFibGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9naWNhbFRhYmxlOiBMb2dpY2FsVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5jYXB0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL2xpYi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3dvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFwcGx5VG9Xb3Jrc2hlZXRzLCAnYXBwbHlUb1dvcmtzaGVldHMnKTtcbiAgICBjb25zdCB1bmlxdWVXb3Jrc2hlZXRzID0gbmV3IFNldChhcHBseVRvV29ya3NoZWV0cyk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5zZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkTmFtZSwgdGhpcy5fZmllbGRJZCwgQXJyYXkuZnJvbSh1bmlxdWVXb3Jrc2hlZXRzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhjbHVkZU1vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldENhdGVnb3JpY2FsRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZTogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9oaWVyYXJjaGljYWxQYXRoOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGllcmFyY2hpY2FsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oaWVyYXJjaGljYWxQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uYW1lOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsU2VsZWN0aW9uU3RhdGU6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsU2VsZWN0aW9uU3RhdGUoKTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsU2VsZWN0aW9uU3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2RpbWVuc2lvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9oaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZMZXZlbHM6IG51bWJlcixcbiAgICBwcml2YXRlIF9sZXZlbERldGFpbHM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVsRGV0YWlsPixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IENvbnRyYWN0LkZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaW1lbnNpb25OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpbWVuc2lvbk5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoeUNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2h5Q2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbnVtYmVyT2ZMZXZlbHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsRGV0YWlscygpOiBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxEZXRhaWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfaW5jbHVkZU51bGxWYWx1ZXM6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pblZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmNsdWRlTnVsbFZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZU51bGxWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICBpZiAoIWRvbWFpblR5cGUpIHtcbiAgICAgIGRvbWFpblR5cGUgPSBGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50O1xuICAgIH1cblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyRG9tYWluVHlwZT4oZG9tYWluVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgJ0ZpbHRlckRvbWFpblR5cGUnKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFJhbmdlRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FuY2hvckRhdGU6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9wZXJpb2RUeXBlOiBQZXJpb2RUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlVHlwZTogRGF0ZVJhbmdlVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZU46IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkLCByZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yRGF0ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3JEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJpb2RUeXBlKCk6IFBlcmlvZFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9wZXJpb2RUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCByYW5nZVR5cGUoKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlTjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmljYWxEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW4oKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXgoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIE1hcmtUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFUYWJsZSB7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGF0YTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4sXG4gICAgcHJpdmF0ZSBfY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBwcml2YXRlIF90b3RhbFJvd0NvdW50OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNUb3RhbFJvd0NvdW50TGltaXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1N1bW1hcnlEYXRhOiBib29sZWFuLFxuICAgIHByaXZhdGUgX21hcmtzSW5mbz86IEFycmF5PE1hcmtJbmZvPixcbiAgKSB7XG4gICAgdGhpcy5fbmFtZSA9IF9pc1N1bW1hcnlEYXRhID8gJ1N1bW1hcnkgRGF0YSBUYWJsZScgOiAnVW5kZXJseWluZyBEYXRhIFRhYmxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxDb250cmFjdC5Db2x1bW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya3NJbmZvKCk6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1RvdGFsUm93Q291bnRMaW1pdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1RvdGFsUm93Q291bnRMaW1pdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1N1bW1hcnlEYXRhKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1N1bW1hcnlEYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXJrSW5mbyBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtJbmZvIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3R5cGU6IE1hcmtUeXBlLCBwcml2YXRlIF9jb2xvcjogc3RyaW5nLCBwcml2YXRlIF90dXBsZUlkPzogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBNYXJrVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCB0dXBsZUlkKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3R1cGxlSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbHVtbiBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbHVtbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZGF0YVR5cGU6IERhdGFUeXBlLFxuICAgIHByaXZhdGUgX2lzUmVmZXJlbmNlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUmVmZXJlbmNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWZlcmVuY2VkO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZTogYW55LCBwcml2YXRlIF9uYXRpdmVWYWx1ZTogYW55LCBwcml2YXRlIF9mb3JtYXR0ZWRWYWx1ZT86IHN0cmluZykge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBuYXRpdmVWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmVWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVkVmFsdWU7XG4gIH1cbiAgLyogdHNsaW50OmVuYWJsZTpuby1hbnkgKi9cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVSZWFkZXIgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVGFibGVSZWFkZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIF9pZDogc3RyaW5nLCBwcm90ZWN0ZWQgX3RvdGFsUm93Q291bnQ6IG51bWJlciwgcHJvdGVjdGVkIF9wYWdlUm93Q291bnQsIHByaXZhdGUgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHRoaXMuX3BhZ2VDb3VudCA9IE1hdGguY2VpbChfdG90YWxSb3dDb3VudCAvIF9wYWdlUm93Q291bnQpO1xuICB9XG4gIHByb3RlY3RlZCBfcGFnZUNvdW50OiBudW1iZXI7XG5cbiAgcHVibGljIGdldCB0b3RhbFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUm93Q291bnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wYWdlQ291bnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFnZUFzeW5jKHBhZ2VOdW1iZXI6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVJhbmdlKHBhZ2VOdW1iZXIsIDAsIHRoaXMuX3BhZ2VDb3VudCk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFBhZ2VBc3luYyh0aGlzLl9pZCwgcGFnZU51bWJlciwgdGhpcy5fcGFnZVJvd0NvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBbGxQYWdlc0FzeW5jKG1heFJvd3M/OiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IGZpcnN0UGFnZTogQ29udHJhY3QuRGF0YVRhYmxlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoMCk7XG4gICAgbWF4Um93cyA9IG1heFJvd3MgfHwgdGhpcy50b3RhbFJvd0NvdW50O1xuICAgIGNvbnN0IHJvd3NSZXF1ZXN0ZWQgPSBNYXRoLm1pbihtYXhSb3dzLCB0aGlzLnRvdGFsUm93Q291bnQpO1xuICAgIGNvbnN0IHBhZ2VzUmVxdWVzdGVkID0gTWF0aC5jZWlsKHJvd3NSZXF1ZXN0ZWQgLyB0aGlzLl9wYWdlUm93Q291bnQpO1xuXG4gICAgLy8gRmV0Y2ggdXAgdG8gNDAwIHBhZ2VzLCB3aXRoIGEgZGVmYXVsdCBvZiAxMCwwMDAgcGFnZVJvd0NvdW50IHRoYXQgZ2l2ZXMgdXMgNCwwMDAsMDAwIHJvd3NcbiAgICBjb25zdCBwYWdlc1RvRmV0Y2ggPSBNYXRoLm1pbihwYWdlc1JlcXVlc3RlZCwgNDAwKTtcbiAgICBjb25zdCBpc0RhdGFMaW1pdGVkID0gcGFnZXNUb0ZldGNoIDwgcGFnZXNSZXF1ZXN0ZWQ7XG4gICAgbGV0IHJlbWFpbmluZ0RhdGE6IEFycmF5PEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+PiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGFnZXNUb0ZldGNoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLmdldFBhZ2VBc3luYyhpKTtcbiAgICAgIHJlbWFpbmluZ0RhdGEucHVzaChwYWdlLmRhdGEpO1xuICAgIH1cblxuICAgIGxldCBmdWxsRGF0YSA9IGZpcnN0UGFnZS5kYXRhLmNvbmNhdCguLi5yZW1haW5pbmdEYXRhKTtcbiAgICAvLyBUaGlzIHNsaWNlcyB0aGUgYXJyYXkgb25seSBpZiBtYXhSb3dzIGhhcyBiZWVuIHNldCBhbmQgaXMgbGVzcyB0aGFuIHRvdGFsUm93Q291bnRcbiAgICBmdWxsRGF0YS5sZW5ndGggPSByb3dzUmVxdWVzdGVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGZpcnN0UGFnZS5uYW1lLFxuICAgICAgZGF0YTogZnVsbERhdGEsXG4gICAgICBjb2x1bW5zOiBmaXJzdFBhZ2UuY29sdW1ucyxcbiAgICAgIHRvdGFsUm93Q291bnQ6IGlzRGF0YUxpbWl0ZWQgPyBwYWdlc1RvRmV0Y2ggKiB0aGlzLl9wYWdlUm93Q291bnQgOiByb3dzUmVxdWVzdGVkLFxuICAgICAgaXNUb3RhbFJvd0NvdW50TGltaXRlZDogaXNEYXRhTGltaXRlZCxcbiAgICAgIGlzU3VtbWFyeURhdGE6IGZpcnN0UGFnZS5pc1N1bW1hcnlEYXRhLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5yZWxlYXNlQXN5bmModGhpcy5faWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUb29sdGlwQ29udGV4dCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogU2VsZWN0aW9uIE1vZGVsLlxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgcXVhbGlmaWVkRmllbGRDYXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVmFsdWUgYmFzZWQgc2VsZWN0aW9uIG1vZGVsLiBNZWFudCBmb3IgaGllcmFyY2hpY2FsLCByYW5nZSBhbmQgY2F0ZWdvcmljYWwgc2VsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbHVlU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBzZWxlY3RWYWx1ZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuLyoqXG4gKiBIaWVyYXJjaGljYWwgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFZhbHVlU2VsZWN0aW9uTW9kZWwge31cblxuLyoqXG4gKiBSYW5nZSBiYXNlZCB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbmdlU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBtaW5WYWx1ZTogc3RyaW5nO1xuICBwdWJsaWMgbWF4VmFsdWU6IHN0cmluZztcbiAgcHVibGljIGluY2x1ZGVkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGltZW5zaW9uIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG4vKipcbiAqIFR1cGxlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgVHVwbGVTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBzZWxlY3Rpb25UeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyBvYmplY3RJZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuLyoqXG4gKiBDb250YWluZXIgY2xhc3MgdG8gcG9wdWxhdGUgYWxsIHRoZSBzZWxlY3Rpb24gbW9kZWxzIHdoZW4gcGFyc2luZyBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgcHVibGljIGhpZXJNb2RlbEFycjogQXJyYXk8SGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBkaW1Nb2RlbEFycjogQXJyYXk8RGltZW5zaW9uU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBxdWFudE1vZGVsQXJyOiBBcnJheTxSYW5nZVNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgc2VsZWN0aW9uOiBUdXBsZVNlbGVjdGlvbk1vZGVsO1xufVxuXG5leHBvcnQgY2xhc3MgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgIHB1YmxpYyBzZWxlY3RPcHRpb25zOiBzdHJpbmcsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQsXG4gICkge31cbn1cblxuZXhwb3J0IGNsYXNzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbk1vZGVsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQsIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIsIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0KSB7fVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFBvaW50IGltcGxlbWVudHMgQ29udHJhY3QuUG9pbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfeDogbnVtYmVyLCBwcml2YXRlIF95OiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCB4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3g7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5feTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeSc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGljaCB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlLlxuICovXG5leHBvcnQgZW51bSBHZXREYXRhVHlwZSB7XG4gIFN1bW1hcnkgPSAnc3VtbWFyeScsXG4gIFVuZGVybHlpbmcgPSAndW5kZXJseWluZycsXG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBsb2dpYyBmb3IgdmFyaW91cyBnZXREYXRhIGNhbGxzXG4gKlxuICogQGludGVyZmFjZSBHZXREYXRhU2VydmljZVxuICogQGV4dGVuZHMge0FwaVNlcnZpY2V9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2UgZXh0ZW5kcyBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpbWl0IG9mIHJvd3MgZm9yIGdldFVuZGVybHlpbmdEYXRhQXN5bmNcbiAgICovXG4gIGdldE1heFJvd0xpbWl0KCk6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5kZXJseWluZyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7R2V0RGF0YVR5cGV9IGdldFR5cGUgIFRoZSB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBvciBub3QgYWxpYXNlcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBvciBub3Qgc2VsZWN0aW9uIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyAgTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgU2hvdWxkIGFsbCBjb2x1bW5zIGJlIGluY2x1ZGVkXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPn0gIERhdGEgdGFibGUgcmVhZGVyIHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyBkYXRhXG4gICAqL1xuICBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0RGF0YVNvdXJjZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKi9cbiAgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PjtcblxuICAvKipcbiAgICogQHBhcmFtIHRhYmxlSWQgICAgIFRoZSB0YWJsZSBpZCB1c2VkIHRvIGZldGNoIGRhdGEuXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyICBUaGUgcGFnZSBudW1iZXIgKHplcm8tYmFzZWQpLlxuICAgKiBAcGFyYW0gcGFnZVNpemUgICAgVGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgb3duaW5nIERhdGFUYWJsZVJlYWRlclxuICAgKiBAcmV0dXJucyAgICAgICAgICAgQSBEYXRhVGFibGUgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIHBhZ2UuIFRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZFxuICAgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGxlc3MgdGhhbiByZXF1ZXN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YS5cbiAgICovXG4gIGdldFBhZ2VBc3luYyh0YWJsZUlkOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHRhYmxlSWQgICAgIFRoZSB0YWJsZSBpZCB1c2VkIHRvIGZldGNoIGRhdGEuXG4gICAqL1xuICByZWxlYXNlQXN5bmModGFibGVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cbiIsImltcG9ydCB7IEludGVybmFsQXBpRGlzcGF0Y2hlciwgVmVyc2lvbk51bWJlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnkgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5ub3RhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRXhwb3J0U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1Zpc3VhbE1vZGVsU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVml6U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVml6U2VydmljZUltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1pvbmVTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyLCBwbGF0Zm9ybVZlcnNpb24/OiBWZXJzaW9uTnVtYmVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbmltYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBEYXRhU291cmNlU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCwgcGxhdGZvcm1WZXJzaW9uKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHBvcnRTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBHZXREYXRhU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRmlsdGVyU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgTm90aWZpY2F0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgUGFyYW1ldGVyc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNlbGVjdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFubm90YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBab25lU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2l6ZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFZpc3VhbE1vZGVsU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVml6U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYW4gYXBpIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgZm9yIHRoaXMgc2VydmljZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBzZXJ2aWNlIG5hbWUgd2hpY2ggd2lsbCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcGktc2hhcmVkIHByb2plY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VydmljZU5hbWVzIHtcbiAgQXV0aGVudGljYXRpb24gPSAnYXV0aGVudGljYXRpb24nLFxuICBDbGllbnRJbmZvID0gJ2NsaWVudC1pbmZvLXNlcnZpY2UnLFxuICBEYXRhU291cmNlU2VydmljZSA9ICdkYXRhLXNvdXJjZS1zZXJ2aWNlJyxcbiAgR2V0RGF0YSA9ICdnZXQtZGF0YS1zZXJ2aWNlJyxcbiAgRmlsdGVyID0gJ2ZpbHRlci1zZXJ2aWNlJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbi1zZXJ2aWNlJyxcbiAgUGFyYW1ldGVycyA9ICdwYXJhbWV0ZXJzLXNlcnZpY2UnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uLXNlcnZpY2UnLFxuICBBbm5vdGF0aW9uID0gJ2Fubm90YXRpb24tc2VydmljZScsXG4gIFpvbmUgPSAnem9uZS1zZXJ2aWNlJyxcbiAgQW5pbWF0aW9uID0gJ2FuaW1hdGlvbi1zZXJ2aWNlJyxcbiAgVml6ID0gJ3Zpei1zZXJ2aWNlJyxcbiAgRXh0ZXJuYWxDb250ZXh0TWVudSA9ICdleHRlcm5hbC1jb250ZXh0LW1lbnUtc2VydmljZScsXG4gIEluaXRpYWxpemF0aW9uID0gJ2luaXRpYWxpemF0aW9uLXNlcnZpY2UnLFxuICBTdG9yeUFjdGl2YXRpb24gPSAnc3RvcnktYWN0aXZhdGlvbi1zZXJ2aWNlJyxcbiAgU2l6ZSA9ICdzaXplLXNlcnZpY2UnLFxuICBFeHBvcnQgPSAnZXhwb3J0LXNlcnZpY2UnLFxuICBWaXN1YWxNb2RlbCA9ICd2aXN1YWwtbW9kZWwtc2VydmljZScsXG59XG5cbi8qKlxuICogRG8gc29tZSBnbG9iYWwgZGVjbGFyYXRpb25zIHNvIHdlIGNhbiBjcmVhdGUgYSBzaW5nbGV0b24gb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqL1xuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnk6IHsgW3JlZ2lzdHJ5SWQ6IG51bWJlcl06IFNlcnZpY2VSZWdpc3RyeSB9O1xuICB9XG59XG5cbndpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgPSB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHx8IHt9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgc2VydmljZSBpbnRvIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LiBBbnkgZXhpc3Rpbmcgb25lIHdpbGxcbiAgICogYmUgb3ZlcndyaXR0ZW4uIHRoZSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgc2VydmljZS5zZXJ2aWNlTmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge0FwaVNlcnZpY2V9IHNlcnZpY2UgVGhlIHNlcnZpdmUgdG8gcmVnaXN0ZXJcbiAgICovXG4gIHJlZ2lzdGVyU2VydmljZShzZXJ2aWNlOiBBcGlTZXJ2aWNlKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBzZXJ2aWNlIGZyb20gdGhlIHJlZ2lzdHJ5LiBJZiB0aGVyZSBpcyBub3QgYVxuICAgKiBzZXJ2aWNlIHJlZ2lzdGVyZWQgdW5kZXIgdGhhdCBuYW1lLCB0aHJvd3MgYW5kIGVycm9yXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogQHJldHVybnMge1R9IFRoZSByZXF1ZXN0ZWQgc2VydmljZVxuICAgKi9cbiAgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQ7XG59XG5cbmNsYXNzIFNlcnZpY2VSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVnaXN0cnkge1xuICBwcml2YXRlIF9zZXJ2aWNlczogeyBbc2VydmljZU5hbWU6IHN0cmluZ106IEFwaVNlcnZpY2UgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2VydmljZXMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQge1xuICAgIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2Uuc2VydmljZU5hbWVdID0gc2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZXJ2aWNlPFQgZXh0ZW5kcyBBcGlTZXJ2aWNlPihzZXJ2aWNlTmFtZTogc3RyaW5nKTogVCB7XG4gICAgaWYgKCF0aGlzLl9zZXJ2aWNlcy5oYXNPd25Qcm9wZXJ0eShzZXJ2aWNlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgU2VydmljZSBub3QgcmVnaXN0ZXJlZDogJHtzZXJ2aWNlTmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VydmljZXNbc2VydmljZU5hbWVdIGFzIFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBmb3IgZ2V0dGluZyBhY2Nlc3MgdG8gdGhlIHNpbmdsZSBpbnN0YW5jZVxuICogb2YgdGhlIEFwaVNlcnZpY2VSZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJ5SWQuXG4gKlxuICogRXh0ZW5zaW9ucyBieSBkZXNpZ24gZG9uJ3QgbmVlZCB0byBzdG9yZS9hY2Nlc3MgbXVsdGlwbGUgc2VydmljZSByZWdpc3RyaWVzLiBUaGVpciBzaW5nbGUgaW5zdGFuY2Ugb2YgU2VydmljZVJlZ2lzdHJ5IGlzXG4gKiBzdG9yZWQvYWNjZXNzIHdpdGggcmVnaXN0cnlJZCA9IDAuXG4gKlxuICogV2hlcmVhcyBFbWJlZGRpbmcgbmVlZHMgdG8gYmUgYXdhcmUgb2Ygd2hpY2ggU2VydmljZVJlZ2lzdHJ5IHRvIHVzZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB2aXp6ZXMgZW1iZWRkZWQuXG4gKiBBbiBleGFtcGxlIG9mIGhvdyB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHdpbGwgbG9vayB3aGVuIHRoZXJlIGFyZSB0d28gdml6emVzOiB7IDAgOiBTZXJ2aWNlUmVnaXN0cnksIDEgOiBTZXJ2aWNlUmVnaXN0cnl9XG4gKiB3aGVyZSByZWdpc3RyeSBJRCBvZiAwICYgMSByZWZlcnMgdG8gdml6J3MgaW50ZXJuYWwgaWRlbnRpZmllciAod2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IFZpek1hbmFnZXIpLlxuICovXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgU2VydmljZVJlZ2lzdHJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldChyZWdpc3RyeUlkOiBudW1iZXIpOiBTZXJ2aWNlUmVnaXN0cnkge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCAhd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSkge1xuICAgICAgQXBpU2VydmljZVJlZ2lzdHJ5LnNldEluc3RhbmNlKHJlZ2lzdHJ5SWQsIG5ldyBTZXJ2aWNlUmVnaXN0cnlJbXBsKCkpO1xuICAgIH1cblxuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdTZXJ2aWNlIHJlZ2lzdHJ5IGZhaWxlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdGhhdCBzZXRzIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5IGluc3RhbmNlIGZvciB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RyeUlkLiBDYW4gYmUgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqXG4gICAqIEBwYXJhbSB7U2VydmljZVJlZ2lzdHJ5fSBzZXJ2aWNlUmVnaXN0cnkgVGhlIG5ldyByZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRJbnN0YW5jZShyZWdpc3RyeUlkOiBudW1iZXIsIHNlcnZpY2VSZWdpc3RyeTogU2VydmljZVJlZ2lzdHJ5KTogdm9pZCB7XG4gICAgaWYgKCF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5KSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0gPSBzZXJ2aWNlUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogT25seSB1c2VkIGJ5IHVuaXQgdGVzdHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xlYXJSZWdpc3RyeSgpOiB2b2lkIHtcbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0ge307XG4gIH1cblxuICAvLyBQcml2YXRlIHRvIGF2b2lkIGFueW9uZSBjb25zdHJ1Y3RpbmcgdGhpc1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cbiIsImltcG9ydCB7IFJlcGxheVNwZWVkVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5pbWF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBbmltYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5pbWF0aW9uO1xuICB9XG5cbiAgcHVibGljIHJlcGxheUFzeW5jKHJlcGxheVNwZWVkOiBSZXBsYXlTcGVlZFR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXTogMS4wLFxuICAgIH07XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFJlcGxheVNwZWVkVHlwZT4ocmVwbGF5U3BlZWQsIFJlcGxheVNwZWVkVHlwZSwgJ1JlcGxheVNwZWVkVHlwZScpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmVwbGF5U3BlZWRdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnNldFJlcGxheVNwZWVkVHlwZS5jb252ZXJ0KHJlcGxheVNwZWVkKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlcGxheUFuaW1hdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFubm90YXRlRW51bSwgQW5ub3RhdGlvbiwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLCBUdXBsZVNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vTW9kZWxzL1NlbGVjdGlvbk1vZGVscyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5ub3RhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBhbm5vdGF0ZSBhIG1hcmsgb24gdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBtYXJrXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uVGV4dFxuICAgKi9cbiAgcHVibGljIGFubm90YXRlTWFya0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgbWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZU1hcmtTZWxlY3Rpb25JZHMoW21hcmtdKTtcbiAgICBjb25zdCBkdW1teVRhcmdldFBvaW50ID0geyB4OiAwLCB5OiAwIH07XG4gICAgY29uc3QgZm9ybWF0dGVkVGV4dCA9IGA8Zm9ybWF0dGVkLXRleHQ+PHJ1bj4ke2Fubm90YXRpb25UZXh0fTwvcnVuPjwvZm9ybWF0dGVkLXRleHQ+YDtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhbm5vdGF0ZU1hcmtBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Bbm5vdGF0ZUVudW1dOiBBbm5vdGF0ZUVudW0uTWFyayxcbiAgICAgIFtQYXJhbWV0ZXJJZC5UYXJnZXRQb2ludF06IGR1bW15VGFyZ2V0UG9pbnQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uTGlzdF06IFtzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb25dLFxuICAgICAgW1BhcmFtZXRlcklkLkZvcm1hdHRlZFRleHRdOiBmb3JtYXR0ZWRUZXh0LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ3JlYXRlQW5ub3RhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHJldHJpZXZlIGFubm90YXRpb25zIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8QW5ub3RhdGlvbj4+fVxuICAgKi9cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbm5vdGF0aW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QW5ub3RhdGlvbnMsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbnNMaXN0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEFubm90YXRpb24+O1xuICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uc0xpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZW1vdmUgYW4gYW5ub3RhdGlvbiBmcm9tIGEgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICovXG4gIHB1YmxpYyByZW1vdmVBbm5vdGF0aW9uQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VBbm5vdGF0aW9uU2VsZWN0aW9uSWRzKFthbm5vdGF0aW9uXSk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQW5ub3RhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtzSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VNYXJrU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgbWFya3MuZm9yRWFjaCgobWFyaykgPT4ge1xuICAgICAgY29uc3QgdHVwbGVJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFyay50dXBsZUlkO1xuICAgICAgaWYgKHR1cGxlSWQgIT09IHVuZGVmaW5lZCAmJiB0dXBsZUlkICE9PSBudWxsICYmIHR1cGxlSWQgPiAwKSB7XG4gICAgICAgIGlkcy5wdXNoKHR1cGxlSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIHR1cGxlIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHR1cGxlSWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdHVwbGUgaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAndHVwbGVzJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VBbm5vdGF0aW9uU2VsZWN0aW9uSWRzKGFubm90YXRpb25zOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhbm5vdGF0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IGFubm90YXRpb24uYW5ub3RhdGlvbklkO1xuICAgICAgaWYgKGFubm90YXRpb25JZCAhPT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25JZCAhPT0gbnVsbCAmJiBhbm5vdGF0aW9uSWQgPj0gMCkge1xuICAgICAgICBpZHMucHVzaChhbm5vdGF0aW9uSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIGFubm90YXRpb24gaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgYW5ub3RhdGlvbklkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIGFubm90YXRpb24gaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAnYW5ub3RhdGlvbnMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG1hcCBBbm5vdGF0aW9uIHRvIE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblxuICAgKiBAcmV0dXJucyB7QW5ub3RhdGlvbn1cbiAgICovXG4gIHByaXZhdGUgbWFwQW5ub3RhdGlvbihhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKTogQ29udHJhY3QuQW5ub3RhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFubm90YXRpb25IVE1MOiBhbm5vdGF0aW9uLmFubm90YXRpb25UZXh0LFxuICAgICAgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uLmFubm90YXRpb25JZCxcbiAgICAgIGFubm90YXRpb25UZXh0OiBhbm5vdGF0aW9uLmFubm90YXRpb25QbGFpblRleHQsXG4gICAgICBhbm5vdGF0aW9uVHlwZTogSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmFubm90YXRpb25UeXBlLmNvbnZlcnQoYW5ub3RhdGlvbi5hbm5vdGF0ZUVudW0pLFxuICAgICAgdHVwbGVJZDogYW5ub3RhdGlvbi50dXBsZUlkISxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciB0aGUgQW5ub3RhdGlvbnMgdG8gTWFyayBBbm5vdGF0aW9ucywgYW5kIG1hcCB0aGVtIHRvIE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvbnNcbiAgICogQHJldHVybnMge0FycmF5PEFubm90YXRpb24+fVxuICAgKi9cbiAgcHJpdmF0ZSBhbm5vdGF0aW9uRmlsdGVyTWFwKGFubm90YXRpb25zOiBBcnJheTxBbm5vdGF0aW9uPik6IEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+IHtcbiAgICBjb25zdCBhbm5vdGF0aW9uSW5mb3MgPSBhbm5vdGF0aW9ucy5tYXAoKGFubm90YXRpb24pID0+IHRoaXMubWFwQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7XG5cbiAgICByZXR1cm4gYW5ub3RhdGlvbkluZm9zO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbWJlZGRpbmdCb290c3RyYXBJbmZvLCBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRJbmZvU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBDbGllbnRJbmZvU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkNsaWVudEluZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xpZW50SW5mb0FzeW5jKCk6IFByb21pc2U8RW1iZWRkaW5nQm9vdHN0cmFwSW5mbz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RW1iZWRkaW5nQ2xpZW50SW5mbztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2xpZW50SW5mb0FzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mbyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFbWJlZGRpbmdCb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIGNsaWVudEluZm87XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnksXG4gIERhdGFTY2hlbWEsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIExvZ2ljYWxUYWJsZUluZm8sXG4gIFBhcmFtZXRlcklkLFxuICBUYWJsZUluZm8sXG4gIFRhYmxlSW5mb3MsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YVNvdXJjZSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uLy4uL0ZpZWxkJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0ZpZWxkSW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY29uc3QgU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPOiBMb2dpY2FsVGFibGVJbmZvID0ge1xuICBpZDogSW50ZXJuYWxDb250cmFjdC5BcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVJZCxcbiAgY2FwdGlvbjogSW50ZXJuYWxDb250cmFjdC5BcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVDYXB0aW9uLFxufTtcblxuLy8gVGhlIG1pbmltdW0gcGxhdGZvcm0gdmVyc2lvbiB3aGVuIE9iamVjdCBNb2RlbCB3YXMgc3VwcG9ydGVkXG5jb25zdCBwbGF0Zm9ybVZlcnNpb25PYmplY3RNb2RlbFN1cHBvcnQgPSB7IG1ham9yOiAxLCBtaW5vcjogMjAsIGZpeDogMSB9O1xuXG5leHBvcnQgY2xhc3MgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRGF0YVNvdXJjZVNlcnZpY2Uge1xuICAvLyBTaW5jZSBPYmplY3QgTW9kZWwgaXMgc3VwcG9ydGVkIHNpbmNlIFRhYmxlYXUgMjAyMC4yLCBEYXRhU291cmNlU2VydmljZUltcGwgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggdGhlXG4gIC8vIHBsYXRmb3JtIHZlcnNpb24gd2hlbiBPTSB3YXMgc3VwcG9ydGVkLiBPbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3IgVGFibGVhdSB2ZXJzaW9ucyA8PSAyMDIwLjEsIGFsbCBhZGRpdGlvbmFsXG4gIC8vIGNvZGUgaW4gaGVyZSBmb3IgT2JqZWN0IE1vZGVsIGNhbiBiZSByZW1vdmVkLlxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9wbGF0Zm9ybVZlcnNpb246IEludGVybmFsQ29udHJhY3QuVmVyc2lvbk51bWJlciA9IHBsYXRmb3JtVmVyc2lvbk9iamVjdE1vZGVsU3VwcG9ydCxcbiAgKSB7XG4gICAgc3VwZXIoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKGRhdGFTb3VyY2VJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWZyZXNoQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRlbHRhVGltZU1zXTogMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG91bGRSZWZyZXNoRFNdOiB0cnVlLFxuICAgIH07XG5cbiAgICAvLyBPbiBzZXJ2ZXI6IE5vdCBwYXNzaW5nIHRoZSBkYXRhc291cmNlIGlkIHdpbGwgcmVmcmVzaCBhbGwgZGF0YXNvdXJjZXMuXG4gICAgaWYgKGRhdGFTb3VyY2VJZCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdID0gZGF0YVNvdXJjZUlkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlZnJlc2hEYXRhU291cmNlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZVRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxUYWJsZUluZm8+PiB7XG4gICAgY29uc3Qgam9pblBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBY3RpdmVUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRBY3RpdmVUYWJsZXMsIGpvaW5QYXJhbWV0ZXJzKS50aGVuPEFycmF5PFRhYmxlSW5mbz4+KChqb2luUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlSW5mb3MgPSBqb2luUmVzcG9uc2UucmVzdWx0IGFzIFRhYmxlSW5mb3M7XG5cbiAgICAgIC8vIGdldEFjdGl2ZVRhYmxlcyBpcyB1bnN1cHBvcnRlZCBmb3IgY3ViZXMgYW5kIEdBLiBXZSBkbyBub3QgaGF2ZSBhIGNvbm5lY3Rpb24gdHlwZSBwcm9wZXJ0eVxuICAgICAgLy8gYXZhaWxhYmxlIGZyb20gdGhlIHBsYXRmb3JtIChpbnRlbnRpb25hbGx5LCB0byByZWR1Y2UgY29kZSBjaHVybiBhcyBuZXcgY29ubmVjdGlvbnMgYXJlIGFkZGVkKS5cbiAgICAgIC8vIEluc3RlYWQsanVzdCBjaGVjayBpZiBhbnkgdGFibGVzIGFyZSByZXR1cm5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBhbnkgbm9uLXRhYmxlIGJhc2VkIGRhdGFzb3VyY2UuXG4gICAgICBpZiAodGFibGVJbmZvcy50YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZE1ldGhvZEZvckRhdGFTb3VyY2VUeXBlLCBgZ2V0QWN0aXZlVGFibGVzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MudGFibGVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhdGFTb3VyY2VzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU291cmNlcywgcGFyYW1ldGVycykudGhlbjxEYXRhU2NoZW1hPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVNjaGVtYTtcbiAgICAgIHJldHVybiBkYXRhU2NoZW1hO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEFsbERhdGFTb3VyY2VzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWxsRGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMsIHBhcmFtcykudGhlbjxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25TdW1tYXJpZXMgPSByZXNwb25zZS5yZXN1bHQgYXMgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uU3VtbWFyaWVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoZ2xvYmFsZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWVsZEFuZERhdGFTb3VyY2U7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEZpZWxkQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkSWRdOiBnbG9iYWxmaWVsZE5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5GaWVsZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU291cmNlID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkRhdGFTb3VyY2VdIGFzIEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZTtcbiAgICAgIGNvbnN0IGZpZWxkID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkZpZWxkXSBhcyBGaWVsZDtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGaWVsZChmaWVsZCwgdGhpcy5jb252ZXJ0RGF0YVNvdXJjZShkYXRhU291cmNlKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGlmICghdGhpcy5pc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgc2VudGluZWwgSUQgY2FuIGJlIHBhc3NlZCB0byBkYXRhc291cmNlLmdldExvZ2ljYWxUYWJsZURhdGEuXG4gICAgICAgKiBPbmNlIHRoZSBkZXNrdG9wIGlzIHVwZ3JhZGVkIHRvIGEgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIG9iamVjdCBtb2RlbCxcbiAgICAgICAqIHRoZSBzZW50aW5lbCBJRCB3aWxsIGF1dG9tYXRpY2FsbHkgZmV0Y2ggdGhlIHVwZ3JhZGVkIHRhYmxlLlxuICAgICAgICogKi9cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc29sdmUpID0+IHJlc29sdmUoW1NFTlRJTkVMX0xPR0lDQUxfVEFCTEVfSU5GT10pKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRMb2dpY2FsVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PiB7XG4gICAgaWYgKCF0aGlzLmlzT2JqZWN0TW9kZWxTdXBwb3J0ZWRCeVBsYXRmb3JtKCkpIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBzZW50aW5lbCBJRCBjYW4gYmUgcGFzc2VkIHRvIHdvcmtzaGVldC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhLlxuICAgICAgICogT25jZSB0aGUgZGVza3RvcCBpcyB1cGdyYWRlZCB0byBhIHZlcnNpb24gdGhhdCBzdXBwb3J0cyBvYmplY3QgbW9kZWwsXG4gICAgICAgKiB0aGUgc2VudGluZWwgSUQgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSB1cGdyYWRlZCB0YWJsZS5cbiAgICAgICAqICovXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNvbHZlKSA9PiByZXNvbHZlKFtTRU5USU5FTF9MT0dJQ0FMX1RBQkxFX0lORk9dKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGaWVsZChmaWVsZDogSW50ZXJuYWxDb250cmFjdC5GaWVsZCwgZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkZpZWxkIHtcbiAgICByZXR1cm4gbmV3IEZpZWxkKG5ldyBGaWVsZEltcGwoZmllbGQsIGRhdGFTb3VyY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZTogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU291cmNlKG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlLCB0aGlzLl9yZWdpc3RyeUlkKSk7XG4gIH1cblxuICBwcml2YXRlIGlzT2JqZWN0TW9kZWxTdXBwb3J0ZWRCeVBsYXRmb3JtKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbk5vT2JqZWN0TW9kZWxTdXBwb3J0ID0geyBtYWpvcjogMSwgbWlub3I6IDEzLCBmaXg6IDAgfTtcbiAgICByZXR1cm4gSW50ZXJuYWxDb250cmFjdC5WZXJzaW9uTGVzc1RoYW4ocGxhdGZvcm1WZXJzaW9uTm9PYmplY3RNb2RlbFN1cHBvcnQsIHRoaXMuX3BsYXRmb3JtVmVyc2lvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwLFxuICBFeHBvcnRGaWxlLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIEV4cG9ydERhdGFPcHRpb25zLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXhwb3J0SGVscGVycyc7XG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vRXhwb3J0U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEV4cG9ydFNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHBvcnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlKTogUHJvbWlzZTxFeHBvcnRDcm9zc3RhYlNoZWV0TWFwPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1cnJlbnRTaGVldFR5cGVdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hlZXRUeXBlLmNvbnZlcnQoY3VycmVudFNoZWV0VHlwZSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0Q3Jvc3N0YWJBc3luYyhcbiAgICBzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgICBleHBvcnRhYmxlV29ya3NoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgY3VycmVudFNoZWV0VHlwZTogRXh0ZXJuYWxTaGVldFR5cGUsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWUoZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzLCBzaGVldE5hbWUpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q3Jvc3N0YWJGaWxlRm9ybWF0Pihmb3JtYXQsIENyb3NzdGFiRmlsZUZvcm1hdCwgJ0Nyb3NzdGFiRmlsZUZvcm1hdCcpO1xuXG4gICAgLy8gVGhlIHByZXMgbGF5ZXIgY29tbWFuZCBmb3IgZXhwb3J0aW5nIENyb3NzdGFiIHVzZXMgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBpbnN0ZWFkIG9mIHNoZWV0IG5hbWVzLlxuICAgIC8vIFRoZSBleHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpIGN1cnJlbnQgZG9lcyBub3Qgc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBvZiBpdHMgc2hlZXRzXG4gICAgLy8gc28gd2UgY2FsbCBhIHByZXMgbGF5ZXIgY29tbWFuZCB0aGF0IGdpdmVzIHVzIHRoZSBTaW1wbGVTaGVldElkZW50aWZpZXIgZm9yIGVhY2ggc2hlZXQgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlXG4gICAgLy8gZXhwb3J0IENyb3NzdGFiIGRpYWxvZyBwb3B1cC5cbiAgICBjb25zdCBzaGVldE5hbWVUb0lkTWFwID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMoY3VycmVudFNoZWV0VHlwZSk7XG4gICAgaWYgKCFzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnbWlzc2luZyBzaGVldCBkb2MgaWQgZnJvbSBzaGVldE1hcCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRDcm9zc3RhYkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldElkZW50aWZpZXJdOiBzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0sXG4gICAgICBbUGFyYW1ldGVySWQuU2VuZE5vdGlmaWNhdGlvbnNdOiB0cnVlLCAvLyBzZW5kIG5vdGlmaWNhdGlvbiBvbiBwcmVzIGxheWVyIHRoYXQgdHJpZ2dlcnMgZmlsZSBkb3dubG9hZFxuICAgIH07XG5cbiAgICAvLyBwcmVzIGxheWVyIGNvbW1hbmQgaW52b2tlZCBkZXBlbmRzIG9uIHRoZSBjcm9zc3RhYiBmaWxlIGZvcm1hdFxuICAgIGxldCB2ZXJiO1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5DU1Y6XG4gICAgICAgIHZlcmIgPSBWZXJiSWQuRXhwb3J0Q3Jvc3N0YWJDc3ZEb3dubG9hZDtcbiAgICAgICAgLy8gQ1NWIG9ubHkgcGFyYW1ldGVyOiBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1jcm9zc3RhYi1vcHRpb25zLWRpYWxvZyByZXBvXG4gICAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVXNlVGFiRGVsaW1pdGVyc10gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiRXhjZWxEb3dubG9hZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3Vuc3VwcG9ydGVkIENyb3NzdGFiIGZpbGUgZm9ybWF0LicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuQ3Jvc3N0YWJDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydERhdGFBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG9wdGlvbnM6IEV4cG9ydERhdGFPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUV4cG9ydERhdGFPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQob3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgY29uc3QgY29sdW1uc1RvSW5jbHVkZUJ5SWQgPSBBcnJheS5mcm9tKGNvbHVtbnNBc1NldCk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydERhdGFEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0RGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBvcHRpb25zLmlnbm9yZUFsaWFzZXMgPz8gZmFsc2UsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiBjb2x1bW5zVG9JbmNsdWRlQnlJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48dm9pZD4oKCkgPT4ge30pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuRGF0YUNyZWF0aW9uRXJyb3IsICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0UG93ZXJQb2ludEFzeW5jKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICAvLyBOb3RlOiB0aGUgRXhwb3J0T3JpZ2luVXJsIHBhcmFtIGlzIGxpc3RlZCBhcyBvcHRpb25hbCBmb3IgdGhlIHByZXMgbGF5ZXIgY29tbWFuZCB3ZSBhcmUgaW52b2tpbmc7IGhvd2V2ZXIsXG4gICAgLy8gcmVjZW50IGNoYW5nZXMgd2VyZSBtYWRlIHRoYXQgZW5mb3JjZWQgdGhlIHVzZSBvZiB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gaW52b2tpbmcgdGhpcyBjb21tYW5kIHdpdGggbm8gRXhwb3J0T3JpZ2luVXJsLlxuICAgIC8vIHNlZSBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBvd2VycG9pbnQtb3B0aW9ucy1kaWFsb2cgcmVwby5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBvd2VycG9pbnREb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UG93ZXJQb2ludEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHBvcnRPcmlnaW5VcmxdOiAnJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RlZFNoZWV0TmFtZXNdOiBzaGVldE5hbWVzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBTaGFyZWRFcnJvckNvZGVzLlBvd2VyUG9pbnRDcmVhdGlvbkVycm9yLFxuICAgICAgICAgICdBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgdGhlIFBvd2VyUG9pbnQgZmlsZS4nLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0UERGQXN5bmMoXG4gICAgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnRQREZPcHRpb25zKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lcywgZXhwb3J0U2NlbmFyaW9zKTtcblxuICAgIGNvbnN0IGludGVybmFsRXhwb3J0UGRmT3B0aW9uczogSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRQREZPcHRpb25zQXN5bmMoKTtcbiAgICBFeHBvcnRIZWxwZXJzLnVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBkZkRvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRQREZBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0UGRmT3B0aW9uc106IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5QREZDcmVhdGlvbkVycm9yLCAnVW5hYmxlIHRvIGNyZWF0ZSBQREYgYmVjYXVzZSBzb21ldGhpbmcgd2VudCB3cm9uZy4gVHJ5IGFnYWluLicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk6IFByb21pc2U8SW50ZXJuYWxFeHBvcnRQREZPcHRpb25zPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRQZGZPcHRpb25zO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRQZGZPcHRpb25zQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXBpTWVudVR5cGUsIENvbnRleHRNZW51T3B0aW9ucyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnU7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIGNvbmZpZzogQ29udGV4dE1lbnVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGVuZEV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGVuZENvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbURpc3BsYXlOYW1lXTogY29uZmlnLmRpc3BsYXlOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IG5ld01lbnVJdGVtSWQgPSByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIG5ld01lbnVJdGVtSWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuUmVtb3ZlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4ZWN1dGVFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleGVjdXRlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbmFtZUV4dGVybmFsTWVudTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVuYW1lQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVIZWFkZXJdOiBtZW51SGVhZGVyLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudURlc2NyaXB0aW9uXTogbWVudURlc2NyaXB0aW9uLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRlUmFuZ2VUeXBlLFxuICBFbWJlZGRpbmdFcnJvckNvZGVzLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEV4dGVybmFsRmlsdGVyVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBGaWx0ZXJUeXBlLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEludGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHtcbiAgQ2F0ZWdvcmljYWxEb21haW4sXG4gIENhdGVnb3JpY2FsRmlsdGVyLFxuICBIaWVyYXJjaGljYWxEYXRhVmFsdWUsXG4gIEhpZXJhcmNoaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwsXG4gIFJhbmdlRG9tYWluLFxuICBSYW5nZUZpbHRlcixcbiAgUmVsYXRpdmVEYXRlRmlsdGVyLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvRmlsdGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRmlsdGVyU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkZpbHRlcjtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseUZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPVxuICAgICAgZmlsdGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseVJhbmdlRmlsdGVyQXN5bmMnLFxuICAgIH07XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1pbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1pbjogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWluIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtaW4gPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5taW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluID0gZmlsdGVyT3B0aW9ucy5taW47XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWluXSA9IG1pbjtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1heCAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1heDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWF4IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtYXggPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5tYXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4ID0gZmlsdGVyT3B0aW9ucy5tYXg7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWF4XSA9IG1heDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbnVsbCBvcHRpb24gaXMgdXNlZCB3aXRoIG1pbittYXggZm9yICdpbmNsdWRlLXJhbmdlJyBvciAnaW5jbHVkZS1yYW5nZS1vci1udWxsJ1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VOdWxsT3B0aW9uXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5udWxsT3B0aW9ucy5jb252ZXJ0KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbik7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHJlc3BvbnNlLnJlc3VsdCBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+IHwgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzLFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkhpZXJhcmNoaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcblxuICAgIGNvbnN0IGhpZXJhcmNoaWNhbExldmVscyA9ICh2YWx1ZXMgYXMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzKS5sZXZlbHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoaWVyYXJjaGljYWxMZXZlbHMpICYmIGhpZXJhcmNoaWNhbExldmVscy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBoaWVyYXJjaGljYWxMZXZlbHM7XG4gICAgfSBlbHNlIGlmICgodmFsdWVzIGFzIEFycmF5PFN0cmluZz4pLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlIHNlcnZlciBjb21tYW5kIGV4cGVjdHMgZW1wdHkgbGlzdCBmb3IgY2xlYXJpbmcgdGhlIGZpbHRlclxuICAgICAgLy8gaXQgYWxzbyBleHBlY3RzIGVpdGhlcnMgRmlsdGVyTGV2ZWxzIG9yIEZpbHRlclZhbHVlcyB0byBiZSBzZXRcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyTGV2ZWxzXSA9IFtdO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5DbGVhckZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9zbmUpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBlcmlvZFR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnBlcmlvZFR5cGUuY29udmVydChvcHRpb25zLnBlcmlvZFR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0ZVJhbmdlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KG9wdGlvbnMucmFuZ2VUeXBlKTtcbiAgICBpZiAob3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTGFzdE4gfHwgb3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTmV4dE4pIHtcbiAgICAgIGlmIChvcHRpb25zLnJhbmdlTiA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucmFuZ2VOID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyxcbiAgICAgICAgICAnTWlzc2luZyByYW5nZU4gZmllbGQgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIgb2YgTEFTVE4gb3IgTkVYVE4uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmFuZ2VOXSA9IG9wdGlvbnMucmFuZ2VOO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFuY2hvckRhdGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFuY2hvckRhdGUgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQW5jaG9yRGF0ZV0gPSB0aGlzLmNvbnZlcnRBbmNob3JEYXRlKG9wdGlvbnMuYW5jaG9yRGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENhdGVnb3JpY2FsRG9tYWluQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRDYXRlZ29yaWNhbERvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbiwgZG9tYWluVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmFuZ2VEb21haW5Bc3luYyh3b3Jrc2hlZXROYW1lOiBzdHJpbmcsIGZpZWxkSWQ6IHN0cmluZywgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuUmFuZ2VEb21haW4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFJhbmdlRG9tYWluO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRSYW5nZURvbWFpbkFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRvbWFpblR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlckRvbWFpblR5cGUuY29udmVydChkb21haW5UeXBlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuUmFuZ2VEb21haW4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW47XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSYW5nZURvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhc2hib2FyZEZpbHRlcnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhc2hib2FyZEZpbHRlcnNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkRhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseURhc2hib2FyZEZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJVcGRhdGVUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJVcGRhdGVUeXBlLmNvbnZlcnQodXBkYXRlVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Jc0V4Y2x1ZGVNb2RlXSA9IGZpbHRlck9wdGlvbnMgJiYgISFmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJyk7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cz8ubWFwKCh3b3Jrc2hlZXRJbmZvOiBJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlcldvcmtzaGVldE1vZGVsKSA9PiB7XG4gICAgICBpZiAod29ya3NoZWV0SW5mby5pc1NlbGVjdGVkKSB7XG4gICAgICAgIHdvcmtzaGVldE5hbWVzLnB1c2god29ya3NoZWV0SW5mby53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+LFxuICApOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jSW50ZXJuYWwnKTtcbiAgICBpZiAoIXNoYXJlZEZpbHRlck1vZGVsIHx8ICFzaGFyZWRGaWx0ZXJNb2RlbC53b3Jrc2hlZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1RoaXMgZmlsdGVyIGRvZXMgbm90IGFwcGx5IHRvIG11bHRpcGxlIHdvcmtzaGVldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd2VkV29ya3NoZWV0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgYWN0aXZlV29ya3NoZWV0ID0gJyc7XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cy5mb3JFYWNoKCh3b3Jrc2hlZXQpID0+IHtcbiAgICAgIC8vIEdldCBhY3RpdmUgd29ya3NoZWV0XG4gICAgICBpZiAod29ya3NoZWV0LmlzQWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZVdvcmtzaGVldCA9IHdvcmtzaGVldC53b3Jrc2hlZXROYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3B1bGF0ZSBhbGxvd2VkIHdvcmtzaGVldHNcbiAgICAgIGlmICh3b3Jrc2hlZXQuaXNTZWxlY3RlZCB8fCB3b3Jrc2hlZXQuaXNFbmFibGVkKSB7XG4gICAgICAgIGFsbG93ZWRXb3Jrc2hlZXRzLnB1c2god29ya3NoZWV0LndvcmtzaGVldE5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGFjdGl2ZVdvcmtzaGVldCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnTm8gYWN0aXZlIHdvcmtzaGVldCcpO1xuICAgIH1cblxuICAgIGlmICghYXBwbHlUb1dvcmtzaGVldHMuaW5jbHVkZXMoYWN0aXZlV29ya3NoZWV0KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FjdGl2ZVdvcmtzaGVldH0gbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgYXBwbGllZCB3b3Jrc2hlZXRzYCk7XG4gICAgfVxuXG4gICAgYXBwbHlUb1dvcmtzaGVldHMuZm9yRWFjaCgoc2hlZXQpID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcHJlc2VudCB3aXRoaW4gY29tcGF0aWJsZSBzaGVldHNcbiAgICAgIGlmICghYWxsb3dlZFdvcmtzaGVldHMuaW5jbHVkZXMoc2hlZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVGhlIGZpZWxkICR7ZmllbGROYW1lfSBpc24ndCBhcHBsaWNhYmxlIHRvIHRoZSB3b3Jrc2hlZXQgJHtzaGVldH1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2hhbmdlU2hhcmVkRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdID0gJ3NldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMnO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TaGFyZWRGaWx0ZXJTaGVldHNdID0gYXBwbHlUb1dvcmtzaGVldHM7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nW10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGFwcGx5VG9Xb3Jrc2hlZXRzO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSGVscGVyIE1ldGhvZHNcblxuICBwcml2YXRlIGV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9IHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICAgIHJldHVybiBzaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERvbWFpbkZpbHRlcnMoZG9tYWluRmlsdGVyczogQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+KTogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgY29uc3QgZmlsdGVyczogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiA9IFtdO1xuICAgIGRvbWFpbkZpbHRlcnMuZm9yRWFjaCgoZG9tYWluRmlsdGVyKSA9PiB7XG4gICAgICBzd2l0Y2ggKGRvbWFpbkZpbHRlci5maWx0ZXJUeXBlKSB7XG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5DYXRlZ29yaWNhbDoge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIENhdGVnb3JpY2FsIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhpZXJhcmNoaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmFuZ2U6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmFuZ2VGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSYW5nZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSZWxhdGl2ZSBEYXRlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoZHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZHYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbEZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0V4Y2x1ZGUsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGllcmFyY2hpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIpOiBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoaGllcmFyY2hpY2FsRGF0YVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbERhdGFWYWx1ZShcbiAgICAgICAgRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGhpZXJhcmNoaWNhbERhdGFWYWx1ZS52YWx1ZSksXG4gICAgICAgIGhpZXJhcmNoaWNhbERhdGFWYWx1ZS5oaWVyYXJjaGljYWxQYXRoLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUubGV2ZWwsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4gPSBkb21haW5GaWx0ZXIubGV2ZWxJbmZvLm1hcCgoYUxldmVsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbExldmVsRGV0YWlsKFxuICAgICAgICBhTGV2ZWwubmFtZSxcbiAgICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuY29udmVydChhTGV2ZWwubGV2ZWxTZWxlY3Rpb25TdGF0ZSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBkb21haW5GaWx0ZXIuZGltZW5zaW9uTmFtZSxcbiAgICAgIGRvbWFpbkZpbHRlci5oaWVyYXJjaHlDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmxldmVscyxcbiAgICAgIGxldmVsRGV0YWlscyxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyKTogQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICAgIGNvbnN0IG1pblZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1pbik7XG4gICAgY29uc3QgbWF4VmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5SYW5nZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgZG9tYWluRmlsdGVyLmluY2x1ZGVOdWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcik6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gICAgY29uc3QgYW5jaG9yRGF0ZVZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLmFuY2hvckRhdGUpO1xuICAgIHJldHVybiBuZXcgUmVsYXRpdmVEYXRlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBhbmNob3JEYXRlVmFsdWUsXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChkb21haW5GaWx0ZXIucGVyaW9kVHlwZSksXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KGRvbWFpbkZpbHRlci5yYW5nZVR5cGUpLFxuICAgICAgZG9tYWluRmlsdGVyLnJhbmdlTixcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiA9IGRvbWFpbi52YWx1ZXMubWFwKChkb21haW5EdikgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5Edik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbERvbWFpbih2YWx1ZXMsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICAgIGNvbnN0IG1pbjogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5taW4pO1xuICAgIGNvbnN0IG1heDogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VEb21haW4obWluLCBtYXgsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QW5jaG9yRGF0ZShhbmNob3JEYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAvLyBDb252ZXJ0cyBhIERhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgZm9ybWF0IHRoYXQgdGhlIHNlcnZlciBleHBlY3RzIGZvciBkYXRlL3RpbWUgdmFsdWVzLlxuICAgIC8vIElmIGFuY2hvckRhdGUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCBEYXRlIG9iamVjdCwgYW55IG9mIHRoZXNlIHdvdWxkIGJlIE5hTi5cbiAgICBjb25zdCB5ZWFyID0gYW5jaG9yRGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gYW5jaG9yRGF0ZS5nZXRVVENNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXkgPSBhbmNob3JEYXRlLmdldFVUQ0RhdGUoKTtcbiAgICBjb25zdCBoaCA9IGFuY2hvckRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbSA9IGFuY2hvckRhdGUuZ2V0VVRDTWludXRlcygpO1xuICAgIGNvbnN0IHNlYyA9IGFuY2hvckRhdGUuZ2V0VVRDU2Vjb25kcygpO1xuXG4gICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSB8fCBpc05hTihkYXkpIHx8IGlzTmFOKGhoKSB8fCBpc05hTihtbSkgfHwgaXNOYU4oc2VjKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWREYXRlUGFyYW1ldGVyLCAnSW52YWxpZCBkYXRlIHBhcmFtZXRlcjogYW5jaG9yRGF0ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hofToke21tfToke3NlY31gO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihzZXJ2ZXJQbTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmICghc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5QYXJhbWV0ZXJFcnJvcl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkQ2FwdGlvbl0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGRWYWx1ZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLlNlcnZlckVycm9yLCAnU2VydmVyIEVycm9yJyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LFxuICBEYXRhVGFibGUgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCxcbiAgRGF0YVRhYmxlUmVhZGVyIGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3QsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBIaWdobGlnaHRlZE1hcmtzVGFibGUsXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IENvbHVtbiwgRGF0YVRhYmxlLCBNYXJrSW5mbyB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFUYWJsZVJlYWRlciB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhVGFibGVSZWFkZXJNb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlRmFjdG9yeSB9IGZyb20gJy4uLy4uL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnknO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEdldERhdGFTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEdldERhdGFTZXJ2aWNlIHtcbiAgLy8gVGhlIGV4dGVuc2lvbi9lbWJlZGRpbmcgaW5zdGFuY2UgdXNlcyB0aGUgc2FtZSBjYWNoZSBmb3IgYWxsIERhdGFUYWJsZVJlYWRlcnMuXG4gIHByaXZhdGUgdmlld0RhdGFUYWJsZUNhY2hlSWQ6IHN0cmluZyA9IHV1aWR2NCgpO1xuXG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkdldERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52aWV3RGF0YVRhYmxlQ2FjaGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGltaXRlZE1heFJvd3MocmVxdWVzdGVkUm93czogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCByb3dDb3VudExpbWl0ID0gdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMTtcbiAgICByZXR1cm4gcmVxdWVzdGVkUm93cyA+IDAgJiYgcmVxdWVzdGVkUm93cyA8IHJvd0NvdW50TGltaXQgPyByZXF1ZXN0ZWRSb3dzIDogcm93Q291bnRMaW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cykgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgcmVzcG9uc2VEYXRhLmlzU3VtbWFyeSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlBhZ2VSb3dDb3VudF06IHBhZ2VSb3dDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhO1xuICAgICAgY29uc3QgY29sdW1ucyA9IGRhdGFUYWJsZS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0U2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0SGlnaGxpZ2h0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cyksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZVJlYWRlcj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlUmVhZGVySW50ZXJuYWxDb250cmFjdDtcblxuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWFkZXIocmVzcG9uc2VEYXRhLmlkLCByZXNwb25zZURhdGEudG90YWxSb3dDb3VudCwgcGFnZVJvd0NvdW50LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN1bW1hcnlUYWJsZUlkID0gJyc7XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyh0YWJsZUlkOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhZ2VBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUlkXTogdGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhUm93SW5kZXhdOiBwYWdlTnVtYmVyICogcGFnZVNpemUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFUYWJsZVJlYWRlclBhZ2UsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0O1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNQYWdlKHJlc3BvbnNlRGF0YSwgdGFibGVJZCA9PT0gR2V0RGF0YVNlcnZpY2VJbXBsLnN1bW1hcnlUYWJsZUlkID8gdHJ1ZSA6IGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlQXN5bmModGFibGVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbGVhc2UnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVJZF06IHRhYmxlSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbGVhc2VEYXRhVGFibGVSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgLy8gY29sdW1ucyBtdXN0IGJlIGEgdmFsaWQgYXJyYXlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sdW1ucykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnY29sdW1uc1RvSW5jbHVkZSBhbmQgY29sdW1uc1RvSW5jbHVkZUJ5SWQgbXVzdCBiZSB2YWxpZCBhcnJheXMnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgaW5wdXQgYXJyYXlcbiAgICBjb25zdCBjb2x1bW5zQXNTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldChjb2x1bW5zKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb2x1bW5zQXNTZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhOiBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LCBpc1N1bW1hcnk6IGJvb2xlYW4pOiBEYXRhVGFibGUge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZURhdGEuaGVhZGVycy5tYXAoKGgpID0+IG5ldyBDb2x1bW4oaC5maWVsZENhcHRpb24sIGguZmllbGROYW1lLCBoLmRhdGFUeXBlLCBoLmlzUmVmZXJlbmNlZCwgaC5pbmRleCkpO1xuXG4gICAgLy8gVE9ETyBUaGlzIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBhcGkgd2lsbCByZXNwb25kIG1hcmtzIGluZm8gb3Igbm90XG4gICAgbGV0IG1hcmtzO1xuICAgIGlmIChyZXNwb25zZURhdGEubWFya3MpIHtcbiAgICAgIG1hcmtzID0gcmVzcG9uc2VEYXRhLm1hcmtzLm1hcCgoaCkgPT4gbmV3IE1hcmtJbmZvKGgudHlwZSwgaC5jb2xvciwgaC50dXBsZUlkKSk7XG4gICAgfVxuXG4gICAgLy8gTGltaXQrMSBpcyBvdXIgc2VudGluYWwgdGhhdCB1bmRlcmx5aW5nIGRhdGEgY29udGFpbnMgbW9yZSByb3dzIHRoYW4gdXNlciBpcyBhbGxvd2VkIHRvIGZldGNoLlxuICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IHNvIHdlIGFsd2F5cyByZXR1cm4gTWF4Um93TGltaXRcbiAgICBjb25zdCBpc1RvdGFsUm93Q291bnRMaW1pdGVkID0gaXNTdW1tYXJ5ID09PSBmYWxzZSAmJiByZXNwb25zZURhdGEuZGF0YVRhYmxlLmxlbmd0aCA9PT0gdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMTtcbiAgICBpZiAoaXNUb3RhbFJvd0NvdW50TGltaXRlZCkge1xuICAgICAgcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5sZW5ndGggLT0gMTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubWFwKChyb3cpID0+IHtcbiAgICAgIHJldHVybiByb3cubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlVGFibGVEYXRhVmFsdWUoY2VsbCwgaGVhZGVyc1tpbmRleF0uZGF0YVR5cGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAobWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGlzVG90YWxSb3dDb3VudExpbWl0ZWQsIGlzU3VtbWFyeSwgbWFya3MpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBpc1RvdGFsUm93Q291bnRMaW1pdGVkLCBpc1N1bW1hcnkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NSZXN1bHRzUGFnZShyZXNwb25zZURhdGE6IERhdGFUYWJsZUludGVybmFsQ29udHJhY3QsIGlzU3VtbWFyeTogYm9vbGVhbik6IERhdGFUYWJsZSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlRGF0YS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG5cbiAgICBsZXQgbWFya3M7XG4gICAgaWYgKHJlc3BvbnNlRGF0YS5tYXJrcykge1xuICAgICAgbWFya3MgPSByZXNwb25zZURhdGEubWFya3MubWFwKChoKSA9PiBuZXcgTWFya0luZm8oaC50eXBlLCBoLmNvbG9yLCBoLnR1cGxlSWQpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubWFwKChyb3cpID0+IHtcbiAgICAgIHJldHVybiByb3cubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlVGFibGVEYXRhVmFsdWUoY2VsbCwgaGVhZGVyc1tpbmRleF0uZGF0YVR5cGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAobWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGZhbHNlLCBpc1N1bW1hcnksIG1hcmtzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgZmFsc2UsIGlzU3VtbWFyeSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsQXBpRGlzcGF0Y2hlciwgTW9kZWwsIE5vdGlmaWNhdGlvbiwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVW5yZWdpc3RlckZuIH0gZnJvbSAnLi4vTm90aWZpY2F0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmlsdGVyRm46IChub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpID0+IGJvb2xlYW4sIHByaXZhdGUgX2NhbGxiYWNrRm46IChub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpID0+IHZvaWQpIHtcbiAgICAvLyBOb3RoaW5nIEhlcmVcbiAgfVxuXG4gIHB1YmxpYyBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZmlsdGVyRm4obm90aWZpY2F0aW9uTW9kZWwpKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja0ZuKG5vdGlmaWNhdGlvbk1vZGVsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSB7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiB7IFtub3RpZmljYXRpb25JZDogc3RyaW5nXTogQXJyYXk8UmVnaXN0cmF0aW9uPiB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcikge1xuICAgIHRoaXMuX2hhbmRsZXJzID0ge307XG4gICAgdGhpcy5kaXNwYXRjaGVyLnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihpZDogTm90aWZpY2F0aW9uSWQsIGZpbHRlckZuOiAobW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobW9kZWw6IE1vZGVsKSA9PiB2b2lkKTogVW5yZWdpc3RlckZuIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzW2lkXSB8fCBuZXcgQXJyYXk8UmVnaXN0cmF0aW9uPigpO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IG5ldyBSZWdpc3RyYXRpb24oZmlsdGVyRm4sIGhhbmRsZXIpO1xuICAgIGhhbmRsZXJzLnB1c2gocmVnaXN0cmF0aW9uKTtcbiAgICB0aGlzLl9oYW5kbGVyc1tpZF0gPSBoYW5kbGVycztcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVSZWdpc3RyYXRpb24oaWQsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShpZDogTm90aWZpY2F0aW9uSWQpOiBib29sZWFuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHbyB0aHJvdWdoIGFuZCBjaGVjayBmb3IgYWxsIHRoZSBoYW5kbGVycyBvZiB0aGlzIHBhcnRpY3VsYXIgbm90aWZpY2F0aW9uXG4gICAgdGhpcy5faGFuZGxlcnNbbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkXS5mb3JFYWNoKChoKSA9PiBoLm9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbi5kYXRhKSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlZ2lzdHJhdGlvbihpZDogTm90aWZpY2F0aW9uSWQsIHJlZ2lzdHJhdGlvbjogUmVnaXN0cmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShpZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVyc1tpZF0gPSB0aGlzLl9oYW5kbGVyc1tpZF0uZmlsdGVyKChyZWcpID0+IHJlZyAhPT0gcmVnaXN0cmF0aW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgTW9kZWwsIFBhcmFtZXRlcklkLCBQYXJhbWV0ZXJJbmZvLCBTaGVldFBhdGgsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9QYXJhbWV0ZXJJbXBsJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBQYXJhbWV0ZXJzU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlBhcmFtZXRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmMoc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNoZWV0UGF0aF06IHNoZWV0UGF0aCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyc0FzeW5jKHBhcmFtZXRlcnMpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbFBhcmFtZXRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXJzQXN5bmMocGFyYW1ldGVycyk7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmFtZXRlcnNBc3luYyhpbnB1dFBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFBhcmFtZXRlcnNGb3JTaGVldCwgaW5wdXRQYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PFBhcmFtZXRlckluZm8+O1xuICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoKHBhcmFtZXRlckluZm8pID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJJbXBsKHBhcmFtZXRlckluZm8sIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW5mbz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlBhcmFtZXRlckZpZWxkTmFtZV06IGZpZWxkTmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJWYWx1ZV06IG5ld1ZhbHVlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DaGFuZ2VQYXJhbWV0ZXJWYWx1ZSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBQYXJhbWV0ZXJJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQnlOYW1lQXN5bmMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKG5hbWUsIHVuZGVmaW5lZCk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5R2xvYmFsRmllbGROYW1lQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyYW1ldGVyQXN5bmModW5kZWZpbmVkLCBmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGFyYW1ldGVyQXN5bmMobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdmaW5kUGFyYW1ldGVyQXN5bmMnLFxuICAgIH07XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJDYXB0aW9uXSA9IG5hbWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJGaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ25hbWUgb3IgZmllbGROYW1lIG11c3QgYmUgcHJvdmlkZWQgdG8gZmluZCBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5GaW5kUGFyYW1ldGVyLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2VPZlBhcmFtZXRlckluZm8gPSAob2JqZWN0OiBNb2RlbCk6IG9iamVjdCBpcyBQYXJhbWV0ZXJJbmZvID0+IHtcbiAgICAgICAgcmV0dXJuICdmaWVsZE5hbWUnIGluIG9iamVjdDtcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHdlIGdvdCBhIHZhbGlkIHJlc3BvbnNlIGJhY2sgYWdhaW5cbiAgICAgIGlmIChpbnN0YW5jZU9mUGFyYW1ldGVySW5mbyhyZXNwb25zZS5yZXN1bHQpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJJbXBsKHJlc3VsdCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIFBhcmFtZXRlcklkLFxuICBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcyxcbiAgU2VsZWN0T3B0aW9ucyBhcyBTZWxlY3RPcHRpb25zSW50ZXJuYWwsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUgYXMgU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwsXG4gIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsLFxuICBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCxcbiAgUmFuZ2VTZWxlY3Rpb25Nb2RlbCxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCxcbiAgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLFxuICBUdXBsZVNlbGVjdGlvbk1vZGVsLFxuICBWYWx1ZVNlbGVjdGlvbk1vZGVsLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFNlbGVjdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TZWxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNsZWFyIGFsbCB0aGUgc2VsZWN0ZWQgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbGVhclNlbGVjdGVkTWFya3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsZWFyU2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjsgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VsZWN0IG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGlvbkNyaXRlcmlhXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1NlbGVjdGlvbiBjcml0ZXJpYSBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgfTtcblxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5IaWVyVmFsU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRpbVZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFycjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZWxlY3RCeVZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5hcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3IocmVzcG9uc2UucmVzdWx0IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBleGVjdXRlIGhvdmVyIGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIHR1cGxlIHJlcHJlc2VudGluZyBhIG1hcmsgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gaG92ZXIuIElmIG5vdCwgbm8gdG9vbHRpcCBpcyBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBob3ZlcmVkVHVwbGVcbiAgICogQHBhcmFtIHRvb2x0aXBcbiAgICogQHJldHVybnMgZW1wdHkgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV4dGVuc2lvbiBob3N0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcmVxdWVzdCBhbmQgcmVqZWN0cyBvbiBlcnJvclxuICAgKi9cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGhvdmVyZWRUdXBsZTogbnVtYmVyLCB0b29sdGlwPzogQ29udHJhY3QuVG9vbHRpcENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW50ZXJhY3Rpb25Nb2RlbCA9IG5ldyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCh2aXN1YWxJZCwgaG92ZXJlZFR1cGxlLCB0b29sdGlwKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdob3ZlclR1cGxlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkhvdmVyVHVwbGVJbnRlcmFjdGlvbl06IGludGVyYWN0aW9uTW9kZWwsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlSG92ZXJUdXBsZU5vdGlmaWNhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gbW9kaWZ5IHNlbGVjdGlvbiwgZXhlY3V0ZSBzZWxlY3QgYWN0aW9ucyBhbmQgcmVuZGVyIHRvb2x0aXAgZm9yIGEgZ2l2ZW4gbGlzdCBvZiB0dXBsZXMgcmVwcmVzZW50aW5nIGEgbWFyayBvciBtYXJrcyBpbiB0aGUgdmlzdWFsaXphdGlvbi5cbiAgICogSWYgdGhlIHRvb2x0aXAgcGFyYW1ldGVyIGlzIGluY2x1ZGVkIGl0IHdpbGwgc2hvdyB0aGUgdG9vbHRpcCBvbiBzZWxlY3QuIElmIG5vdCwgbm8gdG9vbHRpcCBpcyBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBzZWxlY3RlZFR1cGxlc1xuICAgKiBAcGFyYW0gc2VsZWN0T3B0aW9uXG4gICAqIEBwYXJhbSB0b29sdGlwXG4gICAqIEByZXR1cm5zIGVtcHR5IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBleHRlbnNpb24gaG9zdCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gaW5mb3JtZWQgb2YgdGhlIHJlcXVlc3QgYW5kIHJlamVjdHMgb24gZXJyb3JcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgc2VsZWN0ZWRUdXBsZXM6IEFycmF5PG51bWJlcj4sXG4gICAgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLFxuICAgIHRvb2x0aXA/OiBDb250cmFjdC5Ub29sdGlwQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0aW9uOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0T3B0aW9uKHNlbGVjdE9wdGlvbik7XG4gICAgbGV0IGludGVyYWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCh2aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIG9wdGlvbiwgdG9vbHRpcCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0VHVwbGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdFR1cGxlc0ludGVyYWN0aW9uXTogaW50ZXJhY3Rpb25Nb2RlbCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmFpc2VTZWxlY3RUdXBsZXNOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihzZXJ2ZXJQbTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmICghc2VydmVyUG1bUGFyYW1ldGVySWQuUGFyYW1ldGVyRXJyb3JdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUsIHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRGaWVsZHNdKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvblZhbHVlLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRGF0ZXNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvbkRhdGUsIHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWREYXRlc10pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VsZWN0IG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIE1hcmtJbmZvXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sXG4gICAgc2VsZWN0aW9uVXBkYXRlVHlwZTogQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG1hcmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdNYXJrcyBpbmZvIG1pc3NpbmcgZm9yIHNlbGVjdGluZyBtYXJrcyBieSBJZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvblR5cGU6IHN0cmluZyA9IHRoaXMudmFsaWRhdGVTZWxlY3Rpb25VcGRhdGVUeXBlKHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlU2VsZWN0aW9uSWRzKG1hcmtzKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZWxlY3RNYXJrc0J5SWRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25VcGRhdGVUeXBlXTogc2VsZWN0aW9uVHlwZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25dOiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZWxlY3RCeVZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE8gSW52ZXN0aWdhdGUgdGhlIGVycm9yIHJlc3BvbnNlIHdpdGggbXVsdGlwbGUgb3V0cHV0IHBhcmFtcyBhbmQgdGhyb3cgZXJyb3IgYWNjb3JkaW5nbHkuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgTWFya3NJbmZvXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVNlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmtzW2ldLnR1cGxlSWQ7XG4gICAgICBpZiAodHVwbGVJZCAhPT0gdW5kZWZpbmVkICYmIHR1cGxlSWQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdHVwbGUgaWQgaXMgcHJvdmlkZWQgdXNlIHRoYXQgaW5zdGVhZCBvZiBwYWlyXG4gICAgICAgIGlkcy5wdXNoKHR1cGxlSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIHR1cGxlIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICd0dXBsZUlkIHBhcnNpbmcgZXJyb3InKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSB2YWx1ZXMuXG4gICAqXG4gICAqIFN1cHBvcnRzIDMgdHlwZXMgZm9yIHNlbGVjdGlvbjpcbiAgICogMSkgSGllcmFyY2hpY2FsIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKiAyKSBSYW5nZSB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICogMykgRGltZW5zaW9uIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VTZWxlY3Rpb25NYXJrcyhzZWxlY3Rpb25Dcml0ZXJpYXM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uQ3JpdGVyaWFzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdCA9IHNlbGVjdGlvbkNyaXRlcmlhc1tpXTtcbiAgICAgIGlmICghKHN0LmZpZWxkTmFtZSAmJiBzdC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHN0LnZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1NlbGVjdGlvbiBDcml0ZXJpYSBwYXJzaW5nIGVycm9yJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFtbQS1aYS16MC05XStdKS4qJywgJ2cnKTtcbiAgICAgIGNvbnN0IHJhbmdlT3B0aW9uID0gc3QudmFsdWUgYXMgQ29udHJhY3QuUmFuZ2VWYWx1ZTtcbiAgICAgIGlmIChjYXRSZWdleC50ZXN0KHN0LmZpZWxkTmFtZSkpIHtcbiAgICAgICAgLy8gSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvblxuICAgICAgICBjb25zdCBoaWVyTW9kZWw6IEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1BhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCBzdC52YWx1ZSkgYXMgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5wdXNoKGhpZXJNb2RlbCk7XG4gICAgICB9IGVsc2UgaWYgKHJhbmdlT3B0aW9uLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJhbmdlT3B0aW9uLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFJhbmdlIHZhbHVlIHNlbGVjdGlvblxuICAgICAgICBjb25zdCBxdWFudE1vZGVsOiBSYW5nZVNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1JhbmdlUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHJhbmdlT3B0aW9uKTtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyci5wdXNoKHF1YW50TW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGltZW5zaW9uIHZhbHVlIHNlbGVjdGlvblxuICAgICAgICBjb25zdCBkaW1Nb2RlbDogRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHN0LnZhbHVlKSBhcyBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbDtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIucHVzaChkaW1Nb2RlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gdmFsdWUgYmFzZWQgcHJlcyBtb2RlbCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVNlbGVjdGlvbk1vZGVsXG4gICAqIEBwYXJhbSBmaWVsZE5hbWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZFRvUGFyYW1zTGlzdChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IENvbnRyYWN0LkNhdGVnb3JpY2FsVmFsdWUgfCBDb250cmFjdC5SYW5nZVZhbHVlKTogVmFsdWVTZWxlY3Rpb25Nb2RlbCB7XG4gICAgY29uc3QgdmFsdWVTZWxlY3Rpb25Nb2RlbDogVmFsdWVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBWYWx1ZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgY29uc3QgbWFya1ZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGNvbnN0IHZhbHVlQXJyOiBBcnJheTxzdHJpbmc+ID0gdmFsdWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hcmtWYWx1ZXMucHVzaChQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZUFycltpXSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrVmFsdWVzLnB1c2goUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUpKTtcbiAgICB9XG5cbiAgICB2YWx1ZVNlbGVjdGlvbk1vZGVsLnF1YWxpZmllZEZpZWxkQ2FwdGlvbiA9IGZpZWxkTmFtZTtcbiAgICB2YWx1ZVNlbGVjdGlvbk1vZGVsLnNlbGVjdFZhbHVlcyA9IG1hcmtWYWx1ZXM7XG4gICAgcmV0dXJuIHZhbHVlU2VsZWN0aW9uTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUga2V5IHZhbHVlIHBhaXIgaW50byByYW5nZSBiYXNlZCBzZWxlY3Rpb24gcHJlcyBtb2RlbC5cbiAgICpcbiAgICogVE9ETzogTmVlZCB0byBoYW5kbGUgdGhlIHBhcnNpbmcgb2YgZGF0ZSB0eXBlIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlU2VsZWN0aW9uTW9kZWxcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYWRkVG9SYW5nZVBhcmFtc0xpc3QoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBDb250cmFjdC5SYW5nZVZhbHVlKTogUmFuZ2VTZWxlY3Rpb25Nb2RlbCB7XG4gICAgY29uc3QgcmFuZ2VTZWxlY3Rpb25Nb2RlbDogUmFuZ2VTZWxlY3Rpb25Nb2RlbCA9IG5ldyBSYW5nZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5xdWFsaWZpZWRGaWVsZENhcHRpb24gPSBmaWVsZE5hbWU7XG4gICAgaWYgKHZhbHVlLm1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLm1heCAhPT0gbnVsbCkge1xuICAgICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5tYXhWYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlLm1heCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5taW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5taW4gIT09IG51bGwpIHtcbiAgICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwubWluVmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZS5taW4pO1xuICAgIH1cbiAgICByYW5nZVNlbGVjdGlvbk1vZGVsLmluY2x1ZGVkID0gdGhpcy52YWxpZGF0ZU51bGxPcHRpb25UeXBlKHZhbHVlLm51bGxPcHRpb24pO1xuICAgIHJldHVybiByYW5nZVNlbGVjdGlvbk1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgc2VsZWN0aW9uIHVwZGF0ZSB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZTogQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZSk6IHN0cmluZyB7XG4gICAgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuUmVwbGFjZSkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZXBsYWNlO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZS5BZGQpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuQWRkO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZS5SZW1vdmUpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVtb3ZlO1xuICAgIH1cbiAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlcGxhY2U7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBpbmNsdWRlIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG51bGxPcHRpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVOdWxsT3B0aW9uVHlwZShudWxsT3B0aW9uOiBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAobnVsbE9wdGlvbikge1xuICAgICAgaWYgKG51bGxPcHRpb24gPT09IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24uTnVsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZU51bGw7XG4gICAgICB9IGVsc2UgaWYgKG51bGxPcHRpb24gPT09IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24uTm9uTnVsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZU5vbk51bGw7XG4gICAgICB9IGVsc2UgaWYgKG51bGxPcHRpb24gPT09IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24uQWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlQWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlQWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgc2VsZWN0IG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdE9wdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlbGVjdE9wdGlvbihzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmIChzZWxlY3RPcHRpb24gPT09IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMuU2ltcGxlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0T3B0aW9uc0ludGVybmFsLlNpbXBsZTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdE9wdGlvbiA9PT0gQ29udHJhY3QuU2VsZWN0T3B0aW9ucy5Ub2dnbGUpIHtcbiAgICAgIHJldHVybiBTZWxlY3RPcHRpb25zSW50ZXJuYWwuVG9nZ2xlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ09ubHkgc2ltcGxlIGFuZCB0b2dnbGUgc2VsZWN0IG9wdGlvbnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBJbnRlcm5hbFRhYmxlYXVFcnJvciwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFNob3VsZFRocm93IH0gZnJvbSAnLi4vLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qKlxuICogRWFjaCBTZXJ2Y2VJbXBsIHNob3VsZCBleHRlbmQgdGhpcyBiYXNlIGNsYXNzIGZvciB0aGUgc2FrZSBvZlxuICogcHJvcGVyIGVycm9yIGhhbmRsaW5nLiAgVGhpcyBiYXNlIGhhbmRsZXMgdGhlIGNvbnZlcnNpb25cbiAqIGZyb20gaW50ZXJuYWwgZXJyb3JzIHRvIGV4dGVybmFsIGVycm9ycyB0aGF0IHdlIHRocm93IHRvIGRldmVsb3BlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VJbXBsQmFzZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHByb3RlY3RlZCBfcmVnaXN0cnlJZDogbnVtYmVyKSB7fVxuXG4gIHByb3RlY3RlZCBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuZXhlY3V0ZSh2ZXJiLCBwYXJhbXMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgLy8gQW55IGludGVybmFsIGVycm9yIHRoYXQgY29tZXMgZnJvbSB0aGUgZGlzcGF0Y2hlciBzaG91bGQgYmUgY29udmVydGVkXG4gICAgICAvLyB0byBhbiBleHRlcm5hbCBlcnJvciB1c2luZyB0aGUgZW51bSBtYXBwZXIgZm9yIGVycm9yIGNvZGVzLlxuICAgICAgY29uc3QgaW50ZXJuYWxFcnJvciA9IGVycm9yIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICAgICAgY29uc3QgZXh0ZXJuYWxFcnJvckNvZGU6IEVycm9yQ29kZXMgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZXJyb3JDb2RlLmNvbnZlcnQoaW50ZXJuYWxFcnJvci5lcnJvckNvZGUsIFNob3VsZFRocm93Lk5vKTtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoZXh0ZXJuYWxFcnJvckNvZGUsIGludGVybmFsRXJyb3IubWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTaXplU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTaXplU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlNpemU7XG4gIH1cblxuICBjaGFuZ2VTaXplQXN5bmMobmFtZTogc3RyaW5nLCBuZXdTaXplOiBTaGVldFNpemUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2hhbmdlU2l6ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldE5hbWVdOiBuYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLk1pbkhlaWdodF06IG5ld1NpemUubWluU2l6ZT8uaGVpZ2h0IHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWluV2lkdGhdOiBuZXdTaXplLm1pblNpemU/LndpZHRoIHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4SGVpZ2h0XTogbmV3U2l6ZS5tYXhTaXplPy5oZWlnaHQgfHwgMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhXaWR0aF06IG5ld1NpemUubWF4U2l6ZT8ud2lkdGggfHwgMCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0U2hlZXRTaXplLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChfcmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBTdG9yeVBvaW50TW9kZWwsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB9IGZyb20gJy4uL1N0b3J5QWN0aXZhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uO1xuICB9XG5cbiAgYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVOZXh0U3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlN0b3J5UG9pbnRJbmRleF0gPSBpbmRleDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTxTdG9yeVBvaW50TW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJldmVydFN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JldmVydFN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlN0b3J5UG9pbnRJbmRleF0gPSBpbmRleDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxTdG9yeVBvaW50TW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdG9yeVBvaW50TW9kZWw7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQsIFZpc3VhbFNwZWNpZmljYXRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVmlzdWFsTW9kZWxTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFZpc3VhbFNwZWNpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgVmlzdWFsU3BlY2lmaWNhdGlvbjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vVml6U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYyksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlZpekFQSSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU2hlZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Td2l0Y2hUb1NoZWV0TmFtZV06IG5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFjdGl2YXRlU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbVZpZXdzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDdXN0b21WaWV3SW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VzdG9tVmlld3NBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1c3RvbVZpZXdzLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3cyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxDdXN0b21WaWV3TW9kZWw+O1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdzLm1hcCgoY3VzdG9tVmlldzogQ3VzdG9tVmlld01vZGVsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3Nob3dDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNob3dDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQ3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsPiB7XG4gICAgLy8gQ3VzdG9tVmlld0lzRGVmYXVsdCBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlciwgYnV0IG91ciBBUEkgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gYWxsb3cgaXQgdG8gYmUgc3BlY2lmaWVkIHlldC5cbiAgICAvLyBXZSBzaG91bGQgYWRkIGEgJ2RlZmF1bHQnIHBhcmFtZXRlciB0byB0aGUgaW50ZXJmYWNlLlxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQ3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZVdvcmtib29rQXNDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYyhjdXN0b21WaWV3OiBDdXN0b21WaWV3SW1wbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3THVpZF06IGN1c3RvbVZpZXcubHVpZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXcubmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNEZWZhdWx0XTogY3VzdG9tVmlldy5pc0RlZmF1bHQsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzUHVibGljXTogY3VzdG9tVmlldy5zaGFyZWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlVwZGF0ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDdXJyZW50U3JjQXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDdXJyZW50U3JjLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlIH0gZnJvbSAnLi4vWm9uZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgWm9uZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgWm9uZVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5ab25lO1xuICB9XG5cbiAgcHVibGljIHNldFZpc2liaWxpdHlBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICB6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXAsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldFZpc2liaWxpdHlBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLlpvbmVJZHNWaXNpYmlsaXR5TWFwXToge30sXG4gICAgfTtcblxuICAgIC8vIHpvbmVWaXNpYmlsaXR5TWFwIGNhbiBiZSBlaXRoZXIgYW4gb2JqZWN0IG9yIGEgTWFwIC0gY29udmVydCBpdCB0byBhIE1hcFxuICAgIGNvbnN0IHBhcmFtZXRlckFzTWFwID0gUGFyYW0uY29udmVydFBhcmFtZXRlclRvTWFwKHpvbmVWaXNpYmlsaXR5TWFwLCAnem9uZVZpc2liaWxpdHlNYXAnKTtcblxuICAgIHBhcmFtZXRlckFzTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwLCBOdW1iZXIucGFyc2VJbnQoa2V5LCAxMCkpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZT4odmFsdWUsIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLCAnRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUnKTtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdW2tleV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuc2V0VmlzaWJpbGl0eVR5cGUuY29udmVydCh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRab25lVmlzaWJpbGl0eSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplQXN5bmMoXG4gICAgZGFzaGJvYXJkOiBzdHJpbmcsXG4gICAgZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZF06IGRhc2hib2FyZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0XTogZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICAgfTtcblxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LmZvckVhY2goKGRhc2hib2FyZE9iamVjdDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlKSA9PiB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5Wm9uZUlzVmFsaWRBbmRGbG9hdGluZyhkYXNoYm9hcmRab25lTWFwLCBkYXNoYm9hcmRPYmplY3QuZGFzaGJvYXJkT2JqZWN0SUQpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoZGFzaGJvYXJkT2JqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLk1vdmVBbmRSZXNpemVab25lcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSB0YWJsZSBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVTdW1tYXJ5IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVTdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RhYmxlSW5mbzogVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25uZWN0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmNvbm5lY3Rpb25JZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VzdG9tU1FMKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5jdXN0b21TUUw7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMsIEVycm9yQ29kZXMsIFNoYXJlZEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGRlZmF1bHQgSmF2YVNjcmlwdCBFcnJvciBvYmplY3QuXG4gKiBUaGlzIGFsbG93cyB1cyB0byBwcm92aWRlIGEgZmllbGQgd2l0aCBhIHNwZWNpZmljIGVycm9yIGNvZGVcbiAqIHNvIHRoYXQgZGV2ZWxvcGVycyBjYW4gbW9yZSBlYXNpbHkgcHJvZ3JhbW1hdGljYWxseSByZXNwb25kXG4gKiB0byBlcnJvciBzY2VuYXJpb3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lcnJvckNvZGU6IEVycm9yQ29kZXMgfCBFbWJlZGRpbmdFcnJvckNvZGVzIHwgU2hhcmVkRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYCR7X2Vycm9yQ29kZX06ICR7bWVzc2FnZX1gKTtcblxuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAvLyBFcnJvciBpbmhlcml0YW5jZSBkb2VzIG5vdCB3b3JrIHByb3BlcnRseSB3aGVuIGNvbXBpbGluZyB0byBFUzUsIHRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZvcmNlXG4gICAgLy8gdGhlIHByb3RvIGNoYWluIHRvIGJlIGJ1aWx0IGNvcnJlY3RseS4gIFNlZSB0aGUgZ2l0aHViIGxpbmsgYWJvdmUgZm9yIGRldGFpbHMuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFRhYmxlYXVFcnJvci5wcm90b3R5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBlcnJvckNvZGUoKTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JDb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5cbi8qKlxuICogSW4gdmVyc2lvbiAyIG9mIHRoZSBpbnRlcmZhY2UsIHdlIHNob3VsZCBjb2xsYXBzZSB2YWx1ZSBpbnRvIG5hdGl2ZVZhbHVlLCBhbmQgZG8gYWxsIHRoaXMgd29yayBvdmVyXG4gKiBpbiB0aGUgcGxhdGZvcm0uXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhVmFsdWVGYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBNYWtlUGFyYW1ldGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIFBhcmFtZXRlciB2YWx1ZXMgYXJlIGFsbCBzdHJpbmdzLCBjb252ZXJ0IGZyb20gc3RyaW5nIHRvIHZhbHVlXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIEludGVybmFsQ29udHJhY3QuRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgZGF0YVR5cGUpLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZUZpbHRlckRhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUpOiBEYXRhVmFsdWUge1xuICAgIC8vIEZpbHRlcnMgYWxyZWFkeSBoYXZlIG5hdGl2ZSB0eXBlIGluIHZhbHVlLCBqdXN0IHVzZSB0aGF0IGZvciBuYXRpdmVWYWx1ZSBhbHNvXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VUYWJsZURhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUsIGRhdGFUeXBlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBEYXRhVGFibGVzIGNvbnRhaW4gYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IGRhdGUgYXMgc3RyaW5nIHwgJyVudWxsJVxuICAgIC8vIGNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUgY29udmVydHMgZGF0ZXMgYXMgc3RyaW5nIHRvIGRhdGVzLCBhbmQgYW55IHNwZWNpYWwgdG8gbnVsbFxuICAgIC8vIChib29sZWFuLCBudW1iZXJzLCBzdHJpbmdzIGFyZSBwYXNzZWQgdGhyb3VnaClcbiAgICAvLyBCZWNhdXNlIG9mIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIC0gd2UgY2FuIGhhdmUgdW5kZWZpbmVkIHZhbHVlcywgd2hpY2ggYXJlIGRpZmZlcmVudCB0aGFuIGFueSBzcGVjaWFsXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlLFxuICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQSBQcm9taXNlIHdyYXBwZXIgY2xhc3MgYWxsb3dpbmcgZm9yIHJlc29sdmluZy9yZWplY3RpbmcgdGhlIFByb21pc2Ugb3V0c2lkZSB0aGUgY29udGV4dCBvZiBpdHMgY29uc3RydWN0b3IuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERlZmVycmVkXG4gKiBAdGVtcGxhdGUgVFJlc29sdmUgVGhlIHR5cGUgdXNlZCB0byByZXNvbHZlIHRoZSBwcm9taXNlLlxuICogQHRlbXBsYXRlIFRSZWplY3QgVGhlIHR5cGUgdXNlZCB0byByZWplY3QgdGhlIHByb21pc2UuIERlZmF1bHRzIHRvIGFueS5cbiAqIEBsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDYzNzQzNlxuICovXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQ8VFJlc29sdmUsIFRSZWplY3QgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfcHJvbWlzZTogUHJvbWlzZTxUUmVzb2x2ZT47XG4gIHByaXZhdGUgX3Jlc29sdmU6IChyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pID0+IHZvaWQ7XG4gIHByaXZhdGUgX3JlamVjdDogKHJlYXNvbj86IFRSZWplY3QpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGVmZXJyZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2U8VFJlc29sdmU+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFByb21pc2UuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7UHJvbWlzZTxUUmVzb2x2ZT59XG4gICAqL1xuICBnZXQgcHJvbWlzZSgpOiBQcm9taXNlPFRSZXNvbHZlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHdyYXBwZWQgUHJvbWlzZS5cbiAgICpcbiAgICogQHBhcmFtIHsoVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pfSByZXNwb25zZSBUaGUgYXJndW1lbnQgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIFByb21pc2UuXG4gICAqIEByZXR1cm5zIHsqfSAge3ZvaWR9XG4gICAqL1xuICByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc29sdmUocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7VFJlamVjdH0gW3JlYXNvbl0gVGhlIHJlYXNvbiB3aHkgdGhlIFByb21pc2UgcmVqZWN0ZWQuXG4gICAqIEByZXR1cm5zIHsqfSAge3ZvaWR9XG4gICAqL1xuICByZWplY3QocmVhc29uPzogVFJlamVjdCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVqZWN0KHJlYXNvbik7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFVucmVnaXN0ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSAzMDAwMDtcbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGNvbnZlcnRzIGZyb20gYSBzb3VyY2UgZW51bSB2YWx1ZSB0byBkZXN0aW5hdGlvbiBlbnVtXG4gKiB2YWx1ZSBnaXZlbiBhIG1hcHBpbmcgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gd2hlbiBjb25zdHJ1Y3RlZC5cbiAqXG4gKiBOb3RlOiBUaGlzIGV4YWN0IHNhbWUgY2xhc3MgaXMgZGVmaW5lZCBpbiBhcGktY29yZS4gIEdpdmVuIGl0cyBzbWFsbFxuICogbmF0dXJlLCBpdCBpcyBub3Qgd29ydGggaGF2aW5nIGluIGEgc2VwYXJhdGUgcHJvamVjdCB0byBzaGFyZSB0aGlzIGJldHdlZW5cbiAqIGFwaS1jb3JlIGFuZCBhcGktc2hhcmVkLiAgSWYgbW9yZSB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgaXMgYWRkZWQgdGhhdCBpcyB1c2VkIGJ5IGFwaS1jb3JlXG4gKiBhbmQgYXBpLXNoYXJlZCBidXQgaGFzIG5vIG90aGVyIGRlcGVuZGVjaWVzLCBhIHV0aWx0aXR5IHByb2plY3QgbWlnaHQgYmUgbWVyaXRlZCxcbiAqIGFuZCB0aGlzIGNsYXNzIGNvdWxkIGJlIG1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgRW51bUNvbnZlcnRlcjxUU291cmNlVHlwZSBleHRlbmRzIHN0cmluZywgVERlc3RpbmF0aW9uVHlwZT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWFwcGluZ3M6IHsgW2VudW1WYWw6IHN0cmluZ106IFREZXN0aW5hdGlvblR5cGUgfSwgcHJpdmF0ZSBfZGVmYXVsdFZhbD86IFREZXN0aW5hdGlvblR5cGUpIHt9XG5cbiAgcHVibGljIGNvbnZlcnQoZW51bVZhbDogVFNvdXJjZVR5cGUsIHRocm93SWZNaXNzaW5nOiBTaG91bGRUaHJvdyA9IFNob3VsZFRocm93Llllcyk6IFREZXN0aW5hdGlvblR5cGUge1xuICAgIGlmICh0aGlzLl9tYXBwaW5ncy5oYXNPd25Qcm9wZXJ0eShlbnVtVmFsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcHBpbmdzW2VudW1WYWwgYXMgc3RyaW5nXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGVmYXVsdFZhbCAhPT0gdW5kZWZpbmVkICYmIHRocm93SWZNaXNzaW5nICE9PSBTaG91bGRUaHJvdy5ZZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgRW51bSBNYXBwaW5nIG5vdCBmb3VuZCBmb3I6ICR7ZW51bVZhbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgZW51bSBTaG91bGRUaHJvdyB7XG4gIFllcyA9ICd5ZXMnLFxuICBObyA9ICdubycsXG59XG4iLCJpbXBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIEV4cG9ydERhdGFPcHRpb25zLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuL1BhcmFtJztcblxuaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgY29tbW9uIGVycm9ycyB0aHJvdWdob3V0IHRoZSBleHRlcm5hbFxuICogcHJvamVjdHMgKGFwaS1zaGFyZWQsIGV4dGVuc2lvbnMtYXBpLCBldGMuKS4gIEl0IGhhcyBzb21lIGR1cGxpY2F0aW9uIHdpdGhcbiAqIHRoZSBFcnJvckhlbHBlcnMgY2xhc3MgaW4gYXBpLWNvcmUsIGJ1dCBpcyBzZXBhcmF0ZSBkdWUgdG8gdGhlIG5lZWQgdG8gdGhyb3dcbiAqIGFuIGV4dGVybmFsIFRhYmxlYXVFcnJvciB2cy4gYW4gSW50ZXJuYWxUYWJsZWF1RXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckhlbHBlcnMge1xuICAvKipcbiAgICogVGhyb3dzIHdpdGggY29kZSBJbnRlcm5hbEVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXBpTmFtZSBuYW1lIG9mIGFwaSB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwaU5vdEltcGxlbWVudGVkKGFwaU5hbWU6IHN0cmluZyk6IFRhYmxlYXVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcGlOYW1lfSBBUEkgbm90IHlldCBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gaW50ZXJuYWwgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUludGVybmFsVmFsdWUoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICogRm9yIG9iamVjdHMsIGl0IGp1c3QgdGVzdHMgdGhhdCBpdCBpcyBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHR5cGVvZlxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50VmFsdWUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGhhcyBpbnZhbGlkIHR5cGUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBlbXB0eSBzdHJpbmcsIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBhcmd1bWVudFZhbHVlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtdGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bS5cbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgdGhlIGVudW0gdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKiBTdHJpbmcgZW51bXMgYXJlIHtzdHJpbmcgOiBzdHJpbmd9IGRpY3Rpb25hcmllcyB3aGljaCBhcmUgbm90IHJldmVyc2UgbWFwcGFibGVcbiAgICogVGhpcyBpcyBhbiB1Z2x5IHdvcmthcm91bmRcbiAgICpcbiAgICogQHBhcmFtIGVudW1WYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGVudW1UeXBlIGVudW0gdG8gdmVyaWZ5IGFnYWluc3RcbiAgICogQHBhcmFtIGVudW1OYW1lIGVudW0gbmFtZSBmb3IgY2xlYXIgZXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFbnVtVmFsdWU8RW51bVR5cGUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bVZhbHVlOiBFbnVtVHlwZSwgZW51bVR5cGU6IGFueSwgZW51bU5hbWU6IHN0cmluZykge1xuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoZW51bVR5cGUpLmZvckVhY2goKGVudW1LZXkpID0+IHtcbiAgICAgIGlmIChlbnVtVHlwZVtlbnVtS2V5XSA9PT0gZW51bVZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHtlbnVtVmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIGVudW06ICR7ZW51bU5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYmV0d2VlbiBbbWluLCBtYXgpIC4uLiBtaW4gPD0gdmFsdWUgPCBtYXhcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCB2YWxpZC5cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gbWluICAgdmFsdWUgbXVzdCBiZSA+PSBtaW5cbiAgICogQHBhcmFtIG1heCAgIHZhbHVlIG11c3QgYmUgPCBtYXhcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UmFuZ2UodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gICAgbGV0IGlzVmFsaWQgPSBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPCBtYXg7XG5cbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHt2YWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcmFuZ2U6IFske21pbn0uLiR7bWF4fSlgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHBhcmFtcyBtaW4gYW5kIG1heCBmb3IgYXBwbHlpbmcgcmFuZ2UgZmlsdGVyLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIG1pbiByYW5nZSBtaW5cbiAgICogQHBhcmFtIG1heCByYW5nZSBtYXhcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UmFuZ2VQYXJhbVR5cGUobWluOiBhbnksIG1heDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFtaW4gJiYgIW1heCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIGF0IGxlYXN0IG9uZSBvZiBtaW4gb3IgbWF4IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGlmIChtaW4gJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtaW4pICYmICFQYXJhbS5pc1R5cGVEYXRlKG1pbikpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1heCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1heC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWluICYmIG1heCAmJiB0eXBlb2YgbWluICE9PSB0eXBlb2YgbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIHBhcmFtZXRlcnMgbWluIGFuZCBtYXggc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHpvbmVJZCBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgaW4gZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lIGlzIHByZXNlbnQgYW5kIGZsb2F0aW5nIGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRab25lTWFwLmhhcyh6b25lSUQpICYmIGRhc2hib2FyZFpvbmVNYXAuZ2V0KHpvbmVJRCkhLmlzRmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgRGFzaGJvYXJkIE9iamVjdCBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IG9yIGlzIGEgZml4ZWQgem9uZSBpbiB0aGUgZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHdpZHRoIGFuZCBoZWlnaHQgYXJlID4gMCBmb3IgZWFjaCBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0LlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0IGZvciB3aGljaCB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlOiBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gICk6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUud2lkdGggPCAwIHx8IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5oZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUgZm9yIGRhc2hib2FyZCBvYmplY3QgSUQgJHtkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUuZGFzaGJvYXJkT2JqZWN0SUR9OmAgK1xuICAgICAgICAgIGAgbmVnYXRpdmUgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSBub3QgYWxsb3dlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaXMgdGhlIGdpdmVuIHNoZWV0IG5hbWUgaXMgaW4gdGhlIGxpc3Qgb2Ygc2hlZXRzIG5hbWVzIGFsbG93ZWQgZm9yIGV4cG9ydGluZy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBjb25kaXRpb24gYWJvdmUgaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRhYmxlU2hlZXROYW1lcyBBIGxpc3Qgb2Ygc2hlZXQgbmFtZXMgYWxsb3dlZCBmb3IgZXhwb3J0aW5nXG4gICAqIEBwYXJhbSBzaGVldE5hbWUgdGhlIG5hbWUgb2YgdGhlIHNoZWV0IHNlbGVjdGVkIGZvciBleHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVTaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBzaGVldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghZXhwb3J0YWJsZVNoZWV0TmFtZXMuaW5jbHVkZXMoc2hlZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAgICdzaGVldE5hbWUgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3RcbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG9mIEV4cG9ydERhdGFPcHRpb25zIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBDU1YgZmlsZSBmb3IgZXhwb3J0RGF0YUFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICghUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy5pZ25vcmVBbGlhc2VzKSAmJiAhUGFyYW0uaXNUeXBlQm9vbChvcHRpb25zLmlnbm9yZUFsaWFzZXMpKSB8fFxuICAgICAgKCFQYXJhbS5pc051bGxPclVuZGVmaW5lZChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ29wdGlvbnMgcGFyYW1hdGVyIG11c3QgYmUgb2YgdHlwZSBFeHBvcnREYXRhT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHRoZSBzaGVldCBuYW1lcyBhcmUgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSBleHBvcnQgc2NlbmFyaW9zLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gYXJyYXkuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFNlbGVjdGlvblNoZWV0IGlmIHRoZXJlIGFyZSBhcnJheSBlbnRyaWVzIHRoYXQgZG9udCBleGlzdCBvciBpZiB0aGVyZSBpcyBtaXhpbmcgYmV0d2VlbiBzaGVldHMgZnJvbSB0aGUgZGFzaGJvYXJkIGFuZCBzaGVldCBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgTGlzdCBvZiBzaGVldCBuYW1lcyBzZWxlY3RlZCBmb3IgZXhwb3J0aW5nLlxuICAgKiBAcGFyYW0gZXhwb3J0U2NlbmFyaW9zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHNoZWV0IG5hbWUsIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIGRhc2hib2FyZCwgYW5kIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGVldE5hbWVzKSkgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdzaGVldE5hbWVzIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgaWYgKHNoZWV0TmFtZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NoZWV0TmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eScpO1xuXG4gICAgY29uc3QgaXNJbmNsdWRlZEluRGFzaGJvYXJkID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkLmluY2x1ZGVzKHNoZWV0TmFtZSksXG4gICAgKTtcbiAgICBpZiAoaXNJbmNsdWRlZEluRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzSW5jbHVkZWRJbldvcmtib29rID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2suaW5jbHVkZXMoc2hlZXROYW1lKSxcbiAgICApO1xuICAgIGlmIChpc0luY2x1ZGVkSW5Xb3JrYm9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0N1cnJlbnRTaGVldCA9IHNoZWV0TmFtZXMubGVuZ3RoID09PSAxICYmIHNoZWV0TmFtZXNbMF0gPT09IGV4cG9ydFNjZW5hcmlvcy5jdXJyZW50U2hlZXROYW1lO1xuICAgIGlmIChpc0N1cnJlbnRTaGVldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCByZXF1aXJlbWVudDogYWxsIHNoZWV0IG5hbWVzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZXhwb3J0YWJsZSBzaGVldHMgaW4gdGhlIGRhc2hib2FyZCBvclxuICAgIC8vIGFsbCBzaGVldCBuYW1lcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGV4cG9ydGFibGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaywgb3IgdGhlIHNoZWV0IG5hbWUgaXMgdGhlIGN1cnJlbnQgc2hlZXRcbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAnc2hlZXROYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIGFsbCBpdHMgZW50cmllcyBiZSBleHBvcnRhYmxlIHNoZWV0IG5hbWVzIGZyb20gdGhlIGRhc2hib2FyZCBvciBhbGwgaXRzIGVudHJpZXMgYmUgZXhwb3J0YWJsZSBzaGVldCBuYW1lcyBmcm9tIHRoZSB3b3JrYm9vaycsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QncyBwcm9wZXJ0aWVzLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgb2YgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgZXh0ZXJuYWwgdXNlci1mYWNpbmcgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZSBmb3IgZXhwb3J0UERGQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUV4cG9ydFBERk9wdGlvbnMob3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50T3JpZW50YXRpb24+KG9wdGlvbnMub3JpZW50YXRpb24sIFByaW50T3JpZW50YXRpb24sICdQcmludE9yaWVudGF0aW9uJyk7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludFBhZ2VTaXplPihvcHRpb25zLnBhZ2VTaXplLCBQcmludFBhZ2VTaXplLCAnUHJpbnRQYWdlU2l6ZScpO1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRTY2FsaW5nPihvcHRpb25zLnNjYWxpbmcsIFByaW50U2NhbGluZywgJ1ByaW50U2NhbGluZycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdvcHRpb25zIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgRXhwb3J0UERGT3B0aW9ucycpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRXhwb3J0TGF5b3V0T3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEZpdFBhZ2VzLFxuICBQYWdlT3JpZW50YXRpb24sXG4gIFBhZ2VTY2FsaW5nT3B0aW9uLFxuICBQYWdlU2l6ZU9wdGlvbixcbiAgU2NhbGVNb2RlLFxuICBTY2FsaW5nU2VsZWN0aW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2RzIGZvciBFeHBvcnQgQVBJcy5cbiAqXG4gKiBAY2xhc3MgRXhwb3J0SGVscGVyc1xuICovXG5leHBvcnQgY2xhc3MgRXhwb3J0SGVscGVycyB7XG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdERhdGFPcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyA9IHtcbiAgICBpZ25vcmVBbGlhc2VzOiBmYWxzZSxcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogW10sXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0UERGT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zID0ge1xuICAgIHNjYWxpbmc6IFByaW50U2NhbGluZy5BdXRvbWF0aWMsXG4gICAgcGFnZVNpemU6IFByaW50UGFnZVNpemUuTGV0dGVyLFxuICAgIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIERlZmF1bHRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zID0ge1xuICAgIGltYWdlSGVpZ2h0OiAwLFxuICAgIGltYWdlV2lkdGg6IDAsXG4gICAgcGFnZUZpdEhvcml6b250YWw6IDEsXG4gICAgcGFnZUZpdFZlcnRpY2FsOiAxLFxuICAgIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogUGFnZU9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICAgIHBhZ2VTY2FsZU1vZGU6IFNjYWxlTW9kZS5TY2FsZUF1dG8sXG4gICAgcGFnZVNjYWxlUGVyY2VudDogMTAwLFxuICAgIHBhZ2VTaXplT3B0aW9uOiBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zJyBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBnaXZlbiBQREYgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgY29uc3RydWN0IHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGlkZW50aWNhbGx5IHRvIGhvdyB0aGUgJ0V4cG9ydCBQREYnIGRpYWxvZyBjb25zdHJ1Y3RzIHRoZSBFeHBvcnRQZGZPcHRpb25zUHJlc01vZGVsLlxuICAgKiBTZWUgdGhlIGhhbmRsZUV4cG9ydENsaWNrIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICApOiB2b2lkIHtcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuY3VycmVudFNoZWV0ID0gc2hlZXROYW1lc1swXTtcbiAgICB0aGlzLnVwZGF0ZUV4cG9ydExheW91dE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlU2hlZXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBNb2RpZmllcyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucy5cbiAgICogU2VlIHRoZSBnZXRFeHBvcnRMYXlvdXRPcHRpb25zIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRXhwb3J0TGF5b3V0T3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucy5leHBvcnRMYXlvdXRPcHRpb25zO1xuXG4gICAgLy8gc2V0dGluZyB0aGUgaW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZUhlaWdodCA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoO1xuXG4gICAgLy8gIHNldHRpbmcgdGhlIG9yaWVudGF0aW9uIHZhbHVlIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIFByaW50T3JpZW50YXRpb24uTGFuZHNjYXBlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5MYW5kc2NhcGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5Qb3J0cmFpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgb3JpZW50YXRpb24gZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cblxuICAgIC8vIHNldHRpbmcgdGhlIHBhZ2Ugc2l6ZSB2YWx1ZSBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5wYWdlU2l6ZSkge1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkEzOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkV4ZWN1dGl2ZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkV4ZWN1dGl2ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuRm9saW86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Gb2xpbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGVkZ2VyOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGVkZ2VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZWdhbDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxlZ2FsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZXR0ZXI6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLk5vdGU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Ob3RlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5RdWFydG86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5RdWFydG87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlN0YXRlbWVudDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlN0YXRlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuVGFibG9pZDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlRhYmxvaWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlVuc3BlY2lmaWVkOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uVW5zcGVjaWZpZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHBhZ2VTaXplIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBzY2FsaW5nIHZhbHVlcyBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5zY2FsaW5nKSB7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QxUGFnZUhpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0T25lSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MVBhZ2VXaWRlOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdE9uZVdpZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDJQYWdlc0hpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0VHdvSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MlBhZ2VzV2lkZTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRUd29XaWRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdXRvbWF0aWM6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3RBdXRvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMTAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MTAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MjAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QyNSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzQwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDQwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzUwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM2MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDYwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNzU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q3NSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzgwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0ODApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM5MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDkwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgc2NhbGluZyBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogTW9kaWZpZXMgdGhlIHNoZWV0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqIFNlZSB0aGUgaGFuZGxlRXhwb3J0Q2xpY2sgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVNoZWV0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucywgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZXhwb3J0TGF5b3V0T3B0aW9ucywgc2hlZXRPcHRpb25zIH0gPSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgLy8gdXBkYXRpbmcgdGhlIGV4cG9ydCBsYXlvdXRzIG9wdGlvbnMgZm9yIGVhY2ggc2hlZXQgYW5kIHNlbGVjdGluZyBzaGVldCBmb3IgZXhwb3J0IGlmIGluY2x1ZGVkIGluIGxpc3RcbiAgICBmb3IgKGNvbnN0IHNoZWV0T3B0aW9uIG9mIHNoZWV0T3B0aW9ucykge1xuICAgICAgc2hlZXRPcHRpb24uZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGV4cG9ydExheW91dE9wdGlvbnM7XG4gICAgICBzaGVldE9wdGlvbi5pc1NlbGVjdGVkID0gc2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE9wdGlvbi5zaGVldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUV4cG9ydExheW91dE9wdG9ucy5cbiAgICogVGhpcyBtZXRob2QgaXMgYSBzcG9vZiBvZiB0aGUgZ2V0Rml0QW5kU2NhbGVWYWx1ZXMgbWV0aG9kIHVzZWQgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMgdG8gc2V0IHRoZSBleHBvcnRMYXlvdXRPcHRpb25zJyBzY2FsaW5nIHByb3BlcnRpZXMuXG4gICAqIEluIHRoZSBmdXR1cmUsIHRoaXMgZmlsZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBpbXBvcnQgdGhlIG1ldGhvZCBkaXJlY3RseSBmcm9tIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NhbGluZ1NlbGVjdGlvbiBzdHJpbmcgdXNlZCBmb3Igc2V0dGluZyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBiYXNlZCBvbiB0aGUgUHJpbnRTY2FsaW5nIHByb3BlcnR5IGZyb20gdGhlIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogQHBhcmFtIGV4cG9ydExheW91dE9wdGlvbnMgdGhlIEV4cG9ydExheW91dE9wdGlvbnMgdXNlZCBieSB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zLCBzY2FsaW5nU2VsZWN0aW9uOiBTY2FsaW5nU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgbGV0IHsgcGFnZUZpdEhvcml6b250YWwsIHBhZ2VGaXRWZXJ0aWNhbCwgcGFnZVNjYWxlTW9kZSwgcGFnZVNjYWxlUGVyY2VudCB9ID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucztcblxuICAgIGNvbnN0IGZpdE1hdGNoID0gdGhpcy5maXRSZWdleC5leGVjKHNjYWxpbmdTZWxlY3Rpb24pO1xuICAgIGNvbnN0IHBlcmNlbnRNYXRjaCA9IHRoaXMucGN0UmVnZXguZXhlYyhzY2FsaW5nU2VsZWN0aW9uKTtcblxuICAgIGlmIChmaXRNYXRjaCkge1xuICAgICAgW3BhZ2VGaXRIb3Jpem9udGFsLCBwYWdlRml0VmVydGljYWxdID0gZml0TWF0Y2guc2xpY2UoMSkubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSk7XG4gICAgICBwYWdlU2NhbGVNb2RlID0gU2NhbGVNb2RlLlNjYWxlRml0UGFnZXM7XG4gICAgfSBlbHNlIGlmIChwZXJjZW50TWF0Y2gpIHtcbiAgICAgIFtwYWdlU2NhbGVQZXJjZW50XSA9IHBlcmNlbnRNYXRjaC5zbGljZSgxKS5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKTtcbiAgICAgIHBhZ2VTY2FsZU1vZGUgPSBTY2FsZU1vZGUuU2NhbGVQZXJjZW50YWdlO1xuICAgIH1cblxuICAgIC8vIGdldEZpdEFuZFNjYWxlVmFsdWVzIHJldHVybnMgdGhlIHByb3BlcnRpZXMgYmVsb3csIGJ1dCBpbnN0ZWFkIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZW0uXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlRml0SG9yaXpvbnRhbCA9IHBhZ2VGaXRIb3Jpem9udGFsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZUZpdFZlcnRpY2FsID0gcGFnZUZpdFZlcnRpY2FsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNjYWxlTW9kZSA9IHBhZ2VTY2FsZU1vZGU7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2NhbGVQZXJjZW50ID0gcGFnZVNjYWxlUGVyY2VudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZpdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnZml0KFswLTldKyl4KFswLTldKyknKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGN0UmVnZXggPSBuZXcgUmVnRXhwKCdwY3QoWzAtOV0rKScpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogc2VyaWFsaXplcyB0aGUgZGF0ZSBpbnRvIHRoZSBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbTogbnVtYmVyID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjOiBudW1iZXIgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybShib29sOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYm9vbCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBudW1iZXJcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBpbnB1dCBpcyBhIERhdGVcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVEYXRlKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZVN0cmluZyhpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoUGFyYW0uaXNUeXBlTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKHZhbHVlIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBEYXRlKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZUJvb2wodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplQm9vbGVhbkZvclBsYXRmb3JtKHZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuZXhwZWN0ZWQgaW52YWxpZCB2YWx1ZSBmb3I6ICR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBhbHJlYWR5IGEgTWFwLCBvciBjb252ZXJ0cyBhbiBvYmplY3QgdG8gYSBNYXAuXG4gICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IGl0IHRvIGEgTWFwIHVzaW5nIE9iamVjdC5lbnRyaWVzLlxuICAgKiBAdGhyb3dzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCBvciBNYXBcbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0UGFyYW1ldGVyVG9NYXAocGFyYW06IG9iamVjdCwgcGFyYW1OYW1lOiBzdHJpbmcpOiBNYXA8YW55LCBhbnk+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShwYXJhbSwgJ29iamVjdCcsIHBhcmFtTmFtZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYEV4cGVjdGluZyBvYmplY3Qgb3IgTWFwIGZvcjogJHtwYXJhbU5hbWV9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIE1hcCA/IHBhcmFtIDogbmV3IE1hcChPYmplY3QuZW50cmllcyhwYXJhbSkpO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHRyeVBhcnNlTnVtYmVyKHZhbHVlOiBhbnkpOiB7IHBhcnNlZD86IG51bWJlcjsgc3VjY2VzczogYm9vbGVhbiB9IHtcbiAgICBpZiAoUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBwYXJzZWQ6IHZhbHVlIGFzIG51bWJlciwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWVTdHJpbmcgPT09ICdOYU4nKSB7XG4gICAgICAvLyAnTmFOJyBwYXJzZXMgYXMgTmFOIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmYWlsZWQgcGFyc2UuXG4gICAgICByZXR1cm4geyBwYXJzZWQ6IE5hTiwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWVTdHJpbmcpO1xuICAgIGlmIChpc05hTihwYXJzZWQpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnNlZCwgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRJbmZvLCBTaGVldFR5cGUsIFNpemVDb25zdHJhaW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldFV0aWxzIHtcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBwb3J0IGZyb20gU2hlZXRTaXplLmNzIC0gU2hlZXRTaXplRmFjdG9yeVxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2l6ZUNvbnN0cmFpbnQ6IFNpemVDb25zdHJhaW50KTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IHNpemVDb25zdHJhaW50O1xuXG4gICAgaWYgKG1pbkhlaWdodCA9PT0gMCAmJiBtaW5XaWR0aCA9PT0gMCkge1xuICAgICAgaWYgKG1heEhlaWdodCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3QsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWF4SGVpZ2h0ID09PSAwICYmIG1heFdpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdCxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtYXhIZWlnaHQgPT09IG1pbkhlaWdodCAmJiBtYXhXaWR0aCA9PT0gbWluV2lkdGggJiYgbWluV2lkdGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseSxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAnRml0IFdpZHRoJyBmb3IgYSBEU0QgbGF5b3V0XG4gICAgY29uc3QgaXNEc2RMYXlvdXQgPSBtaW5XaWR0aCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UsXG4gICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIG1heFNpemU6IHsgd2lkdGg6IGlzRHNkTGF5b3V0ID8gMjE0NzQ4MzY0NyA6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUF1dG9tYXRpY1NpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBsZXQgYmVoYXZpb3IgPSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgbGV0IG1pblNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBsZXQgbWF4U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShuYW1lOiBzdHJpbmcsIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4pOiBTaGVldEluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoZWV0SW5mbyA9IHNoZWV0SW5mb3MuZmluZCgoc2hlZXQpID0+IHNoZWV0Lm5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiBzaGVldEluZm87XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0VHlwZUVudW0oaW50ZXJuYWxTaGVldFR5cGU6IFNoZWV0VHlwZSk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgbGV0IHNoZWV0VHlwZTogQ29udHJhY3QuU2hlZXRUeXBlO1xuICAgIHN3aXRjaCAoaW50ZXJuYWxTaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLlN0b3J5OiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5TdG9yeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRTaGVldFNpemUoc2l6ZU9iamVjdDogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSk6IHNpemVPYmplY3QgaXMgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gKDxDb250cmFjdC5TaGVldFNpemU+c2l6ZU9iamVjdCkuYmVoYXZpb3IgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEZWZlcnJlZCwgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vRGVmZXJyZWQnO1xuXG4vKipcbiAqIEEgRGVmZXJyZWQgd3JhcHBlciBjbGFzcyBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byByZWplY3QgdW5yZXNwb25zaXZlIHByb21pc2VzIGFmdGVyIHRpbWVvdXRcbiAqXG4gKiB0aGlzIGNsYXNzIGhhbmRsZXMgdHdvIHRoaW5nczpcblxuICogICAgMS4gQWRkcyB0aW1lb3V0IGxvZ2ljIGZvciBkZWZlcnJlZFxuICogICAgMi4gSXQgYmxvY2tzIG11bHRpcGxlIGNhbGxzIGZyb20gZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNob3J0TGl2ZWREZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2hvcnRMaXZlZERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX2RlZmVycmVkOiBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3RpbWVvdXRJZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGltZW91dEluTWlsbGlzZWNvbmRzID0gVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge31cblxuICBwdWJsaWMgZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkFwaUV4ZWN1dGlvbkVycm9yLCAnVGhpcyBhcGkgY2Fubm90IGJlIGV4ZWN1dGVkIHRpbGwgcHJldmlvdXMgY2FsbCBpcyByZXNvbHZlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlRpbWVvdXQsXG4gICAgICAgIGBBcGkgZmFpbGVkIHRvIGNvbXBsZXRlIGluICR7dGhpcy5fdGltZW91dEluTWlsbGlzZWNvbmRzIC8gMTAwMH0gc2Vjb25kc2AsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWplY3QoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMsIGVtYmVkZGluZ1xuICogYW5kIGV4dGVuc2lvbnMtYXBpLXR5cGVzIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25OdW1iZXIgaW1wbGVtZW50cyBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9uU3RyaW5nfWApO1xuICAgIH1cblxuICAgIHRoaXMubWFqb3IgPSBwYXJ0c1swXTtcbiAgICB0aGlzLm1pbm9yID0gcGFydHNbMV07XG4gICAgdGhpcy5maXggPSBwYXJ0c1syXTtcbiAgICB0aGlzLmlzQWxwaGEgPSBpc0FscGhhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZE51bWJlcihwcmVSZWxlYXNlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG5vQnVpbGROdW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGNvbnN0IHBhcnRTdHIgPSBwcmVSZWxlYXNlU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRTdHJbMV0gPyBwYXJzZUludChwYXJ0U3RyWzFdLCAxMCkgOiBub0J1aWxkTnVtYmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnVsbEZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH0tcHJlLiR7dGhpcy5idWlsZH1gO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBOb3RpZmljYXRpb24sXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIFZlcmJJZCxcbiAgVmVyc2lvbkxlc3NUaGFuLFxuICBWZXJzaW9uTnVtYmVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyKSB7XG4gICAgdGhpcy5fdmVyc2lvbkNvbnZlcnRlciA9IENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXIoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyKTtcblxuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gW107XG4gICAgX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZ3JhZGVkTm90aWZpY2F0aW9uID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIGhhbmRsZXIodXBncmFkZWROb3RpZmljYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG5lZWRzVmVyc2lvbkNvbnZlcnRlcihwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBJZiBvdXIgcGxhdGZvcm0gaXMgbGVzcyB0aGFuIGV4dGVybmFsIGxpYnJhcnkgdmVyc2lvbiwgdGhlbiB3ZSBuZWVkIGEgY29udmVydGVyXG4gICAgcmV0dXJuIFZlcnNpb25MZXNzVGhhbihwbGF0Zm9ybVZlcnNpb24sIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRvd25ncmFkZVBhcmFtZXRlcnMgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLmRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5leGVjdXRlKGRvd25ncmFkZVBhcmFtZXRlcnMudmVyYiwgZG93bmdyYWRlUGFyYW1ldGVycy5wYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGdyYWRlUmVzcG9uc2UgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLnVwZ3JhZGVFeGVjdXRlUmV0dXJuKHJlc3BvbnNlLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHVwZ3JhZGVSZXNwb25zZTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaCAhPT0gaGFuZGxlcik7XG4gIH1cbn1cbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyIsIi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+PiA1XSA+Pj4gaSAlIDMyICYgMHhmZjtcbiAgICB2YXIgaGV4ID0gcGFyc2VJbnQoaGV4VGFiLmNoYXJBdCh4ID4+PiA0ICYgMHgwZikgKyBoZXhUYWIuY2hhckF0KHggJiAweDBmKSwgMTYpO1xuICAgIG91dHB1dC5wdXNoKGhleCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgb3V0cHV0IGxlbmd0aCB3aXRoIHBhZGRpbmcgYW5kIGJpdCBsZW5ndGhcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aDgpIHtcbiAgcmV0dXJuIChpbnB1dExlbmd0aDggKyA2NCA+Pj4gOSA8PCA0KSArIDE0ICsgMTtcbn1cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5cblxuZnVuY3Rpb24gd29yZHNUb01kNSh4LCBsZW4pIHtcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCBsZW4gJSAzMjtcbiAgeFtnZXRPdXRwdXRMZW5ndGgobGVuKSAtIDFdID0gbGVuO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cblxuICByZXR1cm4gW2EsIGIsIGMsIGRdO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBieXRlc1RvV29yZHMoaW5wdXQpIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoODsgaSArPSA4KSB7XG4gICAgb3V0cHV0W2kgPj4gNV0gfD0gKGlucHV0W2kgLyA4XSAmIDB4ZmYpIDw8IGkgJSAzMjtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseVxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG4vKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICovXG5cblxuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gbnVtIDw8IGNudCB8IG51bSA+Pj4gMzIgLSBjbnQ7XG59XG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNWNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIHJldHVybiBzYWZlQWRkKGJpdFJvdGF0ZUxlZnQoc2FmZUFkZChzYWZlQWRkKGEsIHEpLCBzYWZlQWRkKHgsIHQpKSwgcyksIGIpO1xufVxuXG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGQgfCBjICYgfmQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1kNTsiLCJleHBvcnQgZGVmYXVsdCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJzsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJleHBvcnQgZGVmYXVsdCAvXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7IC8vICoqYHYxKClgIC0gR2VuZXJhdGUgdGltZS1iYXNlZCBVVUlEKipcbi8vXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vTGlvc0svVVVJRC5qc1xuLy8gYW5kIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91dWlkLmh0bWxcblxudmFyIF9ub2RlSWQ7XG5cbnZhciBfY2xvY2tzZXE7IC8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxuXG5cbnZhciBfbGFzdE1TZWNzID0gMDtcbnZhciBfbGFzdE5TZWNzID0gMDsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCBmb3IgQVBJIGRldGFpbHNcblxuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCBfbm9kZUlkO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsb2Nrc2VxIDogX2Nsb2Nrc2VxOyAvLyBub2RlIGFuZCBjbG9ja3NlcSBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHRvIHJhbmRvbSB2YWx1ZXMgaWYgdGhleSdyZSBub3RcbiAgLy8gc3BlY2lmaWVkLiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50XG4gIC8vIHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcblxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTtcblxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjUsIGNyZWF0ZSBhbmQgNDgtYml0IG5vZGUgaWQsICg0NyByYW5kb20gYml0cyArIG11bHRpY2FzdCBiaXQgPSAxKVxuICAgICAgbm9kZSA9IF9ub2RlSWQgPSBbc2VlZEJ5dGVzWzBdIHwgMHgwMSwgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1dO1xuICAgIH1cblxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgIH1cbiAgfSAvLyBVVUlEIHRpbWVzdGFtcHMgYXJlIDEwMCBuYW5vLXNlY29uZCB1bml0cyBzaW5jZSB0aGUgR3JlZ29yaWFuIGVwb2NoLFxuICAvLyAoMTU4Mi0xMC0xNSAwMDowMCkuICBKU051bWJlcnMgYXJlbid0IHByZWNpc2UgZW5vdWdoIGZvciB0aGlzLCBzb1xuICAvLyB0aW1lIGlzIGhhbmRsZWQgaW50ZXJuYWxseSBhcyAnbXNlY3MnIChpbnRlZ2VyIG1pbGxpc2Vjb25kcykgYW5kICduc2VjcydcbiAgLy8gKDEwMC1uYW5vc2Vjb25kcyBvZmZzZXQgZnJvbSBtc2Vjcykgc2luY2UgdW5peCBlcG9jaCwgMTk3MC0wMS0wMSAwMDowMC5cblxuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpOyAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG5cbiAgdmFyIG5zZWNzID0gb3B0aW9ucy5uc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc2VjcyA6IF9sYXN0TlNlY3MgKyAxOyAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG5cbiAgdmFyIGR0ID0gbXNlY3MgLSBfbGFzdE1TZWNzICsgKG5zZWNzIC0gX2xhc3ROU2VjcykgLyAxMDAwMDsgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuXG4gIGlmIChkdCA8IDAgJiYgb3B0aW9ucy5jbG9ja3NlcSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2xvY2tzZXEgPSBjbG9ja3NlcSArIDEgJiAweDNmZmY7XG4gIH0gLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuXG5cbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH0gLy8gUGVyIDQuMi4xLjIgVGhyb3cgZXJyb3IgaWYgdG9vIG1hbnkgdXVpZHMgYXJlIHJlcXVlc3RlZFxuXG5cbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7IC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwOyAvLyBgdGltZV9sb3dgXG5cbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjsgLy8gYHRpbWVfbWlkYFxuXG4gIHZhciB0bWggPSBtc2VjcyAvIDB4MTAwMDAwMDAwICogMTAwMDAgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7IC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG5cbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmOyAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcblxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmIHx8IHN0cmluZ2lmeShiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLi9wYXJzZS5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgdmFyIEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IHZhciBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9IHBhcnNlKG5hbWVzcGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9IC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG5cblxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnkoYnl0ZXMpO1xuICB9IC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuXG5cbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbi8vIFRoZSBmb2xsb3dpbmcgcG9seWZpbGxzIGFyZSBuZWVkZWQgZm9yIElFMTFcblxuaW1wb3J0IHsgQXBpVmVyc2lvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL2FycmF5L2ZpbmQnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL2FycmF5L2Zyb20nO1xuaW1wb3J0ICdjb3JlLWpzL2VzL21hcCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL2lzLWludGVnZXInO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1uYW4nO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9wYXJzZS1mbG9hdCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL3BhcnNlLWludCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L2Fzc2lnbic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mJztcbmltcG9ydCAnY29yZS1qcy9lcy9wcm9taXNlJztcbi8vIER1ZSB0byB0aGUgd2F5IHdlIGNvbmZpZ3VyZWQgd2VicGFjaywgd2Ugc2hvdWxkIGJlIGV4cG9ydGluZyB0aGluZ3Mgd2hpY2ggd2lsbCBiZSB1bmRlclxuLy8gYSBnbG9iYWwgdmFyaWFibGUgY2FsbGVkIFwidGFibGVhdVwiLiBFeHBvcnQgZXZlcnl0aGluZyB3ZSB3YW50IHRvIGJlIHZpc2libGUgdW5kZXIgdGFibGVhdVxuLy8gZnJvbSB0aGlzIGZpbGUuXG5pbXBvcnQgeyBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcblxuZGVjbGFyZSBsZXQgVkVSU0lPTl9JU19BTFBIQTogYm9vbGVhbjtcbmNvbnN0IGlzQWxwaGE6IGJvb2xlYW4gPSB0eXBlb2YgVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBWRVJTSU9OX0lTX0FMUEhBIDogZmFsc2U7XG5cbmRlY2xhcmUgbGV0IEFQSV9WRVJTSU9OX05VTUJFUjogc3RyaW5nO1xuQXBpVmVyc2lvbi5TZXRWZXJzaW9uTnVtYmVyKHR5cGVvZiBBUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gQVBJX1ZFUlNJT05fTlVNQkVSIDogJzAuMC4wJywgaXNBbHBoYSk7XG5cbmNvbnN0IGV4dGVuc2lvbkltcGwgPSBuZXcgRXh0ZW5zaW9uc0ltcGwoKTtcbmV4cG9ydCBjb25zdCBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnMoZXh0ZW5zaW9uSW1wbCk7XG5cbi8vIEV4cG9ydCBFbnVtc1xuLy8gVGhlc2Ugc2hvdyB1cCB1bmRlciB0aGUgdGFibGVhdSBvYmplY3QuIEkuZS4gdGFibGVhdS5FeHRlbnNpb25Db250ZXh0LlNlcnZlclxuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUsXG4gIERpYWxvZ1N0eWxlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBSZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFNlbGVjdE9wdGlvbnMsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNoZWV0VHlwZSxcbiAgU29ydERpcmVjdGlvbixcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVHJlbmRMaW5lTW9kZWxUeXBlLFxuICBWaXpJbWFnZUVuY29kaW5nVHlwZSxcbiAgVml6SW1hZ2VQYWxldHRlVHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlLFxuICBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/lib/previous/tableau.extensions.1.11.1.min.js b/lib/previous/tableau.extensions.1.11.1.min.js new file mode 100644 index 00000000..166ac3f5 --- /dev/null +++ b/lib/previous/tableau.extensions.1.11.1.min.js @@ -0,0 +1,2 @@ +(()=>{var e={3e3:(e,t,r)=>{r(5092);var n=r(7880);e.exports=n("Array","find")},8315:(e,t,r)=>{r(8504),r(5684);var n=r(340);e.exports=n.Array.from},80:(e,t,r)=>{r(3924),r(472),r(7912),r(8504);var n=r(340);e.exports=n.Map},5668:(e,t,r)=>{r(1300);var n=r(340);e.exports=n.Number.isInteger},5816:(e,t,r)=>{r(3656);var n=r(340);e.exports=n.Number.isNaN},3680:(e,t,r)=>{r(6544);var n=r(340);e.exports=n.Number.parseFloat},9308:(e,t,r)=>{r(7972);var n=r(340);e.exports=n.Number.parseInt},8824:(e,t,r)=>{r(6368);var n=r(340);e.exports=n.Object.assign},8512:(e,t,r)=>{r(8292);var n=r(340);e.exports=n.Object.entries},9232:(e,t,r)=>{r(920);var n=r(340);e.exports=n.Object.setPrototypeOf},9336:(e,t,r)=>{r(6140),r(3924),r(7912),r(7448),r(3936),r(5428),r(1517),r(8504);var n=r(340);e.exports=n.Promise},1381:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a function")}},6372:(e,t,r)=>{var n=r(1600),i=r(5220),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a constructor")}},4040:(e,t,r)=>{var n=r(1600),i=r(984),o=n.String,a=n.TypeError;e.exports=function(e){if("object"==typeof e||i(e))return e;throw a("Can't set "+o(e)+" as a prototype")}},5868:(e,t,r)=>{var n=r(3668),i=r(124),o=r(7072),a=n("unscopables"),s=Array.prototype;null==s[a]&&o.f(s,a,{configurable:!0,value:i(null)}),e.exports=function(e){s[a][e]=!0}},2932:(e,t,r)=>{var n=r(1600),i=r(2408),o=n.TypeError;e.exports=function(e,t){if(i(t,e))return e;throw o("Incorrect invocation")}},3736:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.String,a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not an object")}},8208:(e,t,r)=>{"use strict";var n=r(1600),i=r(5616),o=r(3032),a=r(3848),s=r(3140),u=r(4064),l=r(5220),c=r(9183),p=r(4135),d=r(4944),f=r(8132),y=n.Array;e.exports=function(e){var t=a(e),r=l(this),n=arguments.length,h=n>1?arguments[1]:void 0,m=void 0!==h;m&&(h=i(h,n>2?arguments[2]:void 0));var g,v,b,I,S,_,T=f(t),P=0;if(!T||this==y&&u(T))for(g=c(t),v=r?new this(g):y(g);g>P;P++)_=m?h(t[P],P):t[P],p(v,P,_);else for(S=(I=d(t,T)).next,v=r?new this:[];!(b=o(S,I)).done;P++)_=m?s(I,h,[b.value,P],!0):b.value,p(v,P,_);return v.length=P,v}},6024:(e,t,r)=>{var n=r(3068),i=r(7920),o=r(9183),a=function(e){return function(t,r,a){var s,u=n(t),l=o(u),c=i(a,l);if(e&&r!=r){for(;l>c;)if((s=u[c++])!=s)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===r)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},9560:(e,t,r)=>{var n=r(5616),i=r(604),o=r(3188),a=r(3848),s=r(9183),u=r(1220),l=i([].push),c=function(e){var t=1==e,r=2==e,i=3==e,c=4==e,p=6==e,d=7==e,f=5==e||p;return function(y,h,m,g){for(var v,b,I=a(y),S=o(I),_=n(h,m),T=s(S),P=0,A=g||u,E=t?A(y,T):r||d?A(y,0):void 0;T>P;P++)if((f||P in S)&&(b=_(v=S[P],P,I),e))if(t)E[P]=b;else if(b)switch(e){case 3:return!0;case 5:return v;case 6:return P;case 2:l(E,v)}else switch(e){case 4:return!1;case 7:l(E,v)}return p?-1:i||c?c:E}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},6100:(e,t,r)=>{var n=r(604);e.exports=n([].slice)},4096:(e,t,r)=>{var n=r(1600),i=r(5240),o=r(5220),a=r(9952),s=r(3668)("species"),u=n.Array;e.exports=function(e){var t;return i(e)&&(t=e.constructor,(o(t)&&(t===u||i(t.prototype))||a(t)&&null===(t=t[s]))&&(t=void 0)),void 0===t?u:t}},1220:(e,t,r)=>{var n=r(4096);e.exports=function(e,t){return new(n(e))(0===t?0:t)}},3140:(e,t,r)=>{var n=r(3736),i=r(1792);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){i(e,"throw",t)}}},6344:(e,t,r)=>{var n=r(3668)("iterator"),i=!1;try{var o=0,a={next:function(){return{done:!!o++}},return:function(){i=!0}};a[n]=function(){return this},Array.from(a,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var r=!1;try{var o={};o[n]=function(){return{next:function(){return{done:r=!0}}}},e(o)}catch(e){}return r}},4108:(e,t,r)=>{var n=r(604),i=n({}.toString),o=n("".slice);e.exports=function(e){return o(i(e),8,-1)}},1248:(e,t,r)=>{var n=r(1600),i=r(7796),o=r(984),a=r(4108),s=r(3668)("toStringTag"),u=n.Object,l="Arguments"==a(function(){return arguments}());e.exports=i?a:function(e){var t,r,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=u(e),s))?r:l?a(t):"Object"==(n=a(t))&&o(t.callee)?"Arguments":n}},5032:(e,t,r)=>{var n=r(604),i=r(6100),o=n("".replace),a=n("".split),s=n([].join),u=String(Error("zxcasd").stack),l=/\n\s*at [^:]*:[^\n]*/,c=l.test(u),p=/@[^\n]*\n/.test(u)&&!/zxcasd/.test(u);e.exports=function(e,t){if("string"!=typeof e)return e;if(c)for(;t--;)e=o(e,l,"");else if(p)return s(i(a(e,"\n"),t),"\n");return e}},9920:(e,t,r)=>{"use strict";var n=r(7072).f,i=r(124),o=r(7431),a=r(5616),s=r(2932),u=r(9928),l=r(2648),c=r(9688),p=r(2828),d=r(8756).fastKey,f=r(7932),y=f.set,h=f.getterFor;e.exports={getConstructor:function(e,t,r,l){var c=e((function(e,n){s(e,f),y(e,{type:t,index:i(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=n&&u(n,e[l],{that:e,AS_ENTRIES:r})})),f=c.prototype,m=h(t),g=function(e,t,r){var n,i,o=m(e),a=v(e,t);return a?a.value=r:(o.last=a={index:i=d(t,!0),key:t,value:r,previous:n=o.last,next:void 0,removed:!1},o.first||(o.first=a),n&&(n.next=a),p?o.size++:e.size++,"F"!==i&&(o.index[i]=a)),e},v=function(e,t){var r,n=m(e),i=d(t);if("F"!==i)return n.index[i];for(r=n.first;r;r=r.next)if(r.key==t)return r};return o(f,{clear:function(){for(var e=m(this),t=e.index,r=e.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete t[r.index],r=r.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,r=m(t),n=v(t,e);if(n){var i=n.next,o=n.previous;delete r.index[n.index],n.removed=!0,o&&(o.next=i),i&&(i.previous=o),r.first==n&&(r.first=i),r.last==n&&(r.last=o),p?r.size--:t.size--}return!!n},forEach:function(e){for(var t,r=m(this),n=a(e,arguments.length>1?arguments[1]:void 0);t=t?t.next:r.first;)for(n(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!v(this,e)}}),o(f,r?{get:function(e){var t=v(this,e);return t&&t.value},set:function(e,t){return g(this,0===e?0:e,t)}}:{add:function(e){return g(this,e=0===e?0:e,e)}}),p&&n(f,"size",{get:function(){return m(this).size}}),c},setStrong:function(e,t,r){var n=t+" Iterator",i=h(t),o=h(n);l(e,t,(function(e,t){y(this,{type:n,target:e,state:i(e),kind:t,last:void 0})}),(function(){for(var e=o(this),t=e.kind,r=e.last;r&&r.removed;)r=r.previous;return e.target&&(e.last=r=r?r.next:e.state.first)?"keys"==t?{value:r.key,done:!1}:"values"==t?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),r?"entries":"values",!r,!0),c(t)}}},6064:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(604),a=r(4232),s=r(5028),u=r(8756),l=r(9928),c=r(2932),p=r(984),d=r(9952),f=r(7004),y=r(6344),h=r(9540),m=r(7692);e.exports=function(e,t,r){var g=-1!==e.indexOf("Map"),v=-1!==e.indexOf("Weak"),b=g?"set":"add",I=i[e],S=I&&I.prototype,_=I,T={},P=function(e){var t=o(S[e]);s(S,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return v&&!d(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:function(e,r){return t(this,0===e?0:e,r),this})};if(a(e,!p(I)||!(v||S.forEach&&!f((function(){(new I).entries().next()})))))_=r.getConstructor(t,e,g,b),u.enable();else if(a(e,!0)){var A=new _,E=A[b](v?{}:-0,1)!=A,w=f((function(){A.has(1)})),O=y((function(e){new I(e)})),D=!v&&f((function(){for(var e=new I,t=5;t--;)e[b](t,t);return!e.has(-0)}));O||((_=t((function(e,t){c(e,S);var r=m(new I,e,_);return null!=t&&l(t,r[b],{that:r,AS_ENTRIES:g}),r}))).prototype=S,S.constructor=_),(w||D)&&(P("delete"),P("has"),g&&P("get")),(D||E)&&P(b),v&&S.clear&&delete S.clear}return T[e]=_,n({global:!0,forced:_!=I},T),h(_,e),v||r.setStrong(_,e,g),_}},4640:(e,t,r)=>{var n=r(9180),i=r(4092),o=r(2920),a=r(7072);e.exports=function(e,t){for(var r=i(t),s=a.f,u=o.f,l=0;l{var n=r(7004);e.exports=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},9292:(e,t,r)=>{"use strict";var n=r(804).IteratorPrototype,i=r(124),o=r(364),a=r(9540),s=r(2204),u=function(){return this};e.exports=function(e,t,r){var l=t+" Iterator";return e.prototype=i(n,{next:o(1,r)}),a(e,l,!1,!0),s[l]=u,e}},4768:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(364);e.exports=n?function(e,t,r){return i.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},364:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},4135:(e,t,r)=>{"use strict";var n=r(4061),i=r(7072),o=r(364);e.exports=function(e,t,r){var a=n(t);a in e?i.f(e,a,o(0,r)):e[a]=r}},2648:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(7408),a=r(8492),s=r(984),u=r(9292),l=r(6232),c=r(3440),p=r(9540),d=r(4768),f=r(5028),y=r(3668),h=r(2204),m=r(804),g=a.PROPER,v=a.CONFIGURABLE,b=m.IteratorPrototype,I=m.BUGGY_SAFARI_ITERATORS,S=y("iterator"),_="keys",T="values",P="entries",A=function(){return this};e.exports=function(e,t,r,a,y,m,E){u(r,t,a);var w,O,D,x=function(e){if(e===y&&k)return k;if(!I&&e in N)return N[e];switch(e){case _:case T:case P:return function(){return new r(this,e)}}return function(){return new r(this)}},F=t+" Iterator",C=!1,N=e.prototype,M=N[S]||N["@@iterator"]||y&&N[y],k=!I&&M||x(y),R="Array"==t&&N.entries||M;if(R&&(w=l(R.call(new e)))!==Object.prototype&&w.next&&(o||l(w)===b||(c?c(w,b):s(w[S])||f(w,S,A)),p(w,F,!0,!0),o&&(h[F]=A)),g&&y==T&&M&&M.name!==T&&(!o&&v?d(N,"name",T):(C=!0,k=function(){return i(M,this)})),y)if(O={values:x(T),keys:m?k:x(_),entries:x(P)},E)for(D in O)(I||C||!(D in N))&&f(N,D,O[D]);else n({target:t,proto:!0,forced:I||C},O);return o&&!E||N[S]===k||f(N,S,k,{name:y}),h[t]=k,O}},2828:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},7300:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},4532:e=>{e.exports="object"==typeof window},264:(e,t,r)=>{var n=r(5316),i=r(1600);e.exports=/ipad|iphone|ipod/i.test(n)&&void 0!==i.Pebble},1588:(e,t,r)=>{var n=r(5316);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},3640:(e,t,r)=>{var n=r(4108),i=r(1600);e.exports="process"==n(i.process)},7888:(e,t,r)=>{var n=r(5316);e.exports=/web0s(?!.*chrome)/i.test(n)},5316:(e,t,r)=>{var n=r(6532);e.exports=n("navigator","userAgent")||""},2592:(e,t,r)=>{var n,i,o=r(1600),a=r(5316),s=o.process,u=o.Deno,l=s&&s.versions||u&&u.version,c=l&&l.v8;c&&(i=(n=c.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!i&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(i=+n[1]),e.exports=i},7880:(e,t,r)=>{var n=r(1600),i=r(604);e.exports=function(e,t){return i(n[e].prototype[t])}},8675:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},4464:(e,t,r)=>{var n=r(7004),i=r(364);e.exports=!n((function(){var e=Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",i(1,7)),7!==e.stack)}))},7248:(e,t,r)=>{var n=r(1600),i=r(2920).f,o=r(4768),a=r(5028),s=r(2984),u=r(4640),l=r(4232);e.exports=function(e,t){var r,c,p,d,f,y=e.target,h=e.global,m=e.stat;if(r=h?n:m?n[y]||s(y,{}):(n[y]||{}).prototype)for(c in t){if(d=t[c],p=e.noTargetGet?(f=i(r,c))&&f.value:r[c],!l(h?c:y+(m?".":"#")+c,e.forced)&&void 0!==p){if(typeof d==typeof p)continue;u(d,p)}(e.sham||p&&p.sham)&&o(d,"sham",!0),a(r,c,d,e)}}},7004:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},1748:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},9756:e=>{var t=Function.prototype,r=t.apply,n=t.bind,i=t.call;e.exports="object"==typeof Reflect&&Reflect.apply||(n?i.bind(r):function(){return i.apply(r,arguments)})},5616:(e,t,r)=>{var n=r(604),i=r(1381),o=n(n.bind);e.exports=function(e,t){return i(e),void 0===t?e:o?o(e,t):function(){return e.apply(t,arguments)}}},3032:e=>{var t=Function.prototype.call;e.exports=t.bind?t.bind(t):function(){return t.apply(t,arguments)}},8492:(e,t,r)=>{var n=r(2828),i=r(9180),o=Function.prototype,a=n&&Object.getOwnPropertyDescriptor,s=i(o,"name"),u=s&&"something"===function(){}.name,l=s&&(!n||n&&a(o,"name").configurable);e.exports={EXISTS:s,PROPER:u,CONFIGURABLE:l}},604:e=>{var t=Function.prototype,r=t.bind,n=t.call,i=r&&r.bind(n);e.exports=r?function(e){return e&&i(n,e)}:function(e){return e&&function(){return n.apply(e,arguments)}}},6532:(e,t,r)=>{var n=r(1600),i=r(984);e.exports=function(e,t){return arguments.length<2?(r=n[e],i(r)?r:void 0):n[e]&&n[e][t];var r}},8132:(e,t,r)=>{var n=r(1248),i=r(8808),o=r(2204),a=r(3668)("iterator");e.exports=function(e){if(null!=e)return i(e,a)||i(e,"@@iterator")||o[n(e)]}},4944:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(1381),a=r(3736),s=r(1532),u=r(8132),l=n.TypeError;e.exports=function(e,t){var r=arguments.length<2?u(e):t;if(o(r))return a(i(r,e));throw l(s(e)+" is not iterable")}},8808:(e,t,r)=>{var n=r(1381);e.exports=function(e,t){var r=e[t];return null==r?void 0:n(r)}},1600:(e,t,r)=>{var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof r.g&&r.g)||function(){return this}()||Function("return this")()},9180:(e,t,r)=>{var n=r(604),i=r(3848),o=n({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return o(i(e),t)}},6632:e=>{e.exports={}},5651:(e,t,r)=>{var n=r(1600);e.exports=function(e,t){var r=n.console;r&&r.error&&(1==arguments.length?r.error(e):r.error(e,t))}},2960:(e,t,r)=>{var n=r(6532);e.exports=n("document","documentElement")},2339:(e,t,r)=>{var n=r(2828),i=r(7004),o=r(7300);e.exports=!n&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},3188:(e,t,r)=>{var n=r(1600),i=r(604),o=r(7004),a=r(4108),s=n.Object,u=i("".split);e.exports=o((function(){return!s("z").propertyIsEnumerable(0)}))?function(e){return"String"==a(e)?u(e,""):s(e)}:s},7692:(e,t,r)=>{var n=r(984),i=r(9952),o=r(3440);e.exports=function(e,t,r){var a,s;return o&&n(a=t.constructor)&&a!==r&&i(s=a.prototype)&&s!==r.prototype&&o(e,s),e}},1727:(e,t,r)=>{var n=r(604),i=r(984),o=r(6376),a=n(Function.toString);i(o.inspectSource)||(o.inspectSource=function(e){return a(e)}),e.exports=o.inspectSource},7660:(e,t,r)=>{var n=r(9952),i=r(4768);e.exports=function(e,t){n(t)&&"cause"in t&&i(e,"cause",t.cause)}},8756:(e,t,r)=>{var n=r(7248),i=r(604),o=r(6632),a=r(9952),s=r(9180),u=r(7072).f,l=r(4880),c=r(7316),p=r(6536),d=r(1748),f=!1,y=p("meta"),h=0,m=Object.isExtensible||function(){return!0},g=function(e){u(e,y,{value:{objectID:"O"+h++,weakData:{}}})},v=e.exports={enable:function(){v.enable=function(){},f=!0;var e=l.f,t=i([].splice),r={};r[y]=1,e(r).length&&(l.f=function(r){for(var n=e(r),i=0,o=n.length;i{var n,i,o,a=r(8736),s=r(1600),u=r(604),l=r(9952),c=r(4768),p=r(9180),d=r(6376),f=r(280),y=r(6632),h="Object already initialized",m=s.TypeError,g=s.WeakMap;if(a||d.state){var v=d.state||(d.state=new g),b=u(v.get),I=u(v.has),S=u(v.set);n=function(e,t){if(I(v,e))throw new m(h);return t.facade=e,S(v,e,t),t},i=function(e){return b(v,e)||{}},o=function(e){return I(v,e)}}else{var _=f("state");y[_]=!0,n=function(e,t){if(p(e,_))throw new m(h);return t.facade=e,c(e,_,t),t},i=function(e){return p(e,_)?e[_]:{}},o=function(e){return p(e,_)}}e.exports={set:n,get:i,has:o,enforce:function(e){return o(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!l(t)||(r=i(t)).type!==e)throw m("Incompatible receiver, "+e+" required");return r}}}},4064:(e,t,r)=>{var n=r(3668),i=r(2204),o=n("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||a[o]===e)}},5240:(e,t,r)=>{var n=r(4108);e.exports=Array.isArray||function(e){return"Array"==n(e)}},984:e=>{e.exports=function(e){return"function"==typeof e}},5220:(e,t,r)=>{var n=r(604),i=r(7004),o=r(984),a=r(1248),s=r(6532),u=r(1727),l=function(){},c=[],p=s("Reflect","construct"),d=/^\s*(?:class|function)\b/,f=n(d.exec),y=!d.exec(l),h=function(e){if(!o(e))return!1;try{return p(l,c,e),!0}catch(e){return!1}};e.exports=!p||i((function(){var e;return h(h.call)||!h(Object)||!h((function(){e=!0}))||e}))?function(e){if(!o(e))return!1;switch(a(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return y||!!f(d,u(e))}:h},4232:(e,t,r)=>{var n=r(7004),i=r(984),o=/#|\.prototype\./,a=function(e,t){var r=u[s(e)];return r==c||r!=l&&(i(t)?n(t):!!t)},s=a.normalize=function(e){return String(e).replace(o,".").toLowerCase()},u=a.data={},l=a.NATIVE="N",c=a.POLYFILL="P";e.exports=a},992:(e,t,r)=>{var n=r(9952),i=Math.floor;e.exports=Number.isInteger||function(e){return!n(e)&&isFinite(e)&&i(e)===e}},9952:(e,t,r)=>{var n=r(984);e.exports=function(e){return"object"==typeof e?null!==e:n(e)}},7408:e=>{e.exports=!1},1836:(e,t,r)=>{var n=r(1600),i=r(6532),o=r(984),a=r(2408),s=r(7216),u=n.Object;e.exports=s?function(e){return"symbol"==typeof e}:function(e){var t=i("Symbol");return o(t)&&a(t.prototype,u(e))}},9928:(e,t,r)=>{var n=r(1600),i=r(5616),o=r(3032),a=r(3736),s=r(1532),u=r(4064),l=r(9183),c=r(2408),p=r(4944),d=r(8132),f=r(1792),y=n.TypeError,h=function(e,t){this.stopped=e,this.result=t},m=h.prototype;e.exports=function(e,t,r){var n,g,v,b,I,S,_,T=r&&r.that,P=!(!r||!r.AS_ENTRIES),A=!(!r||!r.IS_ITERATOR),E=!(!r||!r.INTERRUPTED),w=i(t,T),O=function(e){return n&&f(n,"normal",e),new h(!0,e)},D=function(e){return P?(a(e),E?w(e[0],e[1],O):w(e[0],e[1])):E?w(e,O):w(e)};if(A)n=e;else{if(!(g=d(e)))throw y(s(e)+" is not iterable");if(u(g)){for(v=0,b=l(e);b>v;v++)if((I=D(e[v]))&&c(m,I))return I;return new h(!1)}n=p(e,g)}for(S=n.next;!(_=o(S,n)).done;){try{I=D(_.value)}catch(e){f(n,"throw",e)}if("object"==typeof I&&I&&c(m,I))return I}return new h(!1)}},1792:(e,t,r)=>{var n=r(3032),i=r(3736),o=r(8808);e.exports=function(e,t,r){var a,s;i(e);try{if(!(a=o(e,"return"))){if("throw"===t)throw r;return r}a=n(a,e)}catch(e){s=!0,a=e}if("throw"===t)throw r;if(s)throw a;return i(a),r}},804:(e,t,r)=>{"use strict";var n,i,o,a=r(7004),s=r(984),u=r(124),l=r(6232),c=r(5028),p=r(3668),d=r(7408),f=p("iterator"),y=!1;[].keys&&("next"in(o=[].keys())?(i=l(l(o)))!==Object.prototype&&(n=i):y=!0),null==n||a((function(){var e={};return n[f].call(e)!==e}))?n={}:d&&(n=u(n)),s(n[f])||c(n,f,(function(){return this})),e.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:y}},2204:e=>{e.exports={}},9183:(e,t,r)=>{var n=r(1868);e.exports=function(e){return n(e.length)}},3104:(e,t,r)=>{var n,i,o,a,s,u,l,c,p=r(1600),d=r(5616),f=r(2920).f,y=r(5952).set,h=r(1588),m=r(264),g=r(7888),v=r(3640),b=p.MutationObserver||p.WebKitMutationObserver,I=p.document,S=p.process,_=p.Promise,T=f(p,"queueMicrotask"),P=T&&T.value;P||(n=function(){var e,t;for(v&&(e=S.domain)&&e.exit();i;){t=i.fn,i=i.next;try{t()}catch(e){throw i?a():o=void 0,e}}o=void 0,e&&e.enter()},h||v||g||!b||!I?!m&&_&&_.resolve?((l=_.resolve(void 0)).constructor=_,c=d(l.then,l),a=function(){c(n)}):v?a=function(){S.nextTick(n)}:(y=d(y,p),a=function(){y(n)}):(s=!0,u=I.createTextNode(""),new b(n).observe(u,{characterData:!0}),a=function(){u.data=s=!s})),e.exports=P||function(e){var t={fn:e,next:void 0};o&&(o.next=t),i||(i=t,a()),o=t}},3459:(e,t,r)=>{var n=r(1600);e.exports=n.Promise},3880:(e,t,r)=>{var n=r(2592),i=r(7004);e.exports=!!Object.getOwnPropertySymbols&&!i((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},8736:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1727),a=n.WeakMap;e.exports=i(a)&&/native code/.test(o(a))},8071:(e,t,r)=>{"use strict";var n=r(1381),i=function(e){var t,r;this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n})),this.resolve=n(t),this.reject=n(r)};e.exports.f=function(e){return new i(e)}},5744:(e,t,r)=>{var n=r(748);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:n(e)}},6016:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=o("".charAt),c=n.parseFloat,p=n.Symbol,d=p&&p.iterator,f=1/c(u+"-0")!=-1/0||d&&!i((function(){c(Object(d))}));e.exports=f?function(e){var t=s(a(e)),r=c(t);return 0===r&&"-"==l(t,0)?-0:r}:c},6556:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=n.parseInt,c=n.Symbol,p=c&&c.iterator,d=/^[+-]?0x/i,f=o(d.exec),y=8!==l(u+"08")||22!==l(u+"0x16")||p&&!i((function(){l(Object(p))}));e.exports=y?function(e,t){var r=s(a(e));return l(r,t>>>0||(f(d,r)?16:10))}:l},6984:(e,t,r)=>{"use strict";var n=r(2828),i=r(604),o=r(3032),a=r(7004),s=r(9880),u=r(2128),l=r(5988),c=r(3848),p=r(3188),d=Object.assign,f=Object.defineProperty,y=i([].concat);e.exports=!d||a((function(){if(n&&1!==d({b:1},d(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach((function(e){t[e]=e})),7!=d({},e)[r]||s(d({},t)).join("")!=i}))?function(e,t){for(var r=c(e),i=arguments.length,a=1,d=u.f,f=l.f;i>a;)for(var h,m=p(arguments[a++]),g=d?y(s(m),d(m)):s(m),v=g.length,b=0;v>b;)h=g[b++],n&&!o(f,m,h)||(r[h]=m[h]);return r}:d},124:(e,t,r)=>{var n,i=r(3736),o=r(1904),a=r(8675),s=r(6632),u=r(2960),l=r(7300),c=r(280),p="prototype",d="script",f=c("IE_PROTO"),y=function(){},h=function(e){return"<"+d+">"+e+""},m=function(e){e.write(h("")),e.close();var t=e.parentWindow.Object;return e=null,t},g=function(){try{n=new ActiveXObject("htmlfile")}catch(e){}var e,t,r;g="undefined"!=typeof document?document.domain&&n?m(n):(t=l("iframe"),r="java"+d+":",t.style.display="none",u.appendChild(t),t.src=String(r),(e=t.contentWindow.document).open(),e.write(h("document.F=Object")),e.close(),e.F):m(n);for(var i=a.length;i--;)delete g[p][a[i]];return g()};s[f]=!0,e.exports=Object.create||function(e,t){var r;return null!==e?(y[p]=i(e),r=new y,y[p]=null,r[f]=e):r=g(),void 0===t?r:o(r,t)}},1904:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(3736),a=r(3068),s=r(9880);e.exports=n?Object.defineProperties:function(e,t){o(e);for(var r,n=a(t),u=s(t),l=u.length,c=0;l>c;)i.f(e,r=u[c++],n[r]);return e}},7072:(e,t,r)=>{var n=r(1600),i=r(2828),o=r(2339),a=r(3736),s=r(4061),u=n.TypeError,l=Object.defineProperty;t.f=i?l:function(e,t,r){if(a(e),t=s(t),a(r),o)try{return l(e,t,r)}catch(e){}if("get"in r||"set"in r)throw u("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},2920:(e,t,r)=>{var n=r(2828),i=r(3032),o=r(5988),a=r(364),s=r(3068),u=r(4061),l=r(9180),c=r(2339),p=Object.getOwnPropertyDescriptor;t.f=n?p:function(e,t){if(e=s(e),t=u(t),c)try{return p(e,t)}catch(e){}if(l(e,t))return a(!i(o.f,e,t),e[t])}},7316:(e,t,r)=>{var n=r(4108),i=r(3068),o=r(4880).f,a=r(6100),s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&"Window"==n(e)?function(e){try{return o(e)}catch(e){return a(s)}}(e):o(i(e))}},4880:(e,t,r)=>{var n=r(9912),i=r(8675).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,i)}},2128:(e,t)=>{t.f=Object.getOwnPropertySymbols},6232:(e,t,r)=>{var n=r(1600),i=r(9180),o=r(984),a=r(3848),s=r(280),u=r(1040),l=s("IE_PROTO"),c=n.Object,p=c.prototype;e.exports=u?c.getPrototypeOf:function(e){var t=a(e);if(i(t,l))return t[l];var r=t.constructor;return o(r)&&t instanceof r?r.prototype:t instanceof c?p:null}},2408:(e,t,r)=>{var n=r(604);e.exports=n({}.isPrototypeOf)},9912:(e,t,r)=>{var n=r(604),i=r(9180),o=r(3068),a=r(6024).indexOf,s=r(6632),u=n([].push);e.exports=function(e,t){var r,n=o(e),l=0,c=[];for(r in n)!i(s,r)&&i(n,r)&&u(c,r);for(;t.length>l;)i(n,r=t[l++])&&(~a(c,r)||u(c,r));return c}},9880:(e,t,r)=>{var n=r(9912),i=r(8675);e.exports=Object.keys||function(e){return n(e,i)}},5988:(e,t)=>{"use strict";var r={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,i=n&&!r.call({1:2},1);t.f=i?function(e){var t=n(this,e);return!!t&&t.enumerable}:r},3440:(e,t,r)=>{var n=r(604),i=r(3736),o=r(4040);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,r={};try{(e=n(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(r,[]),t=r instanceof Array}catch(e){}return function(r,n){return i(r),o(n),t?e(r,n):r.__proto__=n,r}}():void 0)},5556:(e,t,r)=>{var n=r(2828),i=r(604),o=r(9880),a=r(3068),s=i(r(5988).f),u=i([].push),l=function(e){return function(t){for(var r,i=a(t),l=o(i),c=l.length,p=0,d=[];c>p;)r=l[p++],n&&!s(i,r)||u(d,e?[r,i[r]]:i[r]);return d}};e.exports={entries:l(!0),values:l(!1)}},2816:(e,t,r)=>{"use strict";var n=r(7796),i=r(1248);e.exports=n?{}.toString:function(){return"[object "+i(this)+"]"}},7540:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(984),a=r(9952),s=n.TypeError;e.exports=function(e,t){var r,n;if("string"===t&&o(r=e.toString)&&!a(n=i(r,e)))return n;if(o(r=e.valueOf)&&!a(n=i(r,e)))return n;if("string"!==t&&o(r=e.toString)&&!a(n=i(r,e)))return n;throw s("Can't convert object to primitive value")}},4092:(e,t,r)=>{var n=r(6532),i=r(604),o=r(4880),a=r(2128),s=r(3736),u=i([].concat);e.exports=n("Reflect","ownKeys")||function(e){var t=o.f(s(e)),r=a.f;return r?u(t,r(e)):t}},340:(e,t,r)=>{var n=r(1600);e.exports=n},2699:e=>{e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},9467:(e,t,r)=>{var n=r(3736),i=r(9952),o=r(8071);e.exports=function(e,t){if(n(e),i(t)&&t.constructor===e)return t;var r=o.f(e);return(0,r.resolve)(t),r.promise}},7431:(e,t,r)=>{var n=r(5028);e.exports=function(e,t,r){for(var i in t)n(e,i,t[i],r);return e}},5028:(e,t,r)=>{var n=r(1600),i=r(984),o=r(9180),a=r(4768),s=r(2984),u=r(1727),l=r(7932),c=r(8492).CONFIGURABLE,p=l.get,d=l.enforce,f=String(String).split("String");(e.exports=function(e,t,r,u){var l,p=!!u&&!!u.unsafe,y=!!u&&!!u.enumerable,h=!!u&&!!u.noTargetGet,m=u&&void 0!==u.name?u.name:t;i(r)&&("Symbol("===String(m).slice(0,7)&&(m="["+String(m).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!o(r,"name")||c&&r.name!==m)&&a(r,"name",m),(l=d(r)).source||(l.source=f.join("string"==typeof m?m:""))),e!==n?(p?!h&&e[t]&&(y=!0):delete e[t],y?e[t]=r:a(e,t,r)):y?e[t]=r:s(t,r)})(Function.prototype,"toString",(function(){return i(this)&&p(this).source||u(this)}))},1840:(e,t,r)=>{var n=r(1600).TypeError;e.exports=function(e){if(null==e)throw n("Can't call method on "+e);return e}},2984:(e,t,r)=>{var n=r(1600),i=Object.defineProperty;e.exports=function(e,t){try{i(n,e,{value:t,configurable:!0,writable:!0})}catch(r){n[e]=t}return t}},9688:(e,t,r)=>{"use strict";var n=r(6532),i=r(7072),o=r(3668),a=r(2828),s=o("species");e.exports=function(e){var t=n(e),r=i.f;a&&t&&!t[s]&&r(t,s,{configurable:!0,get:function(){return this}})}},9540:(e,t,r)=>{var n=r(7072).f,i=r(9180),o=r(3668)("toStringTag");e.exports=function(e,t,r){e&&!i(e=r?e:e.prototype,o)&&n(e,o,{configurable:!0,value:t})}},280:(e,t,r)=>{var n=r(4624),i=r(6536),o=n("keys");e.exports=function(e){return o[e]||(o[e]=i(e))}},6376:(e,t,r)=>{var n=r(1600),i=r(2984),o="__core-js_shared__",a=n[o]||i(o,{});e.exports=a},4624:(e,t,r)=>{var n=r(7408),i=r(6376);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.19.0",mode:n?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},7171:(e,t,r)=>{var n=r(3736),i=r(6372),o=r(3668)("species");e.exports=function(e,t){var r,a=n(e).constructor;return void 0===a||null==(r=n(a)[o])?t:i(r)}},5160:(e,t,r)=>{var n=r(604),i=r(9824),o=r(748),a=r(1840),s=n("".charAt),u=n("".charCodeAt),l=n("".slice),c=function(e){return function(t,r){var n,c,p=o(a(t)),d=i(r),f=p.length;return d<0||d>=f?e?"":void 0:(n=u(p,d))<55296||n>56319||d+1===f||(c=u(p,d+1))<56320||c>57343?e?s(p,d):n:e?l(p,d,d+2):c-56320+(n-55296<<10)+65536}};e.exports={codeAt:c(!1),charAt:c(!0)}},1688:(e,t,r)=>{var n=r(604),i=r(1840),o=r(748),a=r(5320),s=n("".replace),u="["+a+"]",l=RegExp("^"+u+u+"*"),c=RegExp(u+u+"*$"),p=function(e){return function(t){var r=o(i(t));return 1&e&&(r=s(r,l,"")),2&e&&(r=s(r,c,"")),r}};e.exports={start:p(1),end:p(2),trim:p(3)}},5952:(e,t,r)=>{var n,i,o,a,s=r(1600),u=r(9756),l=r(5616),c=r(984),p=r(9180),d=r(7004),f=r(2960),y=r(6100),h=r(7300),m=r(1588),g=r(3640),v=s.setImmediate,b=s.clearImmediate,I=s.process,S=s.Dispatch,_=s.Function,T=s.MessageChannel,P=s.String,A=0,E={},w="onreadystatechange";try{n=s.location}catch(e){}var O=function(e){if(p(E,e)){var t=E[e];delete E[e],t()}},D=function(e){return function(){O(e)}},x=function(e){O(e.data)},F=function(e){s.postMessage(P(e),n.protocol+"//"+n.host)};v&&b||(v=function(e){var t=y(arguments,1);return E[++A]=function(){u(c(e)?e:_(e),void 0,t)},i(A),A},b=function(e){delete E[e]},g?i=function(e){I.nextTick(D(e))}:S&&S.now?i=function(e){S.now(D(e))}:T&&!m?(a=(o=new T).port2,o.port1.onmessage=x,i=l(a.postMessage,a)):s.addEventListener&&c(s.postMessage)&&!s.importScripts&&n&&"file:"!==n.protocol&&!d(F)?(i=F,s.addEventListener("message",x,!1)):i=w in h("script")?function(e){f.appendChild(h("script"))[w]=function(){f.removeChild(this),O(e)}}:function(e){setTimeout(D(e),0)}),e.exports={set:v,clear:b}},7920:(e,t,r)=>{var n=r(9824),i=Math.max,o=Math.min;e.exports=function(e,t){var r=n(e);return r<0?i(r+t,0):o(r,t)}},3068:(e,t,r)=>{var n=r(3188),i=r(1840);e.exports=function(e){return n(i(e))}},9824:e=>{var t=Math.ceil,r=Math.floor;e.exports=function(e){var n=+e;return n!=n||0===n?0:(n>0?r:t)(n)}},1868:(e,t,r)=>{var n=r(9824),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},3848:(e,t,r)=>{var n=r(1600),i=r(1840),o=n.Object;e.exports=function(e){return o(i(e))}},2312:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(9952),a=r(1836),s=r(8808),u=r(7540),l=r(3668),c=n.TypeError,p=l("toPrimitive");e.exports=function(e,t){if(!o(e)||a(e))return e;var r,n=s(e,p);if(n){if(void 0===t&&(t="default"),r=i(n,e,t),!o(r)||a(r))return r;throw c("Can't convert object to primitive value")}return void 0===t&&(t="number"),u(e,t)}},4061:(e,t,r)=>{var n=r(2312),i=r(1836);e.exports=function(e){var t=n(e,"string");return i(t)?t:t+""}},7796:(e,t,r)=>{var n={};n[r(3668)("toStringTag")]="z",e.exports="[object z]"===String(n)},748:(e,t,r)=>{var n=r(1600),i=r(1248),o=n.String;e.exports=function(e){if("Symbol"===i(e))throw TypeError("Cannot convert a Symbol value to a string");return o(e)}},1532:(e,t,r)=>{var n=r(1600).String;e.exports=function(e){try{return n(e)}catch(e){return"Object"}}},6536:(e,t,r)=>{var n=r(604),i=0,o=Math.random(),a=n(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++i+o,36)}},7216:(e,t,r)=>{var n=r(3880);e.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3668:(e,t,r)=>{var n=r(1600),i=r(4624),o=r(9180),a=r(6536),s=r(3880),u=r(7216),l=i("wks"),c=n.Symbol,p=c&&c.for,d=u?c:c&&c.withoutSetter||a;e.exports=function(e){if(!o(l,e)||!s&&"string"!=typeof l[e]){var t="Symbol."+e;s&&o(c,e)?l[e]=c[e]:l[e]=u&&p?p(t):d(t)}return l[e]}},5320:e=>{e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},6140:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(2408),a=r(6232),s=r(3440),u=r(4640),l=r(124),c=r(4768),p=r(364),d=r(5032),f=r(7660),y=r(9928),h=r(5744),m=r(4464),g=i.Error,v=[].push,b=function(e,t){var r=o(I,this)?this:l(I),n=arguments.length>2?arguments[2]:void 0;s&&(r=s(new g(void 0),a(r))),c(r,"message",h(t,"")),m&&c(r,"stack",d(r.stack,1)),f(r,n);var i=[];return y(e,v,{that:i}),c(r,"errors",i),r};s?s(b,g):u(b,g);var I=b.prototype=l(g.prototype,{constructor:p(1,b),message:p(1,""),name:p(1,"AggregateError")});n({global:!0},{AggregateError:b})},5092:(e,t,r)=>{"use strict";var n=r(7248),i=r(9560).find,o=r(5868),a="find",s=!0;a in[]&&Array(1)[a]((function(){s=!1})),n({target:"Array",proto:!0,forced:s},{find:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),o(a)},5684:(e,t,r)=>{var n=r(7248),i=r(8208);n({target:"Array",stat:!0,forced:!r(6344)((function(e){Array.from(e)}))},{from:i})},3924:(e,t,r)=>{"use strict";var n=r(3068),i=r(5868),o=r(2204),a=r(7932),s=r(2648),u="Array Iterator",l=a.set,c=a.getterFor(u);e.exports=s(Array,"Array",(function(e,t){l(this,{type:u,target:n(e),index:0,kind:t})}),(function(){var e=c(this),t=e.target,r=e.kind,n=e.index++;return!t||n>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==r?{value:n,done:!1}:"values"==r?{value:t[n],done:!1}:{value:[n,t[n]],done:!1}}),"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},472:(e,t,r)=>{"use strict";r(6064)("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r(9920))},1300:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isInteger:r(992)})},3656:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},6544:(e,t,r)=>{var n=r(7248),i=r(6016);n({target:"Number",stat:!0,forced:Number.parseFloat!=i},{parseFloat:i})},7972:(e,t,r)=>{var n=r(7248),i=r(6556);n({target:"Number",stat:!0,forced:Number.parseInt!=i},{parseInt:i})},6368:(e,t,r)=>{var n=r(7248),i=r(6984);n({target:"Object",stat:!0,forced:Object.assign!==i},{assign:i})},8292:(e,t,r)=>{var n=r(7248),i=r(5556).entries;n({target:"Object",stat:!0},{entries:function(e){return i(e)}})},920:(e,t,r)=>{r(7248)({target:"Object",stat:!0},{setPrototypeOf:r(3440)})},7912:(e,t,r)=>{var n=r(7796),i=r(5028),o=r(2816);n||i(Object.prototype,"toString",o,{unsafe:!0})},3936:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(1381),a=r(8071),s=r(2699),u=r(9928);n({target:"Promise",stat:!0},{allSettled:function(e){var t=this,r=a.f(t),n=r.resolve,l=r.reject,c=s((function(){var r=o(t.resolve),a=[],s=0,l=1;u(e,(function(e){var o=s++,u=!1;l++,i(r,t,e).then((function(e){u||(u=!0,a[o]={status:"fulfilled",value:e},--l||n(a))}),(function(e){u||(u=!0,a[o]={status:"rejected",reason:e},--l||n(a))}))})),--l||n(a)}));return c.error&&l(c.value),r.promise}})},5428:(e,t,r)=>{"use strict";var n=r(7248),i=r(1381),o=r(6532),a=r(3032),s=r(8071),u=r(2699),l=r(9928),c="No one promise resolved";n({target:"Promise",stat:!0},{any:function(e){var t=this,r=o("AggregateError"),n=s.f(t),p=n.resolve,d=n.reject,f=u((function(){var n=i(t.resolve),o=[],s=0,u=1,f=!1;l(e,(function(e){var i=s++,l=!1;u++,a(n,t,e).then((function(e){l||f||(f=!0,p(e))}),(function(e){l||f||(l=!0,o[i]=e,--u||d(new r(o,c)))}))})),--u||d(new r(o,c))}));return f.error&&d(f.value),n.promise}})},1517:(e,t,r)=>{"use strict";var n=r(7248),i=r(7408),o=r(3459),a=r(7004),s=r(6532),u=r(984),l=r(7171),c=r(9467),p=r(5028);if(n({target:"Promise",proto:!0,real:!0,forced:!!o&&a((function(){o.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=l(this,s("Promise")),r=u(e);return this.then(r?function(r){return c(t,e()).then((function(){return r}))}:e,r?function(r){return c(t,e()).then((function(){throw r}))}:e)}}),!i&&u(o)){var d=s("Promise").prototype.finally;o.prototype.finally!==d&&p(o.prototype,"finally",d,{unsafe:!0})}},7448:(e,t,r)=>{"use strict";var n,i,o,a,s=r(7248),u=r(7408),l=r(1600),c=r(6532),p=r(3032),d=r(3459),f=r(5028),y=r(7431),h=r(3440),m=r(9540),g=r(9688),v=r(1381),b=r(984),I=r(9952),S=r(2932),_=r(1727),T=r(9928),P=r(6344),A=r(7171),E=r(5952).set,w=r(3104),O=r(9467),D=r(5651),x=r(8071),F=r(2699),C=r(7932),N=r(4232),M=r(3668),k=r(4532),R=r(3640),V=r(2592),j=M("species"),z="Promise",L=C.get,U=C.set,B=C.getterFor(z),H=d&&d.prototype,W=d,G=H,Y=l.TypeError,K=l.document,Q=l.process,q=x.f,Z=q,X=!!(K&&K.createEvent&&l.dispatchEvent),J=b(l.PromiseRejectionEvent),$="unhandledrejection",ee=!1,te=N(z,(function(){var e=_(W),t=e!==String(W);if(!t&&66===V)return!0;if(u&&!G.finally)return!0;if(V>=51&&/native code/.test(e))return!1;var r=new W((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(r.constructor={})[j]=n,!(ee=r.then((function(){}))instanceof n)||!t&&k&&!J})),re=te||!P((function(e){W.all(e).catch((function(){}))})),ne=function(e){var t;return!(!I(e)||!b(t=e.then))&&t},ie=function(e,t){if(!e.notified){e.notified=!0;var r=e.reactions;w((function(){for(var n=e.value,i=1==e.state,o=0;r.length>o;){var a,s,u,l=r[o++],c=i?l.ok:l.fail,d=l.resolve,f=l.reject,y=l.domain;try{c?(i||(2===e.rejection&&ue(e),e.rejection=1),!0===c?a=n:(y&&y.enter(),a=c(n),y&&(y.exit(),u=!0)),a===l.promise?f(Y("Promise-chain cycle")):(s=ne(a))?p(s,a,d,f):d(a)):f(n)}catch(e){y&&!u&&y.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},oe=function(e,t,r){var n,i;X?((n=K.createEvent("Event")).promise=t,n.reason=r,n.initEvent(e,!1,!0),l.dispatchEvent(n)):n={promise:t,reason:r},!J&&(i=l["on"+e])?i(n):e===$&&D("Unhandled promise rejection",r)},ae=function(e){p(E,l,(function(){var t,r=e.facade,n=e.value;if(se(e)&&(t=F((function(){R?Q.emit("unhandledRejection",n,r):oe($,r,n)})),e.rejection=R||se(e)?2:1,t.error))throw t.value}))},se=function(e){return 1!==e.rejection&&!e.parent},ue=function(e){p(E,l,(function(){var t=e.facade;R?Q.emit("rejectionHandled",t):oe("rejectionhandled",t,e.value)}))},le=function(e,t,r){return function(n){e(t,n,r)}},ce=function(e,t,r){e.done||(e.done=!0,r&&(e=r),e.value=t,e.state=2,ie(e,!0))},pe=function(e,t,r){if(!e.done){e.done=!0,r&&(e=r);try{if(e.facade===t)throw Y("Promise can't be resolved itself");var n=ne(t);n?w((function(){var r={done:!1};try{p(n,t,le(pe,r,e),le(ce,r,e))}catch(t){ce(r,t,e)}})):(e.value=t,e.state=1,ie(e,!1))}catch(t){ce({done:!1},t,e)}}};if(te&&(G=(W=function(e){S(this,G),v(e),p(n,this);var t=L(this);try{e(le(pe,t),le(ce,t))}catch(e){ce(t,e)}}).prototype,(n=function(e){U(this,{type:z,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=y(G,{then:function(e,t){var r=B(this),n=r.reactions,i=q(A(this,W));return i.ok=!b(e)||e,i.fail=b(t)&&t,i.domain=R?Q.domain:void 0,r.parent=!0,n[n.length]=i,0!=r.state&&ie(r,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new n,t=L(e);this.promise=e,this.resolve=le(pe,t),this.reject=le(ce,t)},x.f=q=function(e){return e===W||e===o?new i(e):Z(e)},!u&&b(d)&&H!==Object.prototype)){a=H.then,ee||(f(H,"then",(function(e,t){var r=this;return new W((function(e,t){p(a,r,e,t)})).then(e,t)}),{unsafe:!0}),f(H,"catch",G.catch,{unsafe:!0}));try{delete H.constructor}catch(e){}h&&h(H,G)}s({global:!0,wrap:!0,forced:te},{Promise:W}),m(W,z,!1,!0),g(z),o=c(z),s({target:z,stat:!0,forced:te},{reject:function(e){var t=q(this);return p(t.reject,void 0,e),t.promise}}),s({target:z,stat:!0,forced:u||te},{resolve:function(e){return O(u&&this===o?W:this,e)}}),s({target:z,stat:!0,forced:re},{all:function(e){var t=this,r=q(t),n=r.resolve,i=r.reject,o=F((function(){var r=v(t.resolve),o=[],a=0,s=1;T(e,(function(e){var u=a++,l=!1;s++,p(r,t,e).then((function(e){l||(l=!0,o[u]=e,--s||n(o))}),i)})),--s||n(o)}));return o.error&&i(o.value),r.promise},race:function(e){var t=this,r=q(t),n=r.reject,i=F((function(){var i=v(t.resolve);T(e,(function(e){p(i,t,e).then(r.resolve,n)}))}));return i.error&&n(i.value),r.promise}})},8504:(e,t,r)=>{"use strict";var n=r(5160).charAt,i=r(748),o=r(7932),a=r(2648),s="String Iterator",u=o.set,l=o.getterFor(s);a(String,"String",(function(e){u(this,{type:s,string:i(e),index:0})}),(function(){var e,t=l(this),r=t.string,i=t.index;return i>=r.length?{value:void 0,done:!0}:(e=n(r,i),t.index+=e.length,{value:e,done:!1})}))},1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._type=e}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),e}();t.TableauEvent=r},3248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t)||this;return n._sheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"sheet",{get:function(){return this._sheet},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.TableauSheetEvent=o},4144:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n._worksheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),t}(r(3248).TableauSheetEvent);t.TableauWorksheetEvent=o},4164:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=function(e){function t(t){var r=e.call(this,o.TableauEventType.WorkbookFormattingChanged)||this;return r._formatting=t,r}return i(t,e),Object.defineProperty(t.prototype,"formatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.WorkbookFormattingChangedEvent=a},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=n}return Object.defineProperty(e.prototype,"userId",{get:function(){return this._userId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteId",{get:function(){return this._siteId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteNamespace",{get:function(){return this._siteNamespace},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookId",{get:function(){return this._workbookId},enumerable:!0,configurable:!0}),e}();t.ConnectedServer=r},5920:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(5136),a=r(1468),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t.prototype.getAllDataSourcesAsync=function(){var e=this;return o.ApiServiceRegistry.get(a.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((function(t){var r=t,n=[];return Object.values(r.dataSources).forEach((function(t){n.push(e.createDataSourceFromInfo(t))})),n}))},t.prototype.createDataSourceFromInfo=function(e){var t=new o.DataSourceImpl(e,a.ExtensionsRegistryId),r=new o.DataSource(t);return t.initializeWithPublicInterfaces(r),r},t}(o.WorkbookImpl);t.ExtensionWorkbookImpl=s},976:function(e,t,r){"use strict";var n=this&&this.__spreadArrays||function(){for(var e=0,t=0,r=arguments.length;t0;)r.deleteRule(r.cssRules.length-1);e.formattingSheets.map((function(e){t.applyFormattingSheetToStyleSheet(e,r)}))}},e.prototype.applyFormattingSheetToStyleSheet=function(e,t){var r="",n=e.cssProperties;n.fontFamily&&(r+="font-family: "+n.fontFamily.toString()+"; "),n.fontSize&&(r+="font-size: "+n.fontSize.toString()+"; "),n.fontWeight&&(r+="font-weight: "+n.fontWeight.toString()+"; "),n.fontStyle&&(r+="font-style: "+n.fontStyle.toString()+"; "),n.textDecoration&&(r+="text-decoration: "+n.textDecoration.toString()+"; "),n.color&&(r+="color: "+n.color+"; ");var i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)},e.prototype.initializeWorkbookFormattingChangedEventCallback=function(e){var t=this;a.ApiServiceRegistry.get(m.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(r){r&&(t.initializeTableauFonts(e,r),t.applyAllFormatting(r))}))},e.prototype.initializeTableauFonts=function(e,t){var r,i=this,a=n(g.SupportedBentonSansFontFaces,S.SupportedTableauFontFaces);if(t.formattingSheets.forEach((function(e){e.cssProperties.fontFamily&&a.push(e.cssProperties.fontFamily)})),a.length>0){var s=((r={})[o.ParameterId.FontNameListItems]=a,r);e.execute(o.VerbId.GetFonts,s).then((function(e){i.loadFonts(e.result)})).catch()}},e.prototype.loadFonts=function(e){var t=this;e.forEach((function(e){S.SupportedTableauFontFaces.includes(e.fontName)?t.loadTableauFonts(e):g.SupportedBentonSansFontFaces.includes(e.fontName)?t.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))},e.prototype.initializeDashboardContent=function(e,t){var r=new a.SheetInfoImpl(e.name,i.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),n=new a.DashboardImpl(r,e.zones,t,m.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(n);return new c.DashboardContent(o)},e.prototype.initializeWorksheetContent=function(e){var t=new a.SheetInfoImpl(e.visualId.worksheet,i.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new a.WorksheetImpl(t,m.ExtensionsRegistryId,e.visualId,null,null),n=new l.Worksheet(r);return new y.WorksheetContent(n)},e.prototype.initializeSettings=function(e){var t=new I.SettingsImpl(e);return new d.Settings(t)},e.prototype.initializeContextMenuCallbacks=function(e){a.ApiServiceRegistry.get(m.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.ContextMenuClick,(function(){return!0}),(function(t){if(e){if(!e[t.id])throw new a.TableauError(i.ErrorCodes.InternalError,"Received unexpected context menu Id from event: "+t.id);e[t.id]()}}))},e.prototype.loadTableauFonts=function(e){switch(e.fontName){case S.TableauBookFontFaceName:document.fonts.add(new FontFace(S.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauLightFontFaceName:document.fonts.add(new FontFace(S.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauRegularFontFaceName:document.fonts.add(new FontFace(S.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(S.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case S.TableauBoldFontFaceName:document.fonts.add(new FontFace(S.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case S.TableauMediumFontFaceName:document.fonts.add(new FontFace(S.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e.prototype.loadBentonSansFonts=function(e){switch(e.fontName){case g.BentonSansBookFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case g.BentonSansLightFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case g.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case g.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case g.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case g.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e}();t.ExtensionsImpl=T},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((function(e){e(n.INTERNAL_CONTRACT_VERSION).execute(n.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(7112),l=r(1468),c=function(e){function t(t){var r=e.call(this,o.TableauEventType.SettingsChanged)||this;return r._newSettings=t,r}return i(t,e),Object.defineProperty(t.prototype,"newSettings",{get:function(){return this._newSettings},enumerable:!0,configurable:!0}),t}(u.TableauEvent),p=function(){function e(e){this._saveInProgress=!1,this.initializeSettings(e)}return e.prototype.erase=function(e){s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)},e.prototype.get=function(e){return s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]},e.prototype.getAll=function(){return Object.assign({},this._currentSettings)},Object.defineProperty(e.prototype,"isModified",{get:function(){return this._isModified},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){var e=this;return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((function(t){return e._saveInProgress=!1,e._isModified=!1,void 0===e._currentSettings?e._currentSettings=t:Object.assign(e._currentSettings,t),t}),(function(t){return e._saveInProgress=!1,Promise.reject(t)}))):Promise.resolve(this._currentSettings)},e.prototype.set=function(e,t){s.ErrorHelpers.verifyStringParameter(e,"key"),s.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0},e.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.SettingsChanged);return e.registerHandler(a.NotificationId.SettingsChanged,(function(){return!0}),(function(e){t._currentSettings=e.newSettings,n.triggerEvent((function(){return new c(e.newSettings)}))})),r.push(n),r},e.prototype.initializeSettings=function(e){s.ErrorHelpers.verifyParameter(e,"settingsInfo"),s.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1},e.prototype.verifySettingsAreUnlocked=function(){if(this._saveInProgress)throw new s.TableauError(o.ErrorCodes.SettingSaveInProgress,e.ASYNC_SAVE_IN_PROGRESS)},e.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed.",e}();t.SettingsImpl=p},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(7419),o=r(3448),a=r(5136),s=r(1468),u=function(){function e(){}return e.prototype.displayDialogAsync=function(e,t,r){var u=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService"),l=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("notification-service");return new Promise((function(s,c){u.displayDialogAsync(e,t||"",r).then((function(){var e=l.registerHandler(o.NotificationId.ExtensionDialogUpdate,(function(){return!0}),(function(t){if(t.isCloseEvent){if(void 0===t.closePayload)throw new a.TableauError(n.ErrorCodes.InternalError,"closePayload is undefined");s(t.closePayload)}else c(new a.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((function(e){c(e)}))}))},e.prototype.closeDialog=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService").closeDialog(e)},e}();t.UIImpl=u},4252:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(6416),l=r(4164),c=r(1468),p=r(3192),d=r(6132),f=r(5548),y=function(e){function t(t){var r=e.call(this,t)||this;return r._dashboardImpl=t,t.initializeWithPublicInterfaces(),r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"worksheets",{get:function(){return this._dashboardImpl.worksheetsImpl.map((function(e){return new f.Worksheet(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._dashboardImpl.objects.map((function(e){return new p.DashboardObject(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._dashboardImpl.activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._dashboardImpl.activeDashboardName},enumerable:!0,configurable:!0}),t.prototype.setZoneVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.setDashboardObjectVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.getDashboardObjectById=function(e){var t=this._dashboardImpl.getDashboardObjectById(e);return t&&new p.DashboardObject(t)},t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(c.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.DashboardLayoutChanged);e.registerHandler(a.NotificationId.DashboardLayoutChanged,(function(){return!0}),(function(e){var r=t._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);n.triggerEvent((function(){return new u.DashboardLayoutChangedEvent(r)}))})),r.push(n);var i=new s.SingleEventManagerImpl(o.TableauEventType.WorkbookFormattingChanged);return e.registerHandler(a.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(e){i.triggerEvent((function(){return new l.WorkbookFormattingChangedEvent(e)}))})),r.push(i),r},t.prototype.moveAndResizeDashboardObjectsAsync=function(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)},t.prototype.replayAnimationAsync=function(e){return this._dashboardImpl.replayAnimationAsync(e)},t.prototype.getFiltersAsync=function(){return this._dashboardImpl.getFiltersAsync()},t.prototype.applyFilterAsync=function(e,t,r,n){return this._dashboardImpl.applyFilterAsync(e,t,r,n)},t}(d.Sheet);t.Dashboard=y},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4252),i=r(5548),o=function(){function e(e){this._dashboardObjectImpl=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return new n.Dashboard(this._dashboardObjectImpl.dashboardImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._dashboardObjectImpl.type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._dashboardObjectImpl.position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._dashboardObjectImpl.size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheet",{get:function(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._dashboardObjectImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._dashboardObjectImpl.isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._dashboardObjectImpl.isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dashboardObjectImpl.id},enumerable:!0,configurable:!0}),e}();t.DashboardObject=o},4592:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(864),l=r(1468),c=function(e){function t(t,r){var n=e.call(this)||this;return n.parameterImpl=t,n.initializeEvents(r).forEach((function(e){return n.addNewEventType(e)})),n}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this.parameterImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentValue",{get:function(){return this.parameterImpl.currentValue},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dataType",{get:function(){return this.parameterImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"allowableValues",{get:function(){return this.parameterImpl.allowableValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this.parameterImpl.id},enumerable:!0,configurable:!0}),t.prototype.changeValueAsync=function(e){return this.parameterImpl.changeValueAsync(e)},t.prototype.initializeEvents=function(e){var t=this;s.ErrorHelpers.verifyInternalValue(e,"sheet");var r,n=new Array;try{r=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return n}var i=new s.SingleEventManagerImpl(o.TableauEventType.ParameterChanged);return r.registerHandler(a.NotificationId.ParameterChanged,(function(e){return e===t.parameterImpl.id}),(function(t){i.triggerEvent((function(){return new u.ParameterChangedEvent(t,e)}))})),n.push(i),n},t}(s.EventListenerManager);t.Parameter=c},6132:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(5136),s=r(4592),u=function(e){function t(t){var r=e.call(this)||this;return r._sheetImpl=t,r}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this._sheetImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"sheetType",{get:function(){return this._sheetImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new a.TableauError(o.EmbeddingErrorCodes.ImplementationError,"Size not implemented")},enumerable:!0,configurable:!0}),t.prototype.isValidSize=function(e){var t=e;return void 0!==t.width&&void 0!==t.height},t.prototype.findParameterAsync=function(e){var t=this;return this._sheetImpl.findParameterAsync(e).then((function(e){return new Promise(e?function(r){return r(new s.Parameter(e,t))}:function(e){return e(void 0)})}))},t.prototype.getParametersAsync=function(){var e=this;return this._sheetImpl.getParametersAsync().then((function(t){return t.map((function(t){return new s.Parameter(t,e)}))}))},t}(a.EventListenerManager);t.Sheet=u},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._workbookImpl=e}return e.prototype.getAllDataSourcesAsync=function(){return this._workbookImpl.getAllDataSourcesAsync()},e}();t.Workbook=r},5548:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(5136),l=r(1672),c=r(5572),p=r(3464),d=r(1468),f=r(4252),y=function(e){function t(t){var r=e.call(this,t)||this;return r._worksheetImpl=t,r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){if(null==this._worksheetImpl.parentDashboard)throw new u.TableauError(o.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new f.Dashboard(this._worksheetImpl.parentDashboard)},enumerable:!0,configurable:!0}),t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=u.ApiServiceRegistry.get(d.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new u.SingleEventManagerImpl(a.TableauEventType.MarkSelectionChanged);e.registerHandler(s.NotificationId.SelectedMarksChanged,(function(e){var r=e;return t.visualIdsAreEqual(r,t._worksheetImpl.visualId)}),(function(){return n.triggerEvent((function(){return new c.MarksSelectedEvent(t)}))}));var i=new u.SingleEventManagerImpl(a.TableauEventType.FilterChanged);e.registerHandler(s.NotificationId.FilterChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){i.triggerEvent((function(){return new l.FilterChangedEvent(t,e.fieldName,e.fieldId)}))}));var o=new u.SingleEventManagerImpl(a.TableauEventType.SummaryDataChanged);return e.registerHandler(s.NotificationId.SummaryDataChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){o.triggerEvent((function(){return new p.SummaryDataChangedEvent(t)}))})),r.push(n),r.push(i),r.push(o),r},t.prototype.applyFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyFilterAsync(e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,n)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)},t.prototype.clearFilterAsync=function(e){return this._worksheetImpl.clearFilterAsync(e)},t.prototype.getDataSourcesAsync=function(){return this._worksheetImpl.getDataSourcesAsync()},t.prototype.getFiltersAsync=function(){return this._worksheetImpl.getFiltersAsync()},t.prototype.getSelectedMarksAsync=function(){return this._worksheetImpl.getSelectedMarksAsync()},t.prototype.getHighlightedMarksAsync=function(){return this._worksheetImpl.getHighlightedMarksAsync()},t.prototype.getSummaryDataAsync=function(e){return this._worksheetImpl.getSummaryDataAsync(e)},t.prototype.getSummaryDataReaderAsync=function(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)},t.prototype.getSummaryColumnsInfoAsync=function(){return this._worksheetImpl.getSummaryColumnsInfoAsync()},t.prototype.getUnderlyingDataAsync=function(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)},t.prototype.getUnderlyingTablesAsync=function(){return this._worksheetImpl.getUnderlyingTablesAsync()},t.prototype.getUnderlyingTableDataAsync=function(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)},t.prototype.getUnderlyingTableDataReaderAsync=function(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)},t.prototype.getVisualSpecificationAsync=function(){return this._worksheetImpl.getVisualSpecificationAsync()},t.prototype.clearSelectedMarksAsync=function(){return this._worksheetImpl.clearSelectedMarksAsync()},t.prototype.selectMarksByIDAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.selectMarksByValueAsync=function(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)},t.prototype.selectMarksByIdAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.annotateMarkAsync=function(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)},t.prototype.getAnnotationsAsync=function(){return this._worksheetImpl.getAnnotationsAsync()},t.prototype.removeAnnotationAsync=function(e){return this._worksheetImpl.removeAnnotationAsync(e)},t.prototype.hoverTupleAsync=function(e,t){return this._worksheetImpl.hoverTupleAsync(e,t)},t.prototype.selectTuplesAsync=function(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)},t.prototype.visualIdsAreEqual=function(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID},t}(r(6132).Sheet);t.Worksheet=y},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dashboard=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return this._dashboard},enumerable:!0,configurable:!0}),e}();t.DashboardContent=r},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(8396),o=r(8012),a=function(){function e(e){this._apiVersion=n.ApiVersion.Instance&&n.ApiVersion.Instance.formattedValue,this._context=n.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=o.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=n.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}return Object.defineProperty(e.prototype,"apiVersion",{get:function(){return this._apiVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this._context},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookFormatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"language",{get:function(){return this._language},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"country",{get:function(){return this._country},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"locale",{get:function(){return this._locale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mode",{get:function(){return this._mode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"operatingSystem",{get:function(){return this._operatingSystem},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tableauVersion",{get:function(){return this._tableauVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"uniqueUserId",{get:function(){return this._uniqueUserId},enumerable:!0,configurable:!0}),e}();t.Environment=a},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.extensionImpl=e,this.extensionImpl=e}return Object.defineProperty(e.prototype,"dashboardContent",{get:function(){return this.extensionImpl.dashboardContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetContent",{get:function(){return this.extensionImpl.worksheetContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"environment",{get:function(){return this.extensionImpl.environment},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"settings",{get:function(){return this.extensionImpl.settings},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ui",{get:function(){return this.extensionImpl.ui},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbook",{get:function(){return this.extensionImpl.workbook},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dashboardObjectId",{get:function(){return this.extensionImpl.extensionZoneId},enumerable:!0,configurable:!0}),e.prototype.initializeAsync=function(e){return this.extensionImpl.initializeAsync(!1,e).then()},e.prototype.initializeDialogAsync=function(){return this.extensionImpl.initializeAsync(!0)},e.prototype.createVizImageAsync=function(e){return this.extensionImpl.createVizImageAsync(e)},e.prototype.setClickThroughAsync=function(e){return this.extensionImpl.setClickThroughAsync(e)},e}();t.Extensions=r},652:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var r=e.call(this)||this;return r._settingsImpl=t,r._settingsImpl.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),t.prototype.erase=function(e){this._settingsImpl.erase(e)},t.prototype.get=function(e){return this._settingsImpl.get(e)},t.prototype.getAll=function(){return this._settingsImpl.getAll()},Object.defineProperty(t.prototype,"isModified",{get:function(){return this._settingsImpl.isModified},enumerable:!0,configurable:!0}),t.prototype.saveAsync=function(){return this._settingsImpl.saveAsync()},t.prototype.set=function(e,t){this._settingsImpl.set(e,t)},t}(r(5136).EventListenerManager);t.Settings=o},1964:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._impl=e}return e.prototype.displayDialogAsync=function(e,t,r){return this._impl.displayDialogAsync(e,t,r)},e.prototype.closeDialog=function(e){this._impl.closeDialog(e)},e}();t.UI=r},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(){}return e.convertToWorkbookFormatting=function(e){return e?{formattingSheets:e.formattingSheets.map((function(e){return{classNameKey:n.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:{fontFamily:e.cssProperties.fontFamily,fontSize:e.cssProperties.fontSize,fontWeight:e.cssProperties.fontWeight,fontStyle:e.cssProperties.fontStyle,textDecoration:e.cssProperties.textDecoration,color:e.cssProperties.color}}}))}:void 0},e}();t.WorkbookFormattingEnvUtil=i},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._worksheet=e}return Object.defineProperty(e.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),e}();t.WorksheetContent=r},6336:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"InitializationService"},enumerable:!0,configurable:!0}),t.prototype.initializeDashboardExtensionsAsync=function(e,t){var r,n=((r={})[o.ParameterId.FunctionName]="initializeDashboardExtensionsAsync",r[o.ParameterId.ExtensionContextMenuIds]=t,r[o.ParameterId.IsExtensionDialog]=e,r);return this.execute(o.VerbId.InitializeExtension,n).then((function(e){return e.result}))},t}(r(5136).ServiceImplBase);t.InitializationServiceImpl=a},5432:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"SettingsService"},enumerable:!0,configurable:!0}),t.prototype.saveSettingsAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="saveSettingsAsync",t[a.ParameterId.SettingsValues]=e,t);return this.execute(a.VerbId.SaveExtensionSettings,r).then((function(e){var t=e.result;if(!t||!t.settingsValues)throw new s.TableauError(o.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))},t}(s.ServiceImplBase);t.SettingsServiceImpl=u},752:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=o.DialogStyle.Window,l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"UIService"},enumerable:!0,configurable:!0}),t.prototype.displayDialogAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="displayDialogAsync",n[a.ParameterId.ExtensionDialogUrl]=e,n[a.ParameterId.ExtensionDialogPayload]=t,n),l=r&&r.height?r.height:400,c=r&&r.width?r.width:600,p=r&&r.dialogStyle?r.dialogStyle:u;if(l<=0||c<=0)throw new s.TableauError(o.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return i[a.ParameterId.ExtensionDialogH]=l,i[a.ParameterId.ExtensionDialogW]=c,s.ErrorHelpers.verifyEnumValue(p,o.DialogStyle,"DialogStyle"),i[a.ParameterId.ExtensionDialogStyle]=s.ExternalToInternalEnumMappings.dialogStyles.convert(p),this.execute(a.VerbId.DisplayDialog,i).then((function(e){switch(e.result){case a.ExtensionDialogResult.DialogAlreadyOpen:throw new s.TableauError(o.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case a.ExtensionDialogResult.InvalidDomain:throw new s.TableauError(o.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))},t.prototype.closeDialog=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="closeDialog",t);return e&&(r[a.ParameterId.ExtensionDialogPayload]=e),this.execute(a.VerbId.CloseDialog,r).then((function(){}))},t.prototype.setClickThroughAsync=function(e,t){var r;if(s.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new s.TableauError(o.ErrorCodes.InternalError,"Extension Id is invalid.");var n=((r={})[a.ParameterId.ExtensionZoneId]=t,r[a.ParameterId.ClickThroughEnabled]=e,r);return this.execute(a.VerbId.SetClickThrough,n).then((function(){}))},t}(s.ServiceImplBase);t.UIServiceImpl=l},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(6336),o=r(5432),a=r(752),s=r(1468);t.registerAllExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new o.SettingsServiceImpl(e,s.ExtensionsRegistryId)),n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new a.UIServiceImpl(e,s.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,s.ExtensionsRegistryId))}},1468:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,n(r(828)),n(r(3432)),n(r(1480)),n(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4744);t.ErrorCodes=n.ErrorCodes,t.ExtensionContext=n.ExtensionContext,t.ExtensionMode=n.ExtensionMode,t.TableauEventType=n.TableauEventType,t.VizImageEncodingType=n.VizImageEncodingType,t.VizImagePaletteType=n.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=n.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=n.VizImageSizeSettingType,t.VizImageSortDirectionType=n.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(268)),n(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,y;Object.defineProperty(t,"__esModule",{value:!0}),(y=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",y.Excel="xlsx",(f=t.DeviceType||(t.DeviceType={})).Default="default",f.Desktop="desktop",f.Tablet="tablet",f.Phone="phone",(d=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",d.BrowserNotCapable="browser-not-capable",d.DownloadWorkbookNotAllowed="download-workbook-not-allowed",d.FilterCannotBePerformed="filter-cannot-be-performed",d.IndexOutOfRange="index-out-of-range",d.InternalError="internal-error",d.InvalidCustomViewName="invalid-custom-view-name",d.InvalidDateParameter="invalid-date-parameter",d.invalidFilterFieldNameOrValue="invalid-filter-field-name",d.InvalidParameter="invalid-parameter",d.InvalidSize="invalid-size",d.InvalidSheetType="invalid-sheet-type",d.InvalidSizeBehavior="invalid-size-behavior",d.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",d.InvalidUrl="invalid-url",d.MissingMaxSize="missing-max-size",d.MissingMinSize="missing-min-size",d.MissingMinMaxSize="missing-min-max-size",d.MissingParameter="missing-parameter",d.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",d.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",d.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",d.NotActiveSheet="not-active-sheet",d.NullOrEmptyParameter="null-or-empty-parameter",d.SheetNotInWorkbook="sheet-not-in-workbook",d.StaleDataReference="stale-data-reference",d.UnknownAuthError="unknown-auth-error",d.UnsupportedEventName="unsupported-event-name",d.VizAlreadyInManager="viz-already-in-manager",d.ImplementationError="wrong-implementation",d.NotImplemented="not-implemented",d.EventInitializationError="event-initialization-error",d.IncompatibleVersionError="incompatible-version-error",d.UnknownDialogType="unknown-dialog-type",d.FilterMissingOrNotImplemented="filter-missing-not-implemented",d.StoryPointIdMismatch="storypoint-id-mismatch",(p=t.FileFormats||(t.FileFormats={})).PDF="pdf",p.PNG="png",(c=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",c.Landscape="landscape",(l=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",l.Legal="legal",l.Note="note",l.Folio="folio",l.Tabloid="tabloid",l.Ledger="ledger",l.Statement="statement",l.Executive="executive",l.A3="A3",l.A4="A4",l.A5="A5",l.B4="B4",l.B5="B5",l.Quarto="quarto",l.Unspecified="unspecified",(u=t.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",(s=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",s.Axes="axes",s.Filters="filters",s.Sorts="sorts",s.Shelves="shelves",(a=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",a.AskData="askData",a.CustomViews="customViews",a.DataDetails="dataDetails",a.Share="share",a.Subscribe="subscribe",(o=t.Toolbar||(t.Toolbar={})).Top="top",o.Bottom="bottom",o.Hidden="hidden",(i=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",i.Exactly="exactly",i.Range="range",i.AtLeast="atleast",i.AtMost="atmost",(n=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",n.CustomViewRemoved="customviewremoved",n.CustomViewSaved="customviewsaved",n.CustomViewSetDefault="customviewsetdefault",n.EditButtonClicked="editbuttonclicked",n.EditInDesktopButtonClicked="editindesktopbuttonclicked",n.FilterChanged="filterchanged",n.FirstVizSizeKnown="firstvizsizeknown",n.FirstInteractive="firstinteractive",n.CustomMarkContextMenuEvent="custommarkcontextmenu",n.MarkSelectionChanged="markselectionchanged",n.ParameterChanged="parameterchanged",n.ToolbarStateChanged="toolbarstatechanged",n.WorkbookReadyToClose="workbookreadytoclose",n.WorkbookPublished="workbookpublished",n.WorkbookPublishedAs="workbookpublishedas",n.UrlAction="urlaction",n.TabSwitched="tabswitched",n.StoryPointSwitched="storypointswitched",n.VizLoadError="vizloaderror",n.IframeSrcUpdated="iframesrcupdated",n.SummaryDataChanged="summarydatachanged",n.ReadyToReceiveAuthToken="readytoreceiveauthtoken",(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";Object.defineProperty(t,"__esModule",{value:!0}),(t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter"},3432:(e,t)=>{"use strict";var r,n,i,o,a;Object.defineProperty(t,"__esModule",{value:!0}),(a=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",a.HideEditInDesktopButton="hide-edit-in-desktop-button",a.SuppressDefaultEditBehavior="suppress-default-edit-behavior",a.DisableVersionCheck="disable-version-check",a.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",a.OnFirstVizSizeKnown="onFirstVizSizeKnown",a.OnFirstInteractive="onFirstInteractive",(o=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",o.HideTabs="hide-tabs",o.Toolbar="toolbar",o.InstanceIdToClone="instance-id-to-clone",o.Device="device",o.HideEditButton="hide-edit-button",o.OnEditButtonClicked="onEditButtonClicked",o.OnFilterChanged="onFilterChanged",o.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",o.OnMarkSelectionChanged="onMarkSelectionChanged",o.OnParameterChanged="onParameterChanged",o.OnToolbarStateChanged="onToolbarStateChanged",o.OnUrlAction="onUrlAction",o.OnTabSwitched="onTabSwitched",o.OnCustomViewLoaded="onCustomViewLoaded",o.OnCustomViewRemoved="onCustomViewRemoved",o.OnCustomViewSaved="onCustomViewSaved",o.OnCustomViewSetDefault="onCustomViewSetDefault",o.OnStoryPointSwitched="onStoryPointSwitched",o.OnSummaryDataChanged="onSummaryDataChanged",o.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(n=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",n.VizParameter="viz-parameter",n.CustomParameter="custom-parameter",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,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",(t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){var t,r,n,i,o,a,s,u,l;(l=e.ErrorCodes||(e.ErrorCodes={})).APINotInitialized="api-not-initialized",l.VisibilityError="visibility-error",l.DialogAlreadyOpen="dialog-already-open",l.DialogClosedByUser="dialog-closed-by-user",l.InternalError="internal-error",l.InvalidDomainDialog="invalid-dialog-domain",l.InvalidParameter="invalid-parameter",l.MissingFilter="missing-filter",l.MissingParameter="missing-parameter",l.ServerError="server-error",l.SettingSaveInProgress="setting-save-in-progress",l.UnsupportedEventName="unsupported-event-name",l.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type",(u=e.ExtensionContext||(e.ExtensionContext={})).Desktop="desktop",u.Server="server",(s=e.ExtensionMode||(e.ExtensionMode={})).Authoring="authoring",s.Viewing="viewing",(a=e.TableauEventType||(e.TableauEventType={})).FilterChanged="filter-changed",a.MarkSelectionChanged="mark-selection-changed",a.SummaryDataChanged="summary-data-changed",a.ParameterChanged="parameter-changed",a.SettingsChanged="settings-changed",a.DashboardLayoutChanged="dashboard-layout-changed",a.WorkbookFormattingChanged="workbook-formatting-changed",(o=e.VizImageEncodingType||(e.VizImageEncodingType={})).Discrete="discrete",o.Continuous="continuous",(i=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})).Ascending="ascending",i.Descending="descending",(n=e.VizImagePaletteType||(e.VizImagePaletteType={})).CustomDiverging="custom-diverging",n.CustomSequential="custom-sequential",(r=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})).Fixed="fixed",r.Manual="manual",(t=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={})).Right="right",t.Left="left",t.Center="center"}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:function(e){"use strict";var t,r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var n=r(808);t.AnalyticsObjectType=n.AnalyticsObjectType,t.AnnotationType=n.AnnotationType,t.ClassNameKey=n.ClassNameKey,t.ColumnType=n.ColumnType,t.DashboardLayoutChange=n.DashboardLayoutChange,t.DashboardObjectType=n.DashboardObjectType,t.DashboardObjectVisibilityType=n.DashboardObjectVisibilityType,t.DataType=n.DataType,t.DateRangeType=n.DateRangeType,t.DialogStyle=n.DialogStyle,t.EncodingType=n.EncodingType,t.FieldAggregationType=n.FieldAggregationType,t.FieldRoleType=n.FieldRoleType,t.FilterDomainType=n.FilterDomainType,t.FilterNullOption=n.FilterNullOption,t.FilterType=n.FilterType,t.FilterUpdateType=n.FilterUpdateType,t.HierarchicalLevelSelectionState=n.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=n.IncludeDataValuesOption,t.MarkType=n.MarkType,t.ParameterValueType=n.ParameterValueType,t.PeriodType=n.PeriodType,t.QuickTableCalcType=n.QuickTableCalcType,t.ReplaySpeedType=n.ReplaySpeedType,t.SelectOptions=n.SelectOptions,t.SelectionUpdateType=n.SelectionUpdateType,t.SheetType=n.SheetType,t.SortDirection=n.SortDirection,t.TrendLineModelType=n.TrendLineModelType,t.ZoneVisibilityType=n.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),r(5668),r(5816),r(8824);var i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,n(r(6716)),n(r(1080)),n(r(5824)),n(r(4547)),n(r(2400)),n(r(2496)),n(r(2472)),n(r(552)),n(r(3256)),n(r(7204)),n(r(3760)),n(r(4528)),n(r(3388)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1080),i=function(){function e(){}return e.isSpecial=function(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]},e.parseBoolean=function(e){var t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t},e.parseNumber=function(e){var t=Number(e);return isNaN(t)?this.specialValueIndicator:t},e.parseDate=function(e){var t=new Date(e);return Number.isNaN(t.getTime())?null:t},e.parseDateTime=function(e){var t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r},e.convertValueAsStringToValue=function(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case n.DataType.Bool:return this.parseBoolean(e);case n.DataType.Int:case n.DataType.Float:return this.parseNumber(e);case n.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case n.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case n.DataType.Spatial:case n.DataType.String:default:return e}}},e.convertValueToNativeValue=function(e,t){if(null==e)return null;switch(t){case n.DataType.Bool:case n.DataType.Int:case n.DataType.Float:return"string"==typeof e?null:e;case n.DataType.Date:return this.parseDate(e);case n.DataType.DateTime:return this.parseDateTime(e);case n.DataType.String:return this.isSpecial(e)?null:e;case n.DataType.Spatial:default:return e}},e.convertStringValueToNativeValue=function(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)},e.specialValueIndicator="%null%",e}();t.DataTypeConverter=i},1080:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,y,h,m,g,v,b,I,S,_,T,P,A,E,w,O,D,x,F,C,N,M;Object.defineProperty(t,"__esModule",{value:!0}),(M=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",M.Server="server",M.Unknown="unknown",(N=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",N.Viewing="viewing",N.Unknown="unknown",(C=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",C.Point="point",C.Area="area",(F=t.ColumnType||(t.ColumnType={})).Discrete="discrete",F.Continuous="continuous",(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",(D=t.DataType||(t.DataType={})).String="string",D.Int="int",D.Float="float",D.Bool="bool",D.Date="date",D.DateTime="date-time",D.Spatial="spatial",D.Unknown="unknown",(O=t.DialogStyle||(t.DialogStyle={})).Window="window",O.Modal="modal",O.Modeless="modeless",(w=t.EncodedDataType||(t.EncodedDataType={})).Number="number",w.String="string",w.Date="date",w.Boolean="boolean",(E=t.ErrorCodes||(t.ErrorCodes={})).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",(A=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",A.Avg="avg",A.Min="min",A.Max="max",A.Stdev="stdev",A.Stdevp="stdevp",A.Var="var",A.Varp="varp",A.Collect="collect",A.Count="count",A.Countd="countd",A.Median="median",A.Attr="attr",A.None="none",A.Year="year",A.Qtr="qtr",A.Month="month",A.Day="day",A.Hour="hour",A.Minute="minute",A.Second="second",A.Week="week",A.Weekday="weekday",A.MonthYear="month-year",A.Mdy="mdy",A.End="end",A.TruncYear="trunc-year",A.TruncQtr="trunc-qtr",A.TruncMonth="trunc-month",A.TruncWeek="trunc-week",A.TruncDay="trunc-day",A.TruncHour="trunc-hour",A.TruncMinute="trunc-minute",A.TruncSecond="trunc-second",A.Quart1="quart1",A.Quart3="quart3",A.Skewness="skewness",A.Kurtosis="kurtosis",A.InOut="in-out",A.User="user",(P=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",P.Measure="measure",P.Unknown="unknown",(T=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",T.All="all",T.Replace="replace",T.Remove="remove",(_=t.SheetType||(t.SheetType={})).Dashboard="dashboard",_.Story="story",_.Worksheet="worksheet",(S=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",S.List="list",S.Range="range",(I=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",I.Quarters="quarters",I.Months="months",I.Weeks="weeks",I.Days="days",I.Hours="hours",I.Minutes="minutes",I.Seconds="seconds",(b=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",b.NonNullValues="nonnullvalues",b.AllValues="allvalues",(v=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",v.Database="database",(g=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",g.Add="select-add",g.Remove="select-remove",(m=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",m.Toggle="select-options-toggle",m.Menu="select-options-menu",m.Range="select-options-range",m.Search="select-options-search",(h=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",h.IncludeNonNull="include-non-null",h.IncludeAll="include-all",(y=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",y.NoneSelected="none-selected",y.SomeSelected="some-selected",y.UnknownSelected="unknown-selected",(f=t.MarkType||(t.MarkType={})).Bar="bar",f.Line="line",f.Area="area",f.Square="square",f.Circle="circle",f.Shape="shape",f.Text="text",f.Map="map",f.Pie="pie",f.GanttBar="gantt-bar",f.Polygon="polygon",f.Heatmap="heatmap",f.VizExtension="viz-extension",(d=t.FilterType||(t.FilterType={})).Categorical="categorical",d.Range="range",d.RelativeDate="relativeDate",d.Hierarchical="hierarchical",(p=t.DateRangeType||(t.DateRangeType={})).Last="last",p.LastN="lastN",p.Next="next",p.NextN="nextN",p.Current="current",p.ToDate="toDate",(c=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",c.InvalidDomain="invalid-domain",c.Success="success",(l=t.ApiShowDataTableSentinel||(t.ApiShowDataTableSentinel={})).SingleTableId="single-table-id-sentinel",l.SingleTableCaption="Single table id sentinel",(u=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",u.FormattedValuesOnly="formatted-values-only",u.NativeAndFormattedValues="native-and-formatted-values",(s=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",s.Legal="legal",s.Note="note",s.Folio="folio",s.Tabloid="tabloid",s.Ledger="ledger",s.Statement="statement",s.Executive="executive",s.A3="a3",s.A4="a4",s.A5="a5",s.B4="b4",s.B5="b5",s.Quarto="quarto",s.Unspecified="unspecified",(a=t.PageOrientation||(t.PageOrientation={})).Printer="printer",a.Portrait="portrait",a.Landscape="landscape",(o=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",o.ScalePercentage="percent",o.ScaleFitPages="fit-pages",(i=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",i.ScalePct400="pct400",i.ScalePct200="pct200",i.ScalePct100="pct100",i.ScalePct90="pct90",i.ScalePct80="pct80",i.ScalePct75="pct75",i.ScalePct60="pct60",i.ScalePct50="pct50",i.ScalePct25="pct25",(n=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",n.FitTwoHigh="fit0x2",n.FitOneWide="fit1x0",n.FitTwoWide="fit2x0",(r=t.EncodingType||(t.EncodingType={})).Color="color",r.Size="size",r.Label="label",r.Detail="detail",r.Tooltip="tooltip",r.Shape="shape",r.Path="path",r.Angle="angle",r.Geometry="geometry",r.Custom="custom"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.ParameterChanged="parameter-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.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.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",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.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.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.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.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.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.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.TooltipContext="tooltip-context",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.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",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.ClearFilter="clear-filter",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.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.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.MoveAndResizeZones="move-and-resize-zones",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.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.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,n,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(n||(n={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(3448),o=r(1680),a=r(4020),s=r(7204),u=function(){function e(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}return e.prototype.startListening=function(){var e=this;if(!this.unregisterFunction){var t=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",t,!0),this.unregisterFunction=function(){return e.thisWindow.removeEventListener("message",t,!0)}}},e.prototype.stopListening=function(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)},e.prototype.setInitializeMessageHandler=function(e){this.initializeMessageHandler=e},e.prototype.setCommandResponseMessageHandler=function(e){this.commandResponseMessageHandler=e},e.prototype.setCommandMessageHandler=function(e){this.commandMessageHandler=e},e.prototype.setNotificationMessageHandler=function(e){this.notificationMessageHandler=e},e.prototype.setHandshakeMessageHandler=function(e){this.handshakeMessageHandler=e},e.prototype.prepareInitializationMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)},e.prototype.prepareCommandMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)},e.prototype.prepareCommandResponseMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)},e.prototype.prepareNotificationMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)},e.prototype.prepareAckMessage=function(){var e={msgGuid:n.raw(),msgType:s.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)},e.prototype.prepareMessage=function(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new o.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)},e.prototype.onMessageReceived=function(e){if((!this.otherWindow||e.source===this.otherWindow)&&e.data){var t=e.data;if(a.isMessage(t))switch(t.msgType){case s.MessageType.Initialize:if(!a.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case s.MessageType.CommandResponse:if(!a.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case s.MessageType.Command:if(!a.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case s.MessageType.Notification:if(!a.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case s.MessageType.Handshake:if(!a.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}},e.prototype.setOtherWindow=function(e){this.otherWindow=e},e.prototype.setOtherWindowOrigin=function(e){this.otherWindowOrigin=e},e}();t.CrossFrameMessenger=u},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r){this._message=e,this._target=t,this._origin=r}return Object.defineProperty(e.prototype,"messageGuid",{get:function(){return this._message.msgGuid},enumerable:!0,configurable:!0}),e.prototype.send=function(){return this._target.postMessage(this._message,this._origin),this},e}();t.CrossFramePreparedMessage=r},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(5824),o=r(7204),a=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function s(e){if(!e)return!1;var t=e;return!(!(t&&t.msgGuid&&t.msgType)||!n.isGuid(t.msgGuid)||"string"!=typeof t.msgType||[o.MessageType.Command,o.MessageType.CommandResponse,o.MessageType.Initialize,o.MessageType.Notification,o.MessageType.Handshake].indexOf(t.msgType)<0)}function u(e){if(!e)return!1;var t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=s,t.isVersion=u,t.isInitMessage=function(e){if(!s(e))return!1;var t=e;return!!(t.msgType===o.MessageType.Initialize&&t.apiVersion&&u(t.apiVersion)&&t.crossFrameVersion&&u(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.CommandResponse||!n.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Notification||!t.data&&!a.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!s(e)&&e.msgType===o.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},9220:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.upgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.downgradeExecuteReturn=function(e){return e},e.prototype.downgradeNotification=function(e){return e},e}();t.IdentityVersionConverter=r},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=n,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error("Cannot convert between external version "+this._externalMajorVersion+" and "+this._platformMajorVersion)}return e.fromData=function(e,t,r,n,i){return new this(e.major,t.major,r,n,i)},e.prototype.upgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._upgradeExecuteTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(9220),i=r(2320),o=r(720);function a(e,t){return e.major===t.major&&e.minor===t.minor}function s(e,t,r,o,s){var l=e.major,c=e.minor,p=t.major;if(l>p)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+p);if(a(e,t))return new n.IdentityVersionConverter;var d=u(l,p,c,r),f=u(l,p,c,o),y=u(l,p,c,s);return f.reverse(),y.reverse(),i.StackingVersionConverter.fromData(e,t,d,f,y)}function u(e,t,r,n){for(var i=[],o=e;o<=t;o++)if(o in n)for(var a=o===e?r:0,s=l(Object.keys(n[o])),u=a;u<=s;u++)u in n[o]&&i.push.apply(i,n[o][u]);return i}function l(e){return e.map((function(e){return Number(e)})).reduce((function(e,t){return e>t?e:t}))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5824);t.DowngradeWorksheetNames=function(e){var t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((function(e){e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===n.NotificationId.SelectedMarksChanged){var t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.downgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.upgradeExecuteReturn=function(e,t,r){return e},e.prototype.upgradeNotification=function(e){return e},e}();t.ExternalIdentityVersionConverter=r},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=n,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error("Cannot convert between external version "+this._externalVersion.major+"\n and "+this._platformVersion.major)}return e.prototype.downgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._downgradeExecuteCallTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3760),i=r(4528),o=r(5768),a=r(2088);function s(e,t,r,a,s){var l=e.major,c=t.major,p=t.minor;if(l>c)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+c);if(l{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);function i(e){void 0!==e&&void 0!==e.dataTable&&Array.isArray(e.dataTable)&&e.dataTable.forEach((function(t){t.forEach((function(t,r){var i=t.value;null!==i&&(t.value=n.DataTypeConverter.convertValueAsStringToValue(i,e.headers[r].dataType))}))}))}function o(e,t){if(t[n.ParameterId.LogicalTableId]!==n.ApiShowDataTableSentinel.SingleTableId)throw new Error("Invalid logical table id passed to "+e+".")}t.UpgradeDataTableTypes=function(e,t,r){if(!e)return e;var n=e.result;if(void 0!==n.data&&void 0!==n.isSummary)return i(n.data),e;var o=e.result;return void 0!==o.data&&Array.isArray(o.data)?(o.data.forEach((function(e){i(e)})),e):e},t.DowngradeUnderlyingTableDataAsync=function(e,t){return e===n.VerbId.GetUnderlyingTableData&&(o(e,t),e=n.VerbId.GetUnderlyingData),{verb:e,parameters:t}},t.DowngradeLogicalTableDataAsync=function(e,t){return e===n.VerbId.GetLogicalTableData&&(o(e,t),e=n.VerbId.GetDataSourceData),{verb:e,parameters:t}},t.UpgradeDataTableRowsAndColumns=function(e,t,r){return function(e){return e===n.VerbId.GetDataSummaryData}(t)&&r[n.ParameterId.MaxRows]&&(e=function(e,t){var r=e.result;return r.data&&Array.isArray(r.data.dataTable)?(t>0&&t{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,n(r(5184));var o=r(8540);t.CrossFrameDispatcher=o.CrossFrameDispatcher;var a=r(8340);t.DataSource=a.DataSource;var s=r(1044);t.ExternalToInternalEnumMappings=s.ExternalToInternalEnumMappings;var u=r(6557);t.InternalToExternalEnumMappings=u.InternalToExternalEnumMappings;var l=r(2680);t.EventListenerManager=l.EventListenerManager;var c=r(1072);t.Field=c.Field;var p=r(2520);t.CustomViewImpl=p.CustomViewImpl;var d=r(1940);t.DashboardImpl=d.DashboardImpl;var f=r(6488);t.DashboardObjectImpl=f.DashboardObjectImpl;var y=r(2180);t.DataSourceImpl=y.DataSourceImpl;var h=r(8552);t.ParameterImpl=h.ParameterImpl;var m=r(8332);t.SheetImpl=m.SheetImpl;var g=r(1116);t.SheetInfoImpl=g.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var b=r(6804);t.StoryImpl=b.StoryImpl;var I=r(2608);t.StoryPointImpl=I.StoryPointImpl;var S=r(6068);t.StoryPointInfoImpl=S.StoryPointInfoImpl;var _=r(3044);t.WorkbookImpl=_.WorkbookImpl;var T=r(6500);t.WorksheetImpl=T.WorksheetImpl;var P=r(3987);t.Point=P.Point,n(r(8672)),n(r(3008));var A=r(1832);t.ClientInfoServiceImpl=A.ClientInfoServiceImpl;var E=r(1288);t.NotificationServiceImpl=E.NotificationServiceImpl;var w=r(6428);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var O=r(1776);t.ServiceImplBase=O.ServiceImplBase;var D=r(4109);t.SizeServiceImpl=D.SizeServiceImpl;var x=r(2248);t.StoryActivationServiceImpl=x.StoryActivationServiceImpl;var F=r(6664);t.TableauError=F.TableauError;var C=r(1724);t.Deferred=C.Deferred;var N=r(7480);t.ErrorHelpers=N.ErrorHelpers;var M=r(5044);t.ExportHelpers=M.ExportHelpers;var k=r(2780);t.SheetUtils=k.SheetUtils;var R=r(1576);t.VersionNumber=R.VersionNumber;var V=r(8648);t.VersionedExternalApiDispatcher=V.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1576),i=function(){function e(){}return Object.defineProperty(e,"Instance",{get:function(){return e._instance},enumerable:!0,configurable:!0}),e.SetVersionNumber=function(t,r){e._instance=new n.VersionNumber(t,r)},e}();t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._connectionInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._connectionInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._connectionInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"serverURI",{get:function(){return this._connectionInfo.serverURI},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._connectionInfo.type},enumerable:!0,configurable:!0}),e}();t.ConnectionSummary=r},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise((function(o,a){var s;(s=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener)||a("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");var u=new n.CrossFrameMessenger(e,s,"*"),l=u.prepareInitializationMessage(t,n.MESSAGING_VERSION,r);u.setCommandResponseMessageHandler((function(e){e.commandGuid===l.messageGuid&&o((function(){return new i.CrossFrameDispatcher(u)}))})),u.startListening(),l.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}return e.prototype.execute=function(e,t){var r=this,n=this._messenger.prepareCommandMessage(e,t),i=new Promise((function(e,t){r._pendingPromises[n.messageGuid]={resolve:e,reject:t}}));return n.send(),i},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e.prototype.onCommandResponse=function(e){if(!(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)){var t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}},e.prototype.onNotification=function(e){for(var t=0,r=this._notificationHandlers;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dataSourceImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._dataSourceImpl.fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceImpl.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceImpl.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceImpl.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceImpl.publishedUrl()},e.prototype.refreshAsync=function(){return this._dataSourceImpl.refreshAsync()},e.prototype.getActiveTablesAsync=function(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()},e.prototype.getConnectionSummariesAsync=function(){return this._dataSourceImpl.getConnectionSummariesAsync()},e.prototype.getUnderlyingDataAsync=function(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)},e.prototype.getLogicalTablesAsync=function(){return this._dataSourceImpl.getLogicalTablesAsync()},e.prototype.getLogicalTableDataAsync=function(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)},e}();t.DataSource=r},1044:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d;Object.defineProperty(t,"__esModule",{value:!0});var f=r(7419),y=r(3448),h=r(5520),m=function(){function e(){}return e.filterDomainType=new h.EnumConverter(((n={})[f.FilterDomainType.Relevant]=y.FilterDomainType.Relevant,n[f.FilterDomainType.Database]=y.FilterDomainType.Database,n)),e.nullOptions=new h.EnumConverter(((i={})[f.FilterNullOption.AllValues]=y.FilterNullOption.AllValues,i[f.FilterNullOption.NonNullValues]=y.FilterNullOption.NonNullValues,i[f.FilterNullOption.NullValues]=y.FilterNullOption.NullValues,i)),e.filterUpdateType=new h.EnumConverter(((o={})[f.FilterUpdateType.Add]=y.FilterUpdateType.Add,o[f.FilterUpdateType.All]=y.FilterUpdateType.All,o[f.FilterUpdateType.Remove]=y.FilterUpdateType.Remove,o[f.FilterUpdateType.Replace]=y.FilterUpdateType.Replace,o)),e.setVisibilityType=new h.EnumConverter(((a={})[f.ZoneVisibilityType.Show]=!0,a[f.ZoneVisibilityType.Hide]=!1,a)),e.setReplaySpeedType=new h.EnumConverter(((s={})[f.ReplaySpeedType.Slow]=2,s[f.ReplaySpeedType.Normal]=1,s[f.ReplaySpeedType.Fast]=.5,s)),e.sheetType=new h.EnumConverter(((u={})[f.SheetType.Dashboard]=y.SheetType.Dashboard,u[f.SheetType.Worksheet]=y.SheetType.Worksheet,u[f.SheetType.Story]=y.SheetType.Story,u)),e.showDataTableFormatType=new h.EnumConverter(((l={})[f.IncludeDataValuesOption.AllValues]=y.ApiShowDataTableFormat.NativeAndFormattedValues,l[f.IncludeDataValuesOption.OnlyNativeValues]=y.ApiShowDataTableFormat.NativeValuesOnly,l[f.IncludeDataValuesOption.OnlyFormattedValues]=y.ApiShowDataTableFormat.FormattedValuesOnly,l)),e.periodType=new h.EnumConverter(((c={})[f.PeriodType.Years]=y.DateStepPeriod.Years,c[f.PeriodType.Quarters]=y.DateStepPeriod.Quarters,c[f.PeriodType.Months]=y.DateStepPeriod.Months,c[f.PeriodType.Weeks]=y.DateStepPeriod.Weeks,c[f.PeriodType.Days]=y.DateStepPeriod.Days,c[f.PeriodType.Hours]=y.DateStepPeriod.Hours,c[f.PeriodType.Minutes]=y.DateStepPeriod.Minutes,c[f.PeriodType.Seconds]=y.DateStepPeriod.Seconds,c)),e.dateRangeType=new h.EnumConverter(((p={})[f.DateRangeType.Last]=y.DateRangeType.Last,p[f.DateRangeType.LastN]=y.DateRangeType.LastN,p[f.DateRangeType.Next]=y.DateRangeType.Next,p[f.DateRangeType.NextN]=y.DateRangeType.NextN,p[f.DateRangeType.Current]=y.DateRangeType.Current,p[f.DateRangeType.ToDate]=y.DateRangeType.ToDate,p)),e.dialogStyles=new h.EnumConverter(((d={})[f.DialogStyle.Window]=y.DialogStyle.Window,d[f.DialogStyle.Modal]=y.DialogStyle.Modal,d[f.DialogStyle.Modeless]=y.DialogStyle.Modeless,d)),e}();t.ExternalToInternalEnumMappings=m},6557:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d,f,y,h,m,g,v,b,I;Object.defineProperty(t,"__esModule",{value:!0});var S=r(7419),_=r(3448),T=r(5520),P=function(){function e(){}return e.extensionContext=new T.EnumConverter(((n={})[_.ExtensionContext.Desktop]=S.ExtensionContext.Desktop,n[_.ExtensionContext.Server]=S.ExtensionContext.Server,n)),e.extensionMode=new T.EnumConverter(((i={})[_.ExtensionMode.Authoring]=S.ExtensionMode.Authoring,i[_.ExtensionMode.Viewing]=S.ExtensionMode.Viewing,i)),e.columnType=new T.EnumConverter(((o={})[_.ColumnType.Continuous]=S.ColumnType.Continuous,o[_.ColumnType.Discrete]=S.ColumnType.Discrete,o)),e.fieldAggregationType=new T.EnumConverter(((a={})[_.FieldAggregationType.Attr]=S.FieldAggregationType.Attr,a[_.FieldAggregationType.Avg]=S.FieldAggregationType.Avg,a[_.FieldAggregationType.Collect]=S.FieldAggregationType.Collect,a[_.FieldAggregationType.Count]=S.FieldAggregationType.Count,a[_.FieldAggregationType.Countd]=S.FieldAggregationType.Countd,a[_.FieldAggregationType.Day]=S.FieldAggregationType.Day,a[_.FieldAggregationType.End]=S.FieldAggregationType.End,a[_.FieldAggregationType.Hour]=S.FieldAggregationType.Hour,a[_.FieldAggregationType.InOut]=S.FieldAggregationType.InOut,a[_.FieldAggregationType.Kurtosis]=S.FieldAggregationType.Kurtosis,a[_.FieldAggregationType.Max]=S.FieldAggregationType.Max,a[_.FieldAggregationType.Mdy]=S.FieldAggregationType.Mdy,a[_.FieldAggregationType.Median]=S.FieldAggregationType.Median,a[_.FieldAggregationType.Min]=S.FieldAggregationType.Min,a[_.FieldAggregationType.Minute]=S.FieldAggregationType.Minute,a[_.FieldAggregationType.MonthYear]=S.FieldAggregationType.MonthYear,a[_.FieldAggregationType.None]=S.FieldAggregationType.None,a[_.FieldAggregationType.Qtr]=S.FieldAggregationType.Qtr,a[_.FieldAggregationType.Quart1]=S.FieldAggregationType.Quart1,a[_.FieldAggregationType.Quart3]=S.FieldAggregationType.Quart3,a[_.FieldAggregationType.Second]=S.FieldAggregationType.Second,a[_.FieldAggregationType.Skewness]=S.FieldAggregationType.Skewness,a[_.FieldAggregationType.Stdev]=S.FieldAggregationType.Stdev,a[_.FieldAggregationType.Stdevp]=S.FieldAggregationType.Stdevp,a[_.FieldAggregationType.Sum]=S.FieldAggregationType.Sum,a[_.FieldAggregationType.TruncDay]=S.FieldAggregationType.TruncDay,a[_.FieldAggregationType.TruncHour]=S.FieldAggregationType.TruncHour,a[_.FieldAggregationType.TruncMinute]=S.FieldAggregationType.TruncMinute,a[_.FieldAggregationType.TruncMonth]=S.FieldAggregationType.TruncMonth,a[_.FieldAggregationType.TruncQtr]=S.FieldAggregationType.TruncQtr,a[_.FieldAggregationType.TruncSecond]=S.FieldAggregationType.TruncSecond,a[_.FieldAggregationType.TruncWeek]=S.FieldAggregationType.TruncWeek,a[_.FieldAggregationType.TruncYear]=S.FieldAggregationType.TruncYear,a[_.FieldAggregationType.User]=S.FieldAggregationType.User,a[_.FieldAggregationType.Var]=S.FieldAggregationType.Var,a[_.FieldAggregationType.Varp]=S.FieldAggregationType.Varp,a[_.FieldAggregationType.Week]=S.FieldAggregationType.Week,a[_.FieldAggregationType.Weekday]=S.FieldAggregationType.Weekday,a[_.FieldAggregationType.Year]=S.FieldAggregationType.Year,a)),e.fieldRoleType=new T.EnumConverter(((s={})[_.FieldRoleType.Dimension]=S.FieldRoleType.Dimension,s[_.FieldRoleType.Measure]=S.FieldRoleType.Measure,s[_.FieldRoleType.Unknown]=S.FieldRoleType.Unknown,s)),e.sheetType=new T.EnumConverter(((u={})[_.SheetType.Dashboard]=S.SheetType.Dashboard,u[_.SheetType.Story]=S.SheetType.Story,u[_.SheetType.Worksheet]=S.SheetType.Worksheet,u)),e.dashboardObjectType=new T.EnumConverter(((l={})[_.DashboardObjectType.Extension]=S.DashboardObjectType.Extension,l[_.DashboardObjectType.Blank]=S.DashboardObjectType.Blank,l[_.DashboardObjectType.Image]=S.DashboardObjectType.Image,l[_.DashboardObjectType.Legend]=S.DashboardObjectType.Legend,l[_.DashboardObjectType.PageFilter]=S.DashboardObjectType.PageFilter,l[_.DashboardObjectType.ParameterControl]=S.DashboardObjectType.ParameterControl,l[_.DashboardObjectType.QuickFilter]=S.DashboardObjectType.QuickFilter,l[_.DashboardObjectType.Text]=S.DashboardObjectType.Text,l[_.DashboardObjectType.Title]=S.DashboardObjectType.Title,l[_.DashboardObjectType.WebPage]=S.DashboardObjectType.WebPage,l[_.DashboardObjectType.Worksheet]=S.DashboardObjectType.Worksheet,l)),e.dataType=new T.EnumConverter(((c={})[_.DataType.Bool]=S.DataType.Bool,c[_.DataType.Date]=S.DataType.Date,c[_.DataType.DateTime]=S.DataType.DateTime,c[_.DataType.Float]=S.DataType.Float,c[_.DataType.Int]=S.DataType.Int,c[_.DataType.String]=S.DataType.String,c)),e.filterUpdateType=new T.EnumConverter(((p={})[_.FilterUpdateType.Add]=S.FilterUpdateType.Add,p[_.FilterUpdateType.All]=S.FilterUpdateType.All,p[_.FilterUpdateType.Remove]=S.FilterUpdateType.Remove,p[_.FilterUpdateType.Replace]=S.FilterUpdateType.Replace,p)),e.allowableValues=new T.EnumConverter(((d={})[_.DomainRestrictionType.All]=S.ParameterValueType.All,d[_.DomainRestrictionType.List]=S.ParameterValueType.List,d[_.DomainRestrictionType.Range]=S.ParameterValueType.Range,d)),e.dateStepPeriod=new T.EnumConverter(((f={})[_.DateStepPeriod.Years]=S.PeriodType.Years,f[_.DateStepPeriod.Quarters]=S.PeriodType.Quarters,f[_.DateStepPeriod.Months]=S.PeriodType.Months,f[_.DateStepPeriod.Weeks]=S.PeriodType.Weeks,f[_.DateStepPeriod.Days]=S.PeriodType.Days,f[_.DateStepPeriod.Hours]=S.PeriodType.Hours,f[_.DateStepPeriod.Minutes]=S.PeriodType.Minutes,f[_.DateStepPeriod.Seconds]=S.PeriodType.Seconds,f)),e.dateRangeType=new T.EnumConverter(((y={})[_.DateRangeType.Current]=S.DateRangeType.Current,y[_.DateRangeType.Last]=S.DateRangeType.Last,y[_.DateRangeType.LastN]=S.DateRangeType.LastN,y[_.DateRangeType.Next]=S.DateRangeType.Next,y[_.DateRangeType.NextN]=S.DateRangeType.NextN,y[_.DateRangeType.ToDate]=S.DateRangeType.ToDate,y)),e.errorCode=new T.EnumConverter(((h={})[_.ErrorCodes.INITIALIZATION_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.INTERNAL_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.MISSING_ENUM_MAPPING]=S.ErrorCodes.InternalError,h[_.ErrorCodes.MISSING_PARAMETER]=S.ErrorCodes.InternalError,h[_.ErrorCodes.PERMISSION_DENIED]=S.ErrorCodes.InternalError,h[_.ErrorCodes.PRES_MODEL_PARSING_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.UNKNOWN_VERB_ID]=S.ErrorCodes.InternalError,h[_.ErrorCodes.VERSION_NOT_CONFIGURED]=S.ErrorCodes.APINotInitialized,h[_.ErrorCodes.VISIBILITY_ERROR]=S.ErrorCodes.VisibilityError,h),S.ErrorCodes.InternalError),e.filterType=new T.EnumConverter(((m={})[_.FilterType.Categorical]=S.FilterType.Categorical,m[_.FilterType.Range]=S.FilterType.Range,m[_.FilterType.RelativeDate]=S.FilterType.RelativeDate,m[_.FilterType.Hierarchical]=S.FilterType.Hierarchical,m)),e.classNameKey=new T.EnumConverter(((g={})["tableau-dashboard-title"]=S.ClassNameKey.DashboardTitle,g["tableau-story-title"]=S.ClassNameKey.StoryTitle,g["tableau-tooltip"]=S.ClassNameKey.Tooltip,g["tableau-worksheet"]=S.ClassNameKey.Worksheet,g["tableau-worksheet-title"]=S.ClassNameKey.WorksheetTitle,g["dashboard-title"]=S.ClassNameKey.DashboardTitle,g["story-title"]=S.ClassNameKey.StoryTitle,g.tooltip=S.ClassNameKey.Tooltip,g.worksheet=S.ClassNameKey.Worksheet,g["worksheet-title"]=S.ClassNameKey.WorksheetTitle,g)),e.hierarchicalLevelSelectionState=new T.EnumConverter(((v={})[_.HierarchicalLevelSelectionState.AllSelected]=S.HierarchicalLevelSelectionState.AllSelected,v[_.HierarchicalLevelSelectionState.NoneSelected]=S.HierarchicalLevelSelectionState.NoneSelected,v[_.HierarchicalLevelSelectionState.SomeSelected]=S.HierarchicalLevelSelectionState.SomeSelected,v[_.HierarchicalLevelSelectionState.UnknownSelected]=S.HierarchicalLevelSelectionState.UnknownSelected,v)),e.annotationType=new T.EnumConverter(((b={})[_.AnnotateEnum.Area]=S.AnnotationType.Area,b[_.AnnotateEnum.Mark]=S.AnnotationType.Mark,b[_.AnnotateEnum.Point]=S.AnnotationType.Point,b)),e.markType=new T.EnumConverter(((I={})[_.MarkType.Area]=S.MarkType.Area,I[_.MarkType.Bar]=S.MarkType.Bar,I[_.MarkType.Circle]=S.MarkType.Circle,I[_.MarkType.GanttBar]=S.MarkType.GanttBar,I[_.MarkType.Heatmap]=S.MarkType.Heatmap,I[_.MarkType.Line]=S.MarkType.Line,I[_.MarkType.Map]=S.MarkType.Map,I[_.MarkType.Pie]=S.MarkType.Pie,I[_.MarkType.Polygon]=S.MarkType.Polygon,I[_.MarkType.Shape]=S.MarkType.Shape,I[_.MarkType.Square]=S.MarkType.Square,I[_.MarkType.Text]=S.MarkType.Text,I[_.MarkType.VizExtension]=S.MarkType.VizExtension,I)),e}();t.InternalToExternalEnumMappings=P},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(){this._eventListenerManagers={}}return e.prototype.addEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot add event, unsupported event type: "+e);return this._eventListenerManagers[e].addEventListener(t)},e.prototype.removeEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot remove event, unsupported event type: "+e);return this._eventListenerManagers[e].removeEventListener(t)},e.prototype.addNewEventType=function(e){this._eventListenerManagers[e.eventType]=e},e}();t.EventListenerManager=o},1072:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7480),i=function(){function e(e){this._fieldImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldImpl.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._fieldImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return this._fieldImpl.aggregation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){return this._fieldImpl.dataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return this._fieldImpl.role},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldImpl.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldImpl.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldImpl.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){throw n.ErrorHelpers.apiNotImplemented("Field.columnType")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldImpl.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldImpl.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.Field=i},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}return Object.defineProperty(e.prototype,"luid",{get:function(){return this._luid},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared},set:function(e){this._shared=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isDefault",{get:function(){return this._isDefault},set:function(e){this._isDefault=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ownerName",{get:function(){return this._ownerName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){return n.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)},e}();t.CustomViewImpl=i},1940:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(6557),l=r(3987),c=r(3008),p=r(6664),d=r(7480),f=r(6488),y=r(8332),h=r(1116),m=r(6500),g=function(e){function t(t,r,n,i,o,a){void 0===a&&(a=0);var s=e.call(this,t,i)||this;return s._zones=r,s._sheetPath=n,s._parentStoryPointImpl=o,s._activeDashboardObjectId=a,s}return i(t,e),Object.defineProperty(t.prototype,"worksheetsImpl",{get:function(){return this._worksheetsImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._objects},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._sheetPath.sheetName},enumerable:!0,configurable:!0}),t.prototype.initializeWithPublicInterfaces=function(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(var e=0,t=this._zones;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o,a,s,u){this._dashboardImpl=e,this._type=t,this._position=r,this._size=n,this._worksheetImpl=i,this._name=o,this._isFloating=a,this._isVisible=s,this._id=u}return Object.defineProperty(e.prototype,"dashboardImpl",{get:function(){return this._dashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetImpl",{get:function(){return this._worksheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),e}();t.DashboardObjectImpl=r},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(716),o=r(1072),a=r(624),s=r(3008),u=r(7603),l=r(7480),c=r(5288),p=function(){function e(e,t){var r=this;this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((function(e){var t=new c.FieldImpl(e,r);return new o.Field(t)}))}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceInfo.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceInfo.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceInfo.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceInfo.publishedUrl},e.prototype.getMaxPageRowLimit=function(){return 1e4},e.prototype.refreshAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)},e.prototype.getConnectionSummariesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new i.ConnectionSummary(e)}))}))},e.prototype.getActiveTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new u.TableSummary(e)}))}))},e.prototype.getUnderlyingDataAsync=function(e){return e=e||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataAsync=function(e,t){return t=t||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return r=r||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.initializeWithPublicInterfaces=function(e){l.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((function(t){var r=new c.FieldImpl(t,e);return new o.Field(r)}))},e.prototype.getLogicalTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((function(e){return e.map((function(e){return new a.LogicalTable(e)}))}))},e}();t.DataSourceImpl=p},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6557),o=function(){function e(e,t){this._fieldInfo=e,this._parentDataSource=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldInfo.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){var e;return null!=(e=this._fieldInfo.dataType)?e:n.DataType.Unknown},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return i.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return i.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldInfo.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldInfo.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldInfo.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldInfo.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldInfo.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.FieldImpl=o},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6557),o=r(3008),a=r(8052),s=r(7480),u=r(1172),l=function(){function e(e,t){this._registryId=t,this.setParameterInfo(e)}return Object.defineProperty(e.prototype,"name",{get:function(){return this._parameterInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentValue",{get:function(){return a.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._globalFieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allowableValues",{get:function(){return this._allowableValues},enumerable:!0,configurable:!0}),e.prototype.changeValueAsync=function(e){var t=this;s.ErrorHelpers.verifyParameter(e,"newValue");var r=u.Param.serializeParameterValue(e);return o.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,r).then((function(e){return t.setParameterInfo(e),t.currentValue}))},e.prototype.setParameterInfo=function(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;var t,r,o,s,u,l=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);l===n.ParameterValueType.List?t=(e.allowableValues||[]).map((function(t){return a.DataValueFactory.MakeParameterDataValue(t,e.dataType)})):l===n.ParameterValueType.Range&&(r=e.minValue&&a.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&a.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),s=e.stepSize,u=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:l,allowableValues:t,minValue:r,maxValue:o,stepSize:s,dateStepPeriod:u}},e}();t.ParameterImpl=l},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3008),o=r(6664),a=r(7480),s=r(1172),u=r(2780),l=function(){function e(e,t){this._sheetInfoImpl=e,this._registryId=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._sheetInfoImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetInfoImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return this._sheetInfoImpl.sheetPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._sheetInfoImpl.sheetSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hidden",{get:function(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"active not implemented")},set:function(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"index not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"url not implemented")},enumerable:!0,configurable:!0}),e.prototype.getSheetSize=function(){if(!u.SheetUtils.isValidSheetSize(this.size))throw new o.TableauError(n.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size},e.prototype.findParameterAsync=function(e){return a.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)},e.prototype.getParametersAsync=function(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)},e.prototype.changeSizeAsync=function(e){var t=this,r=new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw r;var a=this.normalizeSheetSize(e),s=a.behavior===n.SheetSizeBehavior.Automatic;if(!s&&!a.minSize&&!a.maxSize)throw r;if(!s&&this.sheetType===n.SheetType.Worksheet)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===a.behavior)return Promise.resolve(e);var l=this.processNewSize(a);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,l).then((function(){return i.ApiServiceRegistry.get(t._registryId).getService("client-info-service").getClientInfoAsync().then((function(e){var r=e.publishedSheets.find((function(e){return e.name===t.name}));if(!r)throw new o.TableauError(n.SharedErrorCodes.InternalError,"Can't find sheet with name "+t.name);var i=u.SheetUtils.getSheetSizeFromSizeConstraints(r.sizeConstraint);return t._sheetInfoImpl.sheetSize=i,i}))}))},e.prototype.normalizeSheetSize=function(t){var r=t.behavior;return a.ErrorHelpers.verifyEnumValue(r,n.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:r,minSize:e.parseDimensions(t.minSize),maxSize:e.parseDimensions(t.maxSize)}},e.prototype.processNewSize=function(e){var t,r,i,a,u=e.behavior,l=e.minSize,c=e.maxSize,p=!s.Param.isNullOrUndefined(null===(t=l)||void 0===t?void 0:t.width),d=!s.Param.isNullOrUndefined(null===(r=l)||void 0===r?void 0:r.height),f=!s.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),y=!s.Param.isNullOrUndefined(null===(a=c)||void 0===a?void 0:a.height),h=p&&d,m=f&&y;switch(u){case n.SheetSizeBehavior.Automatic:return{behavior:u};case n.SheetSizeBehavior.AtMost:if(!c||!m)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");if((v={width:c.width,height:c.height}).width<0||v.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,maxSize:v};case n.SheetSizeBehavior.AtLeast:if(!l||!h)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");if((g={width:l.width,height:l.height}).width<0||g.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,minSize:g};case n.SheetSizeBehavior.Range:if(!(l&&c&&h&&m))throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");var g={width:l.width,height:l.height},v={width:c.width,height:c.height};if(g.width<0||g.height<0||v.width<0||v.height<0||g.width>v.width||g.height>v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:u,minSize:g,maxSize:v};case n.SheetSizeBehavior.Exactly:if(l&&c){if(h&&m){if(g={width:l.width,height:l.height},v={width:c.width,height:c.height},g.width!==v.width||g.height!==v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:u,minSize:g,maxSize:v}}if(h)return{behavior:u,minSize:g={width:l.width,height:l.height},maxSize:g};if(m)return{behavior:u,minSize:v={width:c.width,height:c.height},maxSize:v}}throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new o.TableauError(n.SharedErrorCodes.InternalError,"Unsupported sheet size behavior: "+u)}},e.parseDimensions=function(e){var t={width:void 0,height:void 0};if(!e)return t;var r=s.Param.tryParseNumber(e.width),n=r.success,i=r.parsed,o=s.Param.tryParseNumber(e.height),a=o.success,u=o.parsed;return n&&a?{width:i,height:u}:n?{width:i}:a?{height:u}:t},e}();t.SheetImpl=l},1116:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e,t,r,n,i,o,a){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=n,this._isActive=i,this._isHidden=o,this._url=a}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetSize",{get:function(){return this._sheetSize},set:function(e){this._sheetSize=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return{sheetName:this.name,isDashboard:this.sheetType===n.SheetType.Dashboard}},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isActive",{get:function(){return this._isActive},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{set:function(e){this._isActive=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e}();t.SheetInfoImpl=i},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._eventType=e,this._handlers=[]}return Object.defineProperty(e.prototype,"eventType",{get:function(){return this._eventType},enumerable:!0,configurable:!0}),e.prototype.addEventListener=function(e){var t=this;return this._handlers.push(e),function(){return t.removeEventListener(e)}},e.prototype.removeEventListener=function(e){var t=this._handlers.length;return this._handlers=this._handlers.filter((function(t){return t!==e})),t>this._handlers.length},e.prototype.triggerEvent=function(e){for(var t=0,r=this._handlers;t=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);var t=this._deferred.getNewPromiseOrThrowIfBusy();return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t},t.prototype.revertStoryPointAsync=function(e){var t=this;if(u.ErrorHelpers.verifyParameter(e,"index"),u.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((function(e){return t.updateStoryInfo(e.index,e),new d.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,t)}))},t.prototype.clearPendingPromises=function(){this._deferred&&this._deferred.reject("All pending promises cleared")},t}(c.SheetImpl);t.StoryImpl=f},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(2780),a=r(1940),s=r(1116),u=r(6500),l=function(){function e(e,t,r,n){this._storyPointInfoImpl=e,n&&(this._containedSheetImpl=this.createContainedSheet(n,t,r))}return Object.defineProperty(e.prototype,"index",{get:function(){return this._storyPointInfoImpl.index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._storyPointInfoImpl.caption},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._storyPointInfoImpl.active},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._storyPointInfoImpl.updated},set:function(e){this._storyPointInfoImpl.updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._storyPointInfoImpl.parentStory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containedSheet",{get:function(){return this._containedSheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointInfoImpl.storyPointId},enumerable:!0,configurable:!0}),e.prototype.createContainedSheet=function(e,t,r){var l,c=o.SheetUtils.getPublishedSheetInfoByName(e.name,t),p=o.SheetUtils.createAutomaticSize(),d=void 0===c,f=c?c.url:"",y=new s.SheetInfoImpl(e.name,o.SheetUtils.getSheetTypeEnum(e.sheetType),p,-1,!1,d,f);switch(y.sheetType){case n.SheetType.Worksheet:var h={worksheet:y.name};l=new u.WorksheetImpl(y,r,h,null,this);break;case n.SheetType.Dashboard:var m={sheetName:y.name,isDashboard:!0};l=new a.DashboardImpl(y,e.dashboardZones,m,r,this);break;default:throw new i.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return l},e}();t.StoryPointImpl=l},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._caption=e,this._index=t,this._storyPointId=r,this._active=n,this._updated=i,this._parentStoryImpl=o}return Object.defineProperty(e.prototype,"caption",{get:function(){return this._caption},set:function(e){this._caption=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},set:function(e){this._index=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._active},set:function(e){this._active=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._updated},set:function(e){this._updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._parentStoryImpl},enumerable:!0,configurable:!0}),e}();t.StoryPointInfoImpl=r},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WorkbookImpl=function(){}},6500:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(8340),u=r(624),l=r(3483),c=r(3008),p=r(6664),d=r(7480),f=r(2180),y=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r)||this;return a._visualId=n,a._parentDashboardImpl=i,a._parentStoryPointImpl=o,a}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){return this._parentDashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"visualId",{get:function(){return this._visualId},enumerable:!0,configurable:!0}),t.prototype.getMaxPageRowLimit=function(){return 1e4},t.prototype.applyFilterAsync=function(e,t,r,n){return d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?d.ErrorHelpers.verifyEnumValue(t.nullOption,a.FilterNullOption,"FilterNullOption"):d.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){if(d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"values"),d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new p.TableauError(a.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)},t.prototype.clearFilterAsync=function(e){return d.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return d.ErrorHelpers.verifyStringParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"options"),d.ErrorHelpers.verifyEnumValue(t.periodType,a.PeriodType,"PeriodType"),d.ErrorHelpers.verifyEnumValue(t.rangeType,a.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)},t.prototype.getDataSourcesAsync=function(){var e=this;return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((function(t){var r=t,n=r.worksheetDataSchemaMap[e.name],i=[],o=n.primaryDataSource;i.push(e.createDataSourceFromInfo(r.dataSources[o]));for(var a=0,s=n.referencedDataSourceList;a{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._logicalTable=e}return Object.defineProperty(e.prototype,"id",{get:function(){return this._logicalTable.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._logicalTable.caption},enumerable:!0,configurable:!0}),e}();t.LogicalTable=r},6296:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3008),s=r(7480),u=function(){function e(e,t,r,n,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=n,this._registryId=i}return Object.defineProperty(e.prototype,"worksheetName",{get:function(){return this._worksheetName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"filterType",{get:function(){return this._filterType},enumerable:!0,configurable:!0}),e.prototype.getFieldAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)},e.prototype.getAppliedWorksheetsAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)},e.prototype.setAppliedWorksheetsAsync=function(e){s.ErrorHelpers.verifyParameter(e,"applyToWorksheets");var t=new Set(e);return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))},e}();t.Filter=u;var l=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._appliedValues=a,l._isExcludeMode=s,l._isAllSelected=u,l}return i(t,e),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isExcludeMode",{get:function(){return this._isExcludeMode},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.CategoricalFilter=l;var c=function(){function e(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hierarchicalPath",{get:function(){return this._hierarchicalPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"level",{get:function(){return this._level},enumerable:!0,configurable:!0}),e}();t.HierarchicalDataValue=c;var p=function(){function e(e,t){this._name=e,this._levelSelectionState=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"levelSelectionState",{get:function(){return this._levelSelectionState},enumerable:!0,configurable:!0}),e}();t.HierarchicalLevelDetail=p;var d=function(e){function t(t,r,n,i,o,a,s,u,l,c,p){var d=e.call(this,t,r,i,n,o)||this;return d._dimensionName=a,d._hierarchyCaption=s,d._numberOfLevels=u,d._levelDetails=l,d._appliedValues=c,d._isAllSelected=p,d}return i(t,e),t.prototype.getDomainAsync=function(e){throw new Error("Method not implemented.")},Object.defineProperty(t.prototype,"dimensionName",{get:function(){return this._dimensionName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hierarchyCaption",{get:function(){return this._hierarchyCaption},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"numberOfLevels",{get:function(){return this._numberOfLevels},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"levelDetails",{get:function(){return this._levelDetails},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),t}(u);t.HierarchicalFilter=d;var f=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._min=a,l._max=s,l._includeNullValues=u,l}return i(t,e),Object.defineProperty(t.prototype,"minValue",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"maxValue",{get:function(){return this._max},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"includeNullValues",{get:function(){return this._includeNullValues},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){var t=a.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.RangeFilter=f;var y=function(e){function t(t,r,n,i,o,a,s,u,l){var c=e.call(this,t,r,i,n,o)||this;return c._anchorDate=a,c._periodType=s,c._rangeType=u,c._rangeN=l,c}return i(t,e),Object.defineProperty(t.prototype,"anchorDate",{get:function(){return this._anchorDate},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"periodType",{get:function(){return this._periodType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeType",{get:function(){return this._rangeType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeN",{get:function(){return this._rangeN},enumerable:!0,configurable:!0}),t}(u);t.RelativeDateFilter=y;var h=function(){function e(e,t){this._values=e,this._domainType=t}return Object.defineProperty(e.prototype,"values",{get:function(){return this._values},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),e}();t.CategoricalDomain=h;var m=function(){function e(e,t,r){this._min=e,this._max=t,this._domainType=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"min",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"max",{get:function(){return this._max},enumerable:!0,configurable:!0}),e}();t.RangeDomain=m},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=n,this._isSummaryData=i,this._marksInfo=o,this._name=i?"Summary Data Table":"Underlying Data Table"}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columns",{get:function(){return this._columns},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"marksInfo",{get:function(){return this._marksInfo},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"totalRowCount",{get:function(){return this._totalRowCount},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isTotalRowCountLimited",{get:function(){return this._isTotalRowCountLimited},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isSummaryData",{get:function(){return this._isSummaryData},enumerable:!0,configurable:!0}),e}();t.DataTable=r;var n=function(){function e(e,t,r){this._type=e,this._color=t,this._tupleId=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"color",{get:function(){return this._color},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tupleId",{get:function(){return this._tupleId},enumerable:!0,configurable:!0}),e}();t.MarkInfo=n;var i=function(){function e(e,t,r,n,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=n,this._index=i}return Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isReferenced",{get:function(){return this._isReferenced},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),e}();t.Column=i;var o=function(){function e(e,t,r){this._value=e,this._nativeValue=t,this._formattedValue=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeValue",{get:function(){return this._nativeValue},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this._formattedValue},enumerable:!0,configurable:!0}),e}();t.DataValue=o},7968:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},i=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._x=e,this._y=t}return Object.defineProperty(e.prototype,"x",{get:function(){return this._x},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"y",{get:function(){return this._y},enumerable:!0,configurable:!0}),e}();t.Point=r},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3008),i=r(8028),o=r(1384),a=r(9196),s=r(4924),u=r(3851),l=r(8864),c=r(7712),p=r(1288),d=r(7260),f=r(8784),y=r(4109),h=r(6096),m=r(744),g=r(8856);t.registerAllSharedServices=function(e,t,r){n.ApiServiceRegistry.get(t).registerService(new i.AnimationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new a.DataSourceServiceImpl(e,t,r)),n.ApiServiceRegistry.get(t).registerService(new s.ExportServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new c.GetDataServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new l.FilterServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new p.NotificationServiceImpl(e)),n.ApiServiceRegistry.get(t).registerService(new d.ParametersServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new f.SelectionServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new o.AnnotationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new g.ZoneServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new y.SizeServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new h.VisualModelServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new m.VizServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new u.ExternalContextMenuServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664);window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{};var o=function(){function e(){this._services={}}return e.prototype.registerService=function(e){this._services[e.serviceName]=e},e.prototype.getService=function(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.InternalError,"Service not registered: "+e);return this._services[e]},e}(),a=function(){function e(){}return e.get=function(t){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[t]||e.setInstance(t,new o),!window.__tableauApiServiceRegistry[t])throw new i.TableauError(n.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[t]},e.setInstance=function(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t},e.clearRegistry=function(){window.__tableauApiServiceRegistry={}},e}();t.ApiServiceRegistry=a},8028:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"animation-service"},enumerable:!0,configurable:!0}),t.prototype.replayAsync=function(e){var t,r=((t={})[a.ParameterId.ReplaySpeed]=1,t);return u.ErrorHelpers.verifyEnumValue(e,o.ReplaySpeedType,"ReplaySpeedType"),r[a.ParameterId.ReplaySpeed]=s.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(a.VerbId.ReplayAnimation,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AnimationServiceImpl=l},1384:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6557),u=r(7104),l=r(6664),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"annotation-service"},enumerable:!0,configurable:!0}),t.prototype.annotateMarkAsync=function(e,t,r){var n,i=this.parseMarkSelectionIds([t]),o=""+r+"",s=((n={})[a.ParameterId.FunctionName]="annotateMarkAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.AnnotateEnum]=a.AnnotateEnum.Mark,n[a.ParameterId.TargetPoint]={x:0,y:0},n[a.ParameterId.SelectionList]=[i.selection],n[a.ParameterId.FormattedText]=o,n);return this.execute(a.VerbId.CreateAnnotation,s).then((function(e){}))},t.prototype.getAnnotationsAsync=function(e){var t,r=this,n=((t={})[a.ParameterId.FunctionName]="getAnnotationsAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.GetAnnotations,n).then((function(e){var t=e.result;return r.annotationFilterMap(t)}))},t.prototype.removeAnnotationAsync=function(e,t){var r,n=this.parseAnnotationSelectionIds([t]),i=((r={})[a.ParameterId.FunctionName]="removeAnnotationAsync",r[a.ParameterId.VisualId]=e,r[a.ParameterId.SelectionList]=[n.selection],r);return this.execute(a.VerbId.RemoveAnnotation,i).then((function(e){}))},t.prototype.parseMarkSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.tupleId;if(!(null!=r&&r>0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="tuples",n.objectIds=t,r.selection=n}return r},t.prototype.parseAnnotationSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.annotationId;if(!(null!=r&&r>=0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="annotations",n.objectIds=t,r.selection=n}return r},t.prototype.mapAnnotation=function(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:s.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}},t.prototype.annotationFilterMap=function(e){var t=this;return e.map((function(e){return t.mapAnnotation(e)}))},t}(r(1776).ServiceImplBase);t.AnnotationServiceImpl=c},1832:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"client-info-service"},enumerable:!0,configurable:!0}),t.prototype.getClientInfoAsync=function(){var e,t=o.VerbId.GetEmbeddingClientInfo,r=((e={})[o.ParameterId.FunctionName]="getClientInfoAsync",e);return this.execute(t,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.ClientInfoServiceImpl=a},9196:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(3448),u=r(8340),l=r(1072),c=r(2180),p=r(5288),d=r(6664),f=r(1776);t.SENTINEL_LOGICAL_TABLE_INFO={id:a.ApiShowDataTableSentinel.SingleTableId,caption:a.ApiShowDataTableSentinel.SingleTableCaption};var y={major:1,minor:20,fix:1},h=function(e){function r(t,r,n){void 0===n&&(n=y);var i=e.call(this,t,r)||this;return i._platformVersion=n,i}return i(r,e),Object.defineProperty(r.prototype,"serviceName",{get:function(){return"data-source-service"},enumerable:!0,configurable:!0}),r.prototype.refreshAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="refreshAsync",t[s.ParameterId.DeltaTimeMs]=0,t[s.ParameterId.ShouldRefreshDS]=!0,t);return e&&(r[s.ParameterId.DataSourceId]=e),this.execute(s.VerbId.RefreshDataSource,r).then((function(e){}))},r.prototype.getActiveTablesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getActiveTablesAsync",t[s.ParameterId.DataSourceId]=e,t);return this.execute(s.VerbId.GetActiveTables,r).then((function(t){var r=t.result;if(0===r.tables.length)throw new d.TableauError(o.ErrorCodes.UnsupportedMethodForDataSourceType,"getActiveTables is not supported for: "+e);return r.tables}))},r.prototype.getDataSourcesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getDataSourcesAsync",t[s.ParameterId.VisualId]=e,t);return this.execute(s.VerbId.GetDataSources,r).then((function(e){return e.result}))},r.prototype.getAllDataSourcesAsync=function(){var e,t=((e={})[s.ParameterId.FunctionName]="getAllDataSourcesAsync",e);return this.execute(s.VerbId.GetAllDataSources,t).then((function(e){return e.result}))},r.prototype.getConnectionSummariesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getConnectionSummariesAsync",t[s.ParameterId.DataSourceId]=e,t);return this.execute(s.VerbId.GetConnectionDescriptionSummaries,r).then((function(e){return e.result}))},r.prototype.getFieldAsync=function(e){var t,r=this,n=s.VerbId.GetFieldAndDataSource,i=((t={})[s.ParameterId.FunctionName]="getFieldAsync",t[s.ParameterId.FieldId]=e,t);return this.execute(n,i).then((function(e){var t=e.result[s.ParameterId.DataSource],n=e.result[s.ParameterId.Field];return r.convertField(n,r.convertDataSource(t))}))},r.prototype.getLogicalTablesAsync=function(e){var r;if(!this.isObjectModelSupportedByPlatform())return new Promise((function(e){return e([t.SENTINEL_LOGICAL_TABLE_INFO])}));var n=((r={})[s.ParameterId.FunctionName]="getLogicalTablesAsync",r[s.ParameterId.DataSourceId]=e,r);return this.execute(s.VerbId.GetLogicalTables,n).then((function(e){return e.result}))},r.prototype.getUnderlyingTablesAsync=function(e){var r;if(!this.isObjectModelSupportedByPlatform())return new Promise((function(e){return e([t.SENTINEL_LOGICAL_TABLE_INFO])}));var n=((r={})[s.ParameterId.FunctionName]="getUnderlyingTablesAsync",r[s.ParameterId.VisualId]=e,r);return this.execute(s.VerbId.GetUnderlyingTables,n).then((function(e){return e.result}))},r.prototype.convertField=function(e,t){return new l.Field(new p.FieldImpl(e,t))},r.prototype.convertDataSource=function(e){return new u.DataSource(new c.DataSourceImpl(e,this._registryId))},r.prototype.isObjectModelSupportedByPlatform=function(){return a.VersionLessThan({major:1,minor:13,fix:0},this._platformVersion)},r}(f.ServiceImplBase);t.DataSourceServiceImpl=h},4924:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},a=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?s[l.ParameterId.FilterLevels]=u:r.length>0?s[l.ParameterId.FilterValues]=r:s[l.ParameterId.FilterLevels]=[],s[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(n),s[l.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(a,s).then((function(e){return t}))},t.prototype.clearFilterAsync=function(e,t){var r,n=l.VerbId.ClearFilter,i=((r={})[l.ParameterId.FunctionName]="clearFilterAsync",r);return i[l.ParameterId.VisualId]=e,i[l.ParameterId.FieldName]=t,this.execute(n,i).then((function(e){return t}))},t.prototype.applyRelativeDateFilterAsync=function(e,t,r){var n,i=l.VerbId.ApplyRelativeDateFilter,o=((n={})[l.ParameterId.FunctionName]="applyRelativeDateFilterAsync",n);if(o[l.ParameterId.VisualId]=e,o[l.ParameterId.FieldName]=t,o[l.ParameterId.PeriodType]=p.ExternalToInternalEnumMappings.periodType.convert(r.periodType),o[l.ParameterId.DateRangeType]=p.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===s.DateRangeType.LastN||r.rangeType===s.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new c.TableauError(s.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");o[l.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(o[l.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(i,o).then((function(e){return e.result}))},t.prototype.getFiltersAsync=function(e){var t,r=this,n=l.VerbId.GetFilters,i=((t={})[l.ParameterId.FunctionName]="getFiltersAsync",t);return i[l.ParameterId.VisualId]=e,this.execute(n,i).then((function(e){var t=e.result;return r.convertDomainFilters(t)}))},t.prototype.getCategoricalDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetCategoricalDomain,a=((n={})[l.ParameterId.FunctionName]="getCategoricalDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertCategoricalDomain(t,r)}))},t.prototype.getRangeDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetRangeDomain,a=((n={})[l.ParameterId.FunctionName]="getRangeDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertRangeDomain(t,r)}))},t.prototype.getDashboardFiltersAsync=function(){var e,t=this,r=l.VerbId.GetDashboardFilters,n=((e={})[l.ParameterId.FunctionName]="getDashboardFiltersAsync",e);return this.execute(r,n).then((function(e){var r=e.result;return t.convertDomainFilters(r)}))},t.prototype.applyDashboardFilterAsync=function(e,t,r,n){var i,o=l.VerbId.DashboardCategoricalFilter,a=((i={})[l.ParameterId.FunctionName]="applyDashboardFilterAsync",i);return a[l.ParameterId.FieldName]=e,a[l.ParameterId.FilterValues]=t,a[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(r),a[l.ParameterId.IsExcludeMode]=n&&!!n.isExcludeMode,this.execute(o,a).then((function(e){return e.result}))},t.prototype.getAppliedWorksheetsAsync=function(e,t){var r;return o(this,void 0,void 0,(function(){var n,i;return a(this,(function(o){switch(o.label){case 0:return[4,this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync")];case 1:return n=o.sent(),i=[],null===(r=n.worksheets)||void 0===r||r.map((function(e){e.isSelected&&i.push(e.worksheetName)})),[2,i]}}))}))},t.prototype.setAppliedWorksheetsAsync=function(e,t,r,n){return o(this,void 0,void 0,(function(){var i,o,u,p,d;return a(this,(function(a){switch(a.label){case 0:return[4,this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal")];case 1:if(!(i=a.sent())||!i.worksheets)throw new c.TableauError(s.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");if(o=[],u="",i.worksheets.forEach((function(e){e.isActive&&(u=e.worksheetName),(e.isSelected||e.isEnabled)&&o.push(e.worksheetName)})),""===u)throw new c.TableauError(s.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(u))throw new c.TableauError(s.SharedErrorCodes.InternalError,u+" must be included in the applied worksheets");return n.forEach((function(e){if(!o.includes(e))throw new c.TableauError(s.SharedErrorCodes.InternalError,"The field "+t+" isn't applicable to the worksheet "+e)})),p=l.VerbId.ChangeSharedFilter,(d={})[l.ParameterId.FunctionName]="setAppliedWorksheetsAsync",d[l.ParameterId.VisualId]={worksheet:e},d[l.ParameterId.FieldId]=r,d[l.ParameterId.SharedFilterSheets]=n,[2,this.execute(p,d).then((function(e){return n}))]}}))}))},t.prototype.executeGetAppliedWorksheets=function(e,t,r){var n=l.VerbId.GetSharedFilter,i={};return i[l.ParameterId.FunctionName]=r,i[l.ParameterId.VisualId]={worksheet:e},i[l.ParameterId.FieldId]=t,this.execute(n,i).then((function(e){return e.result}))},t.prototype.convertDomainFilters=function(e){var t=this,r=[];return e.forEach((function(e){switch(e.filterType){case l.FilterType.Categorical:if(!(n=e))throw new Error("Invalid Categorical Filter");r.push(t.convertCategoricalFilter(n));break;case l.FilterType.Hierarchical:if(!(n=e))throw new Error("Invalid Hierarchical Filter");r.push(t.convertHierarchicalFilter(n));break;case l.FilterType.Range:if(!(n=e))throw new Error("Invalid Range Filter");r.push(t.convertRangeFilter(n));break;case l.FilterType.RelativeDate:var n;if(!(n=e))throw new Error("Invalid Relative Date Filter");r.push(t.convertRelativeDateFilter(n))}})),r},t.prototype.convertCategoricalFilter=function(e){var t=e.values.map((function(e){return y.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)},t.prototype.convertHierarchicalFilter=function(e){var t=e.values.map((function(e){return new f.HierarchicalDataValue(y.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level)})),r=e.levelInfo.map((function(e){return new f.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))}));return new f.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)},t.prototype.convertRangeFilter=function(e){var t=y.DataValueFactory.MakeFilterDataValue(e.min),r=y.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Range,this._registryId,t,r,e.includeNullValues)},t.prototype.convertRelativeDateFilter=function(e){var t=y.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new f.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)},t.prototype.convertCategoricalDomain=function(e,t){var r=e.values.map((function(e){return y.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalDomain(r,t)},t.prototype.convertRangeDomain=function(e,t){var r=y.DataValueFactory.MakeFilterDataValue(e.min),n=y.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeDomain(r,n,t)},t.prototype.convertAnchorDate=function(e){var t=e.getUTCFullYear(),r=e.getUTCMonth()+1,n=e.getUTCDate(),i=e.getUTCHours(),o=e.getUTCMinutes(),a=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(n)||isNaN(i)||isNaN(o)||isNaN(a))throw new c.TableauError(s.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return t+"-"+r+"-"+n+" "+i+":"+o+":"+a},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[u.ParameterId.ParameterError]){if(e[u.ParameterId.InvalidFieldCaption])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldName,e[u.ParameterId.InvalidFieldCaption]);if(e[u.ParameterId.InvalidValues])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldValue,e[u.ParameterId.InvalidValues]);if(e[u.ParameterId.InvalidAggFieldName])throw new c.TableauError(s.SharedErrorCodes.InvalidAggregationFieldName,e[u.ParameterId.InvalidAggFieldName]);throw new c.TableauError(s.SharedErrorCodes.ServerError,"Server Error")}},t}(r(1776).ServiceImplBase);t.FilterServiceImpl=m},7712:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6680),u=r(5136),l=r(1044),c=r(5068),p=r(7968),d=r(8052),f=r(3483),y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.viewDataTableCacheId=s.v4(),t}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"get-data-service"},enumerable:!0,configurable:!0}),t.prototype.getMaxRowLimit=function(){return 1e4},t.prototype.getViewDataTableCacheId=function(){return this.viewDataTableCacheId},t.prototype.getLimitedMaxRows=function(e){var t=this.getMaxRowLimit()+1;return e>0&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._filterFn=e,this._callbackFn=t}return e.prototype.onNotification=function(e){this._filterFn(e)&&this._callbackFn(e)},e}();t.Registration=r;var n=function(){function e(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}return e.prototype.registerHandler=function(e,t,n){var i=this,o=this._handlers[e]||new Array,a=new r(t,n);return o.push(a),this._handlers[e]=o,function(){return i.removeRegistration(e,a)}},e.prototype.hasHandlersForNotificationType=function(e){return this._handlers.hasOwnProperty(e)},e.prototype.onNotification=function(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((function(t){return t.onNotification(e.data)}))},e.prototype.removeRegistration=function(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((function(e){return e!==t})))},e}();t.NotificationServiceImplBase=n},7260:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(8552),u=r(6664),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"parameters-service"},enumerable:!0,configurable:!0}),t.prototype.getParametersForSheetAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",t[a.ParameterId.SheetPath]=e,t);return this.getParametersAsync(r)},t.prototype.getAllParametersAsync=function(){var e,t=((e={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",e);return this.getParametersAsync(t)},t.prototype.getParametersAsync=function(e){var t=this;return this.execute(a.VerbId.GetParametersForSheet,e).then((function(e){return e.result.map((function(e){return new s.ParameterImpl(e,t._registryId)}))}))},t.prototype.changeParameterValueAsync=function(e,t){var r,n=((r={})[a.ParameterId.FunctionName]="changeParameterValueAsync",r[a.ParameterId.ParameterFieldName]=e,r[a.ParameterId.ParameterValue]=t,r);return this.execute(a.VerbId.ChangeParameterValue,n).then((function(e){return e.result}))},t.prototype.findParameterByNameAsync=function(e){return this.findParameterAsync(e,void 0)},t.prototype.findParameterByGlobalFieldNameAsync=function(e){return this.findParameterAsync(void 0,e)},t.prototype.findParameterAsync=function(e,t){var r,n=this,i=((r={})[a.ParameterId.FunctionName]="findParameterAsync",r);if(void 0!==e)i[a.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");i[a.ParameterId.ParameterFieldName]=t}return this.execute(a.VerbId.FindParameter,i).then((function(e){if("fieldName"in e.result){var t=e.result;return new s.ParameterImpl(t,n._registryId)}}))},t}(r(1776).ServiceImplBase);t.ParametersServiceImpl=l},8784:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(7104),u=r(6664),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"selection-service"},enumerable:!0,configurable:!0}),t.prototype.clearSelectedMarksAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="clearSelectedMarksAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.ClearSelectedMarks,r).then((function(e){}))},t.prototype.selectMarksByValueAsync=function(e,t,r){var n,i=this;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");var s=this.validateSelectionUpdateType(r),l=this.parseSelectionMarks(t),c=((n={})[a.ParameterId.FunctionName]="selectMarksByValueAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=s,n);return l.hierModelArr&&l.hierModelArr.length&&(c[a.ParameterId.HierValSelectionModels]=l.hierModelArr),l.quantModelArr&&l.quantModelArr.length&&(c[a.ParameterId.QuantRangeSelectionModels]=l.quantModelArr),l.dimModelArr&&l.dimModelArr.length&&(c[a.ParameterId.DimValSelectionModels]=l.dimModelArr),this.execute(a.VerbId.SelectByValue,c).then((function(e){i.apiFilterHandlerCheckForCommandError(e.result)}))},t.prototype.hoverTupleAsync=function(e,t,r){var n,i=new s.HoverTupleInteractionModel(e,t,r),o=((n={})[a.ParameterId.FunctionName]="hoverTupleAsync",n[a.ParameterId.HoverTupleInteraction]=i,n);return this.execute(a.VerbId.RaiseHoverTupleNotification,o).then((function(e){}))},t.prototype.selectTuplesAsync=function(e,t,r,n){var i,o=this.validateSelectOption(r),u=new s.SelectTuplesInteractionModel(e,t,o,n),l=((i={})[a.ParameterId.FunctionName]="selectTuplesAsync",i[a.ParameterId.SelectTuplesInteraction]=u,i);return this.execute(a.VerbId.RaiseSelectTuplesNotification,l).then((function(e){}))},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[a.ParameterId.ParameterError]){if(e[a.ParameterId.InvalidFields])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionFieldName,e[a.ParameterId.InvalidFields]);if(e[a.ParameterId.InvalidValues])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionValue,e[a.ParameterId.InvalidValues]);if(e[a.ParameterId.InvalidDates])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionDate,e[a.ParameterId.InvalidDates])}},t.prototype.selectMarksByIdAsync=function(e,t,r){var n;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");var i=this.validateSelectionUpdateType(r),s=this.parseSelectionIds(t),l=((n={})[a.ParameterId.FunctionName]="selectMarksByIdAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=i,n[a.ParameterId.Selection]=s.selection,n);return this.execute(a.VerbId.SelectByValue,l).then((function(e){}))},t.prototype.parseSelectionIds=function(e){for(var t=[],r=new s.SelectionModelsContainer,n=0;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(6557),i=r(6664),o=r(5520),a=function(){function e(e,t){this._dispatcher=e,this._registryId=t}return e.prototype.execute=function(e,t){return this._dispatcher.execute(e,t).catch((function(e){var t=e,r=n.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,o.ShouldThrow.No);throw new i.TableauError(r,t.message)}))},e}();t.ServiceImplBase=a},4109:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"size-service"},enumerable:!0,configurable:!0}),t.prototype.changeSizeAsync=function(e,t){var r,n,i,a,s,u=((r={})[o.ParameterId.FunctionName]="changeSizeAsync",r[o.ParameterId.SheetName]=e,r[o.ParameterId.MinHeight]=(null===(n=t.minSize)||void 0===n?void 0:n.height)||0,r[o.ParameterId.MinWidth]=(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,r[o.ParameterId.MaxHeight]=(null===(a=t.maxSize)||void 0===a?void 0:a.height)||0,r[o.ParameterId.MaxWidth]=(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0,r);return this.execute(o.VerbId.SetSheetSize,u).then((function(e){}))},t}(r(1776).ServiceImplBase);t.SizeServiceImpl=a},2248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"story-activation-service"},enumerable:!0,configurable:!0}),t.prototype.activateNextStoryPointAsync=function(){var e,t=o.VerbId.ActivateNextStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activateNextStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activatePreviousStoryPointAsync=function(){var e,t=o.VerbId.ActivatePreviousStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activatePreviousStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activateStoryPointAsync=function(e){var t,r=o.VerbId.ActivateStoryPoint,n=((t={})[o.ParameterId.FunctionName]="activateStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){}))},t.prototype.revertStoryPointAsync=function(e){var t,r=o.VerbId.RevertStoryPoint,n=((t={})[o.ParameterId.FunctionName]="revertStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.StoryActivationServiceImpl=a},6096:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"visual-model-service"},enumerable:!0,configurable:!0}),t.prototype.getVisualSpecificationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="getVisualSpecificationAsync",t[o.ParameterId.WorksheetName]=e.worksheet,t);return this.execute(o.VerbId.GetVisualSpecification,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VisualModelServiceImpl=a},744:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(2520),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"viz-service"},enumerable:!0,configurable:!0}),t.prototype.createVizImageAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="createVizImageAsync",t[o.ParameterId.VizAPIInputJson]=JSON.stringify(e),t);return this.execute(o.VerbId.VizAPI,r).then((function(e){return e.result}))},t.prototype.activateSheetAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="activateSheetAsync",t[o.ParameterId.SwitchToSheetName]=e,t);return this.execute(o.VerbId.ActivateSheet,r).then((function(){}))},t.prototype.getCustomViewsAsync=function(){var e,t=this,r=((e={})[o.ParameterId.FunctionName]="getCustomViewsAsync",e);return this.execute(o.VerbId.GetCustomViews,r).then((function(e){return e.result.map((function(e){return new a.CustomViewImpl(e,t._registryId)}))}))},t.prototype.showCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="showCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t);return this.execute(o.VerbId.ShowCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.removeCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="removeCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t);return this.execute(o.VerbId.RemoveCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.saveCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t[o.ParameterId.CustomViewIsDefault]=!1,t);return this.execute(o.VerbId.SaveWorkbookAsCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.setActiveCustomViewAsDefaultAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="setActiveCustomViewAsDefaultAsync",e);return this.execute(o.VerbId.SetActiveCustomViewAsDefault,t).then((function(){}))},t.prototype.saveAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveAsync",t[o.ParameterId.CustomViewLuid]=e.luid,t[o.ParameterId.CustomViewName]=e.name,t[o.ParameterId.CustomViewIsDefault]=e.isDefault,t[o.ParameterId.CustomViewIsPublic]=e.shared,t);return this.execute(o.VerbId.UpdateCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.getCurrentSrcAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="getCurrentSrcAsync",e);return this.execute(o.VerbId.GetCurrentSrc,t).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VizServiceImpl=s},8856:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"zone-service"},enumerable:!0,configurable:!0}),t.prototype.setVisibilityAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="setVisibilityAsync",n[a.ParameterId.Dashboard]=e,n[a.ParameterId.ZoneIdsVisibilityMap]={},n);return l.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach((function(e,r){u.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),u.ErrorHelpers.verifyEnumValue(e,o.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),i[a.ParameterId.ZoneIdsVisibilityMap][r]=s.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(a.VerbId.SetZoneVisibility,i).then((function(e){}))},t.prototype.moveAndResizeAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.Dashboard]=e,n[a.ParameterId.DashboardObjectPositionAndSizeUpdateList]=r,n);return r.forEach((function(e){u.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),u.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(a.VerbId.MoveAndResizeZones,i).then((function(e){}))},t}(r(1776).ServiceImplBase);t.ZoneServiceImpl=c},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._tableInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._tableInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._tableInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"connectionId",{get:function(){return this._tableInfo.connectionId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"customSQL",{get:function(){return this._tableInfo.customSQL},enumerable:!0,configurable:!0}),e}();t.TableSummary=r},6664:function(e,t){"use strict";var r,n=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},r(e,t)},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0});var i=function(e){function t(r,n){var i=e.call(this,r+": "+n)||this;return i._errorCode=r,Object.setPrototypeOf(i,t.prototype),i}return n(t,e),Object.defineProperty(t.prototype,"errorCode",{get:function(){return this._errorCode},enumerable:!0,configurable:!0}),t}(Error);t.TableauError=i},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(5068),o=function(){function e(){}return e.MakeParameterDataValue=function(e,t){return new i.DataValue(e.value,n.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue)},e.MakeFilterDataValue=function(e){return new i.DataValue(e.value,e.value,e.formattedValue)},e.MakeTableDataValue=function(e,t){return new i.DataValue(e.value,void 0!==e.value?n.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)},e}();t.DataValueFactory=o},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){var e=this;this._promise=new Promise((function(t,r){e._resolve=t,e._reject=r}))}return Object.defineProperty(e.prototype,"promise",{get:function(){return this._promise},enumerable:!0,configurable:!0}),e.prototype.resolve=function(e){this._resolve&&this._resolve(e)},e.prototype.reject=function(e){this._reject&&this._reject(e)},e}();t.Deferred=r,t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(7419),o=r(6664),a=function(){function e(e,t){this._mappings=e,this._defaultVal=t}return e.prototype.convert=function(e,t){if(void 0===t&&(t=n.Yes),this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new o.TableauError(i.ErrorCodes.InternalError,"Enum Mapping not found for: "+e)},e}();t.EnumConverter=a,function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1172),a=function(){function e(){}return e.apiNotImplemented=function(e){return new i.TableauError(n.SharedErrorCodes.InternalError,e+" API not yet implemented.")},e.verifyInternalValue=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InternalError,e+" is invalid value for: "+t)},e.verifyParameter=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for parameter: "+t)},e.verifyParameterType=function(e,t,r){if(typeof e!==t)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" has invalid type for parameter: "+r+".")},e.verifyStringParameter=function(e,t){if(null==e||""===e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for paramter: "+t)},e.verifyEnumValue=function(e,t,r){var o=!1;if(Object.keys(t).forEach((function(r){t[r]===e.toString()&&(o=!0)})),!o)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for enum: "+r+".")},e.verifyRange=function(e,t,r){if(!(t<=e&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(7419),o=r(6664),a=function(){function e(){}return e.updateInternalExportPDFOptions=function(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)},e.updateExportLayoutOptions=function(e,t){var r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=n.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=n.PageOrientation.Portrait;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=n.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=n.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=n.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=n.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=n.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=n.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=n.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=n.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=n.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=n.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=n.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=n.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=n.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=n.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=n.PageSizeOption.Unspecified;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,n.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,n.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,n.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,n.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct90);break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}},e.updateSheetOptions=function(e,t){for(var r=e.exportLayoutOptions,n=0,i=e.sheetOptions;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(7480),a=function(){function e(){}return e.serializeDateForPlatform=function(e){return e.getUTCFullYear()+"-"+(e.getUTCMonth()+1)+"-"+e.getUTCDate()+" "+e.getUTCHours()+":"+e.getUTCMinutes()+":"+e.getUTCSeconds()},e.serializeBooleanForPlatform=function(e){return e?"true":"false"},e.serializeNumberForPlatform=function(e){return e.toString(10)},e.isTypeNumber=function(e){return"number"==typeof e||e instanceof Number},e.isTypeDate=function(e){return e instanceof Date},e.isTypeString=function(e){return"string"==typeof e||e instanceof String},e.isTypeBool=function(e){return"boolean"==typeof e||e instanceof Boolean},e.isNullOrUndefined=function(e){return null==e},e.serializeParameterValue=function(t){if(e.isTypeNumber(t))return e.serializeNumberForPlatform(t);if(e.isTypeDate(t))return e.serializeDateForPlatform(t);if(e.isTypeBool(t))return e.serializeBooleanForPlatform(t);if(e.isTypeString(t))return t;throw new i.TableauError(n.ErrorCodes.InternalError,"Unexpected invalid value for: "+t)},e.convertParameterToMap=function(e,t){if(o.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(n.ErrorCodes.InvalidParameter,"Expecting object or Map for: "+t+".");return e instanceof Map?e:new Map(Object.entries(e))},e.tryParseNumber=function(t){if(e.isNullOrUndefined(t))return{success:!1};if(e.isTypeNumber(t))return{parsed:t,success:!0};var r=t.toString();if("NaN"===r)return{parsed:NaN,success:!0};var n=parseFloat(r);return isNaN(n)?{success:!1}:{parsed:n,success:!0}},e}();t.Param=a},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6664),a=function(){function e(){}return e.getSheetSizeFromSizeConstraints=function(e){var t=e.minWidth,r=e.minHeight,i=e.maxWidth,o=e.maxHeight;if(0===r&&0===t)return 0===o&&0===i?{behavior:n.SheetSizeBehavior.Automatic}:{behavior:n.SheetSizeBehavior.AtMost,maxSize:{width:i,height:o}};if(0===o&&0===i)return{behavior:n.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(o===r&&i===t&&t>0)return{behavior:n.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};var a=0===t&&0===i;return{behavior:n.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:a?2147483647:i,height:o}}},e.createAutomaticSize=function(){return{behavior:n.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}},e.getPublishedSheetInfoByName=function(e,t){return t.find((function(t){return t.name===e}))},e.getSheetTypeEnum=function(e){var t;switch(e){case i.SheetType.Worksheet:t=n.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=n.SheetType.Dashboard;break;case i.SheetType.Story:t=n.SheetType.Story;break;default:throw new o.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return t},e.isValidSheetSize=function(e){return void 0!==e.behavior},e}();t.SheetUtils=a},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1724),a=function(){function e(e){void 0===e&&(e=o.UnregisterTimeoutInMilliseconds),this._timeoutInMilliseconds=e}return e.prototype.getNewPromiseOrThrowIfBusy=function(){var e=this;if(this._deferred)throw new i.TableauError(n.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new o.Deferred,this._timeoutId=setTimeout((function(){var t=new i.TableauError(n.SharedErrorCodes.Timeout,"Api failed to complete in "+e._timeoutInMilliseconds/1e3+" seconds");e.reject(t)}),this._timeoutInMilliseconds),this._deferred.promise},e.prototype.resolve=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)},e.prototype.reject=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)},e}();t.ShortLivedDeferred=a},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(e,t){var r=e.split("-");this.build=this.getBuildNumber(r[1]);var o=(e=r[0]).split(".").map((function(e){return parseInt(e,10)}));if(3!==o.length)throw new i.TableauError(n.ErrorCodes.InternalError,"Invalid version number: "+e);this.major=o[0],this.minor=o[1],this.fix=o[2],this.isAlpha=t}return e.prototype.getBuildNumber=function(e){if(!e)return-1;var t=e.split(".");return t[1]?parseInt(t[1],10):-1},Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullFormattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix+"-pre."+this.build},enumerable:!0,configurable:!0}),e}();t.VersionNumber=o},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=function(){function e(e,t){var r=this;this._apiDelegateDispatcher=e,this._versionConverter=n.CreateExternalCompatibleVersionConverter(n.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((function(e){if(0!==r._notificationHandlers.length){var t=r._versionConverter.upgradeNotification(e);r._notificationHandlers.forEach((function(e){e(t)}))}}))}return e.needsVersionConverter=function(e){return n.VersionLessThan(e,n.INTERNAL_CONTRACT_VERSION)},e.prototype.execute=function(e,t){var r=this;try{var n=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(n.verb,n.parameters).then((function(n){return r._versionConverter.upgradeExecuteReturn(n,e,t)}))}catch(e){return Promise.reject(e)}},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e}();t.VersionedExternalApiDispatcher=i},6680:(e,t,r)=>{"use strict";var n;r.r(t),r.d(t,{NIL:()=>x,parse:()=>m,stringify:()=>c,v1:()=>h,v3:()=>A,v4:()=>E,v5:()=>D,validate:()=>s,version:()=>F});var i=new Uint8Array(16);function o(){if(!n&&!(n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(i)}const a=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,s=function(e){return"string"==typeof e&&a.test(e)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e[t+4]]+u[e[t+5]]+"-"+u[e[t+6]]+u[e[t+7]]+"-"+u[e[t+8]]+u[e[t+9]]+"-"+u[e[t+10]]+u[e[t+11]]+u[e[t+12]]+u[e[t+13]]+u[e[t+14]]+u[e[t+15]]).toLowerCase();if(!s(r))throw TypeError("Stringified UUID is invalid");return r};var p,d,f=0,y=0;const h=function(e,t,r){var n=t&&r||0,i=t||new Array(16),a=(e=e||{}).node||p,s=void 0!==e.clockseq?e.clockseq:d;if(null==a||null==s){var u=e.random||(e.rng||o)();null==a&&(a=p=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==s&&(s=d=16383&(u[6]<<8|u[7]))}var l=void 0!==e.msecs?e.msecs:Date.now(),h=void 0!==e.nsecs?e.nsecs:y+1,m=l-f+(h-y)/1e4;if(m<0&&void 0===e.clockseq&&(s=s+1&16383),(m<0||l>f)&&void 0===e.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");f=l,y=h,d=s;var g=(1e4*(268435455&(l+=122192928e5))+h)%4294967296;i[n++]=g>>>24&255,i[n++]=g>>>16&255,i[n++]=g>>>8&255,i[n++]=255&g;var v=l/4294967296*1e4&268435455;i[n++]=v>>>8&255,i[n++]=255&v,i[n++]=v>>>24&15|16,i[n++]=v>>>16&255,i[n++]=s>>>8|128,i[n++]=255&s;for(var b=0;b<6;++b)i[n+b]=a[b];return t||c(i)},m=function(e){if(!s(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function g(e,t,r){function n(e,n,i,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function b(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function I(e,t,r,n,i,o){return b((a=b(b(t,e),b(n,o)))<<(s=i)|a>>>32-s,r);var a,s}function S(e,t,r,n,i,o,a){return I(t&r|~t&n,e,t,i,o,a)}function _(e,t,r,n,i,o,a){return I(t&n|r&~n,e,t,i,o,a)}function T(e,t,r,n,i,o,a){return I(t^r^n,e,t,i,o,a)}function P(e,t,r,n,i,o,a){return I(r^(t|~n),e,t,i,o,a)}const A=g("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,a=parseInt(n.charAt(o>>>4&15)+n.charAt(15&o),16);t.push(a)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[n/8])<>>32-t}const D=g("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var n=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;b=v,v=g,g=O(m,30)>>>0,m=h,h=_}r[0]=r[0]+h>>>0,r[1]=r[1]+m>>>0,r[2]=r[2]+g>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+b>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),x="00000000-0000-0000-0000-000000000000",F=function(e){if(!s(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":153,"fix":0}')}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,r),o.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";var e=n;Object.defineProperty(e,"__esModule",{value:!0});var t=r(5136);r(3e3),r(8315),r(80),r(5668),r(5816),r(3680),r(9308),r(8824),r(8512),r(9232),r(9336);var i=r(976),o=r(5408),a="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.11.1-pre.1",a);var s=new i.ExtensionsImpl;e.extensions=new o.Extensions(s);var u=r(7419);e.AnalyticsObjectType=u.AnalyticsObjectType,e.AnnotationType=u.AnnotationType,e.ClassNameKey=u.ClassNameKey,e.ColumnType=u.ColumnType,e.DashboardLayoutChange=u.DashboardLayoutChange,e.DashboardObjectType=u.DashboardObjectType,e.DashboardObjectVisibilityType=u.DashboardObjectVisibilityType,e.DataType=u.DataType,e.DateRangeType=u.DateRangeType,e.DialogStyle=u.DialogStyle,e.EncodingType=u.EncodingType,e.ErrorCodes=u.ErrorCodes,e.ExtensionContext=u.ExtensionContext,e.ExtensionMode=u.ExtensionMode,e.FieldAggregationType=u.FieldAggregationType,e.FieldRoleType=u.FieldRoleType,e.FilterDomainType=u.FilterDomainType,e.FilterNullOption=u.FilterNullOption,e.FilterType=u.FilterType,e.FilterUpdateType=u.FilterUpdateType,e.HierarchicalLevelSelectionState=u.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=u.IncludeDataValuesOption,e.MarkType=u.MarkType,e.ParameterValueType=u.ParameterValueType,e.PeriodType=u.PeriodType,e.QuickTableCalcType=u.QuickTableCalcType,e.ReplaySpeedType=u.ReplaySpeedType,e.SelectOptions=u.SelectOptions,e.SelectionUpdateType=u.SelectionUpdateType,e.SheetType=u.SheetType,e.SortDirection=u.SortDirection,e.TableauEventType=u.TableauEventType,e.TrendLineModelType=u.TrendLineModelType,e.VizImageEncodingType=u.VizImageEncodingType,e.VizImagePaletteType=u.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=u.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=u.VizImageSizeSettingType,e.VizImageSortDirectionType=u.VizImageSortDirectionType,e.ZoneVisibilityType=u.ZoneVisibilityType})(),window.tableau=n})(); +//# sourceMappingURL=tableau.extensions.1.11.1-pre.1.min.js.map \ No newline at end of file diff --git a/lib/tableau.extensions.1.12.0-pre.16.min.js.map b/lib/previous/tableau.extensions.1.12.0-pre.16.min.js.map similarity index 100% rename from lib/tableau.extensions.1.12.0-pre.16.min.js.map rename to lib/previous/tableau.extensions.1.12.0-pre.16.min.js.map diff --git a/lib/tableau.extensions.1.12.0.js b/lib/previous/tableau.extensions.1.12.0.js similarity index 100% rename from lib/tableau.extensions.1.12.0.js rename to lib/previous/tableau.extensions.1.12.0.js diff --git a/lib/tableau.extensions.1.12.0.min.js b/lib/previous/tableau.extensions.1.12.0.min.js similarity index 100% rename from lib/tableau.extensions.1.12.0.min.js rename to lib/previous/tableau.extensions.1.12.0.min.js diff --git a/lib/tableau.extensions.1.12.1-pre.1.min.js.map b/lib/tableau.extensions.1.12.1-pre.1.min.js.map new file mode 100644 index 00000000..361b6f0a --- /dev/null +++ b/lib/tableau.extensions.1.12.1-pre.1.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tableau.extensions.1.12.1-pre.1.min.js","mappings":"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","sources":["webpack://tableau/../../node_modules/core-js/es/array/find.js","webpack://tableau/../../node_modules/core-js/es/array/from.js","webpack://tableau/../../node_modules/core-js/es/map/index.js","webpack://tableau/../../node_modules/core-js/es/number/is-integer.js","webpack://tableau/../../node_modules/core-js/es/number/is-nan.js","webpack://tableau/../../node_modules/core-js/es/number/parse-float.js","webpack://tableau/../../node_modules/core-js/es/number/parse-int.js","webpack://tableau/../../node_modules/core-js/es/object/assign.js","webpack://tableau/../../node_modules/core-js/es/object/entries.js","webpack://tableau/../../node_modules/core-js/es/object/set-prototype-of.js","webpack://tableau/../../node_modules/core-js/es/promise/index.js","webpack://tableau/../../node_modules/core-js/internals/a-callable.js","webpack://tableau/../../node_modules/core-js/internals/a-constructor.js","webpack://tableau/../../node_modules/core-js/internals/a-possible-prototype.js","webpack://tableau/../../node_modules/core-js/internals/add-to-unscopables.js","webpack://tableau/../../node_modules/core-js/internals/an-instance.js","webpack://tableau/../../node_modules/core-js/internals/an-object.js","webpack://tableau/../../node_modules/core-js/internals/array-from.js","webpack://tableau/../../node_modules/core-js/internals/array-includes.js","webpack://tableau/../../node_modules/core-js/internals/array-iteration.js","webpack://tableau/../../node_modules/core-js/internals/array-slice.js","webpack://tableau/../../node_modules/core-js/internals/array-species-constructor.js","webpack://tableau/../../node_modules/core-js/internals/array-species-create.js","webpack://tableau/../../node_modules/core-js/internals/call-with-safe-iteration-closing.js","webpack://tableau/../../node_modules/core-js/internals/check-correctness-of-iteration.js","webpack://tableau/../../node_modules/core-js/internals/classof-raw.js","webpack://tableau/../../node_modules/core-js/internals/classof.js","webpack://tableau/../../node_modules/core-js/internals/clear-error-stack.js","webpack://tableau/../../node_modules/core-js/internals/collection-strong.js","webpack://tableau/../../node_modules/core-js/internals/collection.js","webpack://tableau/../../node_modules/core-js/internals/copy-constructor-properties.js","webpack://tableau/../../node_modules/core-js/internals/correct-prototype-getter.js","webpack://tableau/../../node_modules/core-js/internals/create-iterator-constructor.js","webpack://tableau/../../node_modules/core-js/internals/create-non-enumerable-property.js","webpack://tableau/../../node_modules/core-js/internals/create-property-descriptor.js","webpack://tableau/../../node_modules/core-js/internals/create-property.js","webpack://tableau/../../node_modules/core-js/internals/define-iterator.js","webpack://tableau/../../node_modules/core-js/internals/descriptors.js","webpack://tableau/../../node_modules/core-js/internals/document-create-element.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-browser.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-ios-pebble.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-ios.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-node.js","webpack://tableau/../../node_modules/core-js/internals/engine-is-webos-webkit.js","webpack://tableau/../../node_modules/core-js/internals/engine-user-agent.js","webpack://tableau/../../node_modules/core-js/internals/engine-v8-version.js","webpack://tableau/../../node_modules/core-js/internals/entry-unbind.js","webpack://tableau/../../node_modules/core-js/internals/enum-bug-keys.js","webpack://tableau/../../node_modules/core-js/internals/error-stack-installable.js","webpack://tableau/../../node_modules/core-js/internals/export.js","webpack://tableau/../../node_modules/core-js/internals/fails.js","webpack://tableau/../../node_modules/core-js/internals/freezing.js","webpack://tableau/../../node_modules/core-js/internals/function-apply.js","webpack://tableau/../../node_modules/core-js/internals/function-bind-context.js","webpack://tableau/../../node_modules/core-js/internals/function-call.js","webpack://tableau/../../node_modules/core-js/internals/function-name.js","webpack://tableau/../../node_modules/core-js/internals/function-uncurry-this.js","webpack://tableau/../../node_modules/core-js/internals/get-built-in.js","webpack://tableau/../../node_modules/core-js/internals/get-iterator-method.js","webpack://tableau/../../node_modules/core-js/internals/get-iterator.js","webpack://tableau/../../node_modules/core-js/internals/get-method.js","webpack://tableau/../../node_modules/core-js/internals/global.js","webpack://tableau/../../node_modules/core-js/internals/has-own-property.js","webpack://tableau/../../node_modules/core-js/internals/hidden-keys.js","webpack://tableau/../../node_modules/core-js/internals/host-report-errors.js","webpack://tableau/../../node_modules/core-js/internals/html.js","webpack://tableau/../../node_modules/core-js/internals/ie8-dom-define.js","webpack://tableau/../../node_modules/core-js/internals/indexed-object.js","webpack://tableau/../../node_modules/core-js/internals/inherit-if-required.js","webpack://tableau/../../node_modules/core-js/internals/inspect-source.js","webpack://tableau/../../node_modules/core-js/internals/install-error-cause.js","webpack://tableau/../../node_modules/core-js/internals/internal-metadata.js","webpack://tableau/../../node_modules/core-js/internals/internal-state.js","webpack://tableau/../../node_modules/core-js/internals/is-array-iterator-method.js","webpack://tableau/../../node_modules/core-js/internals/is-array.js","webpack://tableau/../../node_modules/core-js/internals/is-callable.js","webpack://tableau/../../node_modules/core-js/internals/is-constructor.js","webpack://tableau/../../node_modules/core-js/internals/is-forced.js","webpack://tableau/../../node_modules/core-js/internals/is-integral-number.js","webpack://tableau/../../node_modules/core-js/internals/is-object.js","webpack://tableau/../../node_modules/core-js/internals/is-pure.js","webpack://tableau/../../node_modules/core-js/internals/is-symbol.js","webpack://tableau/../../node_modules/core-js/internals/iterate.js","webpack://tableau/../../node_modules/core-js/internals/iterator-close.js","webpack://tableau/../../node_modules/core-js/internals/iterators-core.js","webpack://tableau/../../node_modules/core-js/internals/iterators.js","webpack://tableau/../../node_modules/core-js/internals/length-of-array-like.js","webpack://tableau/../../node_modules/core-js/internals/microtask.js","webpack://tableau/../../node_modules/core-js/internals/native-promise-constructor.js","webpack://tableau/../../node_modules/core-js/internals/native-symbol.js","webpack://tableau/../../node_modules/core-js/internals/native-weak-map.js","webpack://tableau/../../node_modules/core-js/internals/new-promise-capability.js","webpack://tableau/../../node_modules/core-js/internals/normalize-string-argument.js","webpack://tableau/../../node_modules/core-js/internals/number-parse-float.js","webpack://tableau/../../node_modules/core-js/internals/number-parse-int.js","webpack://tableau/../../node_modules/core-js/internals/object-assign.js","webpack://tableau/../../node_modules/core-js/internals/object-create.js","webpack://tableau/../../node_modules/core-js/internals/object-define-properties.js","webpack://tableau/../../node_modules/core-js/internals/object-define-property.js","webpack://tableau/../../node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack://tableau/../../node_modules/core-js/internals/object-get-own-property-names-external.js","webpack://tableau/../../node_modules/core-js/internals/object-get-own-property-names.js","webpack://tableau/../../node_modules/core-js/internals/object-get-own-property-symbols.js","webpack://tableau/../../node_modules/core-js/internals/object-get-prototype-of.js","webpack://tableau/../../node_modules/core-js/internals/object-is-prototype-of.js","webpack://tableau/../../node_modules/core-js/internals/object-keys-internal.js","webpack://tableau/../../node_modules/core-js/internals/object-keys.js","webpack://tableau/../../node_modules/core-js/internals/object-property-is-enumerable.js","webpack://tableau/../../node_modules/core-js/internals/object-set-prototype-of.js","webpack://tableau/../../node_modules/core-js/internals/object-to-array.js","webpack://tableau/../../node_modules/core-js/internals/object-to-string.js","webpack://tableau/../../node_modules/core-js/internals/ordinary-to-primitive.js","webpack://tableau/../../node_modules/core-js/internals/own-keys.js","webpack://tableau/../../node_modules/core-js/internals/path.js","webpack://tableau/../../node_modules/core-js/internals/perform.js","webpack://tableau/../../node_modules/core-js/internals/promise-resolve.js","webpack://tableau/../../node_modules/core-js/internals/redefine-all.js","webpack://tableau/../../node_modules/core-js/internals/redefine.js","webpack://tableau/../../node_modules/core-js/internals/require-object-coercible.js","webpack://tableau/../../node_modules/core-js/internals/set-global.js","webpack://tableau/../../node_modules/core-js/internals/set-species.js","webpack://tableau/../../node_modules/core-js/internals/set-to-string-tag.js","webpack://tableau/../../node_modules/core-js/internals/shared-key.js","webpack://tableau/../../node_modules/core-js/internals/shared-store.js","webpack://tableau/../../node_modules/core-js/internals/shared.js","webpack://tableau/../../node_modules/core-js/internals/species-constructor.js","webpack://tableau/../../node_modules/core-js/internals/string-multibyte.js","webpack://tableau/../../node_modules/core-js/internals/string-trim.js","webpack://tableau/../../node_modules/core-js/internals/task.js","webpack://tableau/../../node_modules/core-js/internals/to-absolute-index.js","webpack://tableau/../../node_modules/core-js/internals/to-indexed-object.js","webpack://tableau/../../node_modules/core-js/internals/to-integer-or-infinity.js","webpack://tableau/../../node_modules/core-js/internals/to-length.js","webpack://tableau/../../node_modules/core-js/internals/to-object.js","webpack://tableau/../../node_modules/core-js/internals/to-primitive.js","webpack://tableau/../../node_modules/core-js/internals/to-property-key.js","webpack://tableau/../../node_modules/core-js/internals/to-string-tag-support.js","webpack://tableau/../../node_modules/core-js/internals/to-string.js","webpack://tableau/../../node_modules/core-js/internals/try-to-string.js","webpack://tableau/../../node_modules/core-js/internals/uid.js","webpack://tableau/../../node_modules/core-js/internals/use-symbol-as-uid.js","webpack://tableau/../../node_modules/core-js/internals/well-known-symbol.js","webpack://tableau/../../node_modules/core-js/internals/whitespaces.js","webpack://tableau/../../node_modules/core-js/modules/es.aggregate-error.js","webpack://tableau/../../node_modules/core-js/modules/es.array.find.js","webpack://tableau/../../node_modules/core-js/modules/es.array.from.js","webpack://tableau/../../node_modules/core-js/modules/es.array.iterator.js","webpack://tableau/../../node_modules/core-js/modules/es.map.js","webpack://tableau/../../node_modules/core-js/modules/es.number.is-integer.js","webpack://tableau/../../node_modules/core-js/modules/es.number.is-nan.js","webpack://tableau/../../node_modules/core-js/modules/es.number.parse-float.js","webpack://tableau/../../node_modules/core-js/modules/es.number.parse-int.js","webpack://tableau/../../node_modules/core-js/modules/es.object.assign.js","webpack://tableau/../../node_modules/core-js/modules/es.object.entries.js","webpack://tableau/../../node_modules/core-js/modules/es.object.set-prototype-of.js","webpack://tableau/../../node_modules/core-js/modules/es.object.to-string.js","webpack://tableau/../../node_modules/core-js/modules/es.promise.all-settled.js","webpack://tableau/../../node_modules/core-js/modules/es.promise.any.js","webpack://tableau/../../node_modules/core-js/modules/es.promise.finally.js","webpack://tableau/../../node_modules/core-js/modules/es.promise.js","webpack://tableau/../../node_modules/core-js/modules/es.string.iterator.js","webpack://tableau/../../node_modules/guid/guid.js","webpack://tableau/./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/FilterChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauSheetEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ConnectedServer.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/SettingsImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/UIImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Dashboard.js","webpack://tableau/./lib/src/ExtensionsApi/Models/DashboardObject.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Parameter.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Sheet.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Workbook.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Worksheet.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/DashboardContent.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Environment.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Extensions.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Settings.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/UI.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js","webpack://tableau/./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js","webpack://tableau/../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.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-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js","webpack://tableau/../api-external-contract-js/lib/src/SharedApiExternalContract.js","webpack://tableau/../api-internal-contract-js/lib/src/JsApiInternalContract.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/DataTypeConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Enums.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Notifications.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Parameters.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Verbs.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/AskDataInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/PulseInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/VqlInterface.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.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-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/VersionTranslations.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js","webpack://tableau/../api-shared-js/lib/src/ApiShared.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/ApiVersion.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/ConnectionSummary.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/DataSource.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EventListenerManager.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Field.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/LogicalTable.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/FilterModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Point.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/GetDataService.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/TableSummary.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/TableauError.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/Deferred.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/Param.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/VersionNumber.js","webpack://tableau/../api-shared-js/lib/src/VersionedExternalApiDispatcher.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js","webpack://tableau/../api-shared-js/node_modules/uuid/dist/esm-browser/version.js","webpack://tableau/webpack/bootstrap","webpack://tableau/webpack/runtime/define property getters","webpack://tableau/webpack/runtime/global","webpack://tableau/webpack/runtime/hasOwnProperty shorthand","webpack://tableau/webpack/runtime/make namespace object","webpack://tableau/./lib/src/ExtensionsApi.js"],"sourcesContent":["require('../../modules/es.array.find');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('Array', 'find');\n","require('../../modules/es.string.iterator');\nrequire('../../modules/es.array.from');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Array.from;\n","require('../../modules/es.array.iterator');\nrequire('../../modules/es.map');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.string.iterator');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Map;\n","require('../../modules/es.number.is-integer');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Number.isInteger;\n","require('../../modules/es.number.is-nan');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Number.isNaN;\n","require('../../modules/es.number.parse-float');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Number.parseFloat;\n","require('../../modules/es.number.parse-int');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Number.parseInt;\n","require('../../modules/es.object.assign');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.assign;\n","require('../../modules/es.object.entries');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.entries;\n","require('../../modules/es.object.set-prototype-of');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.setPrototypeOf;\n","require('../../modules/es.aggregate-error');\nrequire('../../modules/es.array.iterator');\nrequire('../../modules/es.object.to-string');\nrequire('../../modules/es.promise');\nrequire('../../modules/es.promise.all-settled');\nrequire('../../modules/es.promise.any');\nrequire('../../modules/es.promise.finally');\nrequire('../../modules/es.string.iterator');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Promise;\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar TypeError = global.TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw TypeError(tryToString(argument) + ' is not a function');\n};\n","var global = require('../internals/global');\nvar isConstructor = require('../internals/is-constructor');\nvar tryToString = require('../internals/try-to-string');\n\nvar TypeError = global.TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n if (isConstructor(argument)) return argument;\n throw TypeError(tryToString(argument) + ' is not a constructor');\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar String = global.String;\nvar TypeError = global.TypeError;\n\nmodule.exports = function (argument) {\n if (typeof argument == 'object' || isCallable(argument)) return argument;\n throw TypeError(\"Can't set \" + String(argument) + ' as a prototype');\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","var global = require('../internals/global');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar TypeError = global.TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw TypeError('Incorrect invocation');\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar String = global.String;\nvar TypeError = global.TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw TypeError(String(argument) + ' is not an object');\n};\n","'use strict';\nvar global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar isConstructor = require('../internals/is-constructor');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar Array = global.Array;\n\n// `Array.from` method implementation\n// https://tc39.es/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var IS_CONSTRUCTOR = isConstructor(this);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined);\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = getIterator(O, iteratorMethod);\n next = iterator.next;\n result = IS_CONSTRUCTOR ? new this() : [];\n for (;!(step = call(next, iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = lengthOfArrayLike(O);\n result = IS_CONSTRUCTOR ? new this(length) : Array(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = uncurryThis([].push);\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var IS_FILTER_REJECT = TYPE == 7;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that);\n var length = lengthOfArrayLike(self);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push(target, value); // filterReject\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterReject` method\n // https://github.com/tc39/proposal-array-filtering\n filterReject: createMethod(7)\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis([].slice);\n","var global = require('../internals/global');\nvar isArray = require('../internals/is-array');\nvar isConstructor = require('../internals/is-constructor');\nvar isObject = require('../internals/is-object');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar Array = global.Array;\n\n// a part of `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","var arraySpeciesConstructor = require('../internals/array-species-constructor');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\n};\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","var global = require('../internals/global');\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar Object = global.Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar arraySlice = require('../internals/array-slice');\n\nvar replace = uncurryThis(''.replace);\nvar split = uncurryThis(''.split);\nvar join = uncurryThis([].join);\n\nvar TEST = (function (arg) { return String(Error(arg).stack); })('zxcasd');\nvar V8_OR_CHAKRA_STACK_ENTRY = /\\n\\s*at [^:]*:[^\\n]*/;\nvar IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);\nvar IS_FIREFOX_OR_SAFARI_STACK = /@[^\\n]*\\n/.test(TEST) && !/zxcasd/.test(TEST);\n\nmodule.exports = function (stack, dropEntries) {\n if (typeof stack != 'string') return stack;\n if (IS_V8_OR_CHAKRA_STACK) {\n while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');\n } else if (IS_FIREFOX_OR_SAFARI_STACK) {\n return join(arraySlice(split(stack, '\\n'), dropEntries), '\\n');\n } return stack;\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar create = require('../internals/object-create');\nvar redefineAll = require('../internals/redefine-all');\nvar bind = require('../internals/function-bind-context');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/define-iterator');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n index: create(null),\n first: undefined,\n last: undefined,\n size: 0\n });\n if (!DESCRIPTORS) that.size = 0;\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n var previous, index;\n // change existing entry\n if (entry) {\n entry.value = value;\n // create new entry\n } else {\n state.last = entry = {\n index: index = fastKey(key, true),\n key: key,\n value: value,\n previous: previous = state.last,\n next: undefined,\n removed: false\n };\n if (!state.first) state.first = entry;\n if (previous) previous.next = entry;\n if (DESCRIPTORS) state.size++;\n else that.size++;\n // add to index\n if (index !== 'F') state.index[index] = entry;\n } return that;\n };\n\n var getEntry = function (that, key) {\n var state = getInternalState(that);\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return state.index[index];\n // frozen object case\n for (entry = state.first; entry; entry = entry.next) {\n if (entry.key == key) return entry;\n }\n };\n\n redefineAll(Prototype, {\n // `{ Map, Set }.prototype.clear()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.clear\n // https://tc39.es/ecma262/#sec-set.prototype.clear\n clear: function clear() {\n var that = this;\n var state = getInternalState(that);\n var data = state.index;\n var entry = state.first;\n while (entry) {\n entry.removed = true;\n if (entry.previous) entry.previous = entry.previous.next = undefined;\n delete data[entry.index];\n entry = entry.next;\n }\n state.first = state.last = undefined;\n if (DESCRIPTORS) state.size = 0;\n else that.size = 0;\n },\n // `{ Map, Set }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.delete\n // https://tc39.es/ecma262/#sec-set.prototype.delete\n 'delete': function (key) {\n var that = this;\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.next;\n var prev = entry.previous;\n delete state.index[entry.index];\n entry.removed = true;\n if (prev) prev.next = next;\n if (next) next.previous = prev;\n if (state.first == entry) state.first = next;\n if (state.last == entry) state.last = prev;\n if (DESCRIPTORS) state.size--;\n else that.size--;\n } return !!entry;\n },\n // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.foreach\n // https://tc39.es/ecma262/#sec-set.prototype.foreach\n forEach: function forEach(callbackfn /* , that = undefined */) {\n var state = getInternalState(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var entry;\n while (entry = entry ? entry.next : state.first) {\n boundFunction(entry.value, entry.key, this);\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n }\n },\n // `{ Map, Set}.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.has\n // https://tc39.es/ecma262/#sec-set.prototype.has\n has: function has(key) {\n return !!getEntry(this, key);\n }\n });\n\n redefineAll(Prototype, IS_MAP ? {\n // `Map.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-map.prototype.get\n get: function get(key) {\n var entry = getEntry(this, key);\n return entry && entry.value;\n },\n // `Map.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-map.prototype.set\n set: function set(key, value) {\n return define(this, key === 0 ? 0 : key, value);\n }\n } : {\n // `Set.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-set.prototype.add\n add: function add(value) {\n return define(this, value = value === 0 ? 0 : value, value);\n }\n });\n if (DESCRIPTORS) defineProperty(Prototype, 'size', {\n get: function () {\n return getInternalState(this).size;\n }\n });\n return Constructor;\n },\n setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {\n var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.entries\n // https://tc39.es/ecma262/#sec-map.prototype.keys\n // https://tc39.es/ecma262/#sec-map.prototype.values\n // https://tc39.es/ecma262/#sec-map.prototype-@@iterator\n // https://tc39.es/ecma262/#sec-set.prototype.entries\n // https://tc39.es/ecma262/#sec-set.prototype.keys\n // https://tc39.es/ecma262/#sec-set.prototype.values\n // https://tc39.es/ecma262/#sec-set.prototype-@@iterator\n defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {\n setInternalState(this, {\n type: ITERATOR_NAME,\n target: iterated,\n state: getInternalCollectionState(iterated),\n kind: kind,\n last: undefined\n });\n }, function () {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var entry = state.last;\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n // get next entry\n if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n // or finish the iteration\n state.target = undefined;\n return { value: undefined, done: true };\n }\n // return step by kind\n if (kind == 'keys') return { value: entry.key, done: false };\n if (kind == 'values') return { value: entry.value, done: false };\n return { value: [entry.key, entry.value], done: false };\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // `{ Map, Set }.prototype[@@species]` accessors\n // https://tc39.es/ecma262/#sec-get-map-@@species\n // https://tc39.es/ecma262/#sec-get-set-@@species\n setSpecies(CONSTRUCTOR_NAME);\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]);\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n uncurriedNativeMethod(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n uncurriedNativeMethod(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n var REPLACE = isForced(\n CONSTRUCTOR_NAME,\n !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n }))\n );\n\n if (REPLACE) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.enable();\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n // eslint-disable-next-line no-new -- required for testing\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, NativePrototype);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","var hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar toPropertyKey = require('../internals/to-property-key');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPropertyKey(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n redefine(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n } else {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return call(nativeIterator, this); };\n }\n }\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n }\n Iterators[NAME] = defaultIterator;\n\n return methods;\n};\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","module.exports = typeof window == 'object';\n","var userAgent = require('../internals/engine-user-agent');\nvar global = require('../internals/global');\n\nmodule.exports = /ipad|iphone|ipod/i.test(userAgent) && global.Pebble !== undefined;\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /web0s(?!.*chrome)/i.test(userAgent);\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","var global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (CONSTRUCTOR, METHOD) {\n return uncurryThis(global[CONSTRUCTOR].prototype[METHOD]);\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var fails = require('../internals/fails');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = !fails(function () {\n var error = Error('a');\n if (!('stack' in error)) return true;\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7));\n return error.stack !== 7;\n});\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar bind = FunctionPrototype.bind;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var call = Function.prototype.call;\n\nmodule.exports = call.bind ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","var FunctionPrototype = Function.prototype;\nvar bind = FunctionPrototype.bind;\nvar call = FunctionPrototype.call;\nvar callBind = bind && bind.bind(call);\n\nmodule.exports = bind ? function (fn) {\n return fn && callBind(call, fn);\n} : function (fn) {\n return fn && function () {\n return call.apply(fn, arguments);\n };\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n","var classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar TypeError = global.TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw TypeError(tryToString(argument) + ' is not iterable');\n};\n","var aCallable = require('../internals/a-callable');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return func == null ? undefined : aCallable(func);\n};\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","module.exports = {};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length == 1 ? console.error(a) : console.error(a, b);\n }\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- requied for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar Object = global.Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split(it, '') : Object(it);\n} : Object;\n","var isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n isCallable(NewTarget = dummy.constructor) &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\n// `InstallErrorCause` abstract operation\n// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause\nmodule.exports = function (O, options) {\n if (isObject(options) && 'cause' in options) {\n createNonEnumerableProperty(O, 'cause', options.cause);\n }\n};\n","var $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar REQUIRED = false;\nvar METADATA = uid('meta');\nvar id = 0;\n\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + id++, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar enable = function () {\n meta.enable = function () { /* empty */ };\n REQUIRED = true;\n var getOwnPropertyNames = getOwnPropertyNamesModule.f;\n var splice = uncurryThis([].splice);\n var test = {};\n test[METADATA] = 1;\n\n // prevent exposing of metadata key\n if (getOwnPropertyNames(test).length) {\n getOwnPropertyNamesModule.f = function (it) {\n var result = getOwnPropertyNames(it);\n for (var i = 0, length = result.length; i < length; i++) {\n if (result[i] === METADATA) {\n splice(result, i, 1);\n break;\n }\n } return result;\n };\n\n $({ target: 'Object', stat: true, forced: true }, {\n getOwnPropertyNames: getOwnPropertyNamesExternalModule.f\n });\n }\n};\n\nvar meta = module.exports = {\n enable: enable,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = uncurryThis(store.get);\n var wmhas = uncurryThis(store.has);\n var wmset = uncurryThis(store.set);\n set = function (it, metadata) {\n if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n wmset(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget(store, it) || {};\n };\n has = function (it) {\n return wmhas(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) == 'Array';\n};\n","// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = function (argument) {\n return typeof argument == 'function';\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar empty = [];\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.exec(noop);\n\nvar isConstructorModern = function (argument) {\n if (!isCallable(argument)) return false;\n try {\n construct(noop, empty, argument);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nvar isConstructorLegacy = function (argument) {\n if (!isCallable(argument)) return false;\n switch (classof(argument)) {\n case 'AsyncFunction':\n case 'GeneratorFunction':\n case 'AsyncGeneratorFunction': return false;\n // we can't check .prototype since constructors produced by .bind haven't it\n } return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n};\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n var called;\n return isConstructorModern(isConstructorModern.call)\n || !isConstructorModern(Object)\n || !isConstructorModern(function () { called = true; })\n || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var isObject = require('../internals/is-object');\n\nvar floor = Math.floor;\n\n// `IsIntegralNumber` abstract operation\n// https://tc39.es/ecma262/#sec-isintegralnumber\n// eslint-disable-next-line es/no-number-isinteger -- safe\nmodule.exports = Number.isInteger || function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","var isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","module.exports = false;\n","var global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Object = global.Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it));\n};\n","var global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar TypeError = global.TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal', condition);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","var call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n redefine(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","var toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","var global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_IOS_PEBBLE = require('../internals/engine-is-ios-pebble');\nvar IS_WEBOS_WEBKIT = require('../internals/engine-is-webos-webkit');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898\n if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n // workaround of WebKit ~ iOS Safari 10.1 bug\n promise.constructor = Promise;\n then = bind(promise.then, promise);\n notify = function () {\n then(flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n // strange IE + webpack dev server bug - use .bind(global)\n macrotask = bind(macrotask, global);\n notify = function () {\n macrotask(flush);\n };\n }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n};\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol();\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap));\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aCallable(resolve);\n this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var toString = require('../internals/to-string');\n\nmodule.exports = function (argument, $default) {\n return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);\n};\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar charAt = uncurryThis(''.charAt);\nvar n$ParseFloat = global.parseFloat;\nvar Symbol = global.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar FORCED = 1 / n$ParseFloat(whitespaces + '-0') !== -Infinity\n // MS Edge 18- broken with boxed symbols\n || (ITERATOR && !fails(function () { n$ParseFloat(Object(ITERATOR)); }));\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\nmodule.exports = FORCED ? function parseFloat(string) {\n var trimmedString = trim(toString(string));\n var result = n$ParseFloat(trimmedString);\n return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result;\n} : n$ParseFloat;\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar $parseInt = global.parseInt;\nvar Symbol = global.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar hex = /^[+-]?0x/i;\nvar exec = uncurryThis(hex.exec);\nvar FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22\n // MS Edge 18- broken with boxed symbols\n || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); }));\n\n// `parseInt` method\n// https://tc39.es/ecma262/#sec-parseint-string-radix\nmodule.exports = FORCED ? function parseInt(string, radix) {\n var S = trim(toString(string));\n return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10));\n} : $parseInt;\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar call = require('../internals/function-call');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\n// eslint-disable-next-line es/no-object-assign -- safe\nvar $assign = Object.assign;\n// eslint-disable-next-line es/no-object-defineproperty -- required for testing\nvar defineProperty = Object.defineProperty;\nvar concat = uncurryThis([].concat);\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !$assign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line es/no-symbol -- safe\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n","/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","var global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar TypeError = global.TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","/* eslint-disable es/no-object-getownpropertynames -- safe */\nvar classof = require('../internals/classof-raw');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar arraySlice = require('../internals/array-slice');\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return $getOwnPropertyNames(it);\n } catch (error) {\n return arraySlice(windowNames);\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && classof(it) == 'Window'\n ? getWindowNames(it)\n : $getOwnPropertyNames(toIndexedObject(it));\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","var global = require('../internals/global');\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar Object = global.Object;\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof Object ? ObjectPrototype : null;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","/* eslint-disable no-proto -- safe */\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\nvar propertyIsEnumerable = uncurryThis($propertyIsEnumerable);\nvar push = uncurryThis([].push);\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable(O, key)) {\n push(result, TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.es/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.es/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar TypeError = global.TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var name = options && options.name !== undefined ? options.name : key;\n var state;\n if (isCallable(value)) {\n if (String(name).slice(0, 7) === 'Symbol(') {\n name = '[' + String(name).replace(/^Symbol\\(([^)]*)\\)/, '$1') + ']';\n }\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n createNonEnumerableProperty(value, 'name', name);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof name == 'string' ? name : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nvar TypeError = global.TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var global = require('../internals/global');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(global, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !hasOwn(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.19.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2021 Denis Pushkarev (zloirock.ru)'\n});\n","var anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = toString(requireObjectCoercible($this));\n if (TYPE & 1) string = replace(string, ltrim, '');\n if (TYPE & 2) string = replace(string, rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","var global = require('../internals/global');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar Dispatch = global.Dispatch;\nvar Function = global.Function;\nvar MessageChannel = global.MessageChannel;\nvar String = global.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar location, defer, channel, port;\n\ntry {\n // Deno throws a ReferenceError on `location` access without `--location` flag\n location = global.location;\n} catch (error) { /* empty */ }\n\nvar run = function (id) {\n if (hasOwn(queue, id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(String(id), location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(fn) {\n var args = arraySlice(arguments, 1);\n queue[++counter] = function () {\n apply(isCallable(fn) ? fn : Function(fn), undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(port.postMessage, port);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (\n global.addEventListener &&\n isCallable(global.postMessage) &&\n !global.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- safe\n return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number);\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var global = require('../internals/global');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar Object = global.Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TypeError = global.TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","var toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var global = require('../internals/global');\nvar classof = require('../internals/classof');\n\nvar String = global.String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return String(argument);\n};\n","var global = require('../internals/global');\n\nvar String = global.String;\n\nmodule.exports = function (argument) {\n try {\n return String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar symbolFor = Symbol && Symbol['for'];\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {\n var description = 'Symbol.' + name;\n if (NATIVE_SYMBOL && hasOwn(Symbol, name)) {\n WellKnownSymbolsStore[name] = Symbol[name];\n } else if (USE_SYMBOL_AS_UID && symbolFor) {\n WellKnownSymbolsStore[name] = symbolFor(description);\n } else {\n WellKnownSymbolsStore[name] = createWellKnownSymbol(description);\n }\n } return WellKnownSymbolsStore[name];\n};\n","// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar create = require('../internals/object-create');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar clearErrorStack = require('../internals/clear-error-stack');\nvar installErrorCause = require('../internals/install-error-cause');\nvar iterate = require('../internals/iterate');\nvar normalizeStringArgument = require('../internals/normalize-string-argument');\nvar ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');\n\nvar Error = global.Error;\nvar push = [].push;\n\nvar $AggregateError = function AggregateError(errors, message /* , options */) {\n var that = isPrototypeOf(AggregateErrorPrototype, this) ? this : create(AggregateErrorPrototype);\n var options = arguments.length > 2 ? arguments[2] : undefined;\n if (setPrototypeOf) {\n that = setPrototypeOf(new Error(undefined), getPrototypeOf(that));\n }\n createNonEnumerableProperty(that, 'message', normalizeStringArgument(message, ''));\n if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(that, 'stack', clearErrorStack(that.stack, 1));\n installErrorCause(that, options);\n var errorsArray = [];\n iterate(errors, push, { that: errorsArray });\n createNonEnumerableProperty(that, 'errors', errorsArray);\n return that;\n};\n\nif (setPrototypeOf) setPrototypeOf($AggregateError, Error);\nelse copyConstructorProperties($AggregateError, Error);\n\nvar AggregateErrorPrototype = $AggregateError.prototype = create(Error.prototype, {\n constructor: createPropertyDescriptor(1, $AggregateError),\n message: createPropertyDescriptor(1, ''),\n name: createPropertyDescriptor(1, 'AggregateError')\n});\n\n// `AggregateError` constructor\n// https://tc39.es/ecma262/#sec-aggregate-error-constructor\n$({ global: true }, {\n AggregateError: $AggregateError\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.es/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n // eslint-disable-next-line es/no-array-from -- required for testing\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.es/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Map` constructor\n// https://tc39.es/ecma262/#sec-map-objects\ncollection('Map', function (init) {\n return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","var $ = require('../internals/export');\nvar isIntegralNumber = require('../internals/is-integral-number');\n\n// `Number.isInteger` method\n// https://tc39.es/ecma262/#sec-number.isinteger\n$({ target: 'Number', stat: true }, {\n isInteger: isIntegralNumber\n});\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.es/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare -- NaN check\n return number != number;\n }\n});\n","var $ = require('../internals/export');\nvar parseFloat = require('../internals/number-parse-float');\n\n// `Number.parseFloat` method\n// https://tc39.es/ecma262/#sec-number.parseFloat\n// eslint-disable-next-line es/no-number-parsefloat -- required for testing\n$({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, {\n parseFloat: parseFloat\n});\n","var $ = require('../internals/export');\nvar parseInt = require('../internals/number-parse-int');\n\n// `Number.parseInt` method\n// https://tc39.es/ecma262/#sec-number.parseint\n// eslint-disable-next-line es/no-number-parseint -- required for testing\n$({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, {\n parseInt: parseInt\n});\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\n// eslint-disable-next-line es/no-object-assign -- required for testing\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n$({ target: 'Object', stat: true }, {\n setPrototypeOf: setPrototypeOf\n});\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\n// `Promise.allSettled` method\n// https://tc39.es/ecma262/#sec-promise.allsettled\n$({ target: 'Promise', stat: true }, {\n allSettled: function allSettled(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'fulfilled', value: value };\n --remaining || resolve(values);\n }, function (error) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'rejected', reason: error };\n --remaining || resolve(values);\n });\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aCallable = require('../internals/a-callable');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\nvar PROMISE_ANY_ERROR = 'No one promise resolved';\n\n// `Promise.any` method\n// https://tc39.es/ecma262/#sec-promise.any\n$({ target: 'Promise', stat: true }, {\n any: function any(iterable) {\n var C = this;\n var AggregateError = getBuiltIn('AggregateError');\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var errors = [];\n var counter = 0;\n var remaining = 1;\n var alreadyResolved = false;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyRejected = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyResolved = true;\n resolve(value);\n }, function (error) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyRejected = true;\n errors[index] = error;\n --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));\n });\n });\n --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR));\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar fails = require('../internals/fails');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\nvar redefine = require('../internals/redefine');\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromise && fails(function () {\n NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.es/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = isCallable(onFinally);\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n\n// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromise)) {\n var method = getBuiltIn('Promise').prototype['finally'];\n if (NativePromise.prototype['finally'] !== method) {\n redefine(NativePromise.prototype, 'finally', method, { unsafe: true });\n }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_BROWSER = require('../internals/engine-is-browser');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar NativePromisePrototype = NativePromise && NativePromise.prototype;\nvar PromiseConstructor = NativePromise;\nvar PromisePrototype = NativePromisePrototype;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\n\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar SUBCLASSING = false;\n\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor);\n var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor);\n // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // We can't detect it synchronously, so just check versions\n if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromisePrototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = new PromiseConstructor(function (resolve) { resolve(1); });\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;\n if (!SUBCLASSING) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT;\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && isCallable(then = it.then) ? then : false;\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n call(then, result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n call(task, global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n call(task, global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n call(then, value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromisePrototype);\n aCallable(executor);\n call(Internal, this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n PromisePrototype = PromiseConstructor.prototype;\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromisePrototype, {\n // `Promise.prototype.then` method\n // https://tc39.es/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reactions = state.reactions;\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;\n reaction.fail = isCallable(onRejected) && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n reactions[reactions.length] = reaction;\n if (state.state != PENDING) notify(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.es/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && isCallable(NativePromise) && NativePromisePrototype !== Object.prototype) {\n nativeThen = NativePromisePrototype.then;\n\n if (!SUBCLASSING) {\n // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs\n redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n call(nativeThen, that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`\n redefine(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true });\n }\n\n // make `.constructor === Promise` work for native promise-based APIs\n try {\n delete NativePromisePrototype.constructor;\n } catch (error) { /* empty */ }\n\n // make `instanceof Promise` work for native promise-based APIs\n if (setPrototypeOf) {\n setPrototypeOf(NativePromisePrototype, PromisePrototype);\n }\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.es/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n call(capability.reject, undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.es/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.es/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call($promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.es/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n iterate(iterable, function (promise) {\n call($promiseResolve, C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: toString(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","(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) {\n stylesheet.deleteRule(stylesheet.cssRules.length - 1);\n }\n formattingModel.formattingSheets.map(function (currentFormattingSheet) {\n _this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet);\n });\n };\n ExtensionsImpl.prototype.applyFormattingSheetToStyleSheet = function (currentFormattingSheet, stylesheet) {\n var styleInfo = '';\n var 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 var selector = '.' + currentFormattingSheet.classNameKey;\n var rule = selector + ' { ' + styleInfo + ' }';\n stylesheet.insertRule(rule, stylesheet.cssRules.length);\n };\n ExtensionsImpl.prototype.initializeWorkbookFormattingChangedEventCallback = function (dispatcher) {\n var _this = this;\n var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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, function () { return true; }, function (eventFormatting) {\n if (eventFormatting) {\n _this.initializeTableauFonts(dispatcher, eventFormatting);\n _this.applyAllFormatting(eventFormatting);\n }\n });\n };\n ExtensionsImpl.prototype.initializeTableauFonts = function (dispatcher, workbookFormatting) {\n var _a;\n var _this = this;\n var fontNames = __spreadArrays(BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, TableauBookFontNameConstants_1.SupportedTableauFontFaces);\n workbookFormatting.formattingSheets.forEach(function (formattingSheet) {\n if (formattingSheet.cssProperties.fontFamily) {\n fontNames.push(formattingSheet.cssProperties.fontFamily);\n }\n });\n if (fontNames.length > 0) {\n var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.FontNameListItems] = fontNames, _a);\n dispatcher\n .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters)\n .then(function (response) {\n _this.loadFonts(response.result);\n })\n .catch();\n }\n };\n ExtensionsImpl.prototype.loadFonts = function (fonts) {\n var _this = this;\n fonts.forEach(function (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 ExtensionsImpl.prototype.initializeDashboardContent = function (info, sheetPath) {\n // sheets are always active for Extensions\n var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true);\n var dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId);\n var dashboard = new Dashboard_1.Dashboard(dashboardImpl);\n return new DashboardContent_1.DashboardContent(dashboard);\n };\n ExtensionsImpl.prototype.initializeWorksheetContent = function (info) {\n var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific\n true);\n var worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent\n null);\n var worksheet = new Worksheet_1.Worksheet(worksheetImpl);\n return new WorksheetContent_1.WorksheetContent(worksheet);\n };\n ExtensionsImpl.prototype.initializeSettings = function (settingsInfo) {\n var settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo);\n return new Settings_1.Settings(settingsImpl);\n };\n ExtensionsImpl.prototype.initializeContextMenuCallbacks = function (contextMenuFunctions) {\n var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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, function () {\n // Let through any context menu event, these are already filtered on api-core\n // based on the extension locator.\n return true;\n }, function (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 ExtensionsImpl.prototype.loadTableauFonts = function (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 ExtensionsImpl.prototype.loadBentonSansFonts = function (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 return ExtensionsImpl;\n}());\nexports.ExtensionsImpl = ExtensionsImpl;\n//# sourceMappingURL=ExtensionsImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar 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 */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nvar LegacyInternalApiDispatcherHolder;\n(function (LegacyInternalApiDispatcherHolder) {\n /**\n * @param options\n */\n function getDesktopDispatcherPromise(options) {\n var _a;\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 (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) {\n window.__tableauDesktopDispatcher\n .then(function (dispatcherFactory) {\n var 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 || (exports.LegacyInternalApiDispatcherHolder = {}));\n//# sourceMappingURL=LegacyInternalApiDispatcherHolder.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar TableauEvent_1 = require(\"../Events/TableauEvent\");\nvar ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nvar SettingsChangedEvent = /** @class */ (function (_super) {\n __extends(SettingsChangedEvent, _super);\n function SettingsChangedEvent(_newSettings) {\n var _this = _super.call(this, Contract.TableauEventType.SettingsChanged) || this;\n _this._newSettings = _newSettings;\n return _this;\n }\n Object.defineProperty(SettingsChangedEvent.prototype, \"newSettings\", {\n get: function () {\n return this._newSettings;\n },\n enumerable: true,\n configurable: true\n });\n return SettingsChangedEvent;\n}(TableauEvent_1.TableauEvent));\nvar SettingsImpl = /** @class */ (function () {\n function SettingsImpl(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 SettingsImpl.prototype.erase = function (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 SettingsImpl.prototype.get = function (key) {\n api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key');\n return this._currentSettings[key];\n };\n SettingsImpl.prototype.getAll = function () {\n // Returns a mutable copy of the settings\n return Object.assign({}, this._currentSettings);\n };\n Object.defineProperty(SettingsImpl.prototype, \"isModified\", {\n get: function () {\n return this._isModified;\n },\n enumerable: true,\n configurable: true\n });\n SettingsImpl.prototype.saveAsync = function () {\n var _this = this;\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 var settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"SettingsService\" /* SettingsService */);\n return settingsService.saveSettingsAsync(this._currentSettings).then(function (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 }, function (reason) {\n _this._saveInProgress = false;\n return Promise.reject(reason);\n });\n };\n SettingsImpl.prototype.set = function (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 SettingsImpl.prototype.initializeEvents = function () {\n var _this = this;\n var results = new Array();\n var notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n var settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, function () { return true; }, function (event) {\n _this._currentSettings = event.newSettings;\n settingsChangedEvent.triggerEvent(function () { return new SettingsChangedEvent(event.newSettings); });\n });\n results.push(settingsChangedEvent);\n return results;\n };\n SettingsImpl.prototype.initializeSettings = function (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 SettingsImpl.prototype.verifySettingsAreUnlocked = function () {\n if (this._saveInProgress) {\n throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS);\n }\n };\n SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.';\n return SettingsImpl;\n}());\nexports.SettingsImpl = SettingsImpl;\n//# sourceMappingURL=SettingsImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nvar UIImpl = /** @class */ (function () {\n function UIImpl() {\n }\n UIImpl.prototype.displayDialogAsync = function (url, payload, options) {\n var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* UIService */);\n var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* Notification */);\n return new Promise(function (resolve, reject) {\n uiService\n .displayDialogAsync(url, payload || '', options)\n .then(function () {\n var unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, function () {\n // Let through any dialog update event\n return true;\n }, function (event) {\n if (event.isCloseEvent) {\n if (event.closePayload === undefined) {\n throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined');\n }\n resolve(event.closePayload);\n }\n else {\n reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.'));\n }\n unregisterFn();\n });\n })\n .catch(function (error) {\n reject(error);\n });\n });\n };\n UIImpl.prototype.closeDialog = function (payload) {\n var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* UIService */);\n uiService.closeDialog(payload);\n };\n return UIImpl;\n}());\nexports.UIImpl = UIImpl;\n//# sourceMappingURL=UIImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar DashboardLayoutChangedEvent_1 = require(\"../Events/DashboardLayoutChangedEvent\");\nvar WorkbookFormattingChangedEvent_1 = require(\"../Events/WorkbookFormattingChangedEvent\");\nvar ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nvar DashboardObject_1 = require(\"./DashboardObject\");\nvar Sheet_1 = require(\"./Sheet\");\nvar Worksheet_1 = require(\"./Worksheet\");\nvar Dashboard = /** @class */ (function (_super) {\n __extends(Dashboard, _super);\n function Dashboard(_dashboardImpl) {\n var _this = _super.call(this, _dashboardImpl) || this;\n _this._dashboardImpl = _dashboardImpl;\n _dashboardImpl.initializeWithPublicInterfaces();\n _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); });\n return _this;\n }\n Object.defineProperty(Dashboard.prototype, \"worksheets\", {\n get: function () {\n return this._dashboardImpl.worksheetsImpl.map(function (worksheetImpl) {\n return new Worksheet_1.Worksheet(worksheetImpl);\n });\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Dashboard.prototype, \"objects\", {\n get: function () {\n return this._dashboardImpl.objects.map(function (dashboardObjectImpl) {\n return new DashboardObject_1.DashboardObject(dashboardObjectImpl);\n });\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Dashboard.prototype, \"activeDashboardObjectId\", {\n get: function () {\n return this._dashboardImpl.activeDashboardObjectId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Dashboard.prototype, \"activeDashboardName\", {\n get: function () {\n return this._dashboardImpl.activeDashboardName;\n },\n enumerable: true,\n configurable: true\n });\n Dashboard.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) {\n return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap);\n };\n Dashboard.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) {\n return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap);\n };\n Dashboard.prototype.getDashboardObjectById = function (dashboardObjectId) {\n var zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId);\n return zone && new DashboardObject_1.DashboardObject(zone);\n };\n Dashboard.prototype.initializeEvents = function () {\n var _this = this;\n var results = new Array();\n // Initializing events and registering notification service\n var notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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 var dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, function () { return true; }, function (event) {\n var dashboardObjectChanges = _this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName);\n dashboardLayoutChangedEvent.triggerEvent(function () { return new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges); });\n });\n results.push(dashboardLayoutChangedEvent);\n var workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function () { return true; }, function (eventFormatting) {\n workbookFormattingChangedEvent.triggerEvent(function () { return new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting); });\n });\n results.push(workbookFormattingChangedEvent);\n return results;\n };\n Dashboard.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) {\n return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray);\n };\n Dashboard.prototype.replayAnimationAsync = function (replaySpeed) {\n return this._dashboardImpl.replayAnimationAsync(replaySpeed);\n };\n Dashboard.prototype.getFiltersAsync = function () {\n return this._dashboardImpl.getFiltersAsync();\n };\n Dashboard.prototype.applyFilterAsync = function (fieldName, values, updateType, options) {\n return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options);\n };\n return Dashboard;\n}(Sheet_1.Sheet));\nexports.Dashboard = Dashboard;\n//# sourceMappingURL=Dashboard.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dashboard_1 = require(\"./Dashboard\");\nvar Worksheet_1 = require(\"./Worksheet\");\n/**\n * Implementation of the dashboard objects - the zones in a dashboard.\n */\nvar DashboardObject = /** @class */ (function () {\n function DashboardObject(_dashboardObjectImpl) {\n this._dashboardObjectImpl = _dashboardObjectImpl;\n }\n Object.defineProperty(DashboardObject.prototype, \"dashboard\", {\n get: function () {\n return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"type\", {\n get: function () {\n return this._dashboardObjectImpl.type;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"position\", {\n get: function () {\n return this._dashboardObjectImpl.position;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"size\", {\n get: function () {\n return this._dashboardObjectImpl.size;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"worksheet\", {\n get: function () {\n if (this._dashboardObjectImpl.worksheetImpl) {\n return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl);\n }\n return undefined;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"name\", {\n get: function () {\n return this._dashboardObjectImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"isFloating\", {\n get: function () {\n return this._dashboardObjectImpl.isFloating;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"isVisible\", {\n get: function () {\n return this._dashboardObjectImpl.isVisible;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"id\", {\n get: function () {\n return this._dashboardObjectImpl.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObject.prototype, \"fieldId\", {\n get: function () {\n return this._dashboardObjectImpl.fieldId;\n },\n enumerable: true,\n configurable: true\n });\n return DashboardObject;\n}());\nexports.DashboardObject = DashboardObject;\n//# sourceMappingURL=DashboardObject.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar ParameterChangedEvent_1 = require(\"../Events/ParameterChangedEvent\");\nvar 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 */\nvar Parameter = /** @class */ (function (_super) {\n __extends(Parameter, _super);\n function Parameter(parameterImpl, sheet) {\n var _this = _super.call(this) || this;\n _this.parameterImpl = parameterImpl;\n // Initialize our event handling for this class\n _this.initializeEvents(sheet).forEach(function (e) { return _this.addNewEventType(e); });\n return _this;\n }\n Object.defineProperty(Parameter.prototype, \"name\", {\n get: function () {\n return this.parameterImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Parameter.prototype, \"currentValue\", {\n get: function () {\n return this.parameterImpl.currentValue;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Parameter.prototype, \"dataType\", {\n get: function () {\n return this.parameterImpl.dataType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Parameter.prototype, \"allowableValues\", {\n get: function () {\n return this.parameterImpl.allowableValues;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Parameter.prototype, \"id\", {\n get: function () {\n return this.parameterImpl.id;\n },\n enumerable: true,\n configurable: true\n });\n Parameter.prototype.changeValueAsync = function (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 Parameter.prototype.initializeEvents = function (sheet) {\n var _this = this;\n api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet');\n var results = new Array();\n var notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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 var parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, function (model) {\n var fieldName = model;\n return fieldName === _this.parameterImpl.id;\n }, function (fieldName) {\n parameterEvent.triggerEvent(function () { return new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet); });\n });\n results.push(parameterEvent);\n return results;\n };\n return Parameter;\n}(api_shared_js_1.EventListenerManager));\nexports.Parameter = Parameter;\n//# sourceMappingURL=Parameter.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar Parameter_1 = require(\"./Parameter\");\nvar Sheet = /** @class */ (function (_super) {\n __extends(Sheet, _super);\n function Sheet(_sheetImpl) {\n var _this = _super.call(this) || this;\n _this._sheetImpl = _sheetImpl;\n return _this;\n }\n Object.defineProperty(Sheet.prototype, \"name\", {\n get: function () {\n return this._sheetImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Sheet.prototype, \"sheetType\", {\n get: function () {\n return this._sheetImpl.sheetType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Sheet.prototype, \"size\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n Sheet.prototype.isValidSize = function (size) {\n var testSize = size;\n if (testSize.width !== undefined && testSize.height !== undefined) {\n return true;\n }\n return false;\n };\n Sheet.prototype.findParameterAsync = function (parameterName) {\n var _this = this;\n return this._sheetImpl.findParameterAsync(parameterName).then(function (parameterImpl) {\n if (parameterImpl) {\n return new Promise(function (resolve) { return resolve(new Parameter_1.Parameter(parameterImpl, _this)); });\n }\n else {\n return new Promise(function (resolve) { return resolve(undefined); });\n }\n });\n };\n Sheet.prototype.getParametersAsync = function () {\n var _this = this;\n return this._sheetImpl.getParametersAsync().then(function (parametersImpl) {\n return parametersImpl.map(function (parameterImpl) {\n return new Parameter_1.Parameter(parameterImpl, _this);\n });\n });\n };\n return Sheet;\n}(api_shared_js_1.EventListenerManager));\nexports.Sheet = Sheet;\n//# sourceMappingURL=Sheet.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Workbook = /** @class */ (function () {\n function Workbook(_workbookImpl) {\n this._workbookImpl = _workbookImpl;\n }\n Workbook.prototype.getAllDataSourcesAsync = function () {\n return this._workbookImpl.getAllDataSourcesAsync();\n };\n return Workbook;\n}());\nexports.Workbook = Workbook;\n//# sourceMappingURL=Workbook.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar FilterChangedEvent_1 = require(\"../Events/FilterChangedEvent\");\nvar MarksSelectedEvent_1 = require(\"../Events/MarksSelectedEvent\");\nvar SummaryDataChangedEvent_1 = require(\"../Events/SummaryDataChangedEvent\");\nvar ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nvar Dashboard_1 = require(\"./Dashboard\");\nvar Sheet_1 = require(\"./Sheet\");\nvar Worksheet = /** @class */ (function (_super) {\n __extends(Worksheet, _super);\n function Worksheet(_worksheetImpl) {\n var _this = _super.call(this, _worksheetImpl) || this;\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(function (e) { return _this.addNewEventType(e); });\n return _this;\n }\n Object.defineProperty(Worksheet.prototype, \"parentDashboard\", {\n get: function () {\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 enumerable: true,\n configurable: true\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 Worksheet.prototype.initializeEvents = function () {\n var _this = this;\n var results = new Array();\n var notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* 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 var marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, function (model) {\n var visualId = model;\n return _this.visualIdsAreEqual(visualId, _this._worksheetImpl.visualId);\n }, function () { return marksEvent.triggerEvent(function () { return new MarksSelectedEvent_1.MarksSelectedEvent(_this); }); });\n var filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, function (model) {\n var filterEventResponse = model;\n return _this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet;\n }, function (event) {\n filterEvent.triggerEvent(function () { return new FilterChangedEvent_1.FilterChangedEvent(_this, event.fieldName, event.fieldId); });\n });\n var summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, function (model) {\n var summaryDataEventResponse = model;\n return _this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet;\n }, function (event) {\n summaryDataEvent.triggerEvent(function () { return new SummaryDataChangedEvent_1.SummaryDataChangedEvent(_this); });\n });\n results.push(marksEvent);\n results.push(filterEvent);\n results.push(summaryDataEvent);\n return results;\n };\n Worksheet.prototype.applyFilterAsync = function (fieldName, values, updateType, options) {\n return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options);\n };\n Worksheet.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) {\n return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions);\n };\n Worksheet.prototype.applyHierarchicalFilterAsync = function (fieldName, values, updateType, options) {\n return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options);\n };\n Worksheet.prototype.applyRelativeDateFilterAsync = function (fieldName, options) {\n return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options);\n };\n Worksheet.prototype.clearFilterAsync = function (fieldName) {\n return this._worksheetImpl.clearFilterAsync(fieldName);\n };\n Worksheet.prototype.getDataSourcesAsync = function () {\n return this._worksheetImpl.getDataSourcesAsync();\n };\n Worksheet.prototype.getFiltersAsync = function () {\n return this._worksheetImpl.getFiltersAsync();\n };\n Worksheet.prototype.getSelectedMarksAsync = function () {\n return this._worksheetImpl.getSelectedMarksAsync();\n };\n Worksheet.prototype.getHighlightedMarksAsync = function () {\n return this._worksheetImpl.getHighlightedMarksAsync();\n };\n Worksheet.prototype.getSummaryDataAsync = function (options) {\n return this._worksheetImpl.getSummaryDataAsync(options);\n };\n Worksheet.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) {\n return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options);\n };\n Worksheet.prototype.getSummaryColumnsInfoAsync = function () {\n return this._worksheetImpl.getSummaryColumnsInfoAsync();\n };\n Worksheet.prototype.getUnderlyingDataAsync = function (options) {\n console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' +\n 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync');\n return this._worksheetImpl.getUnderlyingDataAsync(options);\n };\n Worksheet.prototype.getUnderlyingTablesAsync = function () {\n return this._worksheetImpl.getUnderlyingTablesAsync();\n };\n Worksheet.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) {\n return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options);\n };\n Worksheet.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) {\n return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options);\n };\n Worksheet.prototype.getVisualSpecificationAsync = function () {\n return this._worksheetImpl.getVisualSpecificationAsync();\n };\n Worksheet.prototype.clearSelectedMarksAsync = function () {\n return this._worksheetImpl.clearSelectedMarksAsync();\n };\n Worksheet.prototype.selectMarksByIDAsync = function (marksInfo, updateType) {\n return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType);\n };\n Worksheet.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) {\n return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType);\n };\n Worksheet.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) {\n return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType);\n };\n Worksheet.prototype.annotateMarkAsync = function (mark, annotationText) {\n return this._worksheetImpl.annotateMarkAsync(mark, annotationText);\n };\n Worksheet.prototype.getAnnotationsAsync = function () {\n return this._worksheetImpl.getAnnotationsAsync();\n };\n Worksheet.prototype.removeAnnotationAsync = function (annotation) {\n return this._worksheetImpl.removeAnnotationAsync(annotation);\n };\n Worksheet.prototype.hoverTupleAsync = function (hoveredTuple, tooltip, allowHoverActions) {\n if (allowHoverActions === void 0) { allowHoverActions = true; }\n return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions);\n };\n Worksheet.prototype.selectTuplesAsync = function (selectedTuples, selectOption, tooltip) {\n return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip);\n };\n Worksheet.prototype.getTooltipTextAsync = function (tupleId) {\n return this._worksheetImpl.getTooltipTextAsync(tupleId);\n };\n Worksheet.prototype.leaveMarkNavigationAsync = function () {\n return this._worksheetImpl.leaveMarkNavigationAsync();\n };\n Worksheet.prototype.visualIdsAreEqual = function (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 return Worksheet;\n}(Sheet_1.Sheet));\nexports.Worksheet = Worksheet;\n//# sourceMappingURL=Worksheet.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar DashboardContent = /** @class */ (function () {\n function DashboardContent(_dashboard) {\n this._dashboard = _dashboard;\n }\n Object.defineProperty(DashboardContent.prototype, \"dashboard\", {\n get: function () {\n return this._dashboard;\n },\n enumerable: true,\n configurable: true\n });\n return DashboardContent;\n}());\nexports.DashboardContent = DashboardContent;\n//# sourceMappingURL=DashboardContent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar ConnectedServer_1 = require(\"../Impl/ConnectedServer\");\nvar 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 */\nvar Environment = /** @class */ (function () {\n function Environment(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._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting);\n this._language = extensionEnvironment.extensionLanguage;\n this._country = extensionEnvironment.extensionCountry;\n this._locale = extensionEnvironment.extensionLocale;\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 // 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 Object.defineProperty(Environment.prototype, \"apiVersion\", {\n get: function () {\n return this._apiVersion;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"context\", {\n get: function () {\n return this._context;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"workbookFormatting\", {\n get: function () {\n return this._formatting;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"language\", {\n get: function () {\n return this._language;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"country\", {\n get: function () {\n return this._country;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"locale\", {\n get: function () {\n return this._locale;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"mode\", {\n get: function () {\n return this._mode;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"operatingSystem\", {\n get: function () {\n return this._operatingSystem;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"tableauVersion\", {\n get: function () {\n return this._tableauVersion;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Environment.prototype, \"uniqueUserId\", {\n get: function () {\n return this._uniqueUserId;\n },\n enumerable: true,\n configurable: true\n });\n return Environment;\n}());\nexports.Environment = Environment;\n//# sourceMappingURL=Environment.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the external Extensions namespace.\n */\nvar Extensions = /** @class */ (function () {\n function Extensions(extensionImpl) {\n this.extensionImpl = extensionImpl;\n this.extensionImpl = extensionImpl;\n }\n Object.defineProperty(Extensions.prototype, \"dashboardContent\", {\n get: function () {\n return this.extensionImpl.dashboardContent;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"worksheetContent\", {\n get: function () {\n return this.extensionImpl.worksheetContent;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"environment\", {\n get: function () {\n return this.extensionImpl.environment;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"settings\", {\n get: function () {\n return this.extensionImpl.settings;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"ui\", {\n get: function () {\n return this.extensionImpl.ui;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"workbook\", {\n get: function () {\n return this.extensionImpl.workbook;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Extensions.prototype, \"dashboardObjectId\", {\n get: function () {\n return this.extensionImpl.extensionZoneId;\n },\n enumerable: true,\n configurable: true\n });\n Extensions.prototype.initializeAsync = function (contextMenuCallbacks) {\n return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then();\n };\n Extensions.prototype.initializeDialogAsync = function () {\n return this.extensionImpl.initializeAsync(true);\n };\n Extensions.prototype.createVizImageAsync = function (inputSpec) {\n return this.extensionImpl.createVizImageAsync(inputSpec);\n };\n Extensions.prototype.setClickThroughAsync = function (clickThroughEnabled) {\n return this.extensionImpl.setClickThroughAsync(clickThroughEnabled);\n };\n return Extensions;\n}());\nexports.Extensions = Extensions;\n//# sourceMappingURL=Extensions.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\n/**\n * Implementation of the external settings namespace.\n */\nvar Settings = /** @class */ (function (_super) {\n __extends(Settings, _super);\n function Settings(_settingsImpl) {\n var _this = _super.call(this) || this;\n _this._settingsImpl = _settingsImpl;\n // Initialize our event handling for this class\n _this._settingsImpl.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); });\n return _this;\n }\n Settings.prototype.erase = function (key) {\n this._settingsImpl.erase(key);\n };\n Settings.prototype.get = function (key) {\n return this._settingsImpl.get(key);\n };\n Settings.prototype.getAll = function () {\n return this._settingsImpl.getAll();\n };\n Object.defineProperty(Settings.prototype, \"isModified\", {\n get: function () {\n return this._settingsImpl.isModified;\n },\n enumerable: true,\n configurable: true\n });\n Settings.prototype.saveAsync = function () {\n return this._settingsImpl.saveAsync();\n };\n Settings.prototype.set = function (key, value) {\n this._settingsImpl.set(key, value);\n };\n return Settings;\n}(api_shared_js_1.EventListenerManager));\nexports.Settings = Settings;\n//# sourceMappingURL=Settings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the external UI namespace.\n */\nvar UI = /** @class */ (function () {\n function UI(_impl) {\n this._impl = _impl;\n }\n UI.prototype.displayDialogAsync = function (url, payload, options) {\n return this._impl.displayDialogAsync(url, payload, options);\n };\n UI.prototype.closeDialog = function (payload) {\n this._impl.closeDialog(payload);\n };\n return UI;\n}());\nexports.UI = UI;\n//# sourceMappingURL=UI.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar WorkbookFormattingEnvUtil = /** @class */ (function () {\n function WorkbookFormattingEnvUtil() {\n }\n WorkbookFormattingEnvUtil.convertToWorkbookFormatting = function (workbookFormattingModel) {\n if (!workbookFormattingModel) {\n return undefined;\n }\n else {\n var formattingMap = workbookFormattingModel.formattingSheets.map(function (currentFormattingSheet) {\n var formattingSheet = {\n classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey),\n cssProperties: {\n fontFamily: currentFormattingSheet.cssProperties.fontFamily,\n fontSize: currentFormattingSheet.cssProperties.fontSize,\n fontWeight: currentFormattingSheet.cssProperties.fontWeight,\n fontStyle: currentFormattingSheet.cssProperties.fontStyle,\n textDecoration: currentFormattingSheet.cssProperties.textDecoration,\n color: currentFormattingSheet.cssProperties.color,\n },\n };\n return formattingSheet;\n });\n var result = {\n formattingSheets: formattingMap,\n };\n return result;\n }\n };\n return WorkbookFormattingEnvUtil;\n}());\nexports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil;\n//# sourceMappingURL=WorkbookFormattingEnvUtil.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar WorksheetContent = /** @class */ (function () {\n function WorksheetContent(_worksheet) {\n this._worksheet = _worksheet;\n }\n Object.defineProperty(WorksheetContent.prototype, \"worksheet\", {\n get: function () {\n return this._worksheet;\n },\n enumerable: true,\n configurable: true\n });\n return WorksheetContent;\n}());\nexports.WorksheetContent = WorksheetContent;\n//# sourceMappingURL=WorksheetContent.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar InitializationServiceImpl = /** @class */ (function (_super) {\n __extends(InitializationServiceImpl, _super);\n function InitializationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(InitializationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"InitializationService\" /* InitializationService */;\n },\n enumerable: true,\n configurable: true\n });\n InitializationServiceImpl.prototype.initializeDashboardExtensionsAsync = function (isExtensionDialog, contextMenuIds) {\n var _a;\n var params = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'initializeDashboardExtensionsAsync',\n _a[api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds] = contextMenuIds,\n _a[api_internal_contract_js_1.ParameterId.IsExtensionDialog] = isExtensionDialog,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then(function (response) {\n // TODO - Validate return value\n var result = response.result;\n return result;\n });\n };\n return InitializationServiceImpl;\n}(api_shared_js_1.ServiceImplBase));\nexports.InitializationServiceImpl = InitializationServiceImpl;\n//# sourceMappingURL=InitializationServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar SettingsServiceImpl = /** @class */ (function (_super) {\n __extends(SettingsServiceImpl, _super);\n function SettingsServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(SettingsServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"SettingsService\" /* SettingsService */;\n },\n enumerable: true,\n configurable: true\n });\n SettingsServiceImpl.prototype.saveSettingsAsync = function (settings) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveSettingsAsync',\n _a[api_internal_contract_js_1.ParameterId.SettingsValues] = settings,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then(function (value) {\n var 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 return SettingsServiceImpl;\n}(api_shared_js_1.ServiceImplBase));\nexports.SettingsServiceImpl = SettingsServiceImpl;\n//# sourceMappingURL=SettingsServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar DEFAULT_DIALOG_HEIGHT = 400; // in pixels\nvar DEFAULT_DIALOG_WIDTH = 600; // in pixels\nvar DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window;\nvar UIServiceImpl = /** @class */ (function (_super) {\n __extends(UIServiceImpl, _super);\n function UIServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(UIServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"UIService\" /* UIService */;\n },\n enumerable: true,\n configurable: true\n });\n UIServiceImpl.prototype.displayDialogAsync = function (url, payload, options) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'displayDialogAsync',\n _a[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = url,\n _a[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload,\n _a);\n var h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT;\n var w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH;\n var 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(function (response) {\n var 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 UIServiceImpl.prototype.closeDialog = function (payload) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'closeDialog',\n _a);\n if (payload) {\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload;\n }\n return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(function () {\n return;\n });\n };\n UIServiceImpl.prototype.setClickThroughAsync = function (clickThroughEnabled, extensionZoneId) {\n var _a;\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 var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.ExtensionZoneId] = extensionZoneId,\n _a[api_internal_contract_js_1.ParameterId.ClickThroughEnabled] = clickThroughEnabled,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(function () {\n return;\n });\n };\n return UIServiceImpl;\n}(api_shared_js_1.ServiceImplBase));\nexports.UIServiceImpl = UIServiceImpl;\n//# sourceMappingURL=UIServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nvar InitializationServiceImpl_1 = require(\"./Impl/InitializationServiceImpl\");\nvar SettingsServiceImpl_1 = require(\"./Impl/SettingsServiceImpl\");\nvar UIServiceImpl_1 = require(\"./Impl/UIServiceImpl\");\nvar 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}\nexports.registerAllExtensionsServices = registerAllExtensionsServices;\nfunction registerInitializationExtensionsServices(dispatcher) {\n api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId));\n}\nexports.registerInitializationExtensionsServices = registerInitializationExtensionsServices;\n//# sourceMappingURL=RegisterAllExtensionsServices.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExtensionsRegistryId = 0;\n//# sourceMappingURL=ServiceRegistryUtil.js.map","\"use strict\";\n// This file re-exports everything which is part of the extensions api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./ExternalContract/Embedding/AskDataInterfaces\"));\nvar Enums_1 = require(\"./ExternalContract/Embedding/Enums\");\nexports.ApiMenuType = Enums_1.ApiMenuType;\nexports.CrosstabFileFormat = Enums_1.CrosstabFileFormat;\nexports.DeviceType = Enums_1.DeviceType;\nexports.EmbeddingErrorCodes = Enums_1.EmbeddingErrorCodes;\nexports.EmbeddingTableauEventType = Enums_1.TableauEventType;\nexports.FileFormats = Enums_1.FileFormats;\nexports.PrintOrientation = Enums_1.PrintOrientation;\nexports.PrintPageSize = Enums_1.PrintPageSize;\nexports.PrintScaling = Enums_1.PrintScaling;\nexports.PulseLayout = Enums_1.PulseLayout;\nexports.SheetSizeBehavior = Enums_1.SheetSizeBehavior;\nexports.TableauDialogType = Enums_1.TableauDialogType;\nexports.Toolbar = Enums_1.Toolbar;\n__export(require(\"./ExternalContract/Embedding/PulseInterfaces\"));\n__export(require(\"./ExternalContract/Embedding/VizInterfaces\"));\n__export(require(\"./ExternalContract/Embedding/WebComponentInterfaces\"));\n__export(require(\"./SharedApiExternalContract\"));\n//# sourceMappingURL=EmbeddingApiExternalContract.js.map","\"use strict\";\n// This file re-exports everything which is part of the extensions api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Tableau_1 = require(\"./ExternalContract/Extensions/Namespaces/Tableau\");\nexports.ErrorCodes = Tableau_1.ErrorCodes;\nexports.ExtensionContext = Tableau_1.ExtensionContext;\nexports.ExtensionMode = Tableau_1.ExtensionMode;\nexports.TableauEventType = Tableau_1.TableauEventType;\nexports.VizImageEncodingType = Tableau_1.VizImageEncodingType;\nexports.VizImagePaletteType = Tableau_1.VizImagePaletteType;\nexports.VizImageSizeSettingAlignmentType = Tableau_1.VizImageSizeSettingAlignmentType;\nexports.VizImageSizeSettingType = Tableau_1.VizImageSizeSettingType;\nexports.VizImageSortDirectionType = Tableau_1.VizImageSortDirectionType;\n__export(require(\"./SharedApiExternalContract\"));\n//# sourceMappingURL=ExtensionsApiExternalContract.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 */\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./EmbeddingApiExternalContract\"));\n__export(require(\"./ExtensionsApiExternalContract\"));\n//# sourceMappingURL=ExternalContract.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.AskDataAttributes = {}));\n//# sourceMappingURL=AskDataInterfaces.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 });\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 || (exports.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 || (exports.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 * 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 * @NotImplemented\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 || (exports.EmbeddingErrorCodes = {}));\n/**\n * Formats available to use with displayStaticImage in @VizInterfaces\n */\nvar FileFormats;\n(function (FileFormats) {\n FileFormats[\"PDF\"] = \"pdf\";\n FileFormats[\"PNG\"] = \"png\";\n})(FileFormats = exports.FileFormats || (exports.FileFormats = {}));\nvar PrintOrientation;\n(function (PrintOrientation) {\n PrintOrientation[\"Portrait\"] = \"portrait\";\n PrintOrientation[\"Landscape\"] = \"landscape\";\n})(PrintOrientation = exports.PrintOrientation || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.ToolbarButtons = {}));\nvar Toolbar;\n(function (Toolbar) {\n Toolbar[\"Top\"] = \"top\";\n Toolbar[\"Bottom\"] = \"bottom\";\n Toolbar[\"Hidden\"] = \"hidden\";\n})(Toolbar = exports.Toolbar || (exports.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 || (exports.SheetSizeBehavior = {}));\nvar PulseLayout;\n(function (PulseLayout) {\n PulseLayout[\"Default\"] = \"default\";\n PulseLayout[\"Card\"] = \"card\";\n PulseLayout[\"Ban\"] = \"ban\";\n})(PulseLayout = exports.PulseLayout || (exports.PulseLayout = {}));\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\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})(TableauEventType = exports.TableauEventType || (exports.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 || (exports.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 || (exports.TableauDialogType = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 = exports.PulseAttributes || (exports.PulseAttributes = {}));\n//# sourceMappingURL=PulseInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.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 || (exports.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 || (exports.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})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {}));\nvar VizChildElementAttributes;\n(function (VizChildElementAttributes) {\n VizChildElementAttributes[\"Field\"] = \"field\";\n VizChildElementAttributes[\"Value\"] = \"value\";\n VizChildElementAttributes[\"Name\"] = \"name\";\n})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {}));\n//# sourceMappingURL=VizInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.WebComponentAttributes = {}));\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})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {}));\nvar WebComponentChildElementAttributes;\n(function (WebComponentChildElementAttributes) {\n WebComponentChildElementAttributes[\"Field\"] = \"field\";\n WebComponentChildElementAttributes[\"Value\"] = \"value\";\n WebComponentChildElementAttributes[\"Name\"] = \"name\";\n})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {}));\n//# sourceMappingURL=WebComponentInterfaces.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 var 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 extenion.\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 var ExtensionContext;\n (function (ExtensionContext) {\n ExtensionContext[\"Desktop\"] = \"desktop\";\n ExtensionContext[\"Server\"] = \"server\";\n })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {}));\n /**\n * The mode in which the Extensions is currently running.\n */\n var ExtensionMode;\n (function (ExtensionMode) {\n ExtensionMode[\"Authoring\"] = \"authoring\";\n ExtensionMode[\"Viewing\"] = \"viewing\";\n })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {}));\n /**\n * Represents the type of event that can be listened for.\n */\n var TableauEventType;\n (function (TableauEventType) {\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 [[Parameter]] objects. */\n TableauEventType[\"ParameterChanged\"] = \"parameter-changed\";\n /** Settings have been changed for this extension. You can use this event type with [[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 })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {}));\n /**\n * Enum that represents the data type of encodings for createVizImageAsync.\n * @since 1.6.0\n */\n var 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 var 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 var 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 var 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 var 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 });\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 || (exports.SharedErrorCodes = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\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 var AnalyticsObjectType;\n (function (AnalyticsObjectType) {\n AnalyticsObjectType[\"Cluster\"] = \"cluster\";\n AnalyticsObjectType[\"Forecast\"] = \"forecast\";\n AnalyticsObjectType[\"TrendLine\"] = \"trend-line\";\n })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {}));\n var AnnotationType;\n (function (AnnotationType) {\n AnnotationType[\"Mark\"] = \"mark\";\n AnnotationType[\"Point\"] = \"point\";\n AnnotationType[\"Area\"] = \"area\";\n })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {}));\n var ColumnType;\n (function (ColumnType) {\n ColumnType[\"Discrete\"] = \"discrete\";\n ColumnType[\"Continuous\"] = \"continuous\";\n ColumnType[\"Unknown\"] = \"unknown\";\n })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {}));\n var 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 = Tableau.ClassNameKey || (Tableau.ClassNameKey = {}));\n /**\n * What the object represents in a dashboard.\n */\n var 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 var 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 var 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 var 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 var 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 var DialogStyle;\n (function (DialogStyle) {\n DialogStyle[\"Window\"] = \"window\";\n DialogStyle[\"Modal\"] = \"modal\";\n DialogStyle[\"Modeless\"] = \"modeless\";\n })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {}));\n var 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 var 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 var 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 var 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 var 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 var 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 var 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 var 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 var 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 /**\n * An enumeration describing the different types of allowable values.\n * This is used for restricting the domain of a parameter\n */\n var 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 var 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 = Tableau.PeriodType || (Tableau.PeriodType = {}));\n var 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 var 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 var 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 var SheetType;\n (function (SheetType) {\n SheetType[\"Dashboard\"] = \"dashboard\";\n SheetType[\"Story\"] = \"story\";\n SheetType[\"Worksheet\"] = \"worksheet\";\n })(SheetType = Tableau.SheetType || (Tableau.SheetType = {}));\n var SortDirection;\n (function (SortDirection) {\n SortDirection[\"Increasing\"] = \"increasing\";\n SortDirection[\"Decreasing\"] = \"decreasing\";\n })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {}));\n var 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 var 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 var 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 = __assign({}, DashboardObjectVisibilityType);\n})(Tableau || (Tableau = {}));\nmodule.exports = Tableau;\n//# sourceMappingURL=Tableau.js.map","\"use strict\";\n// This file re-exports everything which is part of the shared api public interface\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(require(\"./ExternalContract/Shared/Enums\"));\nvar Tableau_1 = require(\"./ExternalContract/Shared/Namespaces/Tableau\");\nexports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType;\nexports.AnnotationType = Tableau_1.AnnotationType;\nexports.ClassNameKey = Tableau_1.ClassNameKey;\nexports.ColumnType = Tableau_1.ColumnType;\nexports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange;\nexports.DashboardObjectType = Tableau_1.DashboardObjectType;\nexports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType;\nexports.DataType = Tableau_1.DataType;\nexports.DateRangeType = Tableau_1.DateRangeType;\nexports.DialogStyle = Tableau_1.DialogStyle;\nexports.EncodingType = Tableau_1.EncodingType;\nexports.FieldAggregationType = Tableau_1.FieldAggregationType;\nexports.FieldRoleType = Tableau_1.FieldRoleType;\nexports.FilterDomainType = Tableau_1.FilterDomainType;\nexports.FilterNullOption = Tableau_1.FilterNullOption;\nexports.FilterType = Tableau_1.FilterType;\nexports.FilterUpdateType = Tableau_1.FilterUpdateType;\nexports.HierarchicalLevelSelectionState = Tableau_1.HierarchicalLevelSelectionState;\nexports.IncludeDataValuesOption = Tableau_1.IncludeDataValuesOption;\nexports.MarkType = Tableau_1.MarkType;\nexports.ParameterValueType = Tableau_1.ParameterValueType;\nexports.PeriodType = Tableau_1.PeriodType;\nexports.QuickTableCalcType = Tableau_1.QuickTableCalcType;\nexports.ReplaySpeedType = Tableau_1.ReplaySpeedType;\nexports.SelectOptions = Tableau_1.SelectOptions;\nexports.SelectionUpdateType = Tableau_1.SelectionUpdateType;\nexports.SheetType = Tableau_1.SheetType;\nexports.SortDirection = Tableau_1.SortDirection;\nexports.TrendLineModelType = Tableau_1.TrendLineModelType;\nexports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType;\n//# sourceMappingURL=SharedApiExternalContract.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 */\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// The following polyfills are needed for IE11\nrequire(\"core-js/es/number/is-integer\");\nrequire(\"core-js/es/number/is-nan\");\nrequire(\"core-js/es/object/assign\");\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.\nvar internalContractVersion = require(\"../internal-contract-version.json\");\nexports.INTERNAL_CONTRACT_VERSION = internalContractVersion;\n__export(require(\"./contract/DataTypeConverter\"));\n__export(require(\"./contract/Enums\"));\n__export(require(\"./contract/Notifications\"));\n__export(require(\"./contract/Parameters\"));\n__export(require(\"./contract/Verbs\"));\n__export(require(\"./interface/AskDataInterface\"));\n__export(require(\"./interface/PulseInterface\"));\n__export(require(\"./interface/VqlInterface\"));\n__export(require(\"./messaging/CrossFrameMessenger\"));\n__export(require(\"./messaging/interface/MessageTypes\"));\n__export(require(\"./versioning/VersionConverterFactory\"));\n__export(require(\"./versioning/external/ExternalIdentityVersionConverter\"));\n__export(require(\"./versioning/external/ExternalVersionConverterFactory\"));\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 });\nvar Enums_1 = require(\"./Enums\");\nvar DataTypeConverter = /** @class */ (function () {\n function DataTypeConverter() {\n }\n DataTypeConverter.isSpecial = function (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 DataTypeConverter.parseBoolean = function (booleanString) {\n // boolean values come to us as 'true'|'false'\n var normalizedBoolean = booleanString.toLowerCase();\n return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true';\n };\n // tslint:disable-next-line:no-any\n DataTypeConverter.parseNumber = function (valueAsString) {\n var value = Number(valueAsString);\n return isNaN(value) ? this.specialValueIndicator : value;\n };\n DataTypeConverter.parseDate = function (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 var value = new Date(dateAsString);\n return Number.isNaN(value.getTime()) ? null : value;\n };\n DataTypeConverter.parseDateTime = function (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 var formattedDateString = dateAsString.replace(' ', 'T').concat('Z');\n var 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 DataTypeConverter.convertValueAsStringToValue = function (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 DataTypeConverter.convertValueToNativeValue = function (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 DataTypeConverter.convertStringValueToNativeValue = function (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 DataTypeConverter.specialValueIndicator = '%null%';\n return DataTypeConverter;\n}());\nexports.DataTypeConverter = DataTypeConverter;\n//# sourceMappingURL=DataTypeConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ExtensionContext;\n(function (ExtensionContext) {\n ExtensionContext[\"Desktop\"] = \"desktop\";\n ExtensionContext[\"Server\"] = \"server\";\n ExtensionContext[\"Unknown\"] = \"unknown\";\n})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {}));\nvar ExtensionMode;\n(function (ExtensionMode) {\n ExtensionMode[\"Authoring\"] = \"authoring\";\n ExtensionMode[\"Viewing\"] = \"viewing\";\n ExtensionMode[\"Unknown\"] = \"unknown\";\n})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {}));\nvar AnnotateEnum;\n(function (AnnotateEnum) {\n AnnotateEnum[\"Mark\"] = \"mark\";\n AnnotateEnum[\"Point\"] = \"point\";\n AnnotateEnum[\"Area\"] = \"area\";\n})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {}));\nvar ColumnType;\n(function (ColumnType) {\n ColumnType[\"Discrete\"] = \"discrete\";\n ColumnType[\"Continuous\"] = \"continuous\";\n ColumnType[\"Unknown\"] = \"unknown\";\n})(ColumnType = exports.ColumnType || (exports.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 || (exports.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 || (exports.DataType = {}));\nvar DialogStyle;\n(function (DialogStyle) {\n DialogStyle[\"Window\"] = \"window\";\n DialogStyle[\"Modal\"] = \"modal\";\n DialogStyle[\"Modeless\"] = \"modeless\";\n})(DialogStyle = exports.DialogStyle || (exports.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 || (exports.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 || (exports.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 || (exports.FieldAggregationType = {}));\nvar FieldRoleType;\n(function (FieldRoleType) {\n FieldRoleType[\"Dimension\"] = \"dimension\";\n FieldRoleType[\"Measure\"] = \"measure\";\n FieldRoleType[\"Unknown\"] = \"unknown\";\n})(FieldRoleType = exports.FieldRoleType || (exports.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 || (exports.FilterUpdateType = {}));\nvar SheetType;\n(function (SheetType) {\n SheetType[\"Dashboard\"] = \"dashboard\";\n SheetType[\"Story\"] = \"story\";\n SheetType[\"Worksheet\"] = \"worksheet\";\n})(SheetType = exports.SheetType || (exports.SheetType = {}));\nvar DomainRestrictionType;\n(function (DomainRestrictionType) {\n DomainRestrictionType[\"All\"] = \"all\";\n DomainRestrictionType[\"List\"] = \"list\";\n DomainRestrictionType[\"Range\"] = \"range\";\n})(DomainRestrictionType = exports.DomainRestrictionType || (exports.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 = exports.DateStepPeriod || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.ExtensionDialogResult = {}));\n// Enumeration for ApiShowData table id sentinels.\nvar ApiShowDataTableSentinel;\n(function (ApiShowDataTableSentinel) {\n // find the one logical table - used in version compatibility check for getUnderlyingDataTable and getLogicalDataTable commands\n ApiShowDataTableSentinel[\"SingleTableId\"] = \"single-table-id-sentinel\";\n ApiShowDataTableSentinel[\"SingleTableCaption\"] = \"Single table id sentinel\";\n})(ApiShowDataTableSentinel = exports.ApiShowDataTableSentinel || (exports.ApiShowDataTableSentinel = {}));\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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.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 || (exports.EncodingType = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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[\"FilterChanged\"] = \"filter-changed\";\n NotificationId[\"FirstVizSizeKnown\"] = \"first-viz-size-known\";\n NotificationId[\"ParameterChanged\"] = \"parameter-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[\"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 || (exports.NotificationId = {}));\n//# sourceMappingURL=Notifications.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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[\"CategoricalDomain\"] = \"categorical-domain\";\n ParameterId[\"ClickThroughEnabled\"] = \"click-through-enabled\";\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[\"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[\"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[\"ExtensionDialogPayload\"] = \"extension-dialog-payload\";\n ParameterId[\"ExtensionDialogResult\"] = \"extension-dialog-result\";\n ParameterId[\"ExtensionDialogStyle\"] = \"extension-dialog-style\";\n ParameterId[\"ExtensionDialogUrl\"] = \"extension-dialog-url\";\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[\"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[\"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[\"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[\"IsExcludeMode\"] = \"is-exclude\";\n ParameterId[\"IsExtensionDialog\"] = \"is-extension-dialog\";\n ParameterId[\"JoinDescription\"] = \"join-description\";\n ParameterId[\"LogicalTableId\"] = \"logical-table-id\";\n ParameterId[\"LogicalTableInfoList\"] = \"logical-table-info-list\";\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[\"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[\"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[\"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 || (exports.ParameterId = {}));\n//# sourceMappingURL=Parameters.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Declare this key type and export the NotificationId to make this behave like a string enum.\n//\n// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put\n// new ones, and merge conflicts.\nvar VerbId;\n(function (VerbId) {\n VerbId[\"ActivateNextStoryPoint\"] = \"activate-next-story-point\";\n VerbId[\"ActivatePreviousStoryPoint\"] = \"activate-previous-story-point\";\n VerbId[\"ActivateSheet\"] = \"activateSheet\";\n VerbId[\"ActivateStoryPoint\"] = \"activate-story-point\";\n VerbId[\"AppendExternalMenuItem\"] = \"append-external-menu-item\";\n VerbId[\"ApplyCategoricalFilter\"] = \"categorical-filter\";\n VerbId[\"ApplyRangeFilter\"] = \"range-filter\";\n VerbId[\"ApplyRelativeDateFilter\"] = \"apply-relative-date-Filter\";\n VerbId[\"Authenticate\"] = \"authenticate\";\n VerbId[\"BlockExtension\"] = \"block-extension\";\n VerbId[\"ChangeParameterValue\"] = \"change-parameter-value\";\n VerbId[\"ChangeSharedFilter\"] = \"change-shared-filter\";\n VerbId[\"ClearFilter\"] = \"clear-filter\";\n VerbId[\"ClearSelectedMarks\"] = \"clear-selected-marks\";\n VerbId[\"CloseDialog\"] = \"close-dialog\";\n VerbId[\"CreateAnnotation\"] = \"create-annotation\";\n VerbId[\"DashboardCategoricalFilter\"] = \"dashboard-categorical-filter\";\n VerbId[\"DisplayDialog\"] = \"display-dialog\";\n VerbId[\"DownloadWorkbook\"] = \"download-workbook\";\n VerbId[\"ExecuteExternalMenuItem\"] = \"execute-external-menu-item\";\n VerbId[\"ExportCrosstab\"] = \"export-crosstab\";\n VerbId[\"ExportCrosstabCsvDownload\"] = \"export-crosstab-csv-download\";\n VerbId[\"ExportCrosstabExcelDownload\"] = \"export-crosstab-excel-download\";\n VerbId[\"ExportData\"] = \"export-data\";\n VerbId[\"ExportDataDownload\"] = \"export-data-download\";\n VerbId[\"ExportImage\"] = \"export-image\";\n VerbId[\"ExportPdf\"] = \"export-pdf\";\n VerbId[\"ExportPdfDownload\"] = \"export-pdf-download\";\n VerbId[\"ExportPowerpoint\"] = \"export-powerpoint\";\n VerbId[\"ExportPowerpointDownload\"] = \"export-powerpoint-download\";\n VerbId[\"FindParameter\"] = \"find-parameter\";\n VerbId[\"GetActiveTables\"] = \"get-active-tables\";\n VerbId[\"GetAllDataSources\"] = \"get-all-data-sources\";\n VerbId[\"GetAnnotations\"] = \"get-annotations\";\n VerbId[\"GetCategoricalDomain\"] = \"get-categorical-domain\";\n VerbId[\"GetConnectionDescriptionSummaries\"] = \"get-connection-description-summaries\";\n VerbId[\"GetCurrentSrc\"] = \"get-current-src\";\n VerbId[\"GetCustomViews\"] = \"get-custom-views\";\n VerbId[\"GetDashboardFilters\"] = \"get-dashboard-filters\";\n VerbId[\"GetDataSource\"] = \"get-datasource\";\n VerbId[\"GetDataSourceData\"] = \"get-datasource-data\";\n VerbId[\"GetDataSources\"] = \"get-data-sources\";\n VerbId[\"GetDataSummaryData\"] = \"get-summary-data\";\n VerbId[\"GetDataSummaryDataReader\"] = \"get-summary-data-reader\";\n VerbId[\"GetDataTableReaderPage\"] = \"get-data-table-reader-page\";\n VerbId[\"GetEmbeddingAbstractQueryWithDataModel\"] = \"get-embedding-abstract-query-with-data-model\";\n VerbId[\"GetEmbeddingClientInfo\"] = \"get-embedding-client-info\";\n VerbId[\"GetVizStateWithDataModel\"] = \"get-viz-state-with-data-model\";\n VerbId[\"GetExportCrosstabSheetMap\"] = \"get-export-crosstab-sheet-map\";\n VerbId[\"GetExportPdfOptions\"] = \"get-export-pdf-options\";\n VerbId[\"GetField\"] = \"get-field\";\n VerbId[\"GetFieldAndDataSource\"] = \"get-field-and-datasource\";\n VerbId[\"GetVisualSpecification\"] = \"get-visual-specification\";\n VerbId[\"GetFilters\"] = \"get-filters\";\n VerbId[\"GetFonts\"] = \"get-fonts\";\n VerbId[\"GetHighlightedMarks\"] = \"get-highlighted-marks\";\n VerbId[\"GetJoinDescription\"] = \"get-join-description\";\n VerbId[\"GetLogicalTableData\"] = \"get-logical-table-data\";\n VerbId[\"GetLogicalTableDataReader\"] = \"get-logical-table-data-reader\";\n VerbId[\"GetLogicalTables\"] = \"get-logical-tables\";\n VerbId[\"GetParametersForSheet\"] = \"get-parameters-for-sheet\";\n VerbId[\"GetRangeDomain\"] = \"get-range-domain\";\n VerbId[\"GetSelectedMarks\"] = \"get-selected-marks\";\n VerbId[\"GetSharedFilter\"] = \"get-shared-filter\";\n VerbId[\"GetTooltipText\"] = \"get-tooltip-text\";\n VerbId[\"GetUnderlyingData\"] = \"get-underlying-data\";\n VerbId[\"GetUnderlyingTableData\"] = \"get-underlying-table-data\";\n VerbId[\"GetUnderlyingTableDataReader\"] = \"get-underlying-table-data-reader\";\n VerbId[\"GetUnderlyingTables\"] = \"get-underlying-tables\";\n VerbId[\"HierarchicalFilter\"] = \"hierachical-filter\";\n VerbId[\"InitializeExtension\"] = \"initialize-extension\";\n VerbId[\"MoveAndResizeZones\"] = \"move-and-resize-zones\";\n VerbId[\"RaiseLeaveMarkNavNotification\"] = \"raise-leave-mark-nav-notification\";\n VerbId[\"RaiseHoverTupleNotification\"] = \"raise-hover-tuple-notification\";\n VerbId[\"RaiseSelectTuplesNotification\"] = \"raise-select-tuples-notification\";\n VerbId[\"Redo\"] = \"redo\";\n VerbId[\"RefreshDataSource\"] = \"refresh-data-source\";\n VerbId[\"ReleaseDataTableReader\"] = \"release-data-table-reader\";\n VerbId[\"RemoveAnnotation\"] = \"remove-annotation\";\n VerbId[\"RemoveCustomView\"] = \"remove-custom-view\";\n VerbId[\"RemoveExternalMenuItem\"] = \"remove-external-menu-item\";\n VerbId[\"RenameExternalMenu\"] = \"rename-external-menu\";\n VerbId[\"ReplayAnimation\"] = \"replay-animation\";\n VerbId[\"RevertStoryPoint\"] = \"revert-story-point\";\n VerbId[\"RevertWorkbook\"] = \"revert-workbook\";\n VerbId[\"SaveExtensionSettings\"] = \"save-extension-settings\";\n VerbId[\"SaveWorkbookAsCustomView\"] = \"save-workbook-as-custom-view\";\n VerbId[\"SelectByValue\"] = \"select-by-value\";\n VerbId[\"SetActiveCustomViewAsDefault\"] = \"set-active-custom-view-as-default\";\n VerbId[\"SetAutoUpdate\"] = \"set-auto-update\";\n VerbId[\"SetClickThrough\"] = \"set-click-through\";\n VerbId[\"SetVizStateWithDataModel\"] = \"set-viz-state-with-data-model\";\n VerbId[\"SetSheetSize\"] = \"set-sheet-size\";\n VerbId[\"SetZoneVisibility\"] = \"set-zone-visibility\";\n VerbId[\"Share\"] = \"share\";\n VerbId[\"ShowCustomView\"] = \"show-custom-view\";\n VerbId[\"TestConversionVerb\"] = \"test-conversion-verb\";\n VerbId[\"Undo\"] = \"undo\";\n VerbId[\"UpdateCustomView\"] = \"update-custom-view\";\n VerbId[\"VizAPI\"] = \"viz-api\";\n})(VerbId = exports.VerbId || (exports.VerbId = {}));\n//# sourceMappingURL=Verbs.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.AskDataOptionNames = {}));\n//# sourceMappingURL=AskDataInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PulseOptionNames;\n(function (PulseOptionNames) {\n PulseOptionNames[\"embed\"] = \"embed\";\n PulseOptionNames[\"token\"] = \"token\";\n PulseOptionNames[\"disableExploreFilter\"] = \"disableExploreFilter\";\n PulseOptionNames[\"layout\"] = \"embed_layout\";\n PulseOptionNames[\"ApiExternalVersion\"] = \":apiExternalVersion\";\n PulseOptionNames[\"ApiInternalVersion\"] = \":apiInternalVersion\";\n PulseOptionNames[\"PulseWebComponent\"] = \":pulseWebComponent\";\n})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {}));\n//# sourceMappingURL=PulseInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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\"] = \":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[\"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 || (exports.VizOptionNames = {}));\n//# sourceMappingURL=VqlInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar guid = require(\"guid\");\nvar JsApiInternalContract_1 = require(\"../JsApiInternalContract\");\nvar CrossFramePreparedMessage_1 = require(\"./CrossFramePreparedMessage\");\nvar MessageTypeChecks_1 = require(\"./MessageTypeChecks\");\nvar 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 */\nvar CrossFrameMessenger = /** @class */ (function () {\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 function CrossFrameMessenger(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 CrossFrameMessenger.prototype.startListening = function () {\n var _this = this;\n // Check if we already are listening, if not, hook up a message listener\n if (!this.unregisterFunction) {\n var boundHandler_1 = this.onMessageReceived.bind(this);\n this.thisWindow.addEventListener('message', boundHandler_1, true);\n this.unregisterFunction = function () { return _this.thisWindow.removeEventListener('message', boundHandler_1, true); };\n }\n };\n CrossFrameMessenger.prototype.stopListening = function () {\n // Stop listening if we have started listening\n if (this.unregisterFunction) {\n this.unregisterFunction();\n this.unregisterFunction = undefined;\n }\n };\n CrossFrameMessenger.prototype.setInitializeMessageHandler = function (handler) {\n this.initializeMessageHandler = handler;\n };\n CrossFrameMessenger.prototype.setCommandResponseMessageHandler = function (handler) {\n this.commandResponseMessageHandler = handler;\n };\n CrossFrameMessenger.prototype.setCommandMessageHandler = function (handler) {\n this.commandMessageHandler = handler;\n };\n CrossFrameMessenger.prototype.setNotificationMessageHandler = function (handler) {\n this.notificationMessageHandler = handler;\n };\n CrossFrameMessenger.prototype.setHandshakeMessageHandler = function (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 CrossFrameMessenger.prototype.prepareInitializationMessage = function (apiVersion, crossFrameVersion, options) {\n var 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 CrossFrameMessenger.prototype.prepareCommandMessage = function (verbId, parameters) {\n var 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 CrossFrameMessenger.prototype.prepareCommandResponseMessage = function (commandGuid, data, error) {\n var 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 CrossFrameMessenger.prototype.prepareNotificationMessage = function (notificationId, data) {\n var 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 CrossFrameMessenger.prototype.prepareAckMessage = function () {\n var 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 CrossFrameMessenger.prototype.prepareMessage = function (msg) {\n if (!this.otherWindow || !this.otherWindowOrigin) {\n throw 'Other window not initialized, cannot dispatch messages';\n }\n var 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 CrossFrameMessenger.prototype.onMessageReceived = function (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 var message = event.data;\n if (!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 (!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 (!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 (!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 (!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 (!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 CrossFrameMessenger.prototype.setOtherWindow = function (otherWindow) {\n this.otherWindow = otherWindow;\n };\n CrossFrameMessenger.prototype.setOtherWindowOrigin = function (origin) {\n this.otherWindowOrigin = origin;\n };\n return CrossFrameMessenger;\n}());\nexports.CrossFrameMessenger = CrossFrameMessenger;\n//# sourceMappingURL=CrossFrameMessenger.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of the PreparedMessage interface used to post messages between\n * two frames using window.postMessage\n */\nvar CrossFramePreparedMessage = /** @class */ (function () {\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 function CrossFramePreparedMessage(_message, _target, _origin) {\n this._message = _message;\n this._target = _target;\n this._origin = _origin;\n }\n Object.defineProperty(CrossFramePreparedMessage.prototype, \"messageGuid\", {\n get: function () {\n return this._message.msgGuid;\n },\n enumerable: true,\n configurable: true\n });\n CrossFramePreparedMessage.prototype.send = function () {\n this._target.postMessage(this._message, this._origin);\n return this;\n };\n return CrossFramePreparedMessage;\n}());\nexports.CrossFramePreparedMessage = CrossFramePreparedMessage;\n//# sourceMappingURL=CrossFramePreparedMessage.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar guid = require(\"guid\");\nvar Notifications_1 = require(\"../contract/Notifications\");\nvar MessageTypes_1 = require(\"./interface/MessageTypes\");\nvar 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 var 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 var 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}\nexports.isMessage = isMessage;\nfunction isVersion(versionNumber) {\n if (!versionNumber) {\n return false;\n }\n var 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}\nexports.isVersion = isVersion;\nfunction isInitMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var 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}\nexports.isInitMessage = isInitMessage;\nfunction isCommandResponseMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var 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}\nexports.isCommandResponseMessage = isCommandResponseMessage;\nfunction isCommandMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var 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}\nexports.isCommandMessage = isCommandMessage;\nfunction isNotificationMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var 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}\nexports.isNotificationMessage = isNotificationMessage;\nfunction isHandshakeMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n var handshakeMessage = message;\n if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) {\n return false;\n }\n return true;\n}\nexports.isHandshakeMessage = isHandshakeMessage;\n//# sourceMappingURL=MessageTypeChecks.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.MessageType = {}));\n//# sourceMappingURL=MessageTypes.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar IdentityVersionConverter = /** @class */ (function () {\n function IdentityVersionConverter() {\n }\n IdentityVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) {\n return {\n verb: verb,\n parameters: parameters,\n };\n };\n IdentityVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) {\n return executeResponse;\n };\n IdentityVersionConverter.prototype.downgradeNotification = function (notification) {\n return notification;\n };\n return IdentityVersionConverter;\n}());\nexports.IdentityVersionConverter = IdentityVersionConverter;\n//# sourceMappingURL=IdentityVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar StackingVersionConverter = /** @class */ (function () {\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 function StackingVersionConverter(_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 /**\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 StackingVersionConverter.fromData = function (externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) {\n return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations);\n };\n StackingVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) {\n // Perform the upgrade of the verb and parameters to the level that platform is using\n var upgraded = { verb: verb, parameters: parameters };\n for (var _i = 0, _a = this._upgradeExecuteTranslations; _i < _a.length; _i++) {\n var upgradeTranslation = _a[_i];\n upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters);\n }\n return upgraded;\n };\n StackingVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) {\n // Downgrade the response to what the external module is expecting\n var downgraded = executeResponse;\n for (var _i = 0, _a = this._downgradeExecuteTranslations; _i < _a.length; _i++) {\n var downgradeTranslation = _a[_i];\n downgraded = downgradeTranslation(downgraded);\n }\n return downgraded;\n };\n StackingVersionConverter.prototype.downgradeNotification = function (notification) {\n // Downgrade the notification to what the external module is expecting\n var downgraded = notification;\n for (var _i = 0, _a = this._downgradeNotificationTranslations; _i < _a.length; _i++) {\n var downgradeTranslation = _a[_i];\n downgraded = downgradeTranslation(downgraded);\n }\n return downgraded;\n };\n return StackingVersionConverter;\n}());\nexports.StackingVersionConverter = StackingVersionConverter;\n//# sourceMappingURL=StackingVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar IdentityVersionConverter_1 = require(\"./IdentityVersionConverter\");\nvar StackingVersionConverter_1 = require(\"./StackingVersionConverter\");\nvar 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}\nexports.VersionLessThan = VersionLessThan;\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}\nexports.VersionEqualTo = VersionEqualTo;\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: [],\n },\n};\nexports.ExecuteMinorDowngrades = {\n 1: {\n 5: [VersionTranslations_1.DowngradeWorksheetNames],\n 9: [],\n },\n};\nexports.NotificationMinorDowngrades = {\n 1: {\n 9: [],\n 10: [VersionTranslations_1.DowngradeFlipboardZoneID],\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}\nexports.CreateVersionConverter = CreateVersionConverter;\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 var externalMajorVersion = externalVersion.major;\n var externalMinorVersion = externalVersion.minor;\n var 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 var neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades);\n var neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades);\n var 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}\nexports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators;\nfunction GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) {\n var neededTranslations = [];\n for (var major = externalMajorVersion; major <= platformMajorVersion; major++) {\n if (major in majorMinorTranslators) {\n var start = major === externalMajorVersion ? externalMinorVersion : 0;\n var maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major]));\n for (var minor = start; minor <= maximumMinorVersion; minor++) {\n if (minor in majorMinorTranslators[major]) {\n neededTranslations.push.apply(neededTranslations, majorMinorTranslators[major][minor]);\n }\n }\n }\n }\n return neededTranslations;\n}\nfunction GetMaximumMinorIndex(minorVersions) {\n return minorVersions.map(function (a) { return Number(a); }).reduce(function (a, b) { return (a > b ? a : b); });\n}\nexports.GetMaximumMinorIndex = GetMaximumMinorIndex;\n//# sourceMappingURL=VersionConverterFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar 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 var bootstrapInfo = executeResponse.result;\n if (bootstrapInfo.extensionDashboardInfo !== undefined) {\n bootstrapInfo.extensionDashboardInfo.zones.forEach(function (zone) {\n if (zone.sheetInfo) {\n zone.name = zone.sheetInfo.name;\n }\n });\n }\n return executeResponse;\n}\nexports.DowngradeWorksheetNames = DowngradeWorksheetNames;\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 var visualModel = notification.data;\n if (visualModel.flipboardZoneID === undefined) {\n visualModel.flipboardZoneID = 0;\n }\n }\n return notification;\n}\nexports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID;\n//# sourceMappingURL=VersionTranslations.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar ExternalIdentityVersionConverter = /** @class */ (function () {\n function ExternalIdentityVersionConverter() {\n }\n ExternalIdentityVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) {\n return {\n verb: verb,\n parameters: parameters,\n };\n };\n ExternalIdentityVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) {\n return executeResponse;\n };\n ExternalIdentityVersionConverter.prototype.upgradeNotification = function (notification) {\n return notification;\n };\n return ExternalIdentityVersionConverter;\n}());\nexports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter;\n//# sourceMappingURL=ExternalIdentityVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar ExternalStackingVersionConverter = /** @class */ (function () {\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 function ExternalStackingVersionConverter(_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 ExternalStackingVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) {\n // Perform the downgrade of the verb and parameters to the level that platform is using\n var downgraded = { verb: verb, parameters: parameters };\n for (var _i = 0, _a = this._downgradeExecuteCallTranslations; _i < _a.length; _i++) {\n var downgradeTranslation = _a[_i];\n downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters);\n }\n return downgraded;\n };\n ExternalStackingVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) {\n // Perform the upgrade of the response to what the external module is expecting\n var upgraded = executeResponse;\n for (var _i = 0, _a = this._upgradeExecuteReturnTranslations; _i < _a.length; _i++) {\n var upgradeTranslation = _a[_i];\n upgraded = upgradeTranslation(upgraded, verb, parameters);\n }\n return upgraded;\n };\n ExternalStackingVersionConverter.prototype.upgradeNotification = function (notification) {\n // Perform the upgrade of notification to what the external module is expecting\n var upgraded = notification;\n for (var _i = 0, _a = this._upgradeNotificationTranslations; _i < _a.length; _i++) {\n var upgradeNotification = _a[_i];\n upgraded = upgradeNotification(upgraded);\n }\n return upgraded;\n };\n return ExternalStackingVersionConverter;\n}());\nexports.ExternalStackingVersionConverter = ExternalStackingVersionConverter;\n//# sourceMappingURL=ExternalStackingVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar VersionConverterFactory_1 = require(\"../VersionConverterFactory\");\nvar ExternalIdentityVersionConverter_1 = require(\"./ExternalIdentityVersionConverter\");\nvar ExternalStackingVersionConverter_1 = require(\"./ExternalStackingVersionConverter\");\nvar ExternalVersionTranslations_1 = require(\"./ExternalVersionTranslations\");\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: [],\n 13: [ExternalVersionTranslations_1.DowngradeUnderlyingTableDataAsync, ExternalVersionTranslations_1.DowngradeLogicalTableDataAsync],\n },\n};\nexports.ExecuteMinorUpgradeReturnExternal = {\n 1: {\n 9: [ExternalVersionTranslations_1.UpgradeDataTableTypes],\n 29: [ExternalVersionTranslations_1.UpgradeDataTableRowsAndColumns],\n },\n};\nexports.ExecuteMinorUpgradeNotification = {\n 1: {\n 9: [],\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}\nexports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter;\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 var externalMajorVersion = externalVersion.major;\n var platformMajorVersion = platformVersion.major;\n var 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 || 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 var neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades);\n var neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades);\n var 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}\nexports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators;\nfunction GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) {\n var neededTranslations = [];\n if (platformMajorVersion in majorMinorTranslators) {\n var start = platformMinorVersion;\n var maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion]));\n for (var minor = start; minor <= maximumMinorVersion; minor++) {\n if (minor in majorMinorTranslators[platformMajorVersion]) {\n neededTranslations.push.apply(neededTranslations, majorMinorTranslators[platformMajorVersion][minor]);\n }\n }\n }\n return neededTranslations;\n}\n//# sourceMappingURL=ExternalVersionConverterFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar JsApiInternalContract_1 = require(\"../../JsApiInternalContract\");\n// 1.2 -> 1.0 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';\n/**\n * Prior to 2019.2 (internal-contract v1.9), DataValue.value were all strings.\n * Go through all DataValue objects. If we have a string, but the type should not be a string,\n * convert it to the correct type. The type of DataValue.value is 'any' in the contract, so\n * this change doesn't need any updates to classes or types.\n */\nfunction UpgradeDataTableTypes(executeResponse, verb, parameters) {\n if (!executeResponse) {\n return executeResponse;\n }\n var oldUnderlyingDataTable = executeResponse.result;\n if (oldUnderlyingDataTable.data !== undefined && oldUnderlyingDataTable.isSummary !== undefined) {\n convertDataValues(oldUnderlyingDataTable.data);\n return executeResponse;\n }\n var oldSelectedMarksTable = executeResponse.result;\n if (oldSelectedMarksTable.data !== undefined && Array.isArray(oldSelectedMarksTable.data)) {\n oldSelectedMarksTable.data.forEach(function (marksTable) {\n convertDataValues(marksTable);\n });\n return executeResponse;\n }\n return executeResponse;\n}\nexports.UpgradeDataTableTypes = UpgradeDataTableTypes;\n/**\n * Prior to 2020.2 (internal-contract v1.13 and older), worksheet.getUnderlyingTableDataAsync doesn't exist.\n * Map it to the older GetUnderlyingData verb and validate the the logical table Id.\n **/\nfunction DowngradeUnderlyingTableDataAsync(verb, parameters) {\n if (verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData) {\n validateParametersForObjectModel(verb, parameters);\n verb = JsApiInternalContract_1.VerbId.GetUnderlyingData;\n }\n return {\n verb: verb,\n parameters: parameters,\n };\n}\nexports.DowngradeUnderlyingTableDataAsync = DowngradeUnderlyingTableDataAsync;\n/**\n * Prior to 2020.2 (internal-contract v1.13 and older), datasource.getLogicalTableDataAsync doesn't exist.\n * Map it to the older GetDataSourceData verb and validate the the logical table Id.\n **/\nfunction DowngradeLogicalTableDataAsync(verb, parameters) {\n if (verb === JsApiInternalContract_1.VerbId.GetLogicalTableData) {\n validateParametersForObjectModel(verb, parameters);\n verb = JsApiInternalContract_1.VerbId.GetDataSourceData;\n }\n return {\n verb: verb,\n parameters: parameters,\n };\n}\nexports.DowngradeLogicalTableDataAsync = DowngradeLogicalTableDataAsync;\nfunction convertDataValues(table) {\n // dataTable is a two-dimensional array of data. First index is the row, second is the column.\n if (table === undefined || table.dataTable === undefined || !Array.isArray(table.dataTable)) {\n return;\n }\n table.dataTable.forEach(function (row) {\n row.forEach(function (dataValue, columnIndex) {\n var value = dataValue.value;\n if (value !== null) {\n dataValue.value = JsApiInternalContract_1.DataTypeConverter.convertValueAsStringToValue(value, table.headers[columnIndex].dataType);\n }\n });\n });\n}\n// ToDo: TFS1069027 Refactor input verbs & parameters in api-internal-contract Upgrade/Downgrade framework\nfunction validateParametersForObjectModel(verb, parameters) {\n if (parameters[JsApiInternalContract_1.ParameterId.LogicalTableId] !== JsApiInternalContract_1.ApiShowDataTableSentinel.SingleTableId) {\n throw new Error(\"Invalid logical table id passed to \" + verb + \".\");\n }\n}\n/**\n * Prior to 2021.2 (internal-contract v1.29 and below), getSummaryDataAsync did not support maxRows,\n * and any get...DataAsync did not support columnsToIncludeById.\n * Trim result to maxRows if it is included in the parameters for getSummaryDataAsync\n * Trim columns to columnsToInclude if included in the parameters for any get...DataAsync\n */\nfunction UpgradeDataTableRowsAndColumns(executeResponse, verb, parameters) {\n if (isGetSummaryDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.MaxRows]) {\n executeResponse = adjustDataRowLength(executeResponse, parameters[JsApiInternalContract_1.ParameterId.MaxRows]);\n }\n if (isGetTableDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]) {\n executeResponse = adjustDataColumns(executeResponse, parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]);\n }\n return executeResponse;\n}\nexports.UpgradeDataTableRowsAndColumns = UpgradeDataTableRowsAndColumns;\nfunction isGetSummaryDataVerb(verb) {\n return verb === JsApiInternalContract_1.VerbId.GetDataSummaryData;\n}\nfunction isGetTableDataVerb(verb) {\n return (verb === JsApiInternalContract_1.VerbId.GetDataSummaryData ||\n verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData ||\n verb === JsApiInternalContract_1.VerbId.GetLogicalTableData ||\n verb === JsApiInternalContract_1.VerbId.GetDataSourceData ||\n verb === JsApiInternalContract_1.VerbId.GetUnderlyingData);\n}\nfunction adjustDataRowLength(executeResponse, maxRows) {\n var underlyingDataTable = executeResponse.result;\n if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable)) {\n return executeResponse;\n }\n if (maxRows > 0 && maxRows < underlyingDataTable.data.dataTable.length) {\n underlyingDataTable.data.dataTable.length = maxRows;\n }\n return executeResponse;\n}\nfunction adjustDataColumns(executeResponse, columnsToInclude) {\n if (columnsToInclude.length === 0) {\n return executeResponse;\n }\n // verify that we have a valid UnderlyingDataTable\n var underlyingDataTable = executeResponse.result;\n if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable) || !Array.isArray(underlyingDataTable.data.headers)) {\n return executeResponse;\n }\n // 1. filter the headers to only columnsToInclude\n // 2. use the new headers to filter all rows\n // 3. update the indices in our new headers\n var newHeaders = underlyingDataTable.data.headers.filter(function (header, index) {\n return columnsToInclude.find(function (name) { return name === header.fieldName; });\n });\n underlyingDataTable.data.dataTable.forEach(function (row, index) {\n underlyingDataTable.data.dataTable[index] = row.filter(function (value, valueIndex) { return newHeaders.findIndex(function (header) { return header.index === valueIndex; }) !== -1; });\n });\n var newIndex = 0;\n underlyingDataTable.data.headers = newHeaders.map(function (header) {\n header.index = newIndex++;\n return header;\n });\n return executeResponse;\n}\n//# sourceMappingURL=ExternalVersionTranslations.js.map","\"use strict\";\n// Export everything which had been previously in the api-shared module\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ApiVersion_1 = require(\"./ApiShared/ApiVersion\");\nexports.ApiVersion = ApiVersion_1.ApiVersion;\n__export(require(\"./ApiShared/CrossFrame/CrossFrameBootstrap\"));\nvar CrossFrameDispatcher_1 = require(\"./ApiShared/CrossFrame/CrossFrameDispatcher\");\nexports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher;\nvar DataSource_1 = require(\"./ApiShared/DataSource\");\nexports.DataSource = DataSource_1.DataSource;\nvar ExternalToInternalEnumMappings_1 = require(\"./ApiShared/EnumMappings/ExternalToInternalEnumMappings\");\nexports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings;\nvar InternalToExternalEnumMappings_1 = require(\"./ApiShared/EnumMappings/InternalToExternalEnumMappings\");\nexports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings;\nvar EventListenerManager_1 = require(\"./ApiShared/EventListenerManager\");\nexports.EventListenerManager = EventListenerManager_1.EventListenerManager;\nvar Field_1 = require(\"./ApiShared/Field\");\nexports.Field = Field_1.Field;\nvar CustomViewImpl_1 = require(\"./ApiShared/Impl/CustomViewImpl\");\nexports.CustomViewImpl = CustomViewImpl_1.CustomViewImpl;\nvar DashboardImpl_1 = require(\"./ApiShared/Impl/DashboardImpl\");\nexports.DashboardImpl = DashboardImpl_1.DashboardImpl;\nvar DashboardObjectImpl_1 = require(\"./ApiShared/Impl/DashboardObjectImpl\");\nexports.DashboardObjectImpl = DashboardObjectImpl_1.DashboardObjectImpl;\nvar DataSourceImpl_1 = require(\"./ApiShared/Impl/DataSourceImpl\");\nexports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl;\nvar ParameterImpl_1 = require(\"./ApiShared/Impl/ParameterImpl\");\nexports.ParameterImpl = ParameterImpl_1.ParameterImpl;\nvar SheetImpl_1 = require(\"./ApiShared/Impl/SheetImpl\");\nexports.SheetImpl = SheetImpl_1.SheetImpl;\nvar SheetInfoImpl_1 = require(\"./ApiShared/Impl/SheetInfoImpl\");\nexports.SheetInfoImpl = SheetInfoImpl_1.SheetInfoImpl;\nvar SingleEventManagerImpl_1 = require(\"./ApiShared/Impl/SingleEventManagerImpl\");\nexports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl;\nvar StoryImpl_1 = require(\"./ApiShared/Impl/StoryImpl\");\nexports.StoryImpl = StoryImpl_1.StoryImpl;\nvar StoryPointImpl_1 = require(\"./ApiShared/Impl/StoryPointImpl\");\nexports.StoryPointImpl = StoryPointImpl_1.StoryPointImpl;\nvar StoryPointInfoImpl_1 = require(\"./ApiShared/Impl/StoryPointInfoImpl\");\nexports.StoryPointInfoImpl = StoryPointInfoImpl_1.StoryPointInfoImpl;\nvar WorkbookImpl_1 = require(\"./ApiShared/Impl/WorkbookImpl\");\nexports.WorkbookImpl = WorkbookImpl_1.WorkbookImpl;\nvar WorksheetImpl_1 = require(\"./ApiShared/Impl/WorksheetImpl\");\nexports.WorksheetImpl = WorksheetImpl_1.WorksheetImpl;\nvar Point_1 = require(\"./ApiShared/Point\");\nexports.Point = Point_1.Point;\n__export(require(\"./ApiShared/Services/RegisterAllSharedServices\"));\n__export(require(\"./ApiShared/Services/ServiceRegistry\"));\nvar ClientInfoServiceImpl_1 = require(\"./ApiShared/Services/impl/ClientInfoServiceImpl\");\nexports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl;\nvar NotificationServiceImpl_1 = require(\"./ApiShared/Services/impl/NotificationServiceImpl\");\nexports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl;\nvar NotificationServiceImplBase_1 = require(\"./ApiShared/Services/impl/NotificationServiceImplBase\");\nexports.NotificationServiceImplBase = NotificationServiceImplBase_1.NotificationServiceImplBase;\nexports.Registration = NotificationServiceImplBase_1.Registration;\nvar ServiceImplBase_1 = require(\"./ApiShared/Services/impl/ServiceImplBase\");\nexports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase;\nvar SizeServiceImpl_1 = require(\"./ApiShared/Services/impl/SizeServiceImpl\");\nexports.SizeServiceImpl = SizeServiceImpl_1.SizeServiceImpl;\nvar StoryActivationServiceImpl_1 = require(\"./ApiShared/Services/impl/StoryActivationServiceImpl\");\nexports.StoryActivationServiceImpl = StoryActivationServiceImpl_1.StoryActivationServiceImpl;\nvar TableauError_1 = require(\"./ApiShared/TableauError\");\nexports.TableauError = TableauError_1.TableauError;\nvar Deferred_1 = require(\"./ApiShared/Utils/Deferred\");\nexports.Deferred = Deferred_1.Deferred;\nvar ErrorHelpers_1 = require(\"./ApiShared/Utils/ErrorHelpers\");\nexports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers;\nvar ExportHelpers_1 = require(\"./ApiShared/Utils/ExportHelpers\");\nexports.ExportHelpers = ExportHelpers_1.ExportHelpers;\nvar SheetUtils_1 = require(\"./ApiShared/Utils/SheetUtils\");\nexports.SheetUtils = SheetUtils_1.SheetUtils;\nvar VersionNumber_1 = require(\"./ApiShared/VersionNumber\");\nexports.VersionNumber = VersionNumber_1.VersionNumber;\nvar VersionedExternalApiDispatcher_1 = require(\"./VersionedExternalApiDispatcher\");\nexports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher;\n//# sourceMappingURL=ApiShared.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar VersionNumber_1 = require(\"./VersionNumber\");\n/**\n * This is the singleton wrapper of VersionNumber\n */\nvar ApiVersion = /** @class */ (function () {\n function ApiVersion() {\n }\n Object.defineProperty(ApiVersion, \"Instance\", {\n /**\n * Gets the singleton instance of the version number.\n */\n get: function () {\n return ApiVersion._instance;\n },\n enumerable: true,\n configurable: true\n });\n ApiVersion.SetVersionNumber = function (numString, isAlpha) {\n ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha);\n };\n return ApiVersion;\n}());\nexports.ApiVersion = ApiVersion;\n//# sourceMappingURL=ApiVersion.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a connection summary.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nvar ConnectionSummary = /** @class */ (function () {\n function ConnectionSummary(_connectionInfo) {\n this._connectionInfo = _connectionInfo;\n }\n Object.defineProperty(ConnectionSummary.prototype, \"name\", {\n get: function () {\n return this._connectionInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ConnectionSummary.prototype, \"id\", {\n get: function () {\n return this._connectionInfo.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ConnectionSummary.prototype, \"serverURI\", {\n get: function () {\n return this._connectionInfo.serverURI;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ConnectionSummary.prototype, \"type\", {\n get: function () {\n return this._connectionInfo.type;\n },\n enumerable: true,\n configurable: true\n });\n return ConnectionSummary;\n}());\nexports.ConnectionSummary = ConnectionSummary;\n//# sourceMappingURL=ConnectionSummary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar 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(function (resolve, reject) {\n var 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 var messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*');\n // Prepare to send an initialization message to the parent frame\n var 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 var dispatcherFactory = function () { return 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}\nexports.doCrossFrameBootstrap = doCrossFrameBootstrap;\n//# sourceMappingURL=CrossFrameBootstrap.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar 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 */\nvar CrossFrameDispatcher = /** @class */ (function () {\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 function CrossFrameDispatcher(_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 CrossFrameDispatcher.prototype.execute = function (verb, parameters) {\n var _this = this;\n // To execute a verb, we first prepare a command message and then define a promise.\n var preparedMessage = this._messenger.prepareCommandMessage(verb, parameters);\n var promise = new Promise(function (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 CrossFrameDispatcher.prototype.registerNotificationHandler = function (handler) {\n this._notificationHandlers.push(handler);\n };\n CrossFrameDispatcher.prototype.unregisterNotificationHandler = function (handler) {\n this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; });\n };\n ////// End InternalApiDispatcher implementation\n CrossFrameDispatcher.prototype.onCommandResponse = function (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 var 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 CrossFrameDispatcher.prototype.onNotification = function (notificationMessage) {\n // Go through each notification handler we have registered and let them know a notification came in\n for (var _i = 0, _a = this._notificationHandlers; _i < _a.length; _i++) {\n var handler = _a[_i];\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 return CrossFrameDispatcher;\n}());\nexports.CrossFrameDispatcher = CrossFrameDispatcher;\n//# sourceMappingURL=CrossFrameDispatcher.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar DataSource = /** @class */ (function () {\n function DataSource(_dataSourceImpl) {\n this._dataSourceImpl = _dataSourceImpl;\n }\n Object.defineProperty(DataSource.prototype, \"name\", {\n get: function () {\n return this._dataSourceImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"id\", {\n get: function () {\n return this._dataSourceImpl.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"fields\", {\n get: function () {\n return this._dataSourceImpl.fields;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"extractUpdateTime\", {\n get: function () {\n return this._dataSourceImpl.extractUpdateTime;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"isExtract\", {\n get: function () {\n return this._dataSourceImpl.isExtract;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSource.prototype, \"isPublished\", {\n get: function () {\n return this._dataSourceImpl.isPublished;\n },\n enumerable: true,\n configurable: true\n });\n DataSource.prototype.publishedUrl = function () {\n return this._dataSourceImpl.publishedUrl();\n };\n DataSource.prototype.refreshAsync = function () {\n return this._dataSourceImpl.refreshAsync();\n };\n DataSource.prototype.getActiveTablesAsync = function () {\n console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.');\n return this._dataSourceImpl.getActiveTablesAsync();\n };\n DataSource.prototype.getConnectionSummariesAsync = function () {\n return this._dataSourceImpl.getConnectionSummariesAsync();\n };\n DataSource.prototype.getUnderlyingDataAsync = function (options) {\n console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' +\n 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.');\n return this._dataSourceImpl.getUnderlyingDataAsync(options);\n };\n DataSource.prototype.getLogicalTablesAsync = function () {\n return this._dataSourceImpl.getLogicalTablesAsync();\n };\n DataSource.prototype.getLogicalTableDataAsync = function (logicalTableId, options) {\n return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options);\n };\n DataSource.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) {\n return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options);\n };\n return DataSource;\n}());\nexports.DataSource = DataSource;\n//# sourceMappingURL=DataSource.js.map","\"use strict\";\nvar _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar 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 */\nvar ExternalToInternalEnumMappings = /** @class */ (function () {\n function ExternalToInternalEnumMappings() {\n }\n ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter((_a = {},\n _a[api_external_contract_js_1.FilterDomainType.Relevant] = api_internal_contract_js_1.FilterDomainType.Relevant,\n _a[api_external_contract_js_1.FilterDomainType.Database] = api_internal_contract_js_1.FilterDomainType.Database,\n _a));\n ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter((_b = {},\n _b[api_external_contract_js_1.FilterNullOption.AllValues] = api_internal_contract_js_1.FilterNullOption.AllValues,\n _b[api_external_contract_js_1.FilterNullOption.NonNullValues] = api_internal_contract_js_1.FilterNullOption.NonNullValues,\n _b[api_external_contract_js_1.FilterNullOption.NullValues] = api_internal_contract_js_1.FilterNullOption.NullValues,\n _b));\n ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_c = {},\n _c[api_external_contract_js_1.FilterUpdateType.Add] = api_internal_contract_js_1.FilterUpdateType.Add,\n _c[api_external_contract_js_1.FilterUpdateType.All] = api_internal_contract_js_1.FilterUpdateType.All,\n _c[api_external_contract_js_1.FilterUpdateType.Remove] = api_internal_contract_js_1.FilterUpdateType.Remove,\n _c[api_external_contract_js_1.FilterUpdateType.Replace] = api_internal_contract_js_1.FilterUpdateType.Replace,\n _c));\n ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter((_d = {},\n _d[api_external_contract_js_1.ZoneVisibilityType.Show] = true,\n _d[api_external_contract_js_1.ZoneVisibilityType.Hide] = false,\n _d));\n ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter((_e = {},\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 _e[api_external_contract_js_1.ReplaySpeedType.Slow] = 2.0,\n _e[api_external_contract_js_1.ReplaySpeedType.Normal] = 1.0,\n _e[api_external_contract_js_1.ReplaySpeedType.Fast] = 0.5,\n _e));\n ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {},\n _f[api_external_contract_js_1.SheetType.Dashboard] = api_internal_contract_js_1.SheetType.Dashboard,\n _f[api_external_contract_js_1.SheetType.Worksheet] = api_internal_contract_js_1.SheetType.Worksheet,\n _f[api_external_contract_js_1.SheetType.Story] = api_internal_contract_js_1.SheetType.Story,\n _f));\n ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter((_g = {},\n _g[api_external_contract_js_1.IncludeDataValuesOption.AllValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues,\n _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,\n _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues] = api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly,\n _g));\n ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter((_h = {},\n _h[api_external_contract_js_1.PeriodType.Years] = api_internal_contract_js_1.DateStepPeriod.Years,\n _h[api_external_contract_js_1.PeriodType.Quarters] = api_internal_contract_js_1.DateStepPeriod.Quarters,\n _h[api_external_contract_js_1.PeriodType.Months] = api_internal_contract_js_1.DateStepPeriod.Months,\n _h[api_external_contract_js_1.PeriodType.Weeks] = api_internal_contract_js_1.DateStepPeriod.Weeks,\n _h[api_external_contract_js_1.PeriodType.Days] = api_internal_contract_js_1.DateStepPeriod.Days,\n _h[api_external_contract_js_1.PeriodType.Hours] = api_internal_contract_js_1.DateStepPeriod.Hours,\n _h[api_external_contract_js_1.PeriodType.Minutes] = api_internal_contract_js_1.DateStepPeriod.Minutes,\n _h[api_external_contract_js_1.PeriodType.Seconds] = api_internal_contract_js_1.DateStepPeriod.Seconds,\n _h));\n ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_j = {},\n _j[api_external_contract_js_1.DateRangeType.Last] = api_internal_contract_js_1.DateRangeType.Last,\n _j[api_external_contract_js_1.DateRangeType.LastN] = api_internal_contract_js_1.DateRangeType.LastN,\n _j[api_external_contract_js_1.DateRangeType.Next] = api_internal_contract_js_1.DateRangeType.Next,\n _j[api_external_contract_js_1.DateRangeType.NextN] = api_internal_contract_js_1.DateRangeType.NextN,\n _j[api_external_contract_js_1.DateRangeType.Current] = api_internal_contract_js_1.DateRangeType.Current,\n _j[api_external_contract_js_1.DateRangeType.ToDate] = api_internal_contract_js_1.DateRangeType.ToDate,\n _j));\n ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter((_k = {},\n _k[api_external_contract_js_1.DialogStyle.Window] = api_internal_contract_js_1.DialogStyle.Window,\n _k[api_external_contract_js_1.DialogStyle.Modal] = api_internal_contract_js_1.DialogStyle.Modal,\n _k[api_external_contract_js_1.DialogStyle.Modeless] = api_internal_contract_js_1.DialogStyle.Modeless,\n _k));\n return ExternalToInternalEnumMappings;\n}());\nexports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings;\n/* tslint:enable:typedef */\n//# sourceMappingURL=ExternalToInternalEnumMappings.js.map","\"use strict\";\nvar _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar 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 */\nvar InternalToExternalEnumMappings = /** @class */ (function () {\n function InternalToExternalEnumMappings() {\n }\n InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter((_a = {},\n _a[api_internal_contract_js_1.ExtensionContext.Desktop] = api_external_contract_js_1.ExtensionContext.Desktop,\n _a[api_internal_contract_js_1.ExtensionContext.Server] = api_external_contract_js_1.ExtensionContext.Server,\n _a));\n InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter((_b = {},\n _b[api_internal_contract_js_1.ExtensionMode.Authoring] = api_external_contract_js_1.ExtensionMode.Authoring,\n _b[api_internal_contract_js_1.ExtensionMode.Viewing] = api_external_contract_js_1.ExtensionMode.Viewing,\n _b));\n InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter((_c = {},\n _c[api_internal_contract_js_1.ColumnType.Continuous] = api_external_contract_js_1.ColumnType.Continuous,\n _c[api_internal_contract_js_1.ColumnType.Discrete] = api_external_contract_js_1.ColumnType.Discrete,\n _c[api_internal_contract_js_1.ColumnType.Unknown] = api_external_contract_js_1.ColumnType.Unknown,\n _c));\n InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter((_d = {},\n _d[api_internal_contract_js_1.FieldAggregationType.Attr] = api_external_contract_js_1.FieldAggregationType.Attr,\n _d[api_internal_contract_js_1.FieldAggregationType.Avg] = api_external_contract_js_1.FieldAggregationType.Avg,\n _d[api_internal_contract_js_1.FieldAggregationType.Collect] = api_external_contract_js_1.FieldAggregationType.Collect,\n _d[api_internal_contract_js_1.FieldAggregationType.Count] = api_external_contract_js_1.FieldAggregationType.Count,\n _d[api_internal_contract_js_1.FieldAggregationType.Countd] = api_external_contract_js_1.FieldAggregationType.Countd,\n _d[api_internal_contract_js_1.FieldAggregationType.Day] = api_external_contract_js_1.FieldAggregationType.Day,\n _d[api_internal_contract_js_1.FieldAggregationType.End] = api_external_contract_js_1.FieldAggregationType.End,\n _d[api_internal_contract_js_1.FieldAggregationType.Hour] = api_external_contract_js_1.FieldAggregationType.Hour,\n _d[api_internal_contract_js_1.FieldAggregationType.InOut] = api_external_contract_js_1.FieldAggregationType.InOut,\n _d[api_internal_contract_js_1.FieldAggregationType.Kurtosis] = api_external_contract_js_1.FieldAggregationType.Kurtosis,\n _d[api_internal_contract_js_1.FieldAggregationType.Max] = api_external_contract_js_1.FieldAggregationType.Max,\n _d[api_internal_contract_js_1.FieldAggregationType.Mdy] = api_external_contract_js_1.FieldAggregationType.Mdy,\n _d[api_internal_contract_js_1.FieldAggregationType.Median] = api_external_contract_js_1.FieldAggregationType.Median,\n _d[api_internal_contract_js_1.FieldAggregationType.Min] = api_external_contract_js_1.FieldAggregationType.Min,\n _d[api_internal_contract_js_1.FieldAggregationType.Minute] = api_external_contract_js_1.FieldAggregationType.Minute,\n _d[api_internal_contract_js_1.FieldAggregationType.MonthYear] = api_external_contract_js_1.FieldAggregationType.MonthYear,\n _d[api_internal_contract_js_1.FieldAggregationType.None] = api_external_contract_js_1.FieldAggregationType.None,\n _d[api_internal_contract_js_1.FieldAggregationType.Qtr] = api_external_contract_js_1.FieldAggregationType.Qtr,\n _d[api_internal_contract_js_1.FieldAggregationType.Quart1] = api_external_contract_js_1.FieldAggregationType.Quart1,\n _d[api_internal_contract_js_1.FieldAggregationType.Quart3] = api_external_contract_js_1.FieldAggregationType.Quart3,\n _d[api_internal_contract_js_1.FieldAggregationType.Second] = api_external_contract_js_1.FieldAggregationType.Second,\n _d[api_internal_contract_js_1.FieldAggregationType.Skewness] = api_external_contract_js_1.FieldAggregationType.Skewness,\n _d[api_internal_contract_js_1.FieldAggregationType.Stdev] = api_external_contract_js_1.FieldAggregationType.Stdev,\n _d[api_internal_contract_js_1.FieldAggregationType.Stdevp] = api_external_contract_js_1.FieldAggregationType.Stdevp,\n _d[api_internal_contract_js_1.FieldAggregationType.Sum] = api_external_contract_js_1.FieldAggregationType.Sum,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncDay] = api_external_contract_js_1.FieldAggregationType.TruncDay,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncHour] = api_external_contract_js_1.FieldAggregationType.TruncHour,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncMinute] = api_external_contract_js_1.FieldAggregationType.TruncMinute,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncMonth] = api_external_contract_js_1.FieldAggregationType.TruncMonth,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncQtr] = api_external_contract_js_1.FieldAggregationType.TruncQtr,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncSecond] = api_external_contract_js_1.FieldAggregationType.TruncSecond,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncWeek] = api_external_contract_js_1.FieldAggregationType.TruncWeek,\n _d[api_internal_contract_js_1.FieldAggregationType.TruncYear] = api_external_contract_js_1.FieldAggregationType.TruncYear,\n _d[api_internal_contract_js_1.FieldAggregationType.User] = api_external_contract_js_1.FieldAggregationType.User,\n _d[api_internal_contract_js_1.FieldAggregationType.Var] = api_external_contract_js_1.FieldAggregationType.Var,\n _d[api_internal_contract_js_1.FieldAggregationType.Varp] = api_external_contract_js_1.FieldAggregationType.Varp,\n _d[api_internal_contract_js_1.FieldAggregationType.Week] = api_external_contract_js_1.FieldAggregationType.Week,\n _d[api_internal_contract_js_1.FieldAggregationType.Weekday] = api_external_contract_js_1.FieldAggregationType.Weekday,\n _d[api_internal_contract_js_1.FieldAggregationType.Year] = api_external_contract_js_1.FieldAggregationType.Year,\n _d));\n InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter((_e = {},\n _e[api_internal_contract_js_1.FieldRoleType.Dimension] = api_external_contract_js_1.FieldRoleType.Dimension,\n _e[api_internal_contract_js_1.FieldRoleType.Measure] = api_external_contract_js_1.FieldRoleType.Measure,\n _e[api_internal_contract_js_1.FieldRoleType.Unknown] = api_external_contract_js_1.FieldRoleType.Unknown,\n _e));\n InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {},\n _f[api_internal_contract_js_1.SheetType.Dashboard] = api_external_contract_js_1.SheetType.Dashboard,\n _f[api_internal_contract_js_1.SheetType.Story] = api_external_contract_js_1.SheetType.Story,\n _f[api_internal_contract_js_1.SheetType.Worksheet] = api_external_contract_js_1.SheetType.Worksheet,\n _f));\n InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter((_g = {},\n _g[api_internal_contract_js_1.DashboardObjectType.Extension] = api_external_contract_js_1.DashboardObjectType.Extension,\n _g[api_internal_contract_js_1.DashboardObjectType.Blank] = api_external_contract_js_1.DashboardObjectType.Blank,\n _g[api_internal_contract_js_1.DashboardObjectType.Image] = api_external_contract_js_1.DashboardObjectType.Image,\n _g[api_internal_contract_js_1.DashboardObjectType.Legend] = api_external_contract_js_1.DashboardObjectType.Legend,\n _g[api_internal_contract_js_1.DashboardObjectType.PageFilter] = api_external_contract_js_1.DashboardObjectType.PageFilter,\n _g[api_internal_contract_js_1.DashboardObjectType.ParameterControl] = api_external_contract_js_1.DashboardObjectType.ParameterControl,\n _g[api_internal_contract_js_1.DashboardObjectType.QuickFilter] = api_external_contract_js_1.DashboardObjectType.QuickFilter,\n _g[api_internal_contract_js_1.DashboardObjectType.Text] = api_external_contract_js_1.DashboardObjectType.Text,\n _g[api_internal_contract_js_1.DashboardObjectType.Title] = api_external_contract_js_1.DashboardObjectType.Title,\n _g[api_internal_contract_js_1.DashboardObjectType.WebPage] = api_external_contract_js_1.DashboardObjectType.WebPage,\n _g[api_internal_contract_js_1.DashboardObjectType.Worksheet] = api_external_contract_js_1.DashboardObjectType.Worksheet,\n _g));\n InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter((_h = {},\n _h[api_internal_contract_js_1.DataType.Bool] = api_external_contract_js_1.DataType.Bool,\n _h[api_internal_contract_js_1.DataType.Date] = api_external_contract_js_1.DataType.Date,\n _h[api_internal_contract_js_1.DataType.DateTime] = api_external_contract_js_1.DataType.DateTime,\n _h[api_internal_contract_js_1.DataType.Float] = api_external_contract_js_1.DataType.Float,\n _h[api_internal_contract_js_1.DataType.Int] = api_external_contract_js_1.DataType.Int,\n _h[api_internal_contract_js_1.DataType.Spatial] = api_external_contract_js_1.DataType.Spatial,\n _h[api_internal_contract_js_1.DataType.String] = api_external_contract_js_1.DataType.String,\n _h));\n InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_j = {},\n _j[api_internal_contract_js_1.FilterUpdateType.Add] = api_external_contract_js_1.FilterUpdateType.Add,\n _j[api_internal_contract_js_1.FilterUpdateType.All] = api_external_contract_js_1.FilterUpdateType.All,\n _j[api_internal_contract_js_1.FilterUpdateType.Remove] = api_external_contract_js_1.FilterUpdateType.Remove,\n _j[api_internal_contract_js_1.FilterUpdateType.Replace] = api_external_contract_js_1.FilterUpdateType.Replace,\n _j));\n InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter((_k = {},\n _k[api_internal_contract_js_1.DomainRestrictionType.All] = api_external_contract_js_1.ParameterValueType.All,\n _k[api_internal_contract_js_1.DomainRestrictionType.List] = api_external_contract_js_1.ParameterValueType.List,\n _k[api_internal_contract_js_1.DomainRestrictionType.Range] = api_external_contract_js_1.ParameterValueType.Range,\n _k));\n InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter((_l = {},\n _l[api_internal_contract_js_1.DateStepPeriod.Years] = api_external_contract_js_1.PeriodType.Years,\n _l[api_internal_contract_js_1.DateStepPeriod.Quarters] = api_external_contract_js_1.PeriodType.Quarters,\n _l[api_internal_contract_js_1.DateStepPeriod.Months] = api_external_contract_js_1.PeriodType.Months,\n _l[api_internal_contract_js_1.DateStepPeriod.Weeks] = api_external_contract_js_1.PeriodType.Weeks,\n _l[api_internal_contract_js_1.DateStepPeriod.Days] = api_external_contract_js_1.PeriodType.Days,\n _l[api_internal_contract_js_1.DateStepPeriod.Hours] = api_external_contract_js_1.PeriodType.Hours,\n _l[api_internal_contract_js_1.DateStepPeriod.Minutes] = api_external_contract_js_1.PeriodType.Minutes,\n _l[api_internal_contract_js_1.DateStepPeriod.Seconds] = api_external_contract_js_1.PeriodType.Seconds,\n _l));\n InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_m = {},\n _m[api_internal_contract_js_1.DateRangeType.Current] = api_external_contract_js_1.DateRangeType.Current,\n _m[api_internal_contract_js_1.DateRangeType.Last] = api_external_contract_js_1.DateRangeType.Last,\n _m[api_internal_contract_js_1.DateRangeType.LastN] = api_external_contract_js_1.DateRangeType.LastN,\n _m[api_internal_contract_js_1.DateRangeType.Next] = api_external_contract_js_1.DateRangeType.Next,\n _m[api_internal_contract_js_1.DateRangeType.NextN] = api_external_contract_js_1.DateRangeType.NextN,\n _m[api_internal_contract_js_1.DateRangeType.ToDate] = api_external_contract_js_1.DateRangeType.ToDate,\n _m));\n InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter((_o = {},\n _o[api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID] = api_external_contract_js_1.ErrorCodes.InternalError,\n _o[api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED] = api_external_contract_js_1.ErrorCodes.APINotInitialized,\n _o[api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR] = api_external_contract_js_1.ErrorCodes.VisibilityError,\n _o), api_external_contract_js_1.ErrorCodes.InternalError);\n InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter((_p = {},\n _p[api_internal_contract_js_1.FilterType.Categorical] = api_external_contract_js_1.FilterType.Categorical,\n _p[api_internal_contract_js_1.FilterType.Range] = api_external_contract_js_1.FilterType.Range,\n _p[api_internal_contract_js_1.FilterType.RelativeDate] = api_external_contract_js_1.FilterType.RelativeDate,\n _p[api_internal_contract_js_1.FilterType.Hierarchical] = api_external_contract_js_1.FilterType.Hierarchical,\n _p));\n InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter((_q = {},\n _q[\"tableau-dashboard-title\" /* DashboardTitle */] = api_external_contract_js_1.ClassNameKey.DashboardTitle,\n _q[\"tableau-story-title\" /* StoryTitle */] = api_external_contract_js_1.ClassNameKey.StoryTitle,\n _q[\"tableau-tooltip\" /* Tooltip */] = api_external_contract_js_1.ClassNameKey.Tooltip,\n _q[\"tableau-worksheet\" /* Worksheet */] = api_external_contract_js_1.ClassNameKey.Worksheet,\n _q[\"tableau-worksheet-title\" /* WorksheetTitle */] = api_external_contract_js_1.ClassNameKey.WorksheetTitle,\n // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed\n _q['dashboard-title'] = api_external_contract_js_1.ClassNameKey.DashboardTitle,\n _q['story-title'] = api_external_contract_js_1.ClassNameKey.StoryTitle,\n _q['tooltip'] = api_external_contract_js_1.ClassNameKey.Tooltip,\n _q['worksheet'] = api_external_contract_js_1.ClassNameKey.Worksheet,\n _q['worksheet-title'] = api_external_contract_js_1.ClassNameKey.WorksheetTitle,\n _q));\n InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter((_r = {},\n _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected,\n _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected,\n _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected,\n _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected,\n _r));\n InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter((_s = {},\n _s[api_internal_contract_js_1.AnnotateEnum.Area] = api_external_contract_js_1.AnnotationType.Area,\n _s[api_internal_contract_js_1.AnnotateEnum.Mark] = api_external_contract_js_1.AnnotationType.Mark,\n _s[api_internal_contract_js_1.AnnotateEnum.Point] = api_external_contract_js_1.AnnotationType.Point,\n _s));\n InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter((_t = {},\n _t[api_internal_contract_js_1.MarkType.Area] = api_external_contract_js_1.MarkType.Area,\n _t[api_internal_contract_js_1.MarkType.Bar] = api_external_contract_js_1.MarkType.Bar,\n _t[api_internal_contract_js_1.MarkType.Circle] = api_external_contract_js_1.MarkType.Circle,\n _t[api_internal_contract_js_1.MarkType.GanttBar] = api_external_contract_js_1.MarkType.GanttBar,\n _t[api_internal_contract_js_1.MarkType.Heatmap] = api_external_contract_js_1.MarkType.Heatmap,\n _t[api_internal_contract_js_1.MarkType.Line] = api_external_contract_js_1.MarkType.Line,\n _t[api_internal_contract_js_1.MarkType.Map] = api_external_contract_js_1.MarkType.Map,\n _t[api_internal_contract_js_1.MarkType.Pie] = api_external_contract_js_1.MarkType.Pie,\n _t[api_internal_contract_js_1.MarkType.Polygon] = api_external_contract_js_1.MarkType.Polygon,\n _t[api_internal_contract_js_1.MarkType.Shape] = api_external_contract_js_1.MarkType.Shape,\n _t[api_internal_contract_js_1.MarkType.Square] = api_external_contract_js_1.MarkType.Square,\n _t[api_internal_contract_js_1.MarkType.Text] = api_external_contract_js_1.MarkType.Text,\n _t[api_internal_contract_js_1.MarkType.VizExtension] = api_external_contract_js_1.MarkType.VizExtension,\n _t));\n return InternalToExternalEnumMappings;\n}());\nexports.InternalToExternalEnumMappings = InternalToExternalEnumMappings;\n/* tslint:enable:typedef */\n//# sourceMappingURL=InternalToExternalEnumMappings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar 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 */\nvar EventListenerManager = /** @class */ (function () {\n function EventListenerManager() {\n this._eventListenerManagers = {};\n }\n EventListenerManager.prototype.addEventListener = function (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 EventListenerManager.prototype.removeEventListener = function (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 EventListenerManager.prototype.addNewEventType = function (eventManager) {\n this._eventListenerManagers[eventManager.eventType] = eventManager;\n };\n return EventListenerManager;\n}());\nexports.EventListenerManager = EventListenerManager;\n//# sourceMappingURL=EventListenerManager.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Field = /** @class */ (function () {\n function Field(_fieldImpl) {\n this._fieldImpl = _fieldImpl;\n }\n Object.defineProperty(Field.prototype, \"name\", {\n get: function () {\n return this._fieldImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"id\", {\n get: function () {\n return this._fieldImpl.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"description\", {\n get: function () {\n return this._fieldImpl.description;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"dataType\", {\n get: function () {\n return this._fieldImpl.dataType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"aggregation\", {\n get: function () {\n return this._fieldImpl.aggregation;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"dataSource\", {\n get: function () {\n return this._fieldImpl.dataSource;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"role\", {\n get: function () {\n return this._fieldImpl.role;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"columnType\", {\n get: function () {\n return this._fieldImpl.columnType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isCalculatedField\", {\n get: function () {\n return this._fieldImpl.isCalculatedField;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isCombinedField\", {\n get: function () {\n return this._fieldImpl.isCombinedField;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isGenerated\", {\n get: function () {\n return this._fieldImpl.isGenerated;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isGeospatial\", {\n get: function () {\n return this._fieldImpl.isGeospatial;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isHidden\", {\n get: function () {\n return this._fieldImpl.isHidden;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Field.prototype, \"isPresentOnPublishedDatasource\", {\n get: function () {\n return this._fieldImpl.isPresentOnPublishedDatasource;\n },\n enumerable: true,\n configurable: true\n });\n return Field;\n}());\nexports.Field = Field;\n//# sourceMappingURL=Field.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ApiShared_1 = require(\"../../ApiShared\");\nvar CustomViewImpl = /** @class */ (function () {\n function CustomViewImpl(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 Object.defineProperty(CustomViewImpl.prototype, \"luid\", {\n get: function () {\n return this._luid;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n set: function (name) {\n this._name = name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"shared\", {\n get: function () {\n return this._shared;\n },\n set: function (shared) {\n this._shared = shared;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"isDefault\", {\n get: function () {\n return this._isDefault;\n },\n set: function (isDefault) {\n this._isDefault = isDefault;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"ownerName\", {\n get: function () {\n return this._ownerName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CustomViewImpl.prototype, \"url\", {\n get: function () {\n return this._url;\n },\n enumerable: true,\n configurable: true\n });\n CustomViewImpl.prototype.saveAsync = function () {\n var service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService(\"viz-service\" /* Viz */);\n return service.saveAsync(this);\n };\n return CustomViewImpl;\n}());\nexports.CustomViewImpl = CustomViewImpl;\n//# sourceMappingURL=CustomViewImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nvar Point_1 = require(\"../Point\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar DashboardObjectImpl_1 = require(\"./DashboardObjectImpl\");\nvar SheetImpl_1 = require(\"./SheetImpl\");\nvar SheetInfoImpl_1 = require(\"./SheetInfoImpl\");\nvar WorksheetImpl_1 = require(\"./WorksheetImpl\");\nvar DashboardImpl = /** @class */ (function (_super) {\n __extends(DashboardImpl, _super);\n function DashboardImpl(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId) {\n if (_activeDashboardObjectId === void 0) { _activeDashboardObjectId = 0; }\n var _this = _super.call(this, _sheetInfo, _registryId) || this;\n _this._zones = _zones;\n _this._sheetPath = _sheetPath;\n _this._parentStoryPointImpl = _parentStoryPointImpl;\n _this._activeDashboardObjectId = _activeDashboardObjectId;\n return _this;\n }\n Object.defineProperty(DashboardImpl.prototype, \"worksheetsImpl\", {\n get: function () {\n return this._worksheetsImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardImpl.prototype, \"objects\", {\n get: function () {\n return this._objects;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardImpl.prototype, \"parentStoryPoint\", {\n get: function () {\n return this._parentStoryPointImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardImpl.prototype, \"activeDashboardObjectId\", {\n get: function () {\n return this._activeDashboardObjectId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardImpl.prototype, \"activeDashboardName\", {\n get: function () {\n return this._sheetPath.sheetName;\n },\n enumerable: true,\n configurable: true\n });\n DashboardImpl.prototype.initializeWithPublicInterfaces = function () {\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 (var _i = 0, _a = this._zones; _i < _a.length; _i++) {\n var zone = _a[_i];\n var worksheetImpl = undefined;\n var zoneSize = { width: zone.width, height: zone.height };\n // As the dashboard is active, all other zones in the dashboard are inactive.\n var isActive = false;\n if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet || zone.zoneType === api_internal_contract_js_1.DashboardObjectType.QuickFilter) {\n var worksheetName = '';\n var worksheetUrl = '';\n var 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 var sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl);\n var 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 var zonePoint = new Point_1.Point(zone.x, zone.y);\n var dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false\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 DashboardImpl.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) {\n var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"zone-service\" /* Zone */);\n return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap);\n };\n DashboardImpl.prototype.getDashboardObjectById = function (dashboardObjectId) {\n return this.zoneMap.get(dashboardObjectId);\n };\n DashboardImpl.prototype.updateZones = function (newZones, newActiveZoneId, newActiveDashboardName) {\n var _this = this;\n if (newActiveZoneId === void 0) { newActiveZoneId = 0; }\n if (newActiveDashboardName === void 0) { newActiveDashboardName = ''; }\n // getting previous dashboard objects, active zone ID and active dashboard name\n var oldDashboardObjects = this._objects;\n var oldZoneMap = this.zoneMap;\n var oldActiveZoneId = this._activeDashboardObjectId;\n var 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 var newDashboardObjects = this._objects;\n var newZoneMap = this.zoneMap;\n // initializing map for changes\n var zoneChanges = new Map();\n // comparing old dashboard objects with new ones\n oldDashboardObjects.forEach(function (oldObject) {\n var 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 var 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(function (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 DashboardImpl.prototype.addChange = function (zoneId, zoneChanges, change) {\n if (!zoneChanges.has(zoneId)) {\n zoneChanges.set(zoneId, []);\n }\n zoneChanges.get(zoneId).push(change);\n };\n DashboardImpl.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) {\n var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"zone-service\" /* Zone */);\n return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray);\n };\n DashboardImpl.prototype.replayAnimationAsync = function (replaySpeed) {\n var animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"animation-service\" /* Animation */);\n return animationService.replayAsync(replaySpeed);\n };\n DashboardImpl.prototype.getFiltersAsync = function () {\n this.verifyActiveSheetOrEmbeddedInActiveStoryPoint();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getDashboardFiltersAsync();\n };\n DashboardImpl.prototype.applyFilterAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* 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 DashboardImpl.prototype.getWorksheetNamesFromZones = function () {\n var worksheetNames = [];\n for (var _i = 0, _a = this._zones; _i < _a.length; _i++) {\n var zone = _a[_i];\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 var worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name;\n worksheetNames.push(worksheetName);\n }\n return worksheetNames;\n };\n DashboardImpl.prototype.verifyActiveSheetOrEmbeddedInActiveStoryPoint = function () {\n var isRootAndActiveDashboard = this.active;\n var 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 return DashboardImpl;\n}(SheetImpl_1.SheetImpl));\nexports.DashboardImpl = DashboardImpl;\n//# sourceMappingURL=DashboardImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar DashboardObjectImpl = /** @class */ (function () {\n function DashboardObjectImpl(_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 Object.defineProperty(DashboardObjectImpl.prototype, \"dashboardImpl\", {\n get: function () {\n return this._dashboardImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"type\", {\n get: function () {\n return this._type;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"position\", {\n get: function () {\n return this._position;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"size\", {\n get: function () {\n return this._size;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"worksheetImpl\", {\n get: function () {\n return this._worksheetImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"isFloating\", {\n get: function () {\n return this._isFloating;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"isVisible\", {\n get: function () {\n return this._isVisible;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"id\", {\n get: function () {\n return this._id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DashboardObjectImpl.prototype, \"fieldId\", {\n get: function () {\n return this._fieldId;\n },\n enumerable: true,\n configurable: true\n });\n return DashboardObjectImpl;\n}());\nexports.DashboardObjectImpl = DashboardObjectImpl;\n//# sourceMappingURL=DashboardObjectImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar ConnectionSummary_1 = require(\"../ConnectionSummary\");\nvar Field_1 = require(\"../Field\");\nvar LogicalTable_1 = require(\"../LogicalTable\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableSummary_1 = require(\"../TableSummary\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar FieldImpl_1 = require(\"./FieldImpl\");\nvar DataSourceImpl = /** @class */ (function () {\n function DataSourceImpl(_dataSourceInfo, _registryId) {\n var _this = this;\n this._dataSourceInfo = _dataSourceInfo;\n this._registryId = _registryId;\n this._fields = _dataSourceInfo.fields.map(function (fieldModel) {\n var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, _this);\n return new Field_1.Field(fieldImpl);\n });\n }\n Object.defineProperty(DataSourceImpl.prototype, \"name\", {\n get: function () {\n return this._dataSourceInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"id\", {\n get: function () {\n return this._dataSourceInfo.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"extractUpdateTime\", {\n get: function () {\n return this._dataSourceInfo.extractUpdateTime;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"fields\", {\n get: function () {\n return this._fields;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"isExtract\", {\n get: function () {\n return this._dataSourceInfo.isExtract;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataSourceImpl.prototype, \"isPublished\", {\n get: function () {\n return this._dataSourceInfo.isPublished;\n },\n enumerable: true,\n configurable: true\n });\n DataSourceImpl.prototype.publishedUrl = function () {\n return this._dataSourceInfo.publishedUrl;\n };\n DataSourceImpl.prototype.getMaxPageRowLimit = function () {\n return 10000;\n };\n DataSourceImpl.prototype.refreshAsync = function () {\n var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.refreshAsync(this._dataSourceInfo.id);\n };\n DataSourceImpl.prototype.getConnectionSummariesAsync = function () {\n var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then(function (summaries) {\n return summaries.map(function (summary) { return new ConnectionSummary_1.ConnectionSummary(summary); });\n });\n };\n DataSourceImpl.prototype.getActiveTablesAsync = function () {\n var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then(function (tableInfos) {\n return tableInfos.map(function (tableInfo) { return new TableSummary_1.TableSummary(tableInfo); });\n });\n };\n DataSourceImpl.prototype.getUnderlyingDataAsync = function (options) {\n var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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 DataSourceImpl.prototype.getLogicalTableDataAsync = function (logicalTableId, options) {\n var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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 DataSourceImpl.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) {\n var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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 DataSourceImpl.prototype.initializeWithPublicInterfaces = function (dataSource) {\n ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource');\n this._fields = this._dataSourceInfo.fields.map(function (fieldModel) {\n var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource);\n return new Field_1.Field(fieldImpl);\n });\n };\n DataSourceImpl.prototype.getLogicalTablesAsync = function () {\n var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return dataSourceService.getLogicalTablesAsync(this.id).then(function (logicalTableInfos) {\n return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); });\n });\n };\n return DataSourceImpl;\n}());\nexports.DataSourceImpl = DataSourceImpl;\n//# sourceMappingURL=DataSourceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar InternalContract = require(\"@tableau/api-internal-contract-js\");\nvar InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nvar FieldImpl = /** @class */ (function () {\n function FieldImpl(_fieldInfo, _parentDataSource) {\n this._fieldInfo = _fieldInfo;\n this._parentDataSource = _parentDataSource;\n }\n Object.defineProperty(FieldImpl.prototype, \"name\", {\n get: function () {\n return this._fieldInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"id\", {\n get: function () {\n return this._fieldInfo.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"description\", {\n get: function () {\n return this._fieldInfo.description;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"dataType\", {\n get: function () {\n var _a;\n return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"aggregation\", {\n get: function () {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"dataSource\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"role\", {\n get: function () {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"columnType\", {\n get: function () {\n var definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown;\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isCalculatedField\", {\n get: function () {\n return this._fieldInfo.isCalculatedField;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isCombinedField\", {\n get: function () {\n return this._fieldInfo.isCombinedField;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isGenerated\", {\n get: function () {\n return this._fieldInfo.isGenerated;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isGeospatial\", {\n get: function () {\n return this._fieldInfo.isGeospatial;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isHidden\", {\n get: function () {\n return this._fieldInfo.isHidden;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(FieldImpl.prototype, \"isPresentOnPublishedDatasource\", {\n get: function () {\n return this._fieldInfo.isPresentOnPublishedDatasource;\n },\n enumerable: true,\n configurable: true\n });\n return FieldImpl;\n}());\nexports.FieldImpl = FieldImpl;\n//# sourceMappingURL=FieldImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar DataValueFactory_1 = require(\"../Utils/DataValueFactory\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar Param_1 = require(\"../Utils/Param\");\nvar ParameterImpl = /** @class */ (function () {\n function ParameterImpl(parameterInfo, _registryId) {\n this._registryId = _registryId;\n this.setParameterInfo(parameterInfo);\n }\n Object.defineProperty(ParameterImpl.prototype, \"name\", {\n get: function () {\n return this._parameterInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ParameterImpl.prototype, \"currentValue\", {\n get: function () {\n return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ParameterImpl.prototype, \"dataType\", {\n get: function () {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ParameterImpl.prototype, \"id\", {\n get: function () {\n return this._globalFieldName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ParameterImpl.prototype, \"allowableValues\", {\n get: function () {\n return this._allowableValues;\n },\n enumerable: true,\n configurable: true\n });\n ParameterImpl.prototype.changeValueAsync = function (newValue) {\n var _this = this;\n ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue');\n var coercedValue = Param_1.Param.serializeParameterValue(newValue);\n var parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then(function (parameterInfo) {\n _this.setParameterInfo(parameterInfo);\n return _this.currentValue;\n });\n };\n ParameterImpl.prototype.setParameterInfo = function (parameterInfo) {\n this._parameterInfo = parameterInfo;\n this._globalFieldName = parameterInfo.fieldName;\n var type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType);\n var listValues;\n var minValue;\n var maxValue;\n var stepSize;\n var dateStepPeriod;\n if (type === api_external_contract_js_1.ParameterValueType.List) {\n var values = parameterInfo.allowableValues || [];\n listValues = values.map(function (val) { return 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 return ParameterImpl;\n}());\nexports.ParameterImpl = ParameterImpl;\n//# sourceMappingURL=ParameterImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar Param_1 = require(\"../Utils/Param\");\nvar SheetUtils_1 = require(\"../Utils/SheetUtils\");\nvar SheetImpl = /** @class */ (function () {\n function SheetImpl(_sheetInfoImpl, _registryId) {\n this._sheetInfoImpl = _sheetInfoImpl;\n this._registryId = _registryId;\n }\n Object.defineProperty(SheetImpl.prototype, \"name\", {\n get: function () {\n return this._sheetInfoImpl.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"sheetType\", {\n get: function () {\n return this._sheetInfoImpl.sheetType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"sheetPath\", {\n get: function () {\n return this._sheetInfoImpl.sheetPath;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"size\", {\n get: function () {\n return this._sheetInfoImpl.sheetSize;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"hidden\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"active\", {\n get: function () {\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: function (active) {\n if (this._sheetInfoImpl.isActive !== undefined) {\n this._sheetInfoImpl.active = active;\n }\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"index\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetImpl.prototype, \"url\", {\n get: function () {\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 enumerable: true,\n configurable: true\n });\n SheetImpl.prototype.getSheetSize = function () {\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 SheetImpl.prototype.findParameterAsync = function (parameterName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName');\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return service.findParameterByNameAsync(parameterName);\n };\n SheetImpl.prototype.getParametersAsync = function () {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* Parameters */);\n return service.getParametersForSheetAsync(this.sheetPath);\n };\n SheetImpl.prototype.changeSizeAsync = function (newSize) {\n var _this = this;\n var invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter');\n if (!newSize || !newSize.behavior) {\n throw invalidSizeError;\n }\n var partialSheetSize = this.normalizeSheetSize(newSize);\n var 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 var processedNewSize = this.processNewSize(partialSheetSize);\n var sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"size-service\" /* Size */);\n return sizeService.changeSizeAsync(this.name, processedNewSize).then(function () {\n var clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(_this._registryId).getService(\"client-info-service\" /* ClientInfo */);\n return clientInfoService.getClientInfoAsync().then(function (bootstrapInfo) {\n var sheet = bootstrapInfo.publishedSheets.find(function (s) { return 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 var sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint);\n _this._sheetInfoImpl.sheetSize = sheetSize;\n return sheetSize;\n });\n });\n };\n SheetImpl.prototype.normalizeSheetSize = function (newSize) {\n var behavior = newSize.behavior;\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior');\n var minSize = SheetImpl.parseDimensions(newSize.minSize);\n var maxSize = SheetImpl.parseDimensions(newSize.maxSize);\n return { behavior: behavior, minSize: minSize, maxSize: maxSize };\n };\n SheetImpl.prototype.processNewSize = function (newSize) {\n var _a, _b, _c, _d;\n var behavior = newSize.behavior, minSizeMaybe = newSize.minSize, maxSizeMaybe = newSize.maxSize;\n var hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width);\n var hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height);\n var hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width);\n var hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height);\n var hasValidMinSize = hasMinWidth && hasMinHeight;\n var hasValidMaxSize = hasMaxWidth && hasMaxHeight;\n switch (behavior) {\n case Contract.SheetSizeBehavior.Automatic: {\n return { behavior: 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 var 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: behavior, maxSize: 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 var 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: behavior, minSize: 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 var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n var 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: behavior, minSize: minSize, maxSize: maxSize };\n }\n case Contract.SheetSizeBehavior.Exactly: {\n if (minSizeMaybe && maxSizeMaybe) {\n if (hasValidMinSize && hasValidMaxSize) {\n var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n var 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: behavior, minSize: minSize, maxSize: maxSize };\n }\n if (hasValidMinSize) {\n var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n return { behavior: behavior, minSize: minSize, maxSize: minSize };\n }\n if (hasValidMaxSize) {\n var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n return { behavior: behavior, minSize: maxSize, 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 SheetImpl.parseDimensions = function (size) {\n var empty = { width: undefined, height: undefined };\n if (!size) {\n return empty;\n }\n var _a = Param_1.Param.tryParseNumber(size.width), widthParsed = _a.success, parsedWidth = _a.parsed;\n var _b = Param_1.Param.tryParseNumber(size.height), heightParsed = _b.success, parsedHeight = _b.parsed;\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 return SheetImpl;\n}());\nexports.SheetImpl = SheetImpl;\n//# sourceMappingURL=SheetImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar SheetInfoImpl = /** @class */ (function () {\n function SheetInfoImpl(_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 Object.defineProperty(SheetInfoImpl.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n set: function (sheetName) {\n this._name = sheetName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"sheetSize\", {\n get: function () {\n return this._sheetSize;\n },\n set: function (value) {\n this._sheetSize = value;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"sheetType\", {\n get: function () {\n return this._sheetType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"sheetPath\", {\n get: function () {\n return {\n sheetName: this.name,\n isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard,\n };\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"index\", {\n get: function () {\n return this._index;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"isActive\", {\n get: function () {\n return this._isActive;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"active\", {\n set: function (active) {\n this._isActive = active;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"isHidden\", {\n get: function () {\n return this._isHidden;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SheetInfoImpl.prototype, \"url\", {\n get: function () {\n return this._url;\n },\n enumerable: true,\n configurable: true\n });\n return SheetInfoImpl;\n}());\nexports.SheetInfoImpl = SheetInfoImpl;\n//# sourceMappingURL=SheetInfoImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar SingleEventManagerImpl = /** @class */ (function () {\n function SingleEventManagerImpl(eventType) {\n this._eventType = eventType;\n this._handlers = [];\n }\n Object.defineProperty(SingleEventManagerImpl.prototype, \"eventType\", {\n get: function () {\n return this._eventType;\n },\n enumerable: true,\n configurable: true\n });\n SingleEventManagerImpl.prototype.addEventListener = function (handler) {\n var _this = this;\n this._handlers.push(handler);\n return function () { return _this.removeEventListener(handler); };\n };\n SingleEventManagerImpl.prototype.removeEventListener = function (handler) {\n var beforeCount = this._handlers.length;\n this._handlers = this._handlers.filter(function (h) { return h !== handler; });\n return beforeCount > this._handlers.length;\n };\n SingleEventManagerImpl.prototype.triggerEvent = function (eventGenerator) {\n for (var _i = 0, _a = this._handlers; _i < _a.length; _i++) {\n var handler = _a[_i];\n try {\n var 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 return SingleEventManagerImpl;\n}());\nexports.SingleEventManagerImpl = SingleEventManagerImpl;\n//# sourceMappingURL=SingleEventManagerImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar ShortLivedDeferred_1 = require(\"../Utils/ShortLivedDeferred\");\nvar SheetImpl_1 = require(\"./SheetImpl\");\nvar StoryPointImpl_1 = require(\"./StoryPointImpl\");\nvar StoryPointInfoImpl_1 = require(\"./StoryPointInfoImpl\");\nvar StoryImpl = /** @class */ (function (_super) {\n __extends(StoryImpl, _super);\n function StoryImpl(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) {\n var _this = _super.call(this, _sheetInfoImpl, _registryId) || this;\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 return _this;\n }\n StoryImpl.prototype.initializeStory = function (storyModel) {\n var _this = this;\n storyModel.storyPoints.forEach(function (storyPointModel) {\n var isActive = storyPointModel.index === storyModel.activeStoryPointIndex;\n var 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 StoryImpl.prototype.updateStoryInfo = function (index, storyPointModel) {\n if (!this._storyPointInfoImpls) {\n return;\n }\n var 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 StoryImpl.prototype.updateStory = function (storyPointModel) {\n var _this = this;\n if (!this._storyPointInfoImpls) {\n return;\n }\n this._storyPointInfoImpls.forEach(function (storyPointInfoImpl) {\n var 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 Object.defineProperty(StoryImpl.prototype, \"activeStoryPoint\", {\n get: function () {\n return this._activeStoryPointImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryImpl.prototype, \"storyPointsInfo\", {\n get: function () {\n return this._storyPointInfoImpls;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryImpl.prototype, \"isActive\", {\n get: function () {\n return this._sheetInfoImpl.active;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryImpl.prototype, \"isHidden\", {\n get: function () {\n return !!this._sheetInfoImpl.isHidden;\n },\n enumerable: true,\n configurable: true\n });\n StoryImpl.prototype.activateNextStoryPointAsync = function () {\n if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n var promise = this._deferred.getNewPromiseOrThrowIfBusy();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activateNextStoryPointAsync();\n return promise;\n };\n StoryImpl.prototype.activatePreviousStoryPointAsync = function () {\n if (this._activeStoryPointImpl.index === 0) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n var promise = this._deferred.getNewPromiseOrThrowIfBusy();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activatePreviousStoryPointAsync();\n return promise;\n };\n StoryImpl.prototype.activateStoryPointAsync = function (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 var promise = this._deferred.getNewPromiseOrThrowIfBusy();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n service.activateStoryPointAsync(index);\n return promise;\n };\n StoryImpl.prototype.revertStoryPointAsync = function (index) {\n var _this = this;\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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* StoryActivation */);\n return service.revertStoryPointAsync(index).then(function (response) {\n _this.updateStoryInfo(response.index, response);\n var storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, _this);\n return storyPointInfoImpl;\n });\n };\n StoryImpl.prototype.clearPendingPromises = function () {\n if (this._deferred) {\n this._deferred.reject('All pending promises cleared');\n }\n };\n return StoryImpl;\n}(SheetImpl_1.SheetImpl));\nexports.StoryImpl = StoryImpl;\n//# sourceMappingURL=StoryImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar SheetUtils_1 = require(\"../Utils/SheetUtils\");\nvar DashboardImpl_1 = require(\"./DashboardImpl\");\nvar SheetInfoImpl_1 = require(\"./SheetInfoImpl\");\nvar WorksheetImpl_1 = require(\"./WorksheetImpl\");\nvar StoryPointImpl = /** @class */ (function () {\n function StoryPointImpl(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) {\n this._storyPointInfoImpl = _storyPointInfoImpl;\n if (containedSheetInfo) {\n this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId);\n }\n }\n Object.defineProperty(StoryPointImpl.prototype, \"index\", {\n get: function () {\n return this._storyPointInfoImpl.index;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"caption\", {\n get: function () {\n return this._storyPointInfoImpl.caption;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"active\", {\n get: function () {\n return this._storyPointInfoImpl.active;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"updated\", {\n get: function () {\n return this._storyPointInfoImpl.updated;\n },\n set: function (updated) {\n this._storyPointInfoImpl.updated = updated;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"parentStory\", {\n get: function () {\n return this._storyPointInfoImpl.parentStory;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"containedSheet\", {\n get: function () {\n return this._containedSheetImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointImpl.prototype, \"storyPointId\", {\n get: function () {\n return this._storyPointInfoImpl.storyPointId;\n },\n enumerable: true,\n configurable: true\n });\n StoryPointImpl.prototype.createContainedSheet = function (containedSheetInfo, sheetInfos, registryId) {\n var containedSheetIdx = -1;\n var publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos);\n var containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize();\n var isContainedSheetHidden = publishedSheetInfo === undefined;\n var containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : '';\n // Contained sheets aren't active - the containing sheet is active.\n var containedSheetActive = false;\n var containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl);\n var sheetImpl;\n switch (containedSheetInfoImpl.sheetType) {\n case Contract.SheetType.Worksheet: {\n var 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 var 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 return StoryPointImpl;\n}());\nexports.StoryPointImpl = StoryPointImpl;\n//# sourceMappingURL=StoryPointImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar StoryPointInfoImpl = /** @class */ (function () {\n function StoryPointInfoImpl(_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 Object.defineProperty(StoryPointInfoImpl.prototype, \"caption\", {\n get: function () {\n return this._caption;\n },\n set: function (caption) {\n this._caption = caption;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"index\", {\n get: function () {\n return this._index;\n },\n set: function (index) {\n this._index = index;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"storyPointId\", {\n get: function () {\n return this._storyPointId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"active\", {\n get: function () {\n return this._active;\n },\n set: function (isActive) {\n this._active = isActive;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"updated\", {\n get: function () {\n return this._updated;\n },\n set: function (isUpdated) {\n this._updated = isUpdated;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(StoryPointInfoImpl.prototype, \"parentStory\", {\n get: function () {\n return this._parentStoryImpl;\n },\n enumerable: true,\n configurable: true\n });\n return StoryPointInfoImpl;\n}());\nexports.StoryPointInfoImpl = StoryPointInfoImpl;\n//# sourceMappingURL=StoryPointInfoImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar WorkbookImpl = /** @class */ (function () {\n function WorkbookImpl() {\n }\n return WorkbookImpl;\n}());\nexports.WorkbookImpl = WorkbookImpl;\n//# sourceMappingURL=WorkbookImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar DataSource_1 = require(\"../DataSource\");\nvar LogicalTable_1 = require(\"../LogicalTable\");\nvar GetDataService_1 = require(\"../Services/GetDataService\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar DataSourceImpl_1 = require(\"./DataSourceImpl\");\nvar SheetImpl_1 = require(\"./SheetImpl\");\nvar WorksheetImpl = /** @class */ (function (_super) {\n __extends(WorksheetImpl, _super);\n function WorksheetImpl(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl) {\n var _this = _super.call(this, sheetInfoImpl, _registryId) || this;\n _this._visualId = _visualId;\n _this._parentDashboardImpl = _parentDashboardImpl;\n _this._parentStoryPointImpl = _parentStoryPointImpl;\n return _this;\n }\n Object.defineProperty(WorksheetImpl.prototype, \"parentDashboard\", {\n get: function () {\n return this._parentDashboardImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WorksheetImpl.prototype, \"parentStoryPoint\", {\n get: function () {\n return this._parentStoryPointImpl;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WorksheetImpl.prototype, \"visualId\", {\n get: function () {\n return this._visualId;\n },\n enumerable: true,\n configurable: true\n });\n WorksheetImpl.prototype.getMaxPageRowLimit = function () {\n return 10000;\n };\n WorksheetImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) {\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType');\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options);\n };\n WorksheetImpl.prototype.applyRangeFilterAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions);\n };\n WorksheetImpl.prototype.applyHierarchicalFilterAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options);\n };\n WorksheetImpl.prototype.clearFilterAsync = function (fieldName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.clearFilterAsync(this.visualId, fieldName);\n };\n WorksheetImpl.prototype.applyRelativeDateFilterAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options);\n };\n WorksheetImpl.prototype.getDataSourcesAsync = function () {\n var _this = this;\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getDataSourcesAsync(this.visualId).then(function (result) {\n var dataSchema = result;\n var worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[_this.name];\n var dataSources = [];\n // First, add the primary datasource. By convention, it comes first in the returned array.\n var primaryId = worksheetDataSourceInfo.primaryDataSource;\n dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[primaryId]));\n // Then, loop through any secondary data sources and add them.\n for (var _i = 0, _a = worksheetDataSourceInfo.referencedDataSourceList; _i < _a.length; _i++) {\n var secondaryId = _a[_i];\n if (secondaryId !== primaryId) {\n dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId]));\n }\n }\n return dataSources;\n });\n };\n WorksheetImpl.prototype.getFiltersAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getFiltersAsync(this.visualId);\n };\n WorksheetImpl.prototype.getSelectedMarksAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getSelectedMarksAsync(this.visualId);\n };\n WorksheetImpl.prototype.getHighlightedMarksAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getHighlightedMarksAsync(this.visualId);\n };\n WorksheetImpl.prototype.getSummaryDataAsync = function (options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.getVisualSpecificationAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* VisualModel */);\n return service.getVisualSpecificationAsync(this.visualId);\n };\n WorksheetImpl.prototype.getSummaryColumnsInfoAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getSummaryColumnsInfoAsync(this.visualId);\n };\n WorksheetImpl.prototype.getUnderlyingDataAsync = function (options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.getUnderlyingTablesAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getUnderlyingTablesAsync(this.visualId).then(function (logicalTableInfos) {\n return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); });\n });\n };\n WorksheetImpl.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* 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);\n };\n WorksheetImpl.prototype.clearSelectedMarksAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.clearSelectedMarksAsync(this.visualId);\n };\n WorksheetImpl.prototype.selectMarksByValueAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType);\n };\n WorksheetImpl.prototype.selectMarksByIdAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType);\n };\n WorksheetImpl.prototype.annotateMarkAsync = function (mark, annotationText) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark');\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.annotateMarkAsync(this.visualId, mark, annotationText);\n };\n WorksheetImpl.prototype.getAnnotationsAsync = function () {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.getAnnotationsAsync(this.visualId);\n };\n WorksheetImpl.prototype.removeAnnotationAsync = function (annotation) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation');\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* Annotation */);\n return service.removeAnnotationAsync(this.visualId, annotation);\n };\n WorksheetImpl.prototype.appendContextMenuAsync = function (targetMenu, config) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config);\n };\n WorksheetImpl.prototype.removeContextMenuAsync = function (targetMenu, menuItemId) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId);\n };\n WorksheetImpl.prototype.executeContextMenuAsync = function (targetMenu, menuItemId) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId);\n };\n WorksheetImpl.prototype.renameContextMenuAsync = function (targetMenu, menuHeader, menuDescription) {\n this.verifyActiveSheet();\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ExternalContextMenu */);\n return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription);\n };\n WorksheetImpl.prototype.hoverTupleAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip, allowHoverActions);\n };\n WorksheetImpl.prototype.selectTuplesAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* Selection */);\n return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip);\n };\n WorksheetImpl.prototype.getTooltipTextAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"accessibility\" /* Accessibility */);\n return service.getTooltipTextAsync(this.visualId, tupleId);\n };\n WorksheetImpl.prototype.leaveMarkNavigationAsync = function () {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, \"leaveMarkNavigationAsync is not supported in dashboard extensions\"));\n }\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"accessibility\" /* Accessibility */);\n return service.leaveMarkNavigationAsync(this.visualId);\n };\n WorksheetImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) {\n var dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId);\n var dataSource = new DataSource_1.DataSource(dataSourceImpl);\n dataSourceImpl.initializeWithPublicInterfaces(dataSource);\n return dataSource;\n };\n WorksheetImpl.prototype.verifyActiveSheet = function () {\n var isRootAndActiveWorksheet = this.active;\n var isInsideActiveDashboard = this.isInsideActiveDashboard();\n var 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 WorksheetImpl.prototype.isInsideActiveStoryPoint = function () {\n return this._parentStoryPointImpl && this._parentStoryPointImpl.active;\n };\n WorksheetImpl.prototype.isInsideActiveDashboard = function () {\n return this._parentDashboardImpl && this._parentDashboardImpl.active;\n };\n WorksheetImpl.prototype.isInsideDashboardExtension = function () {\n return this._parentDashboardImpl !== null;\n };\n return WorksheetImpl;\n}(SheetImpl_1.SheetImpl));\nexports.WorksheetImpl = WorksheetImpl;\n//# sourceMappingURL=WorksheetImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a logical table.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nvar LogicalTable = /** @class */ (function () {\n function LogicalTable(_logicalTable) {\n this._logicalTable = _logicalTable;\n }\n Object.defineProperty(LogicalTable.prototype, \"id\", {\n get: function () {\n return this._logicalTable.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(LogicalTable.prototype, \"caption\", {\n get: function () {\n return this._logicalTable.caption;\n },\n enumerable: true,\n configurable: true\n });\n return LogicalTable;\n}());\nexports.LogicalTable = LogicalTable;\n//# sourceMappingURL=LogicalTable.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar TooltipTextRequestModel = /** @class */ (function () {\n function TooltipTextRequestModel(visualIdPresModel, tupleId) {\n this.visualIdPresModel = visualIdPresModel;\n this.tupleId = tupleId;\n }\n return TooltipTextRequestModel;\n}());\nexports.TooltipTextRequestModel = TooltipTextRequestModel;\n//# sourceMappingURL=AccessibilityModels.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar Filter = /** @class */ (function () {\n function Filter(_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 Object.defineProperty(Filter.prototype, \"worksheetName\", {\n get: function () {\n return this._worksheetName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Filter.prototype, \"fieldName\", {\n get: function () {\n return this._fieldName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Filter.prototype, \"fieldId\", {\n get: function () {\n return this._fieldId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Filter.prototype, \"filterType\", {\n get: function () {\n return this._filterType;\n },\n enumerable: true,\n configurable: true\n });\n Filter.prototype.getFieldAsync = function () {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* DataSourceService */);\n return service.getFieldAsync(this._fieldId);\n };\n Filter.prototype.getAppliedWorksheetsAsync = function () {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId);\n };\n Filter.prototype.setAppliedWorksheetsAsync = function (applyToWorksheets) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets');\n var uniqueWorksheets = new Set(applyToWorksheets);\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets));\n };\n return Filter;\n}());\nexports.Filter = Filter;\nvar CategoricalFilter = /** @class */ (function (_super) {\n __extends(CategoricalFilter, _super);\n function CategoricalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) {\n var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this;\n _this._appliedValues = _appliedValues;\n _this._isExcludeMode = _isExcludeMode;\n _this._isAllSelected = _isAllSelected;\n return _this;\n }\n Object.defineProperty(CategoricalFilter.prototype, \"isAllSelected\", {\n get: function () {\n return this._isAllSelected;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CategoricalFilter.prototype, \"appliedValues\", {\n get: function () {\n return this._appliedValues;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CategoricalFilter.prototype, \"isExcludeMode\", {\n get: function () {\n return this._isExcludeMode;\n },\n enumerable: true,\n configurable: true\n });\n CategoricalFilter.prototype.getDomainAsync = function (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 var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* Filter */);\n return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType);\n };\n return CategoricalFilter;\n}(Filter));\nexports.CategoricalFilter = CategoricalFilter;\nvar HierarchicalDataValue = /** @class */ (function () {\n function HierarchicalDataValue(_value, _hierarchicalPath, _level) {\n this._value = _value;\n this._hierarchicalPath = _hierarchicalPath;\n this._level = _level;\n }\n Object.defineProperty(HierarchicalDataValue.prototype, \"value\", {\n get: function () {\n return this._value;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalDataValue.prototype, \"hierarchicalPath\", {\n get: function () {\n return this._hierarchicalPath;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalDataValue.prototype, \"level\", {\n get: function () {\n return this._level;\n },\n enumerable: true,\n configurable: true\n });\n return HierarchicalDataValue;\n}());\nexports.HierarchicalDataValue = HierarchicalDataValue;\nvar HierarchicalLevelDetail = /** @class */ (function () {\n function HierarchicalLevelDetail(_name, _levelSelectionState) {\n this._name = _name;\n this._levelSelectionState = _levelSelectionState;\n }\n Object.defineProperty(HierarchicalLevelDetail.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalLevelDetail.prototype, \"levelSelectionState\", {\n get: function () {\n return this._levelSelectionState;\n },\n enumerable: true,\n configurable: true\n });\n return HierarchicalLevelDetail;\n}());\nexports.HierarchicalLevelDetail = HierarchicalLevelDetail;\nvar HierarchicalFilter = /** @class */ (function (_super) {\n __extends(HierarchicalFilter, _super);\n function HierarchicalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) {\n var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this;\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 return _this;\n }\n HierarchicalFilter.prototype.getDomainAsync = function (domainType) {\n throw new Error('Method not implemented.');\n };\n Object.defineProperty(HierarchicalFilter.prototype, \"dimensionName\", {\n get: function () {\n return this._dimensionName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"hierarchyCaption\", {\n get: function () {\n return this._hierarchyCaption;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"numberOfLevels\", {\n get: function () {\n return this._numberOfLevels;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"levelDetails\", {\n get: function () {\n return this._levelDetails;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"isAllSelected\", {\n get: function () {\n return this._isAllSelected;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(HierarchicalFilter.prototype, \"appliedValues\", {\n get: function () {\n return this._appliedValues;\n },\n enumerable: true,\n configurable: true\n });\n return HierarchicalFilter;\n}(Filter));\nexports.HierarchicalFilter = HierarchicalFilter;\nvar RangeFilter = /** @class */ (function (_super) {\n __extends(RangeFilter, _super);\n function RangeFilter(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) {\n var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this;\n _this._min = _min;\n _this._max = _max;\n _this._includeNullValues = _includeNullValues;\n return _this;\n }\n Object.defineProperty(RangeFilter.prototype, \"minValue\", {\n get: function () {\n return this._min;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RangeFilter.prototype, \"maxValue\", {\n get: function () {\n return this._max;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RangeFilter.prototype, \"includeNullValues\", {\n get: function () {\n return this._includeNullValues;\n },\n enumerable: true,\n configurable: true\n });\n RangeFilter.prototype.getDomainAsync = function (domainType) {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* 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 return RangeFilter;\n}(Filter));\nexports.RangeFilter = RangeFilter;\nvar RelativeDateFilter = /** @class */ (function (_super) {\n __extends(RelativeDateFilter, _super);\n function RelativeDateFilter(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) {\n var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this;\n _this._anchorDate = _anchorDate;\n _this._periodType = _periodType;\n _this._rangeType = _rangeType;\n _this._rangeN = _rangeN;\n return _this;\n }\n Object.defineProperty(RelativeDateFilter.prototype, \"anchorDate\", {\n get: function () {\n return this._anchorDate;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RelativeDateFilter.prototype, \"periodType\", {\n get: function () {\n return this._periodType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RelativeDateFilter.prototype, \"rangeType\", {\n get: function () {\n return this._rangeType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RelativeDateFilter.prototype, \"rangeN\", {\n get: function () {\n return this._rangeN;\n },\n enumerable: true,\n configurable: true\n });\n return RelativeDateFilter;\n}(Filter));\nexports.RelativeDateFilter = RelativeDateFilter;\nvar CategoricalDomain = /** @class */ (function () {\n function CategoricalDomain(_values, _domainType) {\n this._values = _values;\n this._domainType = _domainType;\n }\n Object.defineProperty(CategoricalDomain.prototype, \"values\", {\n get: function () {\n return this._values;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CategoricalDomain.prototype, \"type\", {\n get: function () {\n return this._domainType;\n },\n enumerable: true,\n configurable: true\n });\n return CategoricalDomain;\n}());\nexports.CategoricalDomain = CategoricalDomain;\nvar RangeDomain = /** @class */ (function () {\n function RangeDomain(_min, _max, _domainType) {\n this._min = _min;\n this._max = _max;\n this._domainType = _domainType;\n }\n Object.defineProperty(RangeDomain.prototype, \"type\", {\n get: function () {\n return this._domainType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RangeDomain.prototype, \"min\", {\n get: function () {\n return this._min;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RangeDomain.prototype, \"max\", {\n get: function () {\n return this._max;\n },\n enumerable: true,\n configurable: true\n });\n return RangeDomain;\n}());\nexports.RangeDomain = RangeDomain;\n//# sourceMappingURL=FilterModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar DataTable = /** @class */ (function () {\n function DataTable(_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 Object.defineProperty(DataTable.prototype, \"name\", {\n get: function () {\n return this._name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"data\", {\n get: function () {\n return this._data;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"columns\", {\n get: function () {\n return this._columns;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"marksInfo\", {\n get: function () {\n return this._marksInfo;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"totalRowCount\", {\n get: function () {\n return this._totalRowCount;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"isTotalRowCountLimited\", {\n get: function () {\n return this._isTotalRowCountLimited;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTable.prototype, \"isSummaryData\", {\n get: function () {\n return this._isSummaryData;\n },\n enumerable: true,\n configurable: true\n });\n return DataTable;\n}());\nexports.DataTable = DataTable;\nvar MarkInfo = /** @class */ (function () {\n function MarkInfo(_type, _color, _tupleId) {\n this._type = _type;\n this._color = _color;\n this._tupleId = _tupleId;\n }\n Object.defineProperty(MarkInfo.prototype, \"type\", {\n get: function () {\n return this._type;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MarkInfo.prototype, \"color\", {\n get: function () {\n return this._color;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(MarkInfo.prototype, \"tupleId\", {\n get: function () {\n return this._tupleId;\n },\n enumerable: true,\n configurable: true\n });\n return MarkInfo;\n}());\nexports.MarkInfo = MarkInfo;\nvar Column = /** @class */ (function () {\n function Column(_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 Object.defineProperty(Column.prototype, \"fieldName\", {\n get: function () {\n return this._fieldName;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Column.prototype, \"fieldId\", {\n get: function () {\n return this._fieldId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Column.prototype, \"dataType\", {\n get: function () {\n return this._dataType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Column.prototype, \"isReferenced\", {\n get: function () {\n return this._isReferenced;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Column.prototype, \"index\", {\n get: function () {\n return this._index;\n },\n enumerable: true,\n configurable: true\n });\n return Column;\n}());\nexports.Column = Column;\nvar DataValue = /** @class */ (function () {\n /* tslint:disable:no-any */\n function DataValue(_value, _nativeValue, _formattedValue) {\n this._value = _value;\n this._nativeValue = _nativeValue;\n this._formattedValue = _formattedValue;\n }\n Object.defineProperty(DataValue.prototype, \"value\", {\n get: function () {\n return this._value;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataValue.prototype, \"nativeValue\", {\n get: function () {\n return this._nativeValue;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataValue.prototype, \"formattedValue\", {\n get: function () {\n return this._formattedValue;\n },\n enumerable: true,\n configurable: true\n });\n return DataValue;\n}());\nexports.DataValue = DataValue;\n//# sourceMappingURL=GetDataModels.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};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nvar ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nvar DataTableReader = /** @class */ (function () {\n function DataTableReader(_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 Object.defineProperty(DataTableReader.prototype, \"totalRowCount\", {\n get: function () {\n return this._totalRowCount;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataTableReader.prototype, \"pageCount\", {\n get: function () {\n return this._pageCount;\n },\n enumerable: true,\n configurable: true\n });\n DataTableReader.prototype.getPageAsync = function (pageNumber) {\n ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount);\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.getPageAsync(this._id, pageNumber, this._pageRowCount);\n };\n DataTableReader.prototype.getAllPagesAsync = function (maxRows) {\n return __awaiter(this, void 0, void 0, function () {\n var firstPage, rowsRequested, pagesRequested, pagesToFetch, isDataLimited, remainingData, i, page, fullData;\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this.getPageAsync(0)];\n case 1:\n firstPage = _b.sent();\n maxRows = maxRows || this.totalRowCount;\n rowsRequested = Math.min(maxRows, this.totalRowCount);\n pagesRequested = Math.ceil(rowsRequested / this._pageRowCount);\n pagesToFetch = Math.min(pagesRequested, 400);\n isDataLimited = pagesToFetch < pagesRequested;\n remainingData = [];\n i = 1;\n _b.label = 2;\n case 2:\n if (!(i < pagesToFetch)) return [3 /*break*/, 5];\n return [4 /*yield*/, this.getPageAsync(i)];\n case 3:\n page = _b.sent();\n remainingData.push(page.data);\n _b.label = 4;\n case 4:\n i++;\n return [3 /*break*/, 2];\n case 5:\n fullData = (_a = firstPage.data).concat.apply(_a, remainingData);\n // This slices the array only if maxRows has been set and is less than totalRowCount\n fullData.length = rowsRequested;\n return [2 /*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 });\n };\n DataTableReader.prototype.releaseAsync = function () {\n var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* GetData */);\n return service.releaseAsync(this._id);\n };\n return DataTableReader;\n}());\nexports.DataTableReader = DataTableReader;\n//# sourceMappingURL=GetDataTableReaderModels.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Selection Model.\n */\nvar SelectionModel = /** @class */ (function () {\n function SelectionModel() {\n }\n return SelectionModel;\n}());\nexports.SelectionModel = SelectionModel;\n/**\n * Value based selection model. Meant for hierarchical, range and categorical selections.\n */\nvar ValueSelectionModel = /** @class */ (function (_super) {\n __extends(ValueSelectionModel, _super);\n function ValueSelectionModel() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.selectValues = [];\n return _this;\n }\n return ValueSelectionModel;\n}(SelectionModel));\nexports.ValueSelectionModel = ValueSelectionModel;\n/**\n * Hierarchical value selection model\n */\nvar HierarchicalSelectionModel = /** @class */ (function (_super) {\n __extends(HierarchicalSelectionModel, _super);\n function HierarchicalSelectionModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return HierarchicalSelectionModel;\n}(ValueSelectionModel));\nexports.HierarchicalSelectionModel = HierarchicalSelectionModel;\n/**\n * Range based value selection model\n */\nvar RangeSelectionModel = /** @class */ (function (_super) {\n __extends(RangeSelectionModel, _super);\n function RangeSelectionModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return RangeSelectionModel;\n}(SelectionModel));\nexports.RangeSelectionModel = RangeSelectionModel;\n/**\n * Dimension value selection model\n */\nvar DimensionSelectionModel = /** @class */ (function (_super) {\n __extends(DimensionSelectionModel, _super);\n function DimensionSelectionModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return DimensionSelectionModel;\n}(ValueSelectionModel));\nexports.DimensionSelectionModel = DimensionSelectionModel;\n/**\n * Tuple based selection model\n */\nvar TupleSelectionModel = /** @class */ (function () {\n function TupleSelectionModel() {\n this.objectIds = [];\n }\n return TupleSelectionModel;\n}());\nexports.TupleSelectionModel = TupleSelectionModel;\n/**\n * Container class to populate all the selection models when parsing input\n */\nvar SelectionModelsContainer = /** @class */ (function () {\n function SelectionModelsContainer() {\n this.hierModelArr = [];\n this.dimModelArr = [];\n this.quantModelArr = [];\n }\n return SelectionModelsContainer;\n}());\nexports.SelectionModelsContainer = SelectionModelsContainer;\nvar SelectTuplesInteractionModel = /** @class */ (function () {\n function SelectTuplesInteractionModel(visualIdPresModel, tupleIds, selectOptions, tooltipContext) {\n if (tupleIds === void 0) { tupleIds = []; }\n this.visualIdPresModel = visualIdPresModel;\n this.tupleIds = tupleIds;\n this.selectOptions = selectOptions;\n this.tooltipContext = tooltipContext;\n }\n return SelectTuplesInteractionModel;\n}());\nexports.SelectTuplesInteractionModel = SelectTuplesInteractionModel;\nvar HoverTupleInteractionModel = /** @class */ (function () {\n function HoverTupleInteractionModel(visualIdPresModel, tupleId, tooltipContext, allowHoverActions) {\n this.visualIdPresModel = visualIdPresModel;\n this.tupleId = tupleId;\n this.tooltipContext = tooltipContext;\n this.allowHoverActions = allowHoverActions;\n }\n return HoverTupleInteractionModel;\n}());\nexports.HoverTupleInteractionModel = HoverTupleInteractionModel;\n//# sourceMappingURL=SelectionModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Point = /** @class */ (function () {\n function Point(_x, _y) {\n this._x = _x;\n this._y = _y;\n }\n Object.defineProperty(Point.prototype, \"x\", {\n get: function () {\n return this._x;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Point.prototype, \"y\", {\n get: function () {\n return this._y;\n },\n enumerable: true,\n configurable: true\n });\n return Point;\n}());\nexports.Point = Point;\n//# sourceMappingURL=Point.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 || (exports.GetDataType = {}));\n//# sourceMappingURL=GetDataService.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ServiceRegistry_1 = require(\"./ServiceRegistry\");\nvar AccessibilityServiceImpl_1 = require(\"./impl/AccessibilityServiceImpl\");\nvar AnimationServiceImpl_1 = require(\"./impl/AnimationServiceImpl\");\nvar AnnotationServiceImpl_1 = require(\"./impl/AnnotationServiceImpl\");\nvar DataSourceServiceImpl_1 = require(\"./impl/DataSourceServiceImpl\");\nvar ExportServiceImpl_1 = require(\"./impl/ExportServiceImpl\");\nvar ExternalContextMenuServiceImpl_1 = require(\"./impl/ExternalContextMenuServiceImpl\");\nvar FilterServiceImpl_1 = require(\"./impl/FilterServiceImpl\");\nvar GetDataServiceImpl_1 = require(\"./impl/GetDataServiceImpl\");\nvar NotificationServiceImpl_1 = require(\"./impl/NotificationServiceImpl\");\nvar ParametersServiceImpl_1 = require(\"./impl/ParametersServiceImpl\");\nvar SelectionServiceImpl_1 = require(\"./impl/SelectionServiceImpl\");\nvar SizeServiceImpl_1 = require(\"./impl/SizeServiceImpl\");\nvar VisualModelServiceImpl_1 = require(\"./impl/VisualModelServiceImpl\");\nvar VizServiceImpl_1 = require(\"./impl/VizServiceImpl\");\nvar ZoneServiceImpl_1 = require(\"./impl/ZoneServiceImpl\");\nfunction registerAllSharedServices(dispatcher, registryId, platformVersion) {\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, platformVersion));\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}\nexports.registerAllSharedServices = registerAllSharedServices;\n//# sourceMappingURL=RegisterAllSharedServices.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nwindow.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {};\nvar ServiceRegistryImpl = /** @class */ (function () {\n function ServiceRegistryImpl() {\n this._services = {};\n }\n ServiceRegistryImpl.prototype.registerService = function (service) {\n this._services[service.serviceName] = service;\n };\n ServiceRegistryImpl.prototype.getService = function (serviceName) {\n if (!this._services.hasOwnProperty(serviceName)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, \"Service not registered: \" + serviceName);\n }\n return this._services[serviceName];\n };\n return ServiceRegistryImpl;\n}());\n/**\n * Static class used for getting access to the single instance\n * of the ApiServiceRegistry associated with the registryId.\n *\n * Extensions by design don't need to store/access multiple service registries. Their single instance of ServiceRegistry is\n * stored/access with registryId = 0.\n *\n * Whereas Embedding needs to be aware of which ServiceRegistry to use when there are multiple vizzes embedded.\n * An example of how window.__tableauApiServiceRegistry will look when there are two vizzes: { 0 : ServiceRegistry, 1 : ServiceRegistry}\n * where registry ID of 0 & 1 refers to viz's internal identifier (which is generated by VizManager).\n */\nvar ApiServiceRegistry = /** @class */ (function () {\n // Private to avoid anyone constructing this\n function ApiServiceRegistry() {\n }\n /**\n * Gets the singleton instance of the ServiceRegistry\n */\n ApiServiceRegistry.get = function (registryId) {\n if (!window.__tableauApiServiceRegistry || !window.__tableauApiServiceRegistry[registryId]) {\n ApiServiceRegistry.setInstance(registryId, new ServiceRegistryImpl());\n }\n if (!window.__tableauApiServiceRegistry[registryId]) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed');\n }\n return window.__tableauApiServiceRegistry[registryId];\n };\n /**\n * Helper method that sets the service registry instance for the corresponding registryId. Can be used by unit tests\n *\n * @param {ServiceRegistry} serviceRegistry The new registry\n */\n ApiServiceRegistry.setInstance = function (registryId, serviceRegistry) {\n if (!window.__tableauApiServiceRegistry) {\n window.__tableauApiServiceRegistry = {};\n }\n window.__tableauApiServiceRegistry[registryId] = serviceRegistry;\n };\n /**\n * Only used by unit tests\n */\n ApiServiceRegistry.clearRegistry = function () {\n window.__tableauApiServiceRegistry = {};\n };\n return ApiServiceRegistry;\n}());\nexports.ApiServiceRegistry = ApiServiceRegistry;\n//# sourceMappingURL=ServiceRegistry.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar AccessibilityModels_1 = require(\"../../Models/AccessibilityModels\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar AccessibilityServiceImpl = /** @class */ (function (_super) {\n __extends(AccessibilityServiceImpl, _super);\n function AccessibilityServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(AccessibilityServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"accessibility\" /* Accessibility */;\n },\n enumerable: true,\n configurable: true\n });\n AccessibilityServiceImpl.prototype.getTooltipTextAsync = function (visualId, tupleId) {\n var _a;\n var tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getTooltipTextAsync',\n _a[api_internal_contract_js_1.ParameterId.TooltipTextRequest] = tooltipTextRequest,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then(function (response) {\n return response.result;\n });\n };\n AccessibilityServiceImpl.prototype.leaveMarkNavigationAsync = function (visualId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'leaveMarkNavigationAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then(function (response) {\n return;\n });\n };\n return AccessibilityServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.AccessibilityServiceImpl = AccessibilityServiceImpl;\n//# sourceMappingURL=AccessibilityServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar AnimationServiceImpl = /** @class */ (function (_super) {\n __extends(AnimationServiceImpl, _super);\n function AnimationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(AnimationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"animation-service\" /* Animation */;\n },\n enumerable: true,\n configurable: true\n });\n AnimationServiceImpl.prototype.replayAsync = function (replaySpeed) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.ReplaySpeed] = 1.0,\n _a);\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(function (response) {\n return;\n });\n };\n return AnimationServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.AnimationServiceImpl = AnimationServiceImpl;\n//# sourceMappingURL=AnimationServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nvar SelectionModels_1 = require(\"../../Models/SelectionModels\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar AnnotationServiceImpl = /** @class */ (function (_super) {\n __extends(AnnotationServiceImpl, _super);\n function AnnotationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(AnnotationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"annotation-service\" /* Annotation */;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Method to annotate a mark on the given worksheet.\n *\n * @param visualId\n * @param mark\n * @param annotationText\n */\n AnnotationServiceImpl.prototype.annotateMarkAsync = function (visualId, mark, annotationText) {\n var _a;\n var selectionModelContainer = this.parseMarkSelectionIds([mark]);\n var dummyTargetPoint = { x: 0, y: 0 };\n var formattedText = \"\" + annotationText + \"\";\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'annotateMarkAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.AnnotateEnum] = api_internal_contract_js_1.AnnotateEnum.Mark,\n _a[api_internal_contract_js_1.ParameterId.TargetPoint] = dummyTargetPoint,\n _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection],\n _a[api_internal_contract_js_1.ParameterId.FormattedText] = formattedText,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then(function (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 AnnotationServiceImpl.prototype.getAnnotationsAsync = function (visualId) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAnnotationsAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then(function (response) {\n var 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 AnnotationServiceImpl.prototype.removeAnnotationAsync = function (visualId, annotation) {\n var _a;\n var selectionModelContainer = this.parseAnnotationSelectionIds([annotation]);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeAnnotationAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection],\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then(function (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 AnnotationServiceImpl.prototype.parseMarkSelectionIds = function (marks) {\n var ids = [];\n var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n marks.forEach(function (mark) {\n var 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 var 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 AnnotationServiceImpl.prototype.parseAnnotationSelectionIds = function (annotations) {\n var ids = [];\n var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n annotations.forEach(function (annotation) {\n var 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 var 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 AnnotationServiceImpl.prototype.mapAnnotation = function (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 AnnotationServiceImpl.prototype.annotationFilterMap = function (annotations) {\n var _this = this;\n var annotationInfos = annotations.map(function (annotation) { return _this.mapAnnotation(annotation); });\n return annotationInfos;\n };\n return AnnotationServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.AnnotationServiceImpl = AnnotationServiceImpl;\n//# sourceMappingURL=AnnotationServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ClientInfoServiceImpl = /** @class */ (function (_super) {\n __extends(ClientInfoServiceImpl, _super);\n function ClientInfoServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ClientInfoServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"client-info-service\" /* ClientInfo */;\n },\n enumerable: true,\n configurable: true\n });\n ClientInfoServiceImpl.prototype.getClientInfoAsync = function () {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getClientInfoAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var clientInfo = response.result;\n return clientInfo;\n });\n };\n return ClientInfoServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ClientInfoServiceImpl = ClientInfoServiceImpl;\n//# sourceMappingURL=ClientInfoServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar InternalContract = require(\"@tableau/api-internal-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar DataSource_1 = require(\"../../DataSource\");\nvar Field_1 = require(\"../../Field\");\nvar DataSourceImpl_1 = require(\"../../Impl/DataSourceImpl\");\nvar FieldImpl_1 = require(\"../../Impl/FieldImpl\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nexports.SENTINEL_LOGICAL_TABLE_INFO = {\n id: InternalContract.ApiShowDataTableSentinel.SingleTableId,\n caption: InternalContract.ApiShowDataTableSentinel.SingleTableCaption,\n};\n// The minimum platform version when Object Model was supported\nvar platformVersionObjectModelSupport = { major: 1, minor: 20, fix: 1 };\nvar DataSourceServiceImpl = /** @class */ (function (_super) {\n __extends(DataSourceServiceImpl, _super);\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 function DataSourceServiceImpl(dispatcher, registryId, _platformVersion) {\n if (_platformVersion === void 0) { _platformVersion = platformVersionObjectModelSupport; }\n var _this = _super.call(this, dispatcher, registryId) || this;\n _this._platformVersion = _platformVersion;\n return _this;\n }\n Object.defineProperty(DataSourceServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"data-source-service\" /* DataSourceService */;\n },\n enumerable: true,\n configurable: true\n });\n DataSourceServiceImpl.prototype.refreshAsync = function (dataSourceId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'refreshAsync',\n _a[api_internal_contract_js_1.ParameterId.DeltaTimeMs] = 0,\n _a[api_internal_contract_js_1.ParameterId.ShouldRefreshDS] = true,\n _a);\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(function (response) {\n return;\n });\n };\n DataSourceServiceImpl.prototype.getActiveTablesAsync = function (dataSourceId) {\n var _a;\n var joinParameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getActiveTablesAsync',\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId,\n _a);\n // Get the description of the tables used by this connection\n return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then(function (joinResponse) {\n var 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 DataSourceServiceImpl.prototype.getDataSourcesAsync = function (visualId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourcesAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then(function (response) {\n var dataSchema = response.result;\n return dataSchema;\n });\n };\n DataSourceServiceImpl.prototype.getAllDataSourcesAsync = function () {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAllDataSourcesAsync',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then(function (response) {\n var dataSchema = response.result;\n return dataSchema;\n });\n };\n DataSourceServiceImpl.prototype.getConnectionSummariesAsync = function (dataSourceId) {\n var _a;\n var params = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getConnectionSummariesAsync',\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId,\n _a);\n // Get the description of the tables used by this connection\n return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then(function (response) {\n var descriptionSummaries = response.result;\n return descriptionSummaries;\n });\n };\n DataSourceServiceImpl.prototype.getFieldAsync = function (globalfieldName) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFieldAsync',\n _a[api_internal_contract_js_1.ParameterId.FieldId] = globalfieldName,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource];\n var field = response.result[api_internal_contract_js_1.ParameterId.Field];\n return _this.convertField(field, _this.convertDataSource(dataSource));\n });\n };\n DataSourceServiceImpl.prototype.getLogicalTablesAsync = function (dataSourceId) {\n var _a;\n if (!this.isObjectModelSupportedByPlatform()) {\n /**\n * This sentinel ID can be passed to datasource.getLogicalTableData.\n * Once the desktop is upgraded to a version that supports object model,\n * the sentinel ID will automatically fetch the upgraded table.\n * */\n return new Promise(function (resolve) { return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); });\n }\n var params = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTablesAsync',\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then(function (response) {\n return response.result;\n });\n };\n DataSourceServiceImpl.prototype.getUnderlyingTablesAsync = function (visualId) {\n var _a;\n if (!this.isObjectModelSupportedByPlatform()) {\n /**\n * This sentinel ID can be passed to worksheet.getUnderlyingTableData.\n * Once the desktop is upgraded to a version that supports object model,\n * the sentinel ID will automatically fetch the upgraded table.\n * */\n return new Promise(function (resolve) { return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); });\n }\n var params = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTablesAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then(function (response) {\n return response.result;\n });\n };\n DataSourceServiceImpl.prototype.convertField = function (field, dataSource) {\n return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource));\n };\n DataSourceServiceImpl.prototype.convertDataSource = function (dataSource) {\n return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId));\n };\n DataSourceServiceImpl.prototype.isObjectModelSupportedByPlatform = function () {\n var platformVersionNoObjectModelSupport = { major: 1, minor: 13, fix: 0 };\n return InternalContract.VersionLessThan(platformVersionNoObjectModelSupport, this._platformVersion);\n };\n return DataSourceServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.DataSourceServiceImpl = DataSourceServiceImpl;\n//# sourceMappingURL=DataSourceServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\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};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar ExportHelpers_1 = require(\"../../Utils/ExportHelpers\");\nvar ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ExportServiceImpl = /** @class */ (function (_super) {\n __extends(ExportServiceImpl, _super);\n function ExportServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ExportServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"export-service\" /* Export */;\n },\n enumerable: true,\n configurable: true\n });\n ExportServiceImpl.prototype.getExportCrosstabSheetMapAsync = function (currentSheetType) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportCrosstabSheetMapAsync',\n _a[api_internal_contract_js_1.ParameterId.CurrentSheetType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType),\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n ExportServiceImpl.prototype.exportCrosstabAsync = function (sheetName, format, exportableWorksheetNames, currentSheetType) {\n return __awaiter(this, void 0, void 0, function () {\n var sheetNameToIdMap, parameters, verb;\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName);\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat');\n return [4 /*yield*/, this.getExportCrosstabSheetMapAsync(currentSheetType)];\n case 1:\n sheetNameToIdMap = _b.sent();\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 parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportCrosstabAsync',\n _a[api_internal_contract_js_1.ParameterId.SheetIdentifier] = sheetNameToIdMap[sheetName],\n _a[api_internal_contract_js_1.ParameterId.SendNotifications] = true,\n _a);\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 [2 /*return*/, this.execute(verb, parameters)\n .then(function (response) {\n var result = response.result;\n return result;\n })\n .catch(function () {\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 });\n };\n ExportServiceImpl.prototype.exportDataAsync = function (visualId, options) {\n var _a;\n var _b;\n ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options);\n // Remove any duplicates from the input array\n var columnsAsSet = new Set(options.columnsToIncludeById);\n var columnsToIncludeById = Array.from(columnsAsSet);\n var verb = api_internal_contract_js_1.VerbId.ExportDataDownload;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportDataAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = (_b = options.ignoreAliases, (_b !== null && _b !== void 0 ? _b : false)),\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = columnsToIncludeById,\n _a);\n return this.execute(verb, parameters)\n .then(function () { })\n .catch(function () {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.');\n });\n };\n ExportServiceImpl.prototype.exportPowerPointAsync = function (sheetNames, exportScenarios) {\n var _a;\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 var verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPowerPointAsync',\n _a[api_internal_contract_js_1.ParameterId.ExportOriginUrl] = '',\n _a[api_internal_contract_js_1.ParameterId.SelectedSheetNames] = sheetNames,\n _a);\n return this.execute(verb, parameters)\n .then(function (response) {\n var result = response.result;\n return result;\n })\n .catch(function () {\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 ExportServiceImpl.prototype.exportPDFAsync = function (sheetNames, externalExportPdfOptions, exportScenarios) {\n return __awaiter(this, void 0, void 0, function () {\n var internalExportPdfOptions, verb, parameters;\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions);\n ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios);\n return [4 /*yield*/, this.getExportPDFOptionsAsync()];\n case 1:\n internalExportPdfOptions = _b.sent();\n ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames);\n verb = api_internal_contract_js_1.VerbId.ExportPdfDownload;\n parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPDFAsync',\n _a[api_internal_contract_js_1.ParameterId.ExportPdfOptions] = internalExportPdfOptions,\n _a);\n return [2 /*return*/, this.execute(verb, parameters)\n .then(function (response) {\n var result = response.result;\n return result;\n })\n .catch(function () {\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 });\n };\n ExportServiceImpl.prototype.getExportPDFOptionsAsync = function () {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportPdfOptionsAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n return ExportServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ExportServiceImpl = ExportServiceImpl;\n//# sourceMappingURL=ExportServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ExternalContextMenuServiceImpl = /** @class */ (function (_super) {\n __extends(ExternalContextMenuServiceImpl, _super);\n function ExternalContextMenuServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ExternalContextMenuServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"external-context-menu-service\" /* ExternalContextMenu */;\n },\n enumerable: true,\n configurable: true\n });\n ExternalContextMenuServiceImpl.prototype.appendContextMenuAsync = function (sheetName, targetMenu, config) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'appendContextMenuAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName] = config.displayName,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var newMenuItemId = response.result;\n return newMenuItemId;\n });\n };\n ExternalContextMenuServiceImpl.prototype.removeContextMenuAsync = function (sheetName, targetMenu, menuItemId) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeContextMenuAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n ExternalContextMenuServiceImpl.prototype.executeContextMenuAsync = function (sheetName, targetMenu, menuItemId) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'executeContextMenuAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n ExternalContextMenuServiceImpl.prototype.renameContextMenuAsync = function (sheetName, targetMenu, menuHeader, menuDescription) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.RenameExternalMenu;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'renameContextMenuAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuHeader] = menuHeader,\n _a[api_internal_contract_js_1.ParameterId.ExternalMenuDescription] = menuDescription,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n return ExternalContextMenuServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl;\n//# sourceMappingURL=ExternalContextMenuServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\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};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar InternalContract = require(\"@tableau/api-internal-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ApiShared_1 = require(\"../../../ApiShared\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nvar FilterModels_1 = require(\"../../Models/FilterModels\");\nvar DataValueFactory_1 = require(\"../../Utils/DataValueFactory\");\nvar Param_1 = require(\"../../Utils/Param\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar FilterServiceImpl = /** @class */ (function (_super) {\n __extends(FilterServiceImpl, _super);\n function FilterServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(FilterServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"filter-service\" /* Filter */;\n },\n enumerable: true,\n configurable: true\n });\n FilterServiceImpl.prototype.applyFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyFilterAsync',\n _a);\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(function (response) {\n return fieldName;\n });\n };\n FilterServiceImpl.prototype.applyRangeFilterAsync = function (visualId, fieldName, filterOptions) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRangeFilterAsync',\n _a);\n if (filterOptions.min !== undefined && filterOptions.min !== null) {\n var min = void 0;\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 var max = void 0;\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(function (response) {\n _this.apiFilterHandlerCheckForCommandError(response.result);\n return fieldName;\n });\n };\n FilterServiceImpl.prototype.applyHierarchicalFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.HierarchicalFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyHierarchicalFilterAsync',\n _a);\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n var 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(function (response) {\n return fieldName;\n });\n };\n FilterServiceImpl.prototype.clearFilterAsync = function (visualId, fieldName) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ClearFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearFilterAsync',\n _a);\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(function (resposne) {\n return fieldName;\n });\n };\n FilterServiceImpl.prototype.applyRelativeDateFilterAsync = function (visualId, fieldName, options) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRelativeDateFilterAsync',\n _a);\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(function (response) {\n return response.result;\n });\n };\n FilterServiceImpl.prototype.getFiltersAsync = function (visualId) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetFilters;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFiltersAsync',\n _a);\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n return this.execute(verb, parameters).then(function (response) {\n var filters = response.result;\n return _this.convertDomainFilters(filters);\n });\n };\n FilterServiceImpl.prototype.getCategoricalDomainAsync = function (worksheetName, fieldId, domainType) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCategoricalDomainAsync',\n _a);\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(function (response) {\n var domain = response.result;\n return _this.convertCategoricalDomain(domain, domainType);\n });\n };\n FilterServiceImpl.prototype.getRangeDomainAsync = function (worksheetName, fieldId, domainType) {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetRangeDomain;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getRangeDomainAsync',\n _a);\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(function (response) {\n var domain = response.result;\n return _this.convertRangeDomain(domain, domainType);\n });\n };\n FilterServiceImpl.prototype.getDashboardFiltersAsync = function () {\n var _a;\n var _this = this;\n var verb = api_internal_contract_js_1.VerbId.GetDashboardFilters;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDashboardFiltersAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var filters = response.result;\n return _this.convertDomainFilters(filters);\n });\n };\n FilterServiceImpl.prototype.applyDashboardFilterAsync = function (fieldName, values, updateType, filterOptions) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyDashboardFilterAsync',\n _a);\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(function (response) {\n return response.result;\n });\n };\n FilterServiceImpl.prototype.getAppliedWorksheetsAsync = function (worksheetName, fieldId) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n var sharedFilterModel, worksheetNames;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync')];\n case 1:\n sharedFilterModel = _b.sent();\n worksheetNames = [];\n (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map(function (worksheetInfo) {\n if (worksheetInfo.isSelected) {\n worksheetNames.push(worksheetInfo.worksheetName);\n }\n });\n return [2 /*return*/, worksheetNames];\n }\n });\n });\n };\n FilterServiceImpl.prototype.setAppliedWorksheetsAsync = function (worksheetName, fieldName, fieldId, applyToWorksheets) {\n return __awaiter(this, void 0, void 0, function () {\n var sharedFilterModel, allowedWorksheets, activeWorksheet, verb, parameters;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal')];\n case 1:\n sharedFilterModel = _a.sent();\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 allowedWorksheets = [];\n activeWorksheet = '';\n sharedFilterModel.worksheets.forEach(function (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(function (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 verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter;\n 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 [2 /*return*/, this.execute(verb, parameters).then(function (response) {\n return applyToWorksheets;\n })];\n }\n });\n });\n };\n // Helper Methods\n FilterServiceImpl.prototype.executeGetAppliedWorksheets = function (worksheetName, fieldId, telemetryFunctionName) {\n var verb = api_internal_contract_js_1.VerbId.GetSharedFilter;\n var 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(function (response) {\n var sharedFilterModel = response.result;\n return sharedFilterModel;\n });\n };\n FilterServiceImpl.prototype.convertDomainFilters = function (domainFilters) {\n var _this = this;\n var filters = [];\n domainFilters.forEach(function (domainFilter) {\n switch (domainFilter.filterType) {\n case api_internal_contract_js_1.FilterType.Categorical: {\n var 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 var 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 var 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 var 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 FilterServiceImpl.prototype.convertCategoricalFilter = function (domainFilter) {\n var appliedValues = domainFilter.values.map(function (dv) {\n return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv);\n });\n 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);\n };\n FilterServiceImpl.prototype.convertHierarchicalFilter = function (domainFilter) {\n var appliedValues = domainFilter.values.map(function (hierarchicalDataValue) {\n return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level);\n });\n var levelDetails = domainFilter.levelInfo.map(function (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_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected);\n };\n FilterServiceImpl.prototype.convertRangeFilter = function (domainFilter) {\n var minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min);\n var maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max);\n 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);\n };\n FilterServiceImpl.prototype.convertRelativeDateFilter = function (domainFilter) {\n var 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 FilterServiceImpl.prototype.convertCategoricalDomain = function (domain, domainType) {\n var values = domain.values.map(function (domainDv) {\n return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv);\n });\n return new FilterModels_1.CategoricalDomain(values, domainType);\n };\n FilterServiceImpl.prototype.convertRangeDomain = function (domain, domainType) {\n var min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min);\n var max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max);\n return new FilterModels_1.RangeDomain(min, max, domainType);\n };\n FilterServiceImpl.prototype.convertAnchorDate = function (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 var year = anchorDate.getUTCFullYear();\n var month = anchorDate.getUTCMonth() + 1;\n var day = anchorDate.getUTCDate();\n var hh = anchorDate.getUTCHours();\n var mm = anchorDate.getUTCMinutes();\n var 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 var result = year + \"-\" + month + \"-\" + day + \" \" + hh + \":\" + mm + \":\" + sec;\n return result;\n };\n FilterServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (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 return FilterServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.FilterServiceImpl = FilterServiceImpl;\n//# sourceMappingURL=FilterServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar uuid_1 = require(\"uuid\");\nvar ApiShared_1 = require(\"../../../ApiShared\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar GetDataModels_1 = require(\"../../Models/GetDataModels\");\nvar GetDataTableReaderModels_1 = require(\"../../Models/GetDataTableReaderModels\");\nvar DataValueFactory_1 = require(\"../../Utils/DataValueFactory\");\nvar GetDataService_1 = require(\"../GetDataService\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar GetDataServiceImpl = /** @class */ (function (_super) {\n __extends(GetDataServiceImpl, _super);\n function GetDataServiceImpl() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n // The extension/embedding instance uses the same cache for all DataTableReaders.\n _this.viewDataTableCacheId = uuid_1.v4();\n return _this;\n }\n Object.defineProperty(GetDataServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"get-data-service\" /* GetData */;\n },\n enumerable: true,\n configurable: true\n });\n GetDataServiceImpl.prototype.getMaxRowLimit = function () {\n return 10000;\n };\n GetDataServiceImpl.prototype.getViewDataTableCacheId = function () {\n return this.viewDataTableCacheId;\n };\n GetDataServiceImpl.prototype.getLimitedMaxRows = function (requestedRows, rowCountLimit) {\n return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit;\n };\n GetDataServiceImpl.prototype.getUnderlyingDataAsync = function (visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) {\n var _a;\n var _this = this;\n // Create all of our parameters\n var summaryData = getType === GetDataService_1.GetDataType.Summary;\n var functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync';\n var verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData;\n var requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = functionName,\n _a);\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 return this.execute(verb, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsTable(responseData.data, responseData.isSummary);\n });\n };\n GetDataServiceImpl.prototype.getSummaryDataReaderAsync = function (visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryDataReaderAsync',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection,\n _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then(function (response) {\n var responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId);\n });\n };\n GetDataServiceImpl.prototype.getSummaryColumnsInfoAsync = function (visualId) {\n var _a;\n // Create all the parameters for GetDataType of Summary with 1 row, and only native values\n // Then return just the columns\n var verb = api_internal_contract_js_1.VerbId.GetDataSummaryData;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryColumnsInfoAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = true,\n _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = true,\n _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = true,\n _a[api_internal_contract_js_1.ParameterId.MaxRows] = 1,\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,\n _a);\n return this.execute(verb, parameters).then(function (response) {\n var underlyingDataTable = response.result;\n var dataTable = underlyingDataTable.data;\n var columns = dataTable.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); });\n return columns;\n });\n };\n GetDataServiceImpl.prototype.getSelectedMarksAsync = function (visualId) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSelectedMarksAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then(function (response) {\n var responseData = response.result;\n return {\n data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }),\n };\n });\n };\n GetDataServiceImpl.prototype.getHighlightedMarksAsync = function (visualId) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getHighlightedMarksAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then(function (response) {\n var responseData = response.result;\n return {\n data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }),\n };\n });\n };\n GetDataServiceImpl.prototype.getDataSourceDataAsync = function (dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourceDataAsync',\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = this.verifyIncludeColumnArray(columnsToInclude),\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsTable(responseData.data, false);\n });\n };\n GetDataServiceImpl.prototype.getLogicalTableDataAsync = function (datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataAsync',\n _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = columnsToInclude,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId,\n _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsTable(responseData.data, false);\n });\n };\n GetDataServiceImpl.prototype.getLogicalTableDataReaderAsync = function (datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit());\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataReaderAsync',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId,\n _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId,\n _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then(function (response) {\n var responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId);\n });\n };\n GetDataServiceImpl.prototype.getUnderlyingTableDataAsync = function (visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection,\n _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsTable(responseData.data, false);\n });\n };\n GetDataServiceImpl.prototype.getUnderlyingTableDataReaderAsync = function (visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption) {\n var _a;\n var _this = this;\n pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit());\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataReaderAsync',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId,\n _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases,\n _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection,\n _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns,\n _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById),\n _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then(function (response) {\n var responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId);\n });\n };\n GetDataServiceImpl.prototype.getPageAsync = function (tableId, pageNumber, pageSize) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getPageAsync',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId,\n _a[api_internal_contract_js_1.ParameterId.DataRowIndex] = pageNumber * pageSize,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then(function (response) {\n var responseData = response.result;\n return _this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false);\n });\n };\n GetDataServiceImpl.prototype.releaseAsync = function (tableId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'release',\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(),\n _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then(function (response) {\n return;\n });\n };\n GetDataServiceImpl.prototype.verifyIncludeColumnArray = function (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 var columnsAsSet = new Set(columns);\n return Array.from(columnsAsSet);\n };\n GetDataServiceImpl.prototype.processResultsTable = function (responseData, isSummary) {\n var headers = responseData.headers.map(function (h) { return 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 var marks;\n if (responseData.marks) {\n marks = responseData.marks.map(function (h) { return 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 var isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1;\n if (isTotalRowCountLimited) {\n responseData.dataTable.length -= 1;\n }\n var table = responseData.dataTable.map(function (row) {\n return row.map(function (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 GetDataServiceImpl.prototype.processResultsPage = function (responseData, isSummary) {\n var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); });\n var marks;\n if (responseData.marks) {\n marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); });\n }\n var table = responseData.dataTable.map(function (row) {\n return row.map(function (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 GetDataServiceImpl.summaryTableId = '';\n return GetDataServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.GetDataServiceImpl = GetDataServiceImpl;\n//# sourceMappingURL=GetDataServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar NotificationServiceImplBase_1 = require(\"./NotificationServiceImplBase\");\nvar NotificationServiceImpl = /** @class */ (function (_super) {\n __extends(NotificationServiceImpl, _super);\n function NotificationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(NotificationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"notification-service\" /* Notification */;\n },\n enumerable: true,\n configurable: true\n });\n return NotificationServiceImpl;\n}(NotificationServiceImplBase_1.NotificationServiceImplBase));\nexports.NotificationServiceImpl = NotificationServiceImpl;\n//# sourceMappingURL=NotificationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Registration = /** @class */ (function () {\n function Registration(_filterFn, _callbackFn) {\n this._filterFn = _filterFn;\n this._callbackFn = _callbackFn;\n // Nothing Here\n }\n Registration.prototype.onNotification = function (notificationModel) {\n if (this._filterFn(notificationModel)) {\n this._callbackFn(notificationModel);\n }\n };\n return Registration;\n}());\nexports.Registration = Registration;\nvar NotificationServiceImplBase = /** @class */ (function () {\n function NotificationServiceImplBase(dispatcher) {\n this.dispatcher = dispatcher;\n this._handlers = {};\n this.dispatcher.registerNotificationHandler(this.onNotification.bind(this));\n }\n NotificationServiceImplBase.prototype.registerHandler = function (id, filterFn, handler) {\n var _this = this;\n var handlers = this._handlers[id] || new Array();\n var registration = new Registration(filterFn, handler);\n handlers.push(registration);\n this._handlers[id] = handlers;\n return function () { return _this.removeRegistration(id, registration); };\n };\n NotificationServiceImplBase.prototype.hasHandlersForNotificationType = function (id) {\n // eslint-disable-next-line no-prototype-builtins\n return this._handlers.hasOwnProperty(id);\n };\n NotificationServiceImplBase.prototype.onNotification = function (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(function (h) { return h.onNotification(notification.data); });\n };\n NotificationServiceImplBase.prototype.removeRegistration = function (id, registration) {\n if (!this.hasHandlersForNotificationType(id)) {\n return;\n }\n this._handlers[id] = this._handlers[id].filter(function (reg) { return reg !== registration; });\n };\n return NotificationServiceImplBase;\n}());\nexports.NotificationServiceImplBase = NotificationServiceImplBase;\n//# sourceMappingURL=NotificationServiceImplBase.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ParameterImpl_1 = require(\"../../Impl/ParameterImpl\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ParametersServiceImpl = /** @class */ (function (_super) {\n __extends(ParametersServiceImpl, _super);\n function ParametersServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ParametersServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"parameters-service\" /* Parameters */;\n },\n enumerable: true,\n configurable: true\n });\n ParametersServiceImpl.prototype.getParametersForSheetAsync = function (sheetPath) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync',\n _a[api_internal_contract_js_1.ParameterId.SheetPath] = sheetPath,\n _a);\n return this.getParametersAsync(parameters);\n };\n ParametersServiceImpl.prototype.getAllParametersAsync = function () {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync',\n _a);\n return this.getParametersAsync(parameters);\n };\n ParametersServiceImpl.prototype.getParametersAsync = function (inputParameters) {\n var _this = this;\n return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then(function (response) {\n var result = response.result;\n return result.map(function (parameterInfo) {\n return new ParameterImpl_1.ParameterImpl(parameterInfo, _this._registryId);\n });\n });\n };\n ParametersServiceImpl.prototype.changeParameterValueAsync = function (fieldName, newValue) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeParameterValueAsync',\n _a[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName,\n _a[api_internal_contract_js_1.ParameterId.ParameterValue] = newValue,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n ParametersServiceImpl.prototype.findParameterByNameAsync = function (name) {\n return this.findParameterAsync(name, undefined);\n };\n ParametersServiceImpl.prototype.findParameterByGlobalFieldNameAsync = function (fieldName) {\n return this.findParameterAsync(undefined, fieldName);\n };\n ParametersServiceImpl.prototype.findParameterAsync = function (name, fieldName) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'findParameterAsync',\n _a);\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(function (response) {\n var instanceOfParameterInfo = function (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 var result = response.result;\n return new ParameterImpl_1.ParameterImpl(result, _this._registryId);\n }\n else {\n return undefined;\n }\n });\n };\n return ParametersServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ParametersServiceImpl = ParametersServiceImpl;\n//# sourceMappingURL=ParametersServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar SelectionModels_1 = require(\"../../Models/SelectionModels\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar Param_1 = require(\"../../Utils/Param\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar SelectionServiceImpl = /** @class */ (function (_super) {\n __extends(SelectionServiceImpl, _super);\n function SelectionServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(SelectionServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"selection-service\" /* Selection */;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Method to clear all the selected marks for the given worksheet.\n *\n * @param visualId\n */\n SelectionServiceImpl.prototype.clearSelectedMarksAsync = function (visualId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearSelectedMarksAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then(function (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 SelectionServiceImpl.prototype.selectMarksByValueAsync = function (visualId, selectionCriterias, selectionUpdateType) {\n var _a;\n var _this = this;\n if (selectionCriterias.length === 0) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value');\n }\n var selectionType = this.validateSelectionUpdateType(selectionUpdateType);\n var selectionModelContainer = this.parseSelectionMarks(selectionCriterias);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByValueAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType,\n _a);\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(function (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 SelectionServiceImpl.prototype.hoverTupleAsync = function (visualId, hoveredTuple, tooltip, allowHoverActions) {\n var _a;\n var interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'hoverTupleAsync',\n _a[api_internal_contract_js_1.ParameterId.HoverTupleInteraction] = interactionModel,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then(function (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 SelectionServiceImpl.prototype.selectTuplesAsync = function (visualId, selectedTuples, selectOption, tooltip) {\n var _a;\n var interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectTuplesAsync',\n _a[api_internal_contract_js_1.ParameterId.SelectTuplesInteraction] = interactionModel,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then(function (response) {\n return;\n });\n };\n SelectionServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (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 SelectionServiceImpl.prototype.selectMarksByIdAsync = function (visualId, marks, selectionUpdateType) {\n var _a;\n if (marks.length === 0) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id');\n }\n var selectionType = this.validateSelectionUpdateType(selectionUpdateType);\n var selectionModelContainer = this.parseSelectionIds(marks);\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByIdAsync',\n _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId,\n _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType,\n _a[api_internal_contract_js_1.ParameterId.Selection] = selectionModelContainer.selection,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then(function (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 SelectionServiceImpl.prototype.parseSelectionIds = function (marks) {\n var ids = [];\n var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n for (var i = 0; i < marks.length; i++) {\n var 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 var 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 SelectionServiceImpl.prototype.parseSelectionMarks = function (selectionCriterias) {\n var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n for (var i = 0; i < selectionCriterias.length; i++) {\n var 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 var catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g');\n var rangeOption = st.value;\n if (catRegex.test(st.fieldName)) {\n // Hierarchical value selection\n var 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 var quantModel = this.addToRangeParamsList(st.fieldName, rangeOption);\n selectionModelContainer.quantModelArr.push(quantModel);\n }\n else {\n // Dimension value selection\n var 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 SelectionServiceImpl.prototype.addToParamsList = function (fieldName, value) {\n var valueSelectionModel = new SelectionModels_1.ValueSelectionModel();\n var markValues = [];\n if (value instanceof Array) {\n var valueArr = value;\n for (var 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 SelectionServiceImpl.prototype.addToRangeParamsList = function (fieldName, value) {\n var 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 SelectionServiceImpl.prototype.validateSelectionUpdateType = function (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 SelectionServiceImpl.prototype.validateNullOptionType = function (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 SelectionServiceImpl.prototype.ensureTupleIDIsNonNegative = function (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 return SelectionServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.SelectionServiceImpl = SelectionServiceImpl;\n//# sourceMappingURL=SelectionServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nvar TableauError_1 = require(\"../../TableauError\");\nvar 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 */\nvar ServiceImplBase = /** @class */ (function () {\n function ServiceImplBase(_dispatcher, _registryId) {\n this._dispatcher = _dispatcher;\n this._registryId = _registryId;\n }\n ServiceImplBase.prototype.execute = function (verb, params) {\n return this._dispatcher.execute(verb, params).catch(function (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 var internalError = error;\n var externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No);\n throw new TableauError_1.TableauError(externalErrorCode, internalError.message);\n });\n };\n return ServiceImplBase;\n}());\nexports.ServiceImplBase = ServiceImplBase;\n//# sourceMappingURL=ServiceImplBase.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar SizeServiceImpl = /** @class */ (function (_super) {\n __extends(SizeServiceImpl, _super);\n function SizeServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(SizeServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"size-service\" /* Size */;\n },\n enumerable: true,\n configurable: true\n });\n SizeServiceImpl.prototype.changeSizeAsync = function (name, newSize) {\n var _a;\n var _b, _c, _d, _e;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeSizeAsync',\n _a[api_internal_contract_js_1.ParameterId.SheetName] = name,\n _a[api_internal_contract_js_1.ParameterId.MinHeight] = ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.height) || 0,\n _a[api_internal_contract_js_1.ParameterId.MinWidth] = ((_c = newSize.minSize) === null || _c === void 0 ? void 0 : _c.width) || 0,\n _a[api_internal_contract_js_1.ParameterId.MaxHeight] = ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.height) || 0,\n _a[api_internal_contract_js_1.ParameterId.MaxWidth] = ((_e = newSize.maxSize) === null || _e === void 0 ? void 0 : _e.width) || 0,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then(function (_response) {\n return;\n });\n };\n return SizeServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.SizeServiceImpl = SizeServiceImpl;\n//# sourceMappingURL=SizeServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar StoryActivationServiceImpl = /** @class */ (function (_super) {\n __extends(StoryActivationServiceImpl, _super);\n function StoryActivationServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(StoryActivationServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"story-activation-service\" /* StoryActivation */;\n },\n enumerable: true,\n configurable: true\n });\n StoryActivationServiceImpl.prototype.activateNextStoryPointAsync = function () {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateNextStoryPointAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n StoryActivationServiceImpl.prototype.activatePreviousStoryPointAsync = function () {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activatePreviousStoryPointAsync',\n _a);\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n StoryActivationServiceImpl.prototype.activateStoryPointAsync = function (index) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateStoryPointAsync',\n _a);\n parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index;\n return this.execute(verb, parameters).then(function (response) {\n return;\n });\n };\n StoryActivationServiceImpl.prototype.revertStoryPointAsync = function (index) {\n var _a;\n var verb = api_internal_contract_js_1.VerbId.RevertStoryPoint;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'revertStoryPointAsync',\n _a);\n parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index;\n return this.execute(verb, parameters).then(function (response) {\n return response.result;\n });\n };\n return StoryActivationServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.StoryActivationServiceImpl = StoryActivationServiceImpl;\n//# sourceMappingURL=StoryActivationServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar VisualModelServiceImpl = /** @class */ (function (_super) {\n __extends(VisualModelServiceImpl, _super);\n function VisualModelServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(VisualModelServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"visual-model-service\" /* VisualModel */;\n },\n enumerable: true,\n configurable: true\n });\n VisualModelServiceImpl.prototype.getVisualSpecificationAsync = function (visualId) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getVisualSpecificationAsync',\n _a[api_internal_contract_js_1.ParameterId.WorksheetName] = visualId.worksheet,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n return VisualModelServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.VisualModelServiceImpl = VisualModelServiceImpl;\n//# sourceMappingURL=VisualModelServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar CustomViewImpl_1 = require(\"../../Impl/CustomViewImpl\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar VizServiceImpl = /** @class */ (function (_super) {\n __extends(VizServiceImpl, _super);\n function VizServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(VizServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"viz-service\" /* Viz */;\n },\n enumerable: true,\n configurable: true\n });\n VizServiceImpl.prototype.createVizImageAsync = function (inputSpec) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'createVizImageAsync',\n _a[api_internal_contract_js_1.ParameterId.VizAPIInputJson] = JSON.stringify(inputSpec),\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then(function (response) {\n var result = response.result;\n return result;\n });\n };\n VizServiceImpl.prototype.activateSheetAsync = function (name) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateSheetAsync',\n _a[api_internal_contract_js_1.ParameterId.SwitchToSheetName] = name,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(function () {\n return;\n });\n };\n VizServiceImpl.prototype.getCustomViewsAsync = function () {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCustomViewsAsync',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then(function (response) {\n var customViews = response.result;\n return customViews.map(function (customView) {\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n });\n };\n VizServiceImpl.prototype.showCustomViewAsync = function (customViewName) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'showCustomViewAsync',\n _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName || '',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then(function (response) {\n var _a;\n var customView = response.result;\n return ((_a = customView) === null || _a === void 0 ? void 0 : _a.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId) : undefined;\n });\n };\n VizServiceImpl.prototype.removeCustomViewAsync = function (customViewName) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeCustomViewAsync',\n _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then(function (response) {\n var customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n };\n VizServiceImpl.prototype.saveCustomViewAsync = function (customViewName) {\n var _a;\n var _this = this;\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 var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveCustomViewAsync',\n _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName,\n _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = false,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then(function (response) {\n var customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n };\n VizServiceImpl.prototype.setActiveCustomViewAsDefaultAsync = function () {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setActiveCustomViewAsDefaultAsync',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(function () {\n return;\n });\n };\n VizServiceImpl.prototype.saveAsync = function (customView) {\n var _a;\n var _this = this;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveAsync',\n _a[api_internal_contract_js_1.ParameterId.CustomViewLuid] = customView.luid,\n _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customView.name,\n _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = customView.isDefault,\n _a[api_internal_contract_js_1.ParameterId.CustomViewIsPublic] = customView.shared,\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then(function (response) {\n var customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId);\n });\n };\n VizServiceImpl.prototype.getCurrentSrcAsync = function () {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCurrentSrcAsync',\n _a);\n return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then(function (response) { return response.result; });\n };\n return VizServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.VizServiceImpl = VizServiceImpl;\n//# sourceMappingURL=VizServiceImpl.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nvar ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nvar Param_1 = require(\"../../Utils/Param\");\nvar ServiceImplBase_1 = require(\"./ServiceImplBase\");\nvar ZoneServiceImpl = /** @class */ (function (_super) {\n __extends(ZoneServiceImpl, _super);\n function ZoneServiceImpl() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ZoneServiceImpl.prototype, \"serviceName\", {\n get: function () {\n return \"zone-service\" /* Zone */;\n },\n enumerable: true,\n configurable: true\n });\n ZoneServiceImpl.prototype.setVisibilityAsync = function (dashboard, dashboardZoneMap, zoneVisibilityMap) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setVisibilityAsync',\n _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard,\n _a[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap] = {},\n _a);\n // zoneVisibilityMap can be either an object or a Map - convert it to a Map\n var parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap');\n parameterAsMap.forEach(function (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(function (response) {\n return;\n });\n };\n ZoneServiceImpl.prototype.moveAndResizeAsync = function (dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) {\n var _a;\n var parameters = (_a = {},\n _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard,\n _a[api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList] = dashboardObjectPositionAndSizeUpdateArray,\n _a);\n dashboardObjectPositionAndSizeUpdateArray.forEach(function (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(function (response) {\n return;\n });\n };\n return ZoneServiceImpl;\n}(ServiceImplBase_1.ServiceImplBase));\nexports.ZoneServiceImpl = ZoneServiceImpl;\n//# sourceMappingURL=ZoneServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Implementation of a table summary.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nvar TableSummary = /** @class */ (function () {\n function TableSummary(_tableInfo) {\n this._tableInfo = _tableInfo;\n }\n Object.defineProperty(TableSummary.prototype, \"name\", {\n get: function () {\n return this._tableInfo.name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TableSummary.prototype, \"id\", {\n get: function () {\n return this._tableInfo.id;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TableSummary.prototype, \"connectionId\", {\n get: function () {\n return this._tableInfo.connectionId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TableSummary.prototype, \"customSQL\", {\n get: function () {\n return this._tableInfo.customSQL;\n },\n enumerable: true,\n configurable: true\n });\n return TableSummary;\n}());\nexports.TableSummary = TableSummary;\n//# sourceMappingURL=TableSummary.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar TableauError = /** @class */ (function (_super) {\n __extends(TableauError, _super);\n function TableauError(_errorCode, message) {\n var _this = _super.call(this, _errorCode + \": \" + message) || this;\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 return _this;\n }\n Object.defineProperty(TableauError.prototype, \"errorCode\", {\n get: function () {\n return this._errorCode;\n },\n enumerable: true,\n configurable: true\n });\n return TableauError;\n}(Error));\nexports.TableauError = TableauError;\n//# sourceMappingURL=TableauError.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar InternalContract = require(\"@tableau/api-internal-contract-js\");\nvar 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 */\nvar DataValueFactory = /** @class */ (function () {\n function DataValueFactory() {\n }\n DataValueFactory.MakeParameterDataValue = function (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);\n };\n DataValueFactory.MakeFilterDataValue = function (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 DataValueFactory.MakeTableDataValue = function (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 return DataValueFactory;\n}());\nexports.DataValueFactory = DataValueFactory;\n//# sourceMappingURL=DataValueFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\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 */\nvar Deferred = /** @class */ (function () {\n /**\n * Creates an instance of Deferred.\n */\n function Deferred() {\n var _this = this;\n this._promise = new Promise(function (resolve, reject) {\n _this._resolve = resolve;\n _this._reject = reject;\n });\n }\n Object.defineProperty(Deferred.prototype, \"promise\", {\n /**\n * Gets the Promise.\n *\n * @readonly\n * @type {Promise}\n */\n get: function () {\n return this._promise;\n },\n enumerable: true,\n configurable: true\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 Deferred.prototype.resolve = function (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 Deferred.prototype.reject = function (reason) {\n if (!this._reject) {\n return;\n }\n this._reject(reason);\n };\n return Deferred;\n}());\nexports.Deferred = Deferred;\nexports.UnregisterTimeoutInMilliseconds = 30000;\n//# sourceMappingURL=Deferred.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar 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 */\nvar EnumConverter = /** @class */ (function () {\n function EnumConverter(_mappings, _defaultVal) {\n this._mappings = _mappings;\n this._defaultVal = _defaultVal;\n }\n EnumConverter.prototype.convert = function (enumVal, throwIfMissing) {\n if (throwIfMissing === void 0) { 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 return EnumConverter;\n}());\nexports.EnumConverter = EnumConverter;\nvar ShouldThrow;\n(function (ShouldThrow) {\n ShouldThrow[\"Yes\"] = \"yes\";\n ShouldThrow[\"No\"] = \"no\";\n})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {}));\n//# sourceMappingURL=EnumConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar 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 */\nvar ErrorHelpers = /** @class */ (function () {\n function ErrorHelpers() {\n }\n /**\n * Throws with code InternalError.\n *\n * @param apiName name of api that was called.\n */\n ErrorHelpers.apiNotImplemented = function (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 ErrorHelpers.verifyInternalValue = function (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 ErrorHelpers.verifyParameter = function (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 ErrorHelpers.verifyParameterType = function (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 ErrorHelpers.verifyStringParameter = function (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 * 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 ErrorHelpers.verifyEnumValue = function (enumValue, enumType, enumName) {\n var isValid = false;\n Object.keys(enumType).forEach(function (enumKey) {\n if (enumType[enumKey] === enumValue.toString()) {\n isValid = true;\n }\n });\n if (!isValid) {\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 /*tslint:disable-next-line */\n ErrorHelpers.verifyRange = function (value, min, max) {\n var 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 /*tslint:disable-next-line */\n ErrorHelpers.verifyRangeParamType = function (min, max) {\n if (!min && !max) {\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 (min && !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 (max && !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 (min && max && 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 ErrorHelpers.verifyZoneIsValid = function (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 ErrorHelpers.verifyZoneIsValidAndFloating = function (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 ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate = function (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 ErrorHelpers.verifySheetName = function (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 ErrorHelpers.verifyExportDataOptions = function (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 ErrorHelpers.verifySheetNamesForPDFAndPPT = function (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 var isIncludedInDashboard = sheetNames.every(function (sheetName) {\n return exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName);\n });\n if (isIncludedInDashboard) {\n return;\n }\n var isIncludedInWorkbook = sheetNames.every(function (sheetName) {\n return exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName);\n });\n if (isIncludedInWorkbook) {\n return;\n }\n var 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 ErrorHelpers.verifyExportPDFOptions = function (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 return ErrorHelpers;\n}());\nexports.ErrorHelpers = ErrorHelpers;\n//# sourceMappingURL=ErrorHelpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\n/**\n * Helper methods for Export APIs.\n *\n * @class ExportHelpers\n */\nvar ExportHelpers = /** @class */ (function () {\n function ExportHelpers() {\n }\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 ExportHelpers.updateInternalExportPDFOptions = function (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 ExportHelpers.updateExportLayoutOptions = function (internalExportPdfOptions, externalExportPdfOptions) {\n var 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 ExportHelpers.updateSheetOptions = function (internalExportPdfOptions, sheetNames) {\n var exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions, sheetOptions = internalExportPdfOptions.sheetOptions;\n // updating the export layouts options for each sheet and selecting sheet for export if included in list\n for (var _i = 0, sheetOptions_1 = sheetOptions; _i < sheetOptions_1.length; _i++) {\n var sheetOption = sheetOptions_1[_i];\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 ExportHelpers.setFitAndScaleValues = function (exportLayoutOptions, scalingSelection) {\n var _a;\n var _b = this.DefaultLayoutOptions, pageFitHorizontal = _b.pageFitHorizontal, pageFitVertical = _b.pageFitVertical, pageScaleMode = _b.pageScaleMode, pageScalePercent = _b.pageScalePercent;\n var fitMatch = this.fitRegex.exec(scalingSelection);\n var percentMatch = this.pctRegex.exec(scalingSelection);\n if (fitMatch) {\n _a = fitMatch.slice(1).map(function (value) { return Number(value); }), pageFitHorizontal = _a[0], pageFitVertical = _a[1];\n pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages;\n }\n else if (percentMatch) {\n pageScalePercent = percentMatch.slice(1).map(function (value) { return Number(value); })[0];\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 ExportHelpers.DefaultDataOptions = {\n ignoreAliases: false,\n columnsToIncludeById: [],\n };\n ExportHelpers.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 };\n ExportHelpers.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 };\n ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)');\n ExportHelpers.pctRegex = new RegExp('pct([0-9]+)');\n return ExportHelpers;\n}());\nexports.ExportHelpers = ExportHelpers;\n//# sourceMappingURL=ExportHelpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar ErrorHelpers_1 = require(\"./ErrorHelpers\");\nvar Param = /** @class */ (function () {\n function Param() {\n }\n /**\n * serializes the date into the format that the server expects.\n * @param date the date to serialize\n */\n Param.serializeDateForPlatform = function (date) {\n var year = date.getUTCFullYear();\n var month = date.getUTCMonth() + 1;\n var day = date.getUTCDate();\n var hh = date.getUTCHours();\n var mm = date.getUTCMinutes();\n var sec = date.getUTCSeconds();\n return year + \"-\" + month + \"-\" + day + \" \" + hh + \":\" + mm + \":\" + sec;\n };\n Param.serializeBooleanForPlatform = function (bool) {\n return bool ? 'true' : 'false';\n };\n Param.serializeNumberForPlatform = function (num) {\n return num.toString(10);\n };\n /**\n * Verifies the input is a number\n */\n /* tslint:disable-next-line:no-any */\n Param.isTypeNumber = function (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 Param.isTypeDate = function (input) {\n return input instanceof Date;\n };\n /* tslint:disable-next-line:no-any */\n Param.isTypeString = function (input) {\n return typeof input === 'string' || input instanceof String;\n };\n /* tslint:disable-next-line:no-any */\n Param.isTypeBool = function (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 Param.isNullOrUndefined = function (input) {\n return input === null || input === undefined;\n };\n /* tslint:disable-next-line:no-any */\n Param.serializeParameterValue = function (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 Param.convertParameterToMap = function (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 Param.tryParseNumber = function (value) {\n if (Param.isNullOrUndefined(value)) {\n return { success: false };\n }\n if (Param.isTypeNumber(value)) {\n return { parsed: value, success: true };\n }\n var 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 var parsed = parseFloat(valueString);\n if (isNaN(parsed)) {\n return { success: false };\n }\n return { parsed: parsed, success: true };\n };\n return Param;\n}());\nexports.Param = Param;\n//# sourceMappingURL=Param.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar SheetUtils = /** @class */ (function () {\n function SheetUtils() {\n }\n // This is a direct port from SheetSize.cs - SheetSizeFactory\n SheetUtils.getSheetSizeFromSizeConstraints = function (sizeConstraint) {\n var minWidth = sizeConstraint.minWidth, minHeight = sizeConstraint.minHeight, maxWidth = sizeConstraint.maxWidth, maxHeight = sizeConstraint.maxHeight;\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 var 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 SheetUtils.createAutomaticSize = function () {\n var behavior = Contract.SheetSizeBehavior.Automatic;\n var minSize = { width: 0, height: 0 };\n var maxSize = { width: 0, height: 0 };\n return { behavior: behavior, minSize: minSize, maxSize: maxSize };\n };\n SheetUtils.getPublishedSheetInfoByName = function (name, sheetInfos) {\n var sheetInfo = sheetInfos.find(function (sheet) { return sheet.name === name; });\n return sheetInfo;\n };\n SheetUtils.getSheetTypeEnum = function (internalSheetType) {\n var 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 SheetUtils.isValidSheetSize = function (sizeObject) {\n return sizeObject.behavior !== undefined;\n };\n return SheetUtils;\n}());\nexports.SheetUtils = SheetUtils;\n//# sourceMappingURL=SheetUtils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Contract = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"../TableauError\");\nvar 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 */\nvar ShortLivedDeferred = /** @class */ (function () {\n function ShortLivedDeferred(_timeoutInMilliseconds) {\n if (_timeoutInMilliseconds === void 0) { _timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds; }\n this._timeoutInMilliseconds = _timeoutInMilliseconds;\n }\n ShortLivedDeferred.prototype.getNewPromiseOrThrowIfBusy = function () {\n var _this = this;\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(function () {\n var 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 ShortLivedDeferred.prototype.resolve = function (response) {\n if (this._deferred) {\n clearTimeout(this._timeoutId);\n this._deferred.resolve(response);\n this._deferred = undefined;\n }\n };\n ShortLivedDeferred.prototype.reject = function (error) {\n if (this._deferred) {\n clearTimeout(this._timeoutId);\n this._deferred.reject(error);\n this._deferred = undefined;\n }\n };\n return ShortLivedDeferred;\n}());\nexports.ShortLivedDeferred = ShortLivedDeferred;\n//# sourceMappingURL=ShortLivedDeferred.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nvar TableauError_1 = require(\"./TableauError\");\n/**\n * Represents the current version of the extensions, embedding\n * and extensions-api-types library\n */\nvar VersionNumber = /** @class */ (function () {\n // private constructor so everyone uses the singleton instance\n // build numbers have this form: M.m.f-pre.N\n function VersionNumber(versionString, isAlpha) {\n var partStr = versionString.split('-');\n this.build = this.getBuildNumber(partStr[1]);\n versionString = partStr[0];\n var parts = versionString.split('.').map(function (p) { return 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 VersionNumber.prototype.getBuildNumber = function (preReleaseString) {\n var 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 var partStr = preReleaseString.split('.');\n return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber;\n };\n Object.defineProperty(VersionNumber.prototype, \"formattedValue\", {\n get: function () {\n return this.major + \".\" + this.minor + \".\" + this.fix;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(VersionNumber.prototype, \"fullFormattedValue\", {\n get: function () {\n return this.major + \".\" + this.minor + \".\" + this.fix + \"-pre.\" + this.build;\n },\n enumerable: true,\n configurable: true\n });\n return VersionNumber;\n}());\nexports.VersionNumber = VersionNumber;\n//# sourceMappingURL=VersionNumber.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar 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 */\nvar VersionedExternalApiDispatcher = /** @class */ (function () {\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 function VersionedExternalApiDispatcher(_apiDelegateDispatcher, platformVersionNumber) {\n var _this = this;\n this._apiDelegateDispatcher = _apiDelegateDispatcher;\n this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber);\n this._notificationHandlers = [];\n _apiDelegateDispatcher.registerNotificationHandler(function (notification) {\n if (_this._notificationHandlers.length === 0) {\n return;\n }\n var upgradedNotification = _this._versionConverter.upgradeNotification(notification);\n _this._notificationHandlers.forEach(function (handler) {\n handler(upgradedNotification);\n });\n });\n }\n VersionedExternalApiDispatcher.needsVersionConverter = function (platformVersion) {\n // If our platform is less than external library version, then we need a converter\n return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);\n };\n VersionedExternalApiDispatcher.prototype.execute = function (verb, parameters) {\n var _this = this;\n try {\n var downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters);\n return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then(function (response) {\n var upgradeResponse = _this._versionConverter.upgradeExecuteReturn(response, verb, parameters);\n return upgradeResponse;\n });\n }\n catch (e) {\n return Promise.reject(e);\n }\n };\n VersionedExternalApiDispatcher.prototype.registerNotificationHandler = function (handler) {\n this._notificationHandlers.push(handler);\n };\n VersionedExternalApiDispatcher.prototype.unregisterNotificationHandler = function (handler) {\n this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; });\n };\n return VersionedExternalApiDispatcher;\n}());\nexports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher;\n//# sourceMappingURL=VersionedExternalApiDispatcher.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;","// 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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\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 });\n// The following polyfills are needed for IE11\nvar api_shared_js_1 = require(\"@tableau/api-shared-js\");\nrequire(\"core-js/es/array/find\");\nrequire(\"core-js/es/array/from\");\nrequire(\"core-js/es/map\");\nrequire(\"core-js/es/number/is-integer\");\nrequire(\"core-js/es/number/is-nan\");\nrequire(\"core-js/es/number/parse-float\");\nrequire(\"core-js/es/number/parse-int\");\nrequire(\"core-js/es/object/assign\");\nrequire(\"core-js/es/object/entries\");\nrequire(\"core-js/es/object/set-prototype-of\");\nrequire(\"core-js/es/promise\");\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.\nvar ExtensionsImpl_1 = require(\"./ExtensionsApi/Impl/ExtensionsImpl\");\nvar Extensions_1 = require(\"./ExtensionsApi/Namespaces/Extensions\");\nvar 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);\nvar 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\");\nexports.AnalyticsObjectType = api_external_contract_js_1.AnalyticsObjectType;\nexports.AnnotationType = api_external_contract_js_1.AnnotationType;\nexports.ClassNameKey = api_external_contract_js_1.ClassNameKey;\nexports.ColumnType = api_external_contract_js_1.ColumnType;\nexports.DashboardLayoutChange = api_external_contract_js_1.DashboardLayoutChange;\nexports.DashboardObjectType = api_external_contract_js_1.DashboardObjectType;\nexports.DashboardObjectVisibilityType = api_external_contract_js_1.DashboardObjectVisibilityType;\nexports.DataType = api_external_contract_js_1.DataType;\nexports.DateRangeType = api_external_contract_js_1.DateRangeType;\nexports.DialogStyle = api_external_contract_js_1.DialogStyle;\nexports.EncodingType = api_external_contract_js_1.EncodingType;\nexports.ErrorCodes = api_external_contract_js_1.ErrorCodes;\nexports.ExtensionContext = api_external_contract_js_1.ExtensionContext;\nexports.ExtensionMode = api_external_contract_js_1.ExtensionMode;\nexports.FieldAggregationType = api_external_contract_js_1.FieldAggregationType;\nexports.FieldRoleType = api_external_contract_js_1.FieldRoleType;\nexports.FilterDomainType = api_external_contract_js_1.FilterDomainType;\nexports.FilterNullOption = api_external_contract_js_1.FilterNullOption;\nexports.FilterType = api_external_contract_js_1.FilterType;\nexports.FilterUpdateType = api_external_contract_js_1.FilterUpdateType;\nexports.HierarchicalLevelSelectionState = api_external_contract_js_1.HierarchicalLevelSelectionState;\nexports.IncludeDataValuesOption = api_external_contract_js_1.IncludeDataValuesOption;\nexports.MarkType = api_external_contract_js_1.MarkType;\nexports.ParameterValueType = api_external_contract_js_1.ParameterValueType;\nexports.PeriodType = api_external_contract_js_1.PeriodType;\nexports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType;\nexports.ReplaySpeedType = api_external_contract_js_1.ReplaySpeedType;\nexports.SelectOptions = api_external_contract_js_1.SelectOptions;\nexports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType;\nexports.SheetType = api_external_contract_js_1.SheetType;\nexports.SortDirection = api_external_contract_js_1.SortDirection;\nexports.TableauEventType = api_external_contract_js_1.TableauEventType;\nexports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType;\nexports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType;\nexports.VizImagePaletteType = api_external_contract_js_1.VizImagePaletteType;\nexports.VizImageSizeSettingAlignmentType = api_external_contract_js_1.VizImageSizeSettingAlignmentType;\nexports.VizImageSizeSettingType = api_external_contract_js_1.VizImageSizeSettingType;\nexports.VizImageSortDirectionType = api_external_contract_js_1.VizImageSortDirectionType;\nexports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType;\n//# sourceMappingURL=ExtensionsApi.js.map"],"names":["entryUnbind","module","exports","path","Array","from","Map","Number","isInteger","isNaN","parseFloat","parseInt","Object","assign","entries","setPrototypeOf","Promise","global","isCallable","tryToString","TypeError","argument","isConstructor","String","wellKnownSymbol","create","definePropertyModule","UNSCOPABLES","ArrayPrototype","prototype","undefined","f","configurable","value","key","isPrototypeOf","it","Prototype","isObject","bind","call","toObject","callWithSafeIterationClosing","isArrayIteratorMethod","lengthOfArrayLike","createProperty","getIterator","getIteratorMethod","arrayLike","O","IS_CONSTRUCTOR","this","argumentsLength","arguments","length","mapfn","mapping","result","step","iterator","next","iteratorMethod","index","done","toIndexedObject","toAbsoluteIndex","createMethod","IS_INCLUDES","$this","el","fromIndex","includes","indexOf","uncurryThis","IndexedObject","arraySpeciesCreate","push","TYPE","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","IS_FILTER_REJECT","NO_HOLES","callbackfn","that","specificCreate","self","boundFunction","target","forEach","map","filter","some","every","find","findIndex","filterReject","slice","isArray","SPECIES","originalArray","C","constructor","arraySpeciesConstructor","anObject","iteratorClose","fn","ENTRIES","error","ITERATOR","SAFE_CLOSING","called","iteratorWithReturn","exec","SKIP_CLOSING","ITERATION_SUPPORT","object","toString","stringSlice","TO_STRING_TAG_SUPPORT","classofRaw","TO_STRING_TAG","CORRECT_ARGUMENTS","tag","tryGet","callee","arraySlice","replace","split","join","TEST","Error","stack","V8_OR_CHAKRA_STACK_ENTRY","IS_V8_OR_CHAKRA_STACK","test","IS_FIREFOX_OR_SAFARI_STACK","dropEntries","defineProperty","redefineAll","anInstance","iterate","defineIterator","setSpecies","DESCRIPTORS","fastKey","InternalStateModule","setInternalState","set","internalStateGetterFor","getterFor","getConstructor","wrapper","CONSTRUCTOR_NAME","ADDER","Constructor","iterable","type","first","last","size","AS_ENTRIES","getInternalState","define","previous","state","entry","getEntry","removed","clear","data","prev","has","get","add","setStrong","ITERATOR_NAME","getInternalCollectionState","getInternalIteratorState","iterated","kind","$","isForced","redefine","InternalMetadataModule","fails","checkCorrectnessOfIteration","setToStringTag","inheritIfRequired","common","IS_WEAK","NativeConstructor","NativePrototype","exported","fixMethod","KEY","uncurriedNativeMethod","enable","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","dummy","forced","hasOwn","ownKeys","getOwnPropertyDescriptorModule","source","keys","getOwnPropertyDescriptor","i","F","getPrototypeOf","IteratorPrototype","createPropertyDescriptor","Iterators","returnThis","IteratorConstructor","NAME","bitmap","enumerable","writable","toPropertyKey","propertyKey","IS_PURE","FunctionName","createIteratorConstructor","createNonEnumerableProperty","IteratorsCore","PROPER_FUNCTION_NAME","PROPER","CONFIGURABLE_FUNCTION_NAME","CONFIGURABLE","BUGGY_SAFARI_ITERATORS","KEYS","VALUES","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","name","values","proto","document","EXISTS","createElement","window","userAgent","Pebble","classof","process","getBuiltIn","match","version","Deno","versions","v8","CONSTRUCTOR","METHOD","setGlobal","copyConstructorProperties","options","targetProperty","sourceProperty","descriptor","TARGET","GLOBAL","STATIC","stat","noTargetGet","sham","isExtensible","preventExtensions","FunctionPrototype","Function","apply","Reflect","aCallable","getDescriptor","callBind","namespace","method","getMethod","usingIterator","V","P","func","check","Math","globalThis","g","hasOwnProperty","a","b","console","propertyIsEnumerable","Wrapper","NewTarget","NewTargetPrototype","store","functionToString","inspectSource","cause","hiddenKeys","getOwnPropertyNamesModule","getOwnPropertyNamesExternalModule","uid","FREEZING","REQUIRED","METADATA","id","setMetadata","objectID","weakData","meta","getOwnPropertyNames","splice","getWeakData","onFreeze","NATIVE_WEAK_MAP","shared","sharedKey","OBJECT_ALREADY_INITIALIZED","WeakMap","wmget","wmhas","wmset","metadata","facade","STATE","enforce","noop","empty","construct","constructorRegExp","INCORRECT_TO_STRING","isConstructorModern","replacement","feature","detection","normalize","POLYFILL","NATIVE","string","toLowerCase","floor","isFinite","USE_SYMBOL_AS_UID","$Symbol","Result","stopped","ResultPrototype","unboundFunction","iterFn","IS_ITERATOR","INTERRUPTED","stop","condition","callFn","innerResult","innerError","PrototypeOfArrayIteratorPrototype","arrayIterator","toLength","obj","flush","head","notify","toggle","node","promise","then","macrotask","IS_IOS","IS_IOS_PEBBLE","IS_WEBOS_WEBKIT","IS_NODE","MutationObserver","WebKitMutationObserver","queueMicrotaskDescriptor","queueMicrotask","parent","domain","exit","enter","resolve","nextTick","createTextNode","observe","characterData","task","V8_VERSION","getOwnPropertySymbols","symbol","Symbol","PromiseCapability","reject","$$resolve","$$reject","$default","trim","whitespaces","charAt","n$ParseFloat","trimmedString","$parseInt","hex","radix","S","objectKeys","getOwnPropertySymbolsModule","propertyIsEnumerableModule","$assign","concat","A","B","alphabet","chr","T","j","activeXDocument","defineProperties","enumBugKeys","html","documentCreateElement","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObjectViaActiveX","write","close","temp","parentWindow","NullProtoObject","ActiveXObject","iframeDocument","iframe","JS","style","display","appendChild","src","contentWindow","open","Properties","props","IE8_DOM_DEFINE","$defineProperty","Attributes","$getOwnPropertyDescriptor","$getOwnPropertyNames","windowNames","getWindowNames","internalObjectKeys","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","names","$propertyIsEnumerable","NASHORN_BUG","aPossiblePrototype","setter","CORRECT_SETTER","__proto__","TO_ENTRIES","input","pref","val","valueOf","newPromiseCapability","x","promiseCapability","enforceInternalState","TEMPLATE","unsafe","simple","TAG","SHARED","mode","copyright","aConstructor","defaultConstructor","toIntegerOrInfinity","requireObjectCoercible","charCodeAt","CONVERT_TO_STRING","pos","second","position","codeAt","whitespace","ltrim","RegExp","rtrim","start","end","location","defer","channel","port","setImmediate","clearImmediate","Dispatch","MessageChannel","counter","queue","ONREADYSTATECHANGE","run","runner","listener","event","post","postMessage","protocol","host","args","now","port2","port1","onmessage","addEventListener","importScripts","removeChild","setTimeout","max","min","integer","ceil","number","isSymbol","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","toPrimitive","postfix","random","NATIVE_SYMBOL","WellKnownSymbolsStore","symbolFor","createWellKnownSymbol","withoutSetter","description","clearErrorStack","installErrorCause","normalizeStringArgument","ERROR_STACK_INSTALLABLE","$AggregateError","errors","message","AggregateErrorPrototype","errorsArray","AggregateError","$find","addToUnscopables","FIND","SKIPS_HOLES","ARRAY_ITERATOR","Arguments","collection","init","$entries","newPromiseCapabilityModule","perform","allSettled","capability","promiseResolve","remaining","alreadyCalled","status","reason","PROMISE_ANY_ERROR","any","alreadyResolved","alreadyRejected","NativePromise","speciesConstructor","real","onFinally","isFunction","e","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","microtask","hostReportErrors","IS_BROWSER","PROMISE","getInternalPromiseState","NativePromisePrototype","PromiseConstructor","PromisePrototype","newGenericPromiseCapability","DISPATCH_EVENT","createEvent","dispatchEvent","NATIVE_REJECTION_EVENT","PromiseRejectionEvent","UNHANDLED_REJECTION","SUBCLASSING","PROMISE_CONSTRUCTOR_SOURCE","GLOBAL_CORE_JS_PROMISE","FakePromise","INCORRECT_ITERATION","all","isThenable","isReject","notified","chain","reactions","ok","exited","reaction","handler","fail","rejection","onHandleUnhandled","onUnhandled","initEvent","isUnhandled","emit","unwrap","internalReject","internalResolve","executor","onFulfilled","onRejected","wrap","r","$promiseResolve","race","STRING_ITERATOR","point","validator","gen","count","out","substring","Guid","guid","EMPTY","isGuid","equals","other","isEmpty","toJSON","raw","extendStatics","__extends","d","p","__","Contract","DashboardLayoutChangedEvent","_super","_dashboardLayoutChangeDetails","_this","TableauEventType","DashboardLayoutChanged","TableauEvent","api_external_contract_js_1","api_shared_js_1","FilterChangedEvent","worksheet","_fieldName","_fieldId","FilterChanged","getFilterAsync","_worksheet","getFiltersAsync","filters","eventedFilter","fieldId","fieldName","TableauError","ErrorCodes","MissingFilter","TableauWorksheetEvent","MarksSelectedEvent","MarkSelectionChanged","getMarksAsync","getSelectedMarksAsync","Parameter_1","ServiceRegistryUtil_1","ParameterChangedEvent","_globalFieldName","sheet","ParameterChanged","getParameterAsync","ApiServiceRegistry","ExtensionsRegistryId","getService","findParameterByGlobalFieldNameAsync","parameterImpl","MissingParameter","Parameter","TableauSheetEvent","SummaryDataChangedEvent","SummaryDataChanged","_type","_sheet","WorkbookFormattingChangedEvent","_formatting","WorkbookFormattingChanged","BentonSansFontFamilyName","BentonSansLowDPIFontFamilyName","BentonSansBookFontFaceName","BentonSansBookItalicFontFaceName","BentonSansSemiDemiFontFaceName","BentonSansSemiDemiItalicFontFaceName","BentonSansLightFontFaceName","BentonSansMediumFontFaceName","SupportedBentonSansFontFaces","ConnectedServer","_userId","_siteId","_siteNamespace","_workbookId","ExtensionWorkbookImpl","getAllDataSourcesAsync","dataSchema","dataSources","ds","createDataSourceFromInfo","dataSourceInfo","dataSourceImpl","DataSourceImpl","dataSource","DataSource","initializeWithPublicInterfaces","WorkbookImpl","__spreadArrays","s","il","k","jl","api_internal_contract_js_1","Dashboard_1","Workbook_1","Worksheet_1","DashboardContent_1","Environment_1","Settings_1","UI_1","WorksheetContent_1","RegisterAllExtensionsServices_1","BentonSansFontNameConstants_1","ExtensionWorkbookImpl_1","LegacyInternalApiDispatcherHolder_1","SettingsImpl_1","TableauBookFontNameConstants_1","UIImpl_1","ExtensionsImpl","initializeAsync","isExtensionDialog","contextMenuCallbacks","_initializationPromise","_a","initOptions","isAlpha","ApiVersion","Instance","LegacyInternalApiDispatcherHolder","hasDesktopApiDispatcherPromise","getDesktopDispatcherPromise","dispatcherFactory","onDispatcherReceived","openPayload","catch","onDispatcherReceivedCallback_1","doCrossFrameBootstrap","INTERNAL_CONTRACT_VERSION","factory","createVizImageAsync","inputSpec","setClickThroughAsync","clickThroughEnabled","extensionZoneId","isDashboardExtensionLocator","locator","dashboardPath","InternalError","contextMenuFunctions","dispatcher","registerInitializationExtensionsServices","initializationService","callbackMapKeys","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","workbookFormatting","initializeTableauFonts","applyAllFormatting","initializeContextMenuCallbacks","initializeWorkbookFormattingChangedEventCallback","extensionDialogPayload","formattingModel","_styleElement","stylesheet","cssRules","deleteRule","formattingSheets","currentFormattingSheet","applyFormattingSheetToStyleSheet","styleInfo","cssProperties","fontFamily","fontSize","fontWeight","fontStyle","textDecoration","color","rule","classNameKey","insertRule","registerHandler","NotificationId","eventFormatting","fontNames","SupportedTableauFontFaces","formattingSheet","parameters","ParameterId","FontNameListItems","execute","VerbId","GetFonts","response","loadFonts","fonts","fontNameAndInfo","fontName","loadTableauFonts","loadBentonSansFonts","FontFace","fontBinaryInfo","info","sheetPath","sheetInfoImpl","SheetInfoImpl","SheetType","Dashboard","width","w","height","h","dashboardImpl","DashboardImpl","zones","activeDashboardObjectId","dashboard","DashboardContent","visualId","Worksheet","worksheetImpl","WorksheetImpl","WorksheetContent","settingsInfo","settingsImpl","SettingsImpl","Settings","ContextMenuClick","TableauBookFontFaceName","TableauBookFontFamilyName","weight","TableauLightFontFaceName","TableauLightFontFamilyName","TableauRegularFontFaceName","TableauRegularFontFamilyName","TableauSemiBoldFontFaceName","TableauSemiboldFontFamilyName","TableauBoldFontFaceName","TableauBoldFontFamilyName","TableauMediumFontFamilyName","TableauMediumFontFaceName","__warningIssued","__platformIsOfficialRelease","__tableauDesktopDispatcher","BlockExtension","warn","TableauEvent_1","SettingsChangedEvent","_newSettings","SettingsChanged","_saveInProgress","erase","ErrorHelpers","verifyParameter","_currentSettings","verifySettingsAreUnlocked","_isModified","getAll","saveAsync","saveSettingsAsync","newSettings","verifyStringParameter","initializeEvents","notificationService","results","settingsChangedEvent","SingleEventManagerImpl","triggerEvent","settingsValues","SettingSaveInProgress","ASYNC_SAVE_IN_PROGRESS","displayDialogAsync","url","payload","uiService","unregisterFn","ExtensionDialogUpdate","isCloseEvent","closePayload","DialogClosedByUser","closeDialog","DashboardLayoutChangedEvent_1","WorkbookFormattingChangedEvent_1","DashboardObject_1","Sheet_1","_dashboardImpl","addNewEventType","worksheetsImpl","objects","dashboardObjectImpl","DashboardObject","activeDashboardName","setZoneVisibilityAsync","zoneVisibilityMap","setDashboardObjectVisibilityAsync","dashboardObjectVisibilityMap","getDashboardObjectById","dashboardObjectId","zone","dashboardLayoutChangedEvent","dashboardObjectChanges","updateZones","activeZoneId","workbookFormattingChangedEvent","moveAndResizeDashboardObjectsAsync","dashboardObjectPositionAndSizeUpdateArray","replayAnimationAsync","replaySpeed","applyFilterAsync","updateType","Sheet","_dashboardObjectImpl","isFloating","isVisible","ParameterChangedEvent_1","currentValue","dataType","allowableValues","changeValueAsync","newValue","verifyInternalValue","parameterEvent","model","EventListenerManager","_sheetImpl","sheetType","isValidSize","EmbeddingErrorCodes","ImplementationError","testSize","findParameterAsync","parameterName","getParametersAsync","parametersImpl","_workbookImpl","FilterChangedEvent_1","MarksSelectedEvent_1","SummaryDataChangedEvent_1","_worksheetImpl","parentDashboard","SharedErrorCodes","marksEvent","SelectedMarksChanged","visualIdsAreEqual","filterEvent","filterEventResponse","summaryDataEvent","summaryDataEventResponse","applyRangeFilterAsync","filterOptions","applyHierarchicalFilterAsync","applyRelativeDateFilterAsync","clearFilterAsync","getDataSourcesAsync","getHighlightedMarksAsync","getSummaryDataAsync","getSummaryDataReaderAsync","pageRowCount","getSummaryColumnsInfoAsync","getUnderlyingDataAsync","getUnderlyingTablesAsync","getUnderlyingTableDataAsync","logicalTableId","getUnderlyingTableDataReaderAsync","getVisualSpecificationAsync","clearSelectedMarksAsync","selectMarksByIDAsync","marksInfo","selectMarksByIdAsync","selectMarksByValueAsync","selections","selectionUpdateType","annotateMarkAsync","mark","annotationText","getAnnotationsAsync","removeAnnotationAsync","annotation","hoverTupleAsync","hoveredTuple","tooltip","allowHoverActions","selectTuplesAsync","selectedTuples","selectOption","getTooltipTextAsync","tupleId","leaveMarkNavigationAsync","storyboard","storyPointID","_dashboard","ConnectedServer_1","WorkbookFormattingEnvUtil_1","_apiVersion","formattedValue","_context","InternalToExternalEnumMappings","extensionContext","convert","WorkbookFormattingEnvUtil","convertToWorkbookFormatting","_language","extensionLanguage","_country","extensionCountry","_locale","extensionLocale","_mode","extensionMode","_operatingSystem","operatingSystem","_tableauVersion","tableauVersion","_uniqueUserId","uniqueUserId","userId","connectedServer","siteId","siteNamespace","workbookId","featureFlags","Extensions","extensionImpl","initializeDialogAsync","_settingsImpl","isModified","_impl","workbookFormattingModel","InitializationServiceImpl","contextMenuIds","params","ExtensionContextMenuIds","IsExtensionDialog","InitializeExtension","ServiceImplBase","SettingsServiceImpl","SettingsValues","SaveExtensionSettings","DEFAULT_DIALOG_STYLE","DialogStyle","Window","UIServiceImpl","ExtensionDialogUrl","ExtensionDialogPayload","dialogStyle","InvalidParameter","ExtensionDialogH","ExtensionDialogW","verifyEnumValue","ExtensionDialogStyle","ExternalToInternalEnumMappings","dialogStyles","DisplayDialog","ExtensionDialogResult","DialogAlreadyOpen","InvalidDomain","InvalidDomainDialog","CloseDialog","verifyParameterType","ExtensionZoneId","ClickThroughEnabled","SetClickThrough","InitializationServiceImpl_1","SettingsServiceImpl_1","UIServiceImpl_1","registerService","__export","m","Enums_1","ApiMenuType","CrosstabFileFormat","DeviceType","EmbeddingTableauEventType","FileFormats","PrintOrientation","PrintPageSize","PrintScaling","PulseLayout","SheetSizeBehavior","TableauDialogType","Toolbar","Tableau_1","ExtensionContext","ExtensionMode","VizImageEncodingType","VizImagePaletteType","VizImageSizeSettingAlignmentType","VizImageSizeSettingType","VizImageSortDirectionType","AskDataAttributes","ToolbarButtons","RevertVizSelection","PulseAttributes","VizChildElementAttributes","VizChildElements","VizAuthoringAttributes","VizAttributes","VizSharedAttributes","WebComponentChildElementAttributes","WebComponentAttributes","WebComponentChildElements","Tableau","__assign","t","n","DashboardObjectVisibilityType","HierarchicalLevelSelectionState","ReplaySpeedType","TrendLineModelType","SortDirection","SelectOptions","SelectionUpdateType","QuickTableCalcType","PeriodType","ParameterValueType","MarkType","IncludeDataValuesOption","FilterNullOption","FilterDomainType","FilterUpdateType","FilterType","FieldRoleType","FieldAggregationType","EncodingType","DateRangeType","DashboardLayoutChange","DataType","DashboardObjectType","ClassNameKey","ColumnType","AnnotationType","AnalyticsObjectType","ZoneVisibilityType","internalContractVersion","MESSAGING_VERSION","DataTypeConverter","isSpecial","valueAsString","parseBoolean","booleanString","normalizedBoolean","specialValueIndicator","parseNumber","parseDate","dateAsString","Date","getTime","parseDateTime","formattedDateString","convertValueAsStringToValue","Bool","Int","Float","DateTime","Spatial","convertValueToNativeValue","convertStringValueToNativeValue","FitPages","PageScalingOption","ScaleMode","PageOrientation","PageSizeOption","ApiShowDataTableFormat","ApiShowDataTableSentinel","QuantitativeIncludedValues","DateStepPeriod","DomainRestrictionType","EncodedDataType","AnnotateEnum","AskDataOptionNames","PulseOptionNames","VqlParameterNames","PublicParameterNames","VizOptionNames","JsApiInternalContract_1","CrossFramePreparedMessage_1","MessageTypeChecks_1","MessageTypes_1","CrossFrameMessenger","thisWindow","otherWindow","otherWindowOrigin","startListening","unregisterFunction","boundHandler_1","onMessageReceived","removeEventListener","stopListening","setInitializeMessageHandler","initializeMessageHandler","setCommandResponseMessageHandler","commandResponseMessageHandler","setCommandMessageHandler","commandMessageHandler","setNotificationMessageHandler","notificationMessageHandler","setHandshakeMessageHandler","handshakeMessageHandler","prepareInitializationMessage","apiVersion","crossFrameVersion","msgGuid","msgType","MessageType","Initialize","prepareMessage","prepareCommandMessage","verbId","Command","prepareCommandResponseMessage","commandGuid","CommandResponse","JSON","parse","stringify","prepareNotificationMessage","notificationId","Notification","prepareAckMessage","Ack","msg","CrossFramePreparedMessage","isMessage","isInitMessage","isCommandResponseMessage","isCommandMessage","isNotificationMessage","Handshake","isHandshakeMessage","setOtherWindow","setOtherWindowOrigin","origin","_message","_target","_origin","send","Notifications_1","expectedEmptyNotifications","Set","EditButtonClicked","EditInDesktopButtonClicked","WorkbookPublished","WorkbookReadyToClose","ReadyToReceiveAuthToken","isVersion","versionNumber","v","initMessage","crMessage","commandMessage","notificationMessage","IdentityVersionConverter","upgradeExecuteCall","verb","downgradeExecuteReturn","executeResponse","downgradeNotification","notification","StackingVersionConverter","_externalMajorVersion","_platformMajorVersion","_upgradeExecuteTranslations","_downgradeExecuteTranslations","_downgradeNotificationTranslations","fromData","externalVersion","upgradeExecuteTranslations","downgradeExecuteTranslations","downgradeNotificationTranslations","upgraded","_i","upgradeTranslation","downgraded","downgradeTranslation","IdentityVersionConverter_1","StackingVersionConverter_1","VersionTranslations_1","VersionEqualTo","lhs","rhs","CreateVersionConverterWithTranslators","upgrades","downgrades","notificationDowngrades","externalMajorVersion","externalMinorVersion","platformMajorVersion","neededExecuteUpgrades","GetNeededTranslations","neededExecuteDowngrades","neededNotificationDowngrades","reverse","majorMinorTranslators","neededTranslations","maximumMinorVersion","GetMaximumMinorIndex","minorVersions","reduce","VersionLessThan","ExecuteMinorUpgrades","ExecuteMinorDowngrades","DowngradeWorksheetNames","NotificationMinorDowngrades","DowngradeFlipboardZoneID","CreateVersionConverter","bootstrapInfo","sheetInfo","visualModel","flipboardZoneID","ExternalIdentityVersionConverter","downgradeExecuteCall","upgradeExecuteReturn","upgradeNotification","ExternalStackingVersionConverter","_externalVersion","_platformVersion","_downgradeExecuteCallTranslations","_upgradeExecuteReturnTranslations","_upgradeNotificationTranslations","VersionConverterFactory_1","ExternalIdentityVersionConverter_1","ExternalStackingVersionConverter_1","ExternalVersionTranslations_1","CreateExternalCompatibleVersionConverterWithTranslators","upgradeNotifications","platformMinorVersion","neededExecuteCallDowngrade","GetNeededExternalTranslations","neededExecuteReturnUpgrades","neededNotificationUpgrades","ExecuteMinorDowngradeCallExternal","DowngradeUnderlyingTableDataAsync","DowngradeLogicalTableDataAsync","ExecuteMinorUpgradeReturnExternal","UpgradeDataTableTypes","UpgradeDataTableRowsAndColumns","ExecuteMinorUpgradeNotification","CreateExternalCompatibleVersionConverter","convertDataValues","table","dataTable","row","dataValue","columnIndex","headers","validateParametersForObjectModel","LogicalTableId","SingleTableId","oldUnderlyingDataTable","isSummary","oldSelectedMarksTable","marksTable","GetUnderlyingTableData","GetUnderlyingData","GetLogicalTableData","GetDataSourceData","GetDataSummaryData","isGetSummaryDataVerb","MaxRows","maxRows","underlyingDataTable","adjustDataRowLength","isGetTableDataVerb","ColumnsToIncludeById","columnsToInclude","newHeaders","header","valueIndex","newIndex","adjustDataColumns","ApiVersion_1","CrossFrameDispatcher_1","CrossFrameDispatcher","DataSource_1","ExternalToInternalEnumMappings_1","InternalToExternalEnumMappings_1","EventListenerManager_1","Field_1","Field","CustomViewImpl_1","CustomViewImpl","DashboardImpl_1","DashboardObjectImpl_1","DashboardObjectImpl","DataSourceImpl_1","ParameterImpl_1","ParameterImpl","SheetImpl_1","SheetImpl","SheetInfoImpl_1","SingleEventManagerImpl_1","StoryImpl_1","StoryImpl","StoryPointImpl_1","StoryPointImpl","StoryPointInfoImpl_1","StoryPointInfoImpl","WorkbookImpl_1","WorksheetImpl_1","Point_1","Point","ClientInfoServiceImpl_1","ClientInfoServiceImpl","NotificationServiceImpl_1","NotificationServiceImpl","NotificationServiceImplBase_1","NotificationServiceImplBase","Registration","ServiceImplBase_1","SizeServiceImpl_1","SizeServiceImpl","StoryActivationServiceImpl_1","StoryActivationServiceImpl","TableauError_1","Deferred_1","Deferred","ErrorHelpers_1","ExportHelpers_1","ExportHelpers","SheetUtils_1","SheetUtils","VersionNumber_1","VersionNumber","VersionedExternalApiDispatcher_1","_instance","SetVersionNumber","numString","ConnectionSummary","_connectionInfo","serverURI","inIframe","opener","messenger","initializationMessage","messageGuid","_messenger","_pendingPromises","_notificationHandlers","onCommandResponse","onNotification","preparedMessage","registerNotificationHandler","unregisterNotificationHandler","pendingPromise","errorCode","IncompatibleVersionError","_dataSourceImpl","fields","extractUpdateTime","isExtract","isPublished","publishedUrl","refreshAsync","getActiveTablesAsync","getConnectionSummariesAsync","getLogicalTablesAsync","getLogicalTableDataAsync","getLogicalTableDataReaderAsync","_b","_c","_d","_e","_f","_g","_h","_j","_k","EnumConverter_1","filterDomainType","EnumConverter","Relevant","Database","nullOptions","AllValues","NonNullValues","NullValues","filterUpdateType","Add","All","Remove","Replace","setVisibilityType","Show","Hide","setReplaySpeedType","Slow","Normal","Fast","Story","showDataTableFormatType","NativeAndFormattedValues","OnlyNativeValues","NativeValuesOnly","OnlyFormattedValues","FormattedValuesOnly","periodType","Years","Quarters","Months","Weeks","Days","Hours","Minutes","Seconds","dateRangeType","Last","LastN","Next","NextN","Current","ToDate","Modal","Modeless","_l","_m","_o","_p","_q","_r","_s","_t","Desktop","Server","Authoring","Viewing","columnType","Continuous","Discrete","Unknown","fieldAggregationType","Attr","Avg","Collect","Count","Countd","Day","End","Hour","InOut","Kurtosis","Max","Mdy","Median","Min","Minute","MonthYear","None","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","dashboardObjectType","Extension","Blank","Image","Legend","PageFilter","ParameterControl","QuickFilter","Text","Title","WebPage","List","Range","dateStepPeriod","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","filterType","Categorical","RelativeDate","Hierarchical","DashboardTitle","StoryTitle","Tooltip","WorksheetTitle","hierarchicalLevelSelectionState","AllSelected","NoneSelected","SomeSelected","UnknownSelected","annotationType","Area","Mark","markType","Bar","Circle","GanttBar","Heatmap","Line","Pie","Polygon","Shape","Square","VizExtension","_eventListenerManagers","eventType","UnsupportedEventName","eventManager","_fieldImpl","aggregation","role","isCalculatedField","isCombinedField","isGenerated","isGeospatial","isHidden","isPresentOnPublishedDatasource","ApiShared_1","customViewModel","_registryId","_luid","luid","_name","_shared","_isDefault","isDefault","_ownerName","owner","userFriendlyName","_url","ServiceRegistry_1","_sheetInfo","_zones","_sheetPath","_parentStoryPointImpl","_activeDashboardObjectId","_worksheetsImpl","_objects","sheetName","zoneMap","zoneSize","zoneType","worksheetName","worksheetUrl","vizId","_sheetInfoImpl","zonePoint","y","zoneId","setVisibilityAsync","newZones","newActiveZoneId","newActiveDashboardName","oldDashboardObjects","oldZoneMap","oldActiveZoneId","oldActiveDashboardName","newDashboardObjects","newZoneMap","zoneChanges","oldObject","oldId","newObject","addChange","IsFloatingChanged","IsVisibleChanged","NameChanged","PositionChanged","SizeChanged","Removed","Added","Selected","Deselected","DashboardChanged","change","moveAndResizeAsync","replayAsync","verifyActiveSheetOrEmbeddedInActiveStoryPoint","getDashboardFiltersAsync","applyDashboardFilterAsync","getWorksheetNamesFromZones","worksheetNames","isRootAndActiveDashboard","active","isWithinActiveStoryPoint","parentStoryPoint","NotActiveSheet","_position","_size","_isFloating","_isVisible","_id","ConnectionSummary_1","LogicalTable_1","TableSummary_1","FieldImpl_1","_dataSourceInfo","_fields","fieldModel","fieldImpl","FieldImpl","getMaxPageRowLimit","summaries","summary","tableInfos","tableInfo","TableSummary","getDataSourceDataAsync","ignoreAliases","columnsToIncludeById","includeDataValuesOption","logicalTableInfos","logicalTableInfo","LogicalTable","InternalContract","_fieldInfo","_parentDataSource","definedValue","DataValueFactory_1","Param_1","parameterInfo","setParameterInfo","_parameterInfo","DataValueFactory","MakeParameterDataValue","_allowableValues","coercedValue","Param","serializeParameterValue","changeParameterValueAsync","listValues","minValue","maxValue","stepSize","allowableValuesType","sheetSize","isActive","getSheetSize","isValidSheetSize","findParameterByNameAsync","getParametersForSheetAsync","changeSizeAsync","newSize","invalidSizeError","InvalidSize","behavior","partialSheetSize","normalizeSheetSize","isAutomatic","Automatic","minSize","maxSize","InvalidSizeBehaviorOnWorksheet","processedNewSize","processNewSize","getClientInfoAsync","publishedSheets","getSheetSizeFromSizeConstraints","sizeConstraint","parseDimensions","minSizeMaybe","maxSizeMaybe","hasMinWidth","isNullOrUndefined","hasMinHeight","hasMaxWidth","hasMaxHeight","hasValidMinSize","hasValidMaxSize","AtMost","MissingMaxSize","AtLeast","MissingMinSize","MissingMinMaxSize","Exactly","tryParseNumber","widthParsed","success","parsedWidth","parsed","heightParsed","parsedHeight","_sheetType","_sheetSize","_index","_isActive","_isHidden","isDashboard","_eventType","_handlers","beforeCount","eventGenerator","ShortLivedDeferred_1","storyModel","_publishedSheetInfos","_storyPointInfoImpls","_deferred","ShortLivedDeferred","initializeStory","storyPoints","storyPointModel","activeStoryPointIndex","storyPointInfoImpl","caption","storyPointId","updated","_activeStoryPointImpl","containedSheetInfo","updateStoryInfo","storyInfoImpl","StoryPointIdMismatch","updateStory","activeStoryPoint","activateNextStoryPointAsync","getNewPromiseOrThrowIfBusy","activatePreviousStoryPointAsync","activateStoryPointAsync","IndexOutOfRange","revertStoryPointAsync","clearPendingPromises","_storyPointInfoImpl","sheetInfos","registryId","_containedSheetImpl","createContainedSheet","parentStory","sheetImpl","publishedSheetInfo","getPublishedSheetInfoByName","containedSheetSize","createAutomaticSize","isContainedSheetHidden","containedSheetUrl","containedSheetInfoImpl","getSheetTypeEnum","dashboardZones","ServerError","_caption","_storyPointId","_active","_updated","_parentStoryImpl","isUpdated","GetDataService_1","_visualId","_parentDashboardImpl","verifyActiveSheet","nullOption","verifyRangeParamType","levels","rangeType","worksheetDataSourceInfo","worksheetDataSchemaMap","primaryId","primaryDataSource","referencedDataSourceList","secondaryId","GetDataType","Summary","ignoreSelection","Underlying","includeAllColumns","appendContextMenuAsync","targetMenu","config","removeContextMenuAsync","menuItemId","executeContextMenuAsync","renameContextMenuAsync","menuHeader","menuDescription","isInsideDashboardExtension","isRootAndActiveWorksheet","isInsideActiveDashboard","isInsideActiveStoryPoint","_logicalTable","TooltipTextRequestModel","visualIdPresModel","Filter","_worksheetName","_filterType","getFieldAsync","getAppliedWorksheetsAsync","setAppliedWorksheetsAsync","applyToWorksheets","uniqueWorksheets","CategoricalFilter","_appliedValues","_isExcludeMode","_isAllSelected","getDomainAsync","domainType","getCategoricalDomainAsync","HierarchicalDataValue","_value","_hierarchicalPath","_level","HierarchicalLevelDetail","_levelSelectionState","HierarchicalFilter","_dimensionName","_hierarchyCaption","_numberOfLevels","_levelDetails","RangeFilter","_min","_max","_includeNullValues","service","getRangeDomainAsync","RelativeDateFilter","_anchorDate","_periodType","_rangeType","_rangeN","CategoricalDomain","_values","_domainType","RangeDomain","DataTable","_data","_columns","_totalRowCount","_isTotalRowCountLimited","_isSummaryData","_marksInfo","MarkInfo","_color","_tupleId","Column","_dataType","_isReferenced","DataValue","_nativeValue","_formattedValue","__awaiter","thisArg","_arguments","generator","fulfilled","rejected","__generator","body","_","label","sent","trys","ops","op","pop","DataTableReader","_pageRowCount","_pageCount","getPageAsync","pageNumber","verifyRange","getAllPagesAsync","firstPage","rowsRequested","pagesRequested","pagesToFetch","isDataLimited","remainingData","page","fullData","totalRowCount","columns","isTotalRowCountLimited","isSummaryData","releaseAsync","SelectionModel","ValueSelectionModel","selectValues","HierarchicalSelectionModel","RangeSelectionModel","DimensionSelectionModel","TupleSelectionModel","objectIds","SelectionModelsContainer","hierModelArr","dimModelArr","quantModelArr","SelectTuplesInteractionModel","tupleIds","selectOptions","tooltipContext","HoverTupleInteractionModel","_x","_y","AccessibilityServiceImpl_1","AnimationServiceImpl_1","AnnotationServiceImpl_1","DataSourceServiceImpl_1","ExportServiceImpl_1","ExternalContextMenuServiceImpl_1","FilterServiceImpl_1","GetDataServiceImpl_1","ParametersServiceImpl_1","SelectionServiceImpl_1","VisualModelServiceImpl_1","VizServiceImpl_1","ZoneServiceImpl_1","AnimationServiceImpl","DataSourceServiceImpl","ExportServiceImpl","GetDataServiceImpl","FilterServiceImpl","ParametersServiceImpl","SelectionServiceImpl","AnnotationServiceImpl","ZoneServiceImpl","VisualModelServiceImpl","VizServiceImpl","ExternalContextMenuServiceImpl","AccessibilityServiceImpl","__tableauApiServiceRegistry","ServiceRegistryImpl","_services","serviceName","setInstance","serviceRegistry","clearRegistry","AccessibilityModels_1","tooltipTextRequest","TooltipTextRequest","GetTooltipText","VisualId","RaiseLeaveMarkNavNotification","ReplaySpeed","ReplayAnimation","SelectionModels_1","selectionModelContainer","parseMarkSelectionIds","formattedText","TargetPoint","SelectionList","selection","FormattedText","CreateAnnotation","GetAnnotations","annotationsList","annotationFilterMap","parseAnnotationSelectionIds","RemoveAnnotation","marks","ids","tupleSelectionModel","selectionType","annotations","annotationId","mapAnnotation","annotationHTML","annotationPlainText","annotateEnum","GetEmbeddingClientInfo","SENTINEL_LOGICAL_TABLE_INFO","SingleTableCaption","platformVersionObjectModelSupport","dataSourceId","DeltaTimeMs","ShouldRefreshDS","DataSourceId","RefreshDataSource","joinParameters","GetActiveTables","joinResponse","tables","UnsupportedMethodForDataSourceType","GetDataSources","GetAllDataSources","GetConnectionDescriptionSummaries","globalfieldName","GetFieldAndDataSource","FieldId","field","convertField","convertDataSource","isObjectModelSupportedByPlatform","GetLogicalTables","GetUnderlyingTables","getExportCrosstabSheetMapAsync","currentSheetType","GetExportCrosstabSheetMap","CurrentSheetType","exportCrosstabAsync","format","exportableWorksheetNames","sheetNameToIdMap","verifySheetName","SheetIdentifier","SendNotifications","CSV","ExportCrosstabCsvDownload","UseTabDelimiters","Excel","ExportCrosstabExcelDownload","CrosstabCreationError","exportDataAsync","verifyExportDataOptions","columnsAsSet","ExportDataDownload","IgnoreAliases","DataCreationError","exportPowerPointAsync","sheetNames","exportScenarios","verifySheetNamesForPDFAndPPT","ExportPowerpointDownload","ExportOriginUrl","SelectedSheetNames","PowerPointCreationError","exportPDFAsync","externalExportPdfOptions","internalExportPdfOptions","verifyExportPDFOptions","getExportPDFOptionsAsync","updateInternalExportPDFOptions","ExportPdfDownload","ExportPdfOptions","PDFCreationError","GetExportPdfOptions","AppendExternalMenuItem","WorksheetName","ExternalMenuItemDisplayName","displayName","RemoveExternalMenuItem","ExternalMenuItemId","ExecuteExternalMenuItem","RenameExternalMenu","ExternalMenuHeader","ExternalMenuDescription","FilterModels_1","ApplyCategoricalFilter","FieldName","FilterValues","IsExcludeMode","isExcludeMode","ApplyRangeFilter","serializeDateForPlatform","FilterRangeMin","FilterRangeMax","FilterRangeNullOption","apiFilterHandlerCheckForCommandError","hierarchicalLevels","FilterLevels","ClearFilter","resposne","ApplyRelativeDateFilter","rangeN","MissingRangeNForRelativeDateFilters","RangeN","anchorDate","AnchorDate","convertAnchorDate","GetFilters","convertDomainFilters","GetCategoricalDomain","DomainType","convertCategoricalDomain","GetRangeDomain","convertRangeDomain","GetDashboardFilters","DashboardCategoricalFilter","sharedFilterModel","executeGetAppliedWorksheets","worksheets","worksheetInfo","isSelected","allowedWorksheets","activeWorksheet","isEnabled","ChangeSharedFilter","SharedFilterSheets","telemetryFunctionName","GetSharedFilter","domainFilters","domainFilter","convertCategoricalFilter","convertHierarchicalFilter","convertRangeFilter","convertRelativeDateFilter","appliedValues","dv","MakeFilterDataValue","fieldCaption","isExclude","isAllSelected","hierarchicalDataValue","hierarchicalPath","level","levelDetails","levelInfo","aLevel","levelSelectionState","dimensionName","hierarchyCaption","includeNullValues","anchorDateValue","domainDv","year","getUTCFullYear","month","getUTCMonth","day","getUTCDate","hh","getUTCHours","mm","getUTCMinutes","sec","getUTCSeconds","InvalidDateParameter","serverPm","ParameterError","InvalidFieldCaption","InvalidFilterFieldName","InvalidValues","InvalidFilterFieldValue","InvalidAggFieldName","InvalidAggregationFieldName","uuid_1","GetDataModels_1","GetDataTableReaderModels_1","viewDataTableCacheId","v4","getMaxRowLimit","getViewDataTableCacheId","getLimitedMaxRows","requestedRows","rowCountLimit","getType","summaryData","functionName","requestMaxRows","IgnoreSelection","IncludeAllColumns","verifyIncludeColumnArray","ShowDataTableFormat","responseData","processResultsTable","ViewDataTableCacheId","PageRowCount","GetDataSummaryDataReader","isReferenced","GetSelectedMarks","GetHighlightedMarks","ColumnsToInclude","datasourceId","GetLogicalTableDataReader","GetUnderlyingTableDataReader","tableId","pageSize","ViewDataTableId","DataRowIndex","GetDataTableReaderPage","processResultsPage","summaryTableId","ReleaseDataTableReader","cell","MakeTableDataValue","_filterFn","_callbackFn","notificationModel","filterFn","handlers","registration","removeRegistration","hasHandlersForNotificationType","reg","SheetPath","getAllParametersAsync","inputParameters","GetParametersForSheet","ParameterFieldName","ParameterValue","ChangeParameterValue","ParameterCaption","FindParameter","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","IncludeNull","IncludeNonNull","IncludeAll","_dispatcher","internalError","externalErrorCode","ShouldThrow","No","SheetName","MinHeight","MinWidth","MaxHeight","MaxWidth","SetSheetSize","_response","ActivateNextStoryPoint","ActivatePreviousStoryPoint","ActivateStoryPoint","StoryPointIndex","RevertStoryPoint","GetVisualSpecification","VizAPIInputJson","VizAPI","activateSheetAsync","SwitchToSheetName","ActivateSheet","getCustomViewsAsync","GetCustomViews","customView","showCustomViewAsync","customViewName","CustomViewName","ShowCustomView","removeCustomViewAsync","RemoveCustomView","saveCustomViewAsync","CustomViewIsDefault","SaveWorkbookAsCustomView","setActiveCustomViewAsDefaultAsync","SetActiveCustomViewAsDefault","CustomViewLuid","CustomViewIsPublic","UpdateCustomView","getCurrentSrcAsync","GetCurrentSrc","dashboardZoneMap","ZoneIdsVisibilityMap","convertParameterToMap","verifyZoneIsValid","SetZoneVisibility","DashboardObjectPositionAndSizeUpdateList","dashboardObject","verifyZoneIsValidAndFloating","dashboardObjectID","verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate","MoveAndResizeZones","_tableInfo","connectionId","customSQL","_errorCode","internalDataValue","_promise","_resolve","_reject","UnregisterTimeoutInMilliseconds","_mappings","_defaultVal","enumVal","throwIfMissing","Yes","apiNotImplemented","apiName","argumentValue","argumentName","expectedType","enumValue","enumType","enumName","isValid","enumKey","isTypeNumber","isTypeDate","zoneID","dashboardObjectPositionAndSizeUpdate","exportableSheetNames","InvalidSelectionSheet","isTypeBool","exportableSheetNamesFromDashboard","exportableSheetNamesFromWorkbook","currentSheetName","orientation","scaling","currentSheet","updateExportLayoutOptions","updateSheetOptions","exportLayoutOptions","imageHeight","DefaultLayoutOptions","imageWidth","Landscape","pageOrientationOption","Portrait","A3","pageSizeOption","A4","A5","B4","B5","Executive","Folio","Ledger","Legal","Letter","Note","Quarto","Statement","Tabloid","Unspecified","AtMost1PageHigh","setFitAndScaleValues","FitOneHigh","AtMost1PageWide","FitOneWide","AtMost2PagesHigh","FitTwoHigh","AtMost2PagesWide","FitTwoWide","ScalePctAuto","Perc100","ScalePct100","Perc200","ScalePct200","Perc25","ScalePct25","Perc400","ScalePct400","Perc50","ScalePct50","Perc60","ScalePct60","Perc75","ScalePct75","Perc80","ScalePct80","Perc90","ScalePct90","sheetOptions_1","sheetOptions","sheetOption","scalingSelection","pageFitHorizontal","pageFitVertical","pageScaleMode","pageScalePercent","fitMatch","fitRegex","percentMatch","pctRegex","ScaleFitPages","ScalePercentage","DefaultDataOptions","DefaultPDFOptions","ScaleAuto","date","serializeBooleanForPlatform","bool","serializeNumberForPlatform","num","isTypeString","Boolean","param","paramName","valueString","NaN","minWidth","minHeight","maxWidth","maxHeight","isDsdLayout","internalSheetType","sizeObject","_timeoutInMilliseconds","ApiExecutionError","_timeoutId","Timeout","clearTimeout","versionString","partStr","build","getBuildNumber","parts","preReleaseString","_apiDelegateDispatcher","platformVersionNumber","_versionConverter","upgradedNotification","downgradeParameters","getRandomValues","rnds8","Uint8Array","rng","crypto","msCrypto","uuid","byteToHex","substr","arr","offset","_nodeId","_clockseq","_lastMSecs","_lastNSecs","buf","clockseq","seedBytes","msecs","nsecs","dt","tl","tmh","hashfunc","generateUUID","str","unescape","encodeURIComponent","bytes","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","cnt","md5ff","c","md5gg","md5hh","md5ii","v35","output","length32","hexTab","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","z","ROTL","K","H","l","N","M","pow","_i2","W","_t2","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","o","prop","toStringTag","ExtensionsImpl_1","Extensions_1","VERSION_IS_ALPHA","extensions"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/tableau.extensions.1.12.1.js b/lib/tableau.extensions.1.12.1.js new file mode 100644 index 00000000..caa419fd --- /dev/null +++ b/lib/tableau.extensions.1.12.1.js @@ -0,0 +1,20141 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "../../node_modules/core-js/es/array/find.js": +/*!***************************************************!*\ + !*** ../../node_modules/core-js/es/array/find.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.array.find */ "../../node_modules/core-js/modules/es.array.find.js"); +var entryUnbind = __webpack_require__(/*! ../../internals/entry-unbind */ "../../node_modules/core-js/internals/entry-unbind.js"); + +module.exports = entryUnbind('Array', 'find'); + + +/***/ }), + +/***/ "../../node_modules/core-js/es/array/from.js": +/*!***************************************************!*\ + !*** ../../node_modules/core-js/es/array/from.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); +__webpack_require__(/*! ../../modules/es.array.from */ "../../node_modules/core-js/modules/es.array.from.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Array.from; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/map/index.js": +/*!**************************************************!*\ + !*** ../../node_modules/core-js/es/map/index.js ***! + \**************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.array.iterator */ "../../node_modules/core-js/modules/es.array.iterator.js"); +__webpack_require__(/*! ../../modules/es.map */ "../../node_modules/core-js/modules/es.map.js"); +__webpack_require__(/*! ../../modules/es.object.to-string */ "../../node_modules/core-js/modules/es.object.to-string.js"); +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Map; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/number/is-integer.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/es/number/is-integer.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.number.is-integer */ "../../node_modules/core-js/modules/es.number.is-integer.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.isInteger; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/number/is-nan.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/es/number/is-nan.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.number.is-nan */ "../../node_modules/core-js/modules/es.number.is-nan.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.isNaN; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/number/parse-float.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/es/number/parse-float.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.number.parse-float */ "../../node_modules/core-js/modules/es.number.parse-float.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.parseFloat; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/number/parse-int.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/es/number/parse-int.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.number.parse-int */ "../../node_modules/core-js/modules/es.number.parse-int.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Number.parseInt; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/object/assign.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/es/object/assign.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.object.assign */ "../../node_modules/core-js/modules/es.object.assign.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.assign; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/object/entries.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/es/object/entries.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.object.entries */ "../../node_modules/core-js/modules/es.object.entries.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.entries; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/object/set-prototype-of.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/es/object/set-prototype-of.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.object.set-prototype-of */ "../../node_modules/core-js/modules/es.object.set-prototype-of.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Object.setPrototypeOf; + + +/***/ }), + +/***/ "../../node_modules/core-js/es/promise/index.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/es/promise/index.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__(/*! ../../modules/es.aggregate-error */ "../../node_modules/core-js/modules/es.aggregate-error.js"); +__webpack_require__(/*! ../../modules/es.array.iterator */ "../../node_modules/core-js/modules/es.array.iterator.js"); +__webpack_require__(/*! ../../modules/es.object.to-string */ "../../node_modules/core-js/modules/es.object.to-string.js"); +__webpack_require__(/*! ../../modules/es.promise */ "../../node_modules/core-js/modules/es.promise.js"); +__webpack_require__(/*! ../../modules/es.promise.all-settled */ "../../node_modules/core-js/modules/es.promise.all-settled.js"); +__webpack_require__(/*! ../../modules/es.promise.any */ "../../node_modules/core-js/modules/es.promise.any.js"); +__webpack_require__(/*! ../../modules/es.promise.finally */ "../../node_modules/core-js/modules/es.promise.finally.js"); +__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); +var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); + +module.exports = path.Promise; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/a-callable.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/a-callable.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); + +var TypeError = global.TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw TypeError(tryToString(argument) + ' is not a function'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/a-constructor.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/a-constructor.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); + +var TypeError = global.TypeError; + +// `Assert: IsConstructor(argument) is true` +module.exports = function (argument) { + if (isConstructor(argument)) return argument; + throw TypeError(tryToString(argument) + ' is not a constructor'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/a-possible-prototype.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/a-possible-prototype.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); + +var String = global.String; +var TypeError = global.TypeError; + +module.exports = function (argument) { + if (typeof argument == 'object' || isCallable(argument)) return argument; + throw TypeError("Can't set " + String(argument) + ' as a prototype'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/add-to-unscopables.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/internals/add-to-unscopables.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); + +var UNSCOPABLES = wellKnownSymbol('unscopables'); +var ArrayPrototype = Array.prototype; + +// Array.prototype[@@unscopables] +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] == undefined) { + definePropertyModule.f(ArrayPrototype, UNSCOPABLES, { + configurable: true, + value: create(null) + }); +} + +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/an-instance.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/an-instance.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); + +var TypeError = global.TypeError; + +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) return it; + throw TypeError('Incorrect invocation'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/an-object.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/an-object.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); + +var String = global.String; +var TypeError = global.TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw TypeError(String(argument) + ' is not an object'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-from.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/array-from.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); +var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "../../node_modules/core-js/internals/call-with-safe-iteration-closing.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "../../node_modules/core-js/internals/is-array-iterator-method.js"); +var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); +var createProperty = __webpack_require__(/*! ../internals/create-property */ "../../node_modules/core-js/internals/create-property.js"); +var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "../../node_modules/core-js/internals/get-iterator.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); + +var Array = global.Array; + +// `Array.from` method implementation +// https://tc39.es/ecma262/#sec-array.from +module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var IS_CONSTRUCTOR = isConstructor(this); + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined); + var iteratorMethod = getIteratorMethod(O); + var index = 0; + var length, result, step, iterator, next, value; + // if the target is not iterable or it's an array with the default iterator - use a simple case + if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) { + iterator = getIterator(O, iteratorMethod); + next = iterator.next; + result = IS_CONSTRUCTOR ? new this() : []; + for (;!(step = call(next, iterator)).done; index++) { + value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; + createProperty(result, index, value); + } + } else { + length = lengthOfArrayLike(O); + result = IS_CONSTRUCTOR ? new this(length) : Array(length); + for (;length > index; index++) { + value = mapping ? mapfn(O[index], index) : O[index]; + createProperty(result, index, value); + } + } + result.length = index; + return result; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-includes.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/array-includes.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "../../node_modules/core-js/internals/to-absolute-index.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-iteration.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/array-iteration.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); +var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "../../node_modules/core-js/internals/array-species-create.js"); + +var push = uncurryThis([].push); + +// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation +var createMethod = function (TYPE) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var IS_FILTER_REJECT = TYPE == 7; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + return function ($this, callbackfn, that, specificCreate) { + var O = toObject($this); + var self = IndexedObject(O); + var boundFunction = bind(callbackfn, that); + var length = lengthOfArrayLike(self); + var index = 0; + var create = specificCreate || arraySpeciesCreate; + var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; + var value, result; + for (;length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: return true; // some + case 5: return value; // find + case 6: return index; // findIndex + case 2: push(target, value); // filter + } else switch (TYPE) { + case 4: return false; // every + case 7: push(target, value); // filterReject + } + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; +}; + +module.exports = { + // `Array.prototype.forEach` method + // https://tc39.es/ecma262/#sec-array.prototype.foreach + forEach: createMethod(0), + // `Array.prototype.map` method + // https://tc39.es/ecma262/#sec-array.prototype.map + map: createMethod(1), + // `Array.prototype.filter` method + // https://tc39.es/ecma262/#sec-array.prototype.filter + filter: createMethod(2), + // `Array.prototype.some` method + // https://tc39.es/ecma262/#sec-array.prototype.some + some: createMethod(3), + // `Array.prototype.every` method + // https://tc39.es/ecma262/#sec-array.prototype.every + every: createMethod(4), + // `Array.prototype.find` method + // https://tc39.es/ecma262/#sec-array.prototype.find + find: createMethod(5), + // `Array.prototype.findIndex` method + // https://tc39.es/ecma262/#sec-array.prototype.findIndex + findIndex: createMethod(6), + // `Array.prototype.filterReject` method + // https://github.com/tc39/proposal-array-filtering + filterReject: createMethod(7) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-slice.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/array-slice.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = uncurryThis([].slice); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-species-constructor.js": +/*!*************************************************************************!*\ + !*** ../../node_modules/core-js/internals/array-species-constructor.js ***! + \*************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isArray = __webpack_require__(/*! ../internals/is-array */ "../../node_modules/core-js/internals/is-array.js"); +var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var SPECIES = wellKnownSymbol('species'); +var Array = global.Array; + +// a part of `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray) { + var C; + if (isArray(originalArray)) { + C = originalArray.constructor; + // cross-realm fallback + if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined; + else if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/array-species-create.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/array-species-create.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var arraySpeciesConstructor = __webpack_require__(/*! ../internals/array-species-constructor */ "../../node_modules/core-js/internals/array-species-constructor.js"); + +// `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray, length) { + return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/call-with-safe-iteration-closing.js": +/*!********************************************************************************!*\ + !*** ../../node_modules/core-js/internals/call-with-safe-iteration-closing.js ***! + \********************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../../node_modules/core-js/internals/iterator-close.js"); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/check-correctness-of-iteration.js": +/*!******************************************************************************!*\ + !*** ../../node_modules/core-js/internals/check-correctness-of-iteration.js ***! + \******************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var SAFE_CLOSING = false; + +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; + }, + 'return': function () { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function () { + return this; + }; + // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing + Array.from(iteratorWithReturn, function () { throw 2; }); +} catch (error) { /* empty */ } + +module.exports = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error) { /* empty */ } + return ITERATION_SUPPORT; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/classof-raw.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/classof-raw.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/classof.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/internals/classof.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var Object = global.Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/clear-error-stack.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/clear-error-stack.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); + +var replace = uncurryThis(''.replace); +var split = uncurryThis(''.split); +var join = uncurryThis([].join); + +var TEST = (function (arg) { return String(Error(arg).stack); })('zxcasd'); +var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; +var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); +var IS_FIREFOX_OR_SAFARI_STACK = /@[^\n]*\n/.test(TEST) && !/zxcasd/.test(TEST); + +module.exports = function (stack, dropEntries) { + if (typeof stack != 'string') return stack; + if (IS_V8_OR_CHAKRA_STACK) { + while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); + } else if (IS_FIREFOX_OR_SAFARI_STACK) { + return join(arraySlice(split(stack, '\n'), dropEntries), '\n'); + } return stack; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/collection-strong.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/collection-strong.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../node_modules/core-js/internals/redefine-all.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); +var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../node_modules/core-js/internals/set-species.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var fastKey = (__webpack_require__(/*! ../internals/internal-metadata */ "../../node_modules/core-js/internals/internal-metadata.js").fastKey); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); + +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; + +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var Constructor = wrapper(function (that, iterable) { + anInstance(that, Prototype); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + index: create(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!DESCRIPTORS) that.size = 0; + if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); + }); + + var Prototype = Constructor.prototype; + + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; + // change existing entry + if (entry) { + entry.value = value; + // create new entry + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) state.first = entry; + if (previous) previous.next = entry; + if (DESCRIPTORS) state.size++; + else that.size++; + // add to index + if (index !== 'F') state.index[index] = entry; + } return that; + }; + + var getEntry = function (that, key) { + var state = getInternalState(that); + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return state.index[index]; + // frozen object case + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) return entry; + } + }; + + redefineAll(Prototype, { + // `{ Map, Set }.prototype.clear()` methods + // https://tc39.es/ecma262/#sec-map.prototype.clear + // https://tc39.es/ecma262/#sec-set.prototype.clear + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + while (entry) { + entry.removed = true; + if (entry.previous) entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + state.first = state.last = undefined; + if (DESCRIPTORS) state.size = 0; + else that.size = 0; + }, + // `{ Map, Set }.prototype.delete(key)` methods + // https://tc39.es/ecma262/#sec-map.prototype.delete + // https://tc39.es/ecma262/#sec-set.prototype.delete + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) prev.next = next; + if (next) next.previous = prev; + if (state.first == entry) state.first = next; + if (state.last == entry) state.last = prev; + if (DESCRIPTORS) state.size--; + else that.size--; + } return !!entry; + }, + // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods + // https://tc39.es/ecma262/#sec-map.prototype.foreach + // https://tc39.es/ecma262/#sec-set.prototype.foreach + forEach: function forEach(callbackfn /* , that = undefined */) { + var state = getInternalState(this); + var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined); + var entry; + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + } + }, + // `{ Map, Set}.prototype.has(key)` methods + // https://tc39.es/ecma262/#sec-map.prototype.has + // https://tc39.es/ecma262/#sec-set.prototype.has + has: function has(key) { + return !!getEntry(this, key); + } + }); + + redefineAll(Prototype, IS_MAP ? { + // `Map.prototype.get(key)` method + // https://tc39.es/ecma262/#sec-map.prototype.get + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + // `Map.prototype.set(key, value)` method + // https://tc39.es/ecma262/#sec-map.prototype.set + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + // `Set.prototype.add(value)` method + // https://tc39.es/ecma262/#sec-set.prototype.add + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (DESCRIPTORS) defineProperty(Prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return Constructor; + }, + setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); + // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods + // https://tc39.es/ecma262/#sec-map.prototype.entries + // https://tc39.es/ecma262/#sec-map.prototype.keys + // https://tc39.es/ecma262/#sec-map.prototype.values + // https://tc39.es/ecma262/#sec-map.prototype-@@iterator + // https://tc39.es/ecma262/#sec-set.prototype.entries + // https://tc39.es/ecma262/#sec-set.prototype.keys + // https://tc39.es/ecma262/#sec-set.prototype.values + // https://tc39.es/ecma262/#sec-set.prototype-@@iterator + defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + // get next entry + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + // or finish the iteration + state.target = undefined; + return { value: undefined, done: true }; + } + // return step by kind + if (kind == 'keys') return { value: entry.key, done: false }; + if (kind == 'values') return { value: entry.value, done: false }; + return { value: [entry.key, entry.value], done: false }; + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // `{ Map, Set }.prototype[@@species]` accessors + // https://tc39.es/ecma262/#sec-get-map-@@species + // https://tc39.es/ecma262/#sec-get-set-@@species + setSpecies(CONSTRUCTOR_NAME); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/collection.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/collection.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "../../node_modules/core-js/internals/internal-metadata.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); +var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "../../node_modules/core-js/internals/inherit-if-required.js"); + +module.exports = function (CONSTRUCTOR_NAME, wrapper, common) { + var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; + var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; + var ADDER = IS_MAP ? 'set' : 'add'; + var NativeConstructor = global[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var exported = {}; + + var fixMethod = function (KEY) { + var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]); + redefine(NativePrototype, KEY, + KEY == 'add' ? function add(value) { + uncurriedNativeMethod(this, value === 0 ? 0 : value); + return this; + } : KEY == 'delete' ? function (key) { + return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'get' ? function get(key) { + return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : KEY == 'has' ? function has(key) { + return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); + } : function set(key, value) { + uncurriedNativeMethod(this, key === 0 ? 0 : key, value); + return this; + } + ); + }; + + var REPLACE = isForced( + CONSTRUCTOR_NAME, + !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + })) + ); + + if (REPLACE) { + // create collection constructor + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + InternalMetadataModule.enable(); + } else if (isForced(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + // eslint-disable-next-line no-new -- required for testing + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); }); + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new NativeConstructor(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (dummy, iterable) { + anInstance(dummy, NativePrototype); + var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); + if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + + // weak collections should not contains .clear method + if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; + } + + exported[CONSTRUCTOR_NAME] = Constructor; + $({ global: true, forced: Constructor != NativeConstructor }, exported); + + setToStringTag(Constructor, CONSTRUCTOR_NAME); + + if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + + return Constructor; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/copy-constructor-properties.js": +/*!***************************************************************************!*\ + !*** ../../node_modules/core-js/internals/copy-constructor-properties.js ***! + \***************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "../../node_modules/core-js/internals/own-keys.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); + +module.exports = function (target, source) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!hasOwn(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/correct-prototype-getter.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/internals/correct-prototype-getter.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/create-iterator-constructor.js": +/*!***************************************************************************!*\ + !*** ../../node_modules/core-js/internals/create-iterator-constructor.js ***! + \***************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var IteratorPrototype = (__webpack_require__(/*! ../internals/iterators-core */ "../../node_modules/core-js/internals/iterators-core.js").IteratorPrototype); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); + +var returnThis = function () { return this; }; + +module.exports = function (IteratorConstructor, NAME, next) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/create-non-enumerable-property.js": +/*!******************************************************************************!*\ + !*** ../../node_modules/core-js/internals/create-non-enumerable-property.js ***! + \******************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/create-property-descriptor.js": +/*!**************************************************************************!*\ + !*** ../../node_modules/core-js/internals/create-property-descriptor.js ***! + \**************************************************************************/ +/***/ ((module) => { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/create-property.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/create-property.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = function (object, key, value) { + var propertyKey = toPropertyKey(key); + if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); + else object[propertyKey] = value; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/define-iterator.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/define-iterator.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); +var FunctionName = __webpack_require__(/*! ../internals/function-name */ "../../node_modules/core-js/internals/function-name.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "../../node_modules/core-js/internals/create-iterator-constructor.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); +var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "../../node_modules/core-js/internals/iterators-core.js"); + +var PROPER_FUNCTION_NAME = FunctionName.PROPER; +var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var ITERATOR = wellKnownSymbol('iterator'); +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; + +var returnThis = function () { return this; }; + +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; + case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; + case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; + } return function () { return new IteratorConstructor(this); }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] + || IterablePrototype['@@iterator'] + || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + + // fix native + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { + redefine(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + // Set @@toStringTag to native iterators + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; + } + } + + // fix Array.prototype.{ values, @@iterator }.name in V8 / FF + if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { + createNonEnumerableProperty(IterablePrototype, 'name', VALUES); + } else { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { return call(nativeIterator, this); }; + } + } + + // export additional methods + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine(IterablePrototype, KEY, methods[KEY]); + } + } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + + // define iterator + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); + } + Iterators[NAME] = defaultIterator; + + return methods; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/descriptors.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/descriptors.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/document-create-element.js": +/*!***********************************************************************!*\ + !*** ../../node_modules/core-js/internals/document-create-element.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); + +var document = global.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-browser.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-browser.js ***! + \*****************************************************************/ +/***/ ((module) => { + +module.exports = typeof window == 'object'; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-ios-pebble.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-ios-pebble.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = /ipad|iphone|ipod/i.test(userAgent) && global.Pebble !== undefined; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-ios.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-ios.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); + +module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-node.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-node.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = classof(global.process) == 'process'; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-is-webos-webkit.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-is-webos-webkit.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); + +module.exports = /web0s(?!.*chrome)/i.test(userAgent); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-user-agent.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-user-agent.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); + +module.exports = getBuiltIn('navigator', 'userAgent') || ''; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/engine-v8-version.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/engine-v8-version.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); + +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/entry-unbind.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/entry-unbind.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = function (CONSTRUCTOR, METHOD) { + return uncurryThis(global[CONSTRUCTOR].prototype[METHOD]); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/enum-bug-keys.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/enum-bug-keys.js ***! + \*************************************************************/ +/***/ ((module) => { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/error-stack-installable.js": +/*!***********************************************************************!*\ + !*** ../../node_modules/core-js/internals/error-stack-installable.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = !fails(function () { + var error = Error('a'); + if (!('stack' in error)) return true; + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7)); + return error.stack !== 7; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/export.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/internals/export.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js").f); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "../../node_modules/core-js/internals/copy-constructor-properties.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.noTargetGet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || setGlobal(TARGET, {}); + } else { + target = (global[TARGET] || {}).prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty == typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(sourceProperty, 'sham', true); + } + // extend global + redefine(target, key, sourceProperty, options); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/fails.js": +/*!*****************************************************!*\ + !*** ../../node_modules/core-js/internals/fails.js ***! + \*****************************************************/ +/***/ ((module) => { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/freezing.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/internals/freezing.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); + +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing + return Object.isExtensible(Object.preventExtensions({})); +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-apply.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-apply.js ***! + \**************************************************************/ +/***/ ((module) => { + +var FunctionPrototype = Function.prototype; +var apply = FunctionPrototype.apply; +var bind = FunctionPrototype.bind; +var call = FunctionPrototype.call; + +// eslint-disable-next-line es/no-reflect -- safe +module.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () { + return call.apply(apply, arguments); +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-bind-context.js": +/*!*********************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-bind-context.js ***! + \*********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-call.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-call.js ***! + \*************************************************************/ +/***/ ((module) => { + +var call = Function.prototype.call; + +module.exports = call.bind ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-name.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-name.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/function-uncurry-this.js": +/*!*********************************************************************!*\ + !*** ../../node_modules/core-js/internals/function-uncurry-this.js ***! + \*********************************************************************/ +/***/ ((module) => { + +var FunctionPrototype = Function.prototype; +var bind = FunctionPrototype.bind; +var call = FunctionPrototype.call; +var callBind = bind && bind.bind(call); + +module.exports = bind ? function (fn) { + return fn && callBind(call, fn); +} : function (fn) { + return fn && function () { + return call.apply(fn, arguments); + }; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/get-built-in.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/get-built-in.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); + +var aFunction = function (argument) { + return isCallable(argument) ? argument : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/get-iterator-method.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/internals/get-iterator-method.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); +var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = function (it) { + if (it != undefined) return getMethod(it, ITERATOR) + || getMethod(it, '@@iterator') + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/get-iterator.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/get-iterator.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); + +var TypeError = global.TypeError; + +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); + throw TypeError(tryToString(argument) + ' is not iterable'); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/get-method.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/get-method.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return func == null ? undefined : aCallable(func); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/global.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/internals/global.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var check = function (it) { + return it && it.Math == Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof __webpack_require__.g == 'object' && __webpack_require__.g) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/has-own-property.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/internals/has-own-property.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/hidden-keys.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/hidden-keys.js ***! + \***********************************************************/ +/***/ ((module) => { + +module.exports = {}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/host-report-errors.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/internals/host-report-errors.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = function (a, b) { + var console = global.console; + if (console && console.error) { + arguments.length == 1 ? console.error(a) : console.error(a, b); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/html.js": +/*!****************************************************!*\ + !*** ../../node_modules/core-js/internals/html.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); + +module.exports = getBuiltIn('document', 'documentElement'); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/ie8-dom-define.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/ie8-dom-define.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); + +// Thank's IE8 for his funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- requied for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a != 7; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/indexed-object.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/indexed-object.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); + +var Object = global.Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split(it, '') : Object(it); +} : Object; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/inherit-if-required.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/internals/inherit-if-required.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); + +// makes subclassing work correct for wrapped built-ins +module.exports = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + setPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + isCallable(NewTarget = dummy.constructor) && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) setPrototypeOf($this, NewTargetPrototype); + return $this; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/inspect-source.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/inspect-source.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var store = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/install-error-cause.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/internals/install-error-cause.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); + +// `InstallErrorCause` abstract operation +// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause +module.exports = function (O, options) { + if (isObject(options) && 'cause' in options) { + createNonEnumerableProperty(O, 'cause', options.cause); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/internal-metadata.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/internal-metadata.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertyNamesExternalModule = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "../../node_modules/core-js/internals/object-get-own-property-names-external.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "../../node_modules/core-js/internals/freezing.js"); + +var REQUIRED = false; +var METADATA = uid('meta'); +var id = 0; + +// eslint-disable-next-line es/no-object-isextensible -- safe +var isExtensible = Object.isExtensible || function () { + return true; +}; + +var setMetadata = function (it) { + defineProperty(it, METADATA, { value: { + objectID: 'O' + id++, // object ID + weakData: {} // weak collections IDs + } }); +}; + +var fastKey = function (it, create) { + // return a primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!hasOwn(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMetadata(it); + // return object ID + } return it[METADATA].objectID; +}; + +var getWeakData = function (it, create) { + if (!hasOwn(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMetadata(it); + // return the store of weak collections IDs + } return it[METADATA].weakData; +}; + +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it); + return it; +}; + +var enable = function () { + meta.enable = function () { /* empty */ }; + REQUIRED = true; + var getOwnPropertyNames = getOwnPropertyNamesModule.f; + var splice = uncurryThis([].splice); + var test = {}; + test[METADATA] = 1; + + // prevent exposing of metadata key + if (getOwnPropertyNames(test).length) { + getOwnPropertyNamesModule.f = function (it) { + var result = getOwnPropertyNames(it); + for (var i = 0, length = result.length; i < length; i++) { + if (result[i] === METADATA) { + splice(result, i, 1); + break; + } + } return result; + }; + + $({ target: 'Object', stat: true, forced: true }, { + getOwnPropertyNames: getOwnPropertyNamesExternalModule.f + }); + } +}; + +var meta = module.exports = { + enable: enable, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze +}; + +hiddenKeys[METADATA] = true; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/internal-state.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/internal-state.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "../../node_modules/core-js/internals/native-weak-map.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var shared = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + var wmget = uncurryThis(store.get); + var wmhas = uncurryThis(store.has); + var wmset = uncurryThis(store.set); + set = function (it, metadata) { + if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + wmset(store, it, metadata); + return metadata; + }; + get = function (it) { + return wmget(store, it) || {}; + }; + has = function (it) { + return wmhas(store, it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-array-iterator-method.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/internals/is-array-iterator-method.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-array.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-array.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) == 'Array'; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-callable.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-callable.js ***! + \***********************************************************/ +/***/ ((module) => { + +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +module.exports = function (argument) { + return typeof argument == 'function'; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-constructor.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/is-constructor.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); + +var noop = function () { /* empty */ }; +var empty = []; +var construct = getBuiltIn('Reflect', 'construct'); +var constructorRegExp = /^\s*(?:class|function)\b/; +var exec = uncurryThis(constructorRegExp.exec); +var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); + +var isConstructorModern = function (argument) { + if (!isCallable(argument)) return false; + try { + construct(noop, empty, argument); + return true; + } catch (error) { + return false; + } +}; + +var isConstructorLegacy = function (argument) { + if (!isCallable(argument)) return false; + switch (classof(argument)) { + case 'AsyncFunction': + case 'GeneratorFunction': + case 'AsyncGeneratorFunction': return false; + // we can't check .prototype since constructors produced by .bind haven't it + } return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); +}; + +// `IsConstructor` abstract operation +// https://tc39.es/ecma262/#sec-isconstructor +module.exports = !construct || fails(function () { + var called; + return isConstructorModern(isConstructorModern.call) + || !isConstructorModern(Object) + || !isConstructorModern(function () { called = true; }) + || called; +}) ? isConstructorLegacy : isConstructorModern; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-forced.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-forced.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true + : value == NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-integral-number.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/internals/is-integral-number.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); + +var floor = Math.floor; + +// `IsIntegralNumber` abstract operation +// https://tc39.es/ecma262/#sec-isintegralnumber +// eslint-disable-next-line es/no-number-isinteger -- safe +module.exports = Number.isInteger || function isInteger(it) { + return !isObject(it) && isFinite(it) && floor(it) === it; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-object.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-object.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-pure.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/internals/is-pure.js ***! + \*******************************************************/ +/***/ ((module) => { + +module.exports = false; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/is-symbol.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/is-symbol.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); +var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "../../node_modules/core-js/internals/use-symbol-as-uid.js"); + +var Object = global.Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/iterate.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/internals/iterate.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "../../node_modules/core-js/internals/is-array-iterator-method.js"); +var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); +var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "../../node_modules/core-js/internals/get-iterator.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); +var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../../node_modules/core-js/internals/iterator-close.js"); + +var TypeError = global.TypeError; + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +var ResultPrototype = Result.prototype; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + if (iterator) iteratorClose(iterator, 'normal', condition); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) throw TypeError(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + + next = iterator.next; + while (!(step = call(next, iterator)).done) { + try { + result = callFn(step.value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/iterator-close.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/iterator-close.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/iterators-core.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/internals/iterators-core.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + redefine(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/iterators.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/iterators.js ***! + \*********************************************************/ +/***/ ((module) => { + +module.exports = {}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/length-of-array-like.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/length-of-array-like.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toLength = __webpack_require__(/*! ../internals/to-length */ "../../node_modules/core-js/internals/to-length.js"); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/microtask.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/microtask.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js").f); +var macrotask = (__webpack_require__(/*! ../internals/task */ "../../node_modules/core-js/internals/task.js").set); +var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "../../node_modules/core-js/internals/engine-is-ios.js"); +var IS_IOS_PEBBLE = __webpack_require__(/*! ../internals/engine-is-ios-pebble */ "../../node_modules/core-js/internals/engine-is-ios-pebble.js"); +var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/engine-is-webos-webkit */ "../../node_modules/core-js/internals/engine-is-webos-webkit.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); + +var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; +var document = global.document; +var process = global.process; +var Promise = global.Promise; +// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` +var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask'); +var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; + +var flush, head, last, notify, toggle, node, promise, then; + +// modern engines have queueMicrotask method +if (!queueMicrotask) { + flush = function () { + var parent, fn; + if (IS_NODE && (parent = process.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (error) { + if (head) notify(); + else last = undefined; + throw error; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 + // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898 + if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) { + toggle = true; + node = document.createTextNode(''); + new MutationObserver(flush).observe(node, { characterData: true }); + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + promise = Promise.resolve(undefined); + // workaround of WebKit ~ iOS Safari 10.1 bug + promise.constructor = Promise; + then = bind(promise.then, promise); + notify = function () { + then(flush); + }; + // Node.js without promises + } else if (IS_NODE) { + notify = function () { + process.nextTick(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + // strange IE + webpack dev server bug - use .bind(global) + macrotask = bind(macrotask, global); + notify = function () { + macrotask(flush); + }; + } +} + +module.exports = queueMicrotask || function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/native-promise-constructor.js": +/*!**************************************************************************!*\ + !*** ../../node_modules/core-js/internals/native-promise-constructor.js ***! + \**************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = global.Promise; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/native-symbol.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/native-symbol.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../node_modules/core-js/internals/engine-v8-version.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol(); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + return !String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/native-weak-map.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/native-weak-map.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); + +var WeakMap = global.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap)); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/new-promise-capability.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/new-promise-capability.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aCallable(resolve); + this.reject = aCallable(reject); +}; + +// `NewPromiseCapability` abstract operation +// https://tc39.es/ecma262/#sec-newpromisecapability +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/normalize-string-argument.js": +/*!*************************************************************************!*\ + !*** ../../node_modules/core-js/internals/normalize-string-argument.js ***! + \*************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); + +module.exports = function (argument, $default) { + return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/number-parse-float.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/internals/number-parse-float.js ***! + \******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var trim = (__webpack_require__(/*! ../internals/string-trim */ "../../node_modules/core-js/internals/string-trim.js").trim); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); + +var charAt = uncurryThis(''.charAt); +var n$ParseFloat = global.parseFloat; +var Symbol = global.Symbol; +var ITERATOR = Symbol && Symbol.iterator; +var FORCED = 1 / n$ParseFloat(whitespaces + '-0') !== -Infinity + // MS Edge 18- broken with boxed symbols + || (ITERATOR && !fails(function () { n$ParseFloat(Object(ITERATOR)); })); + +// `parseFloat` method +// https://tc39.es/ecma262/#sec-parsefloat-string +module.exports = FORCED ? function parseFloat(string) { + var trimmedString = trim(toString(string)); + var result = n$ParseFloat(trimmedString); + return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result; +} : n$ParseFloat; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/number-parse-int.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/internals/number-parse-int.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var trim = (__webpack_require__(/*! ../internals/string-trim */ "../../node_modules/core-js/internals/string-trim.js").trim); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); + +var $parseInt = global.parseInt; +var Symbol = global.Symbol; +var ITERATOR = Symbol && Symbol.iterator; +var hex = /^[+-]?0x/i; +var exec = uncurryThis(hex.exec); +var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22 + // MS Edge 18- broken with boxed symbols + || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); })); + +// `parseInt` method +// https://tc39.es/ecma262/#sec-parseint-string-radix +module.exports = FORCED ? function parseInt(string, radix) { + var S = trim(toString(string)); + return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10)); +} : $parseInt; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-assign.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-assign.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../../node_modules/core-js/internals/object-get-own-property-symbols.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); + +// eslint-disable-next-line es/no-object-assign -- safe +var $assign = Object.assign; +// eslint-disable-next-line es/no-object-defineproperty -- required for testing +var defineProperty = Object.defineProperty; +var concat = uncurryThis([].concat); + +// `Object.assign` method +// https://tc39.es/ecma262/#sec-object.assign +module.exports = !$assign || fails(function () { + // should have correct order of operations (Edge bug) + if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', { + enumerable: true, + get: function () { + defineProperty(this, 'b', { + value: 3, + enumerable: false + }); + } + }), { b: 2 })).b !== 1) return true; + // should work with symbols and should have deterministic property order (V8 bug) + var A = {}; + var B = {}; + // eslint-disable-next-line es/no-symbol -- safe + var symbol = Symbol(); + var alphabet = 'abcdefghijklmnopqrst'; + A[symbol] = 7; + alphabet.split('').forEach(function (chr) { B[chr] = chr; }); + return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length` + var T = toObject(target); + var argumentsLength = arguments.length; + var index = 1; + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + var propertyIsEnumerable = propertyIsEnumerableModule.f; + while (argumentsLength > index) { + var S = IndexedObject(arguments[index++]); + var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key]; + } + } return T; +} : $assign; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-create.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-create.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* global ActiveXObject -- old IE, WSH */ +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "../../node_modules/core-js/internals/object-define-properties.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); +var html = __webpack_require__(/*! ../internals/html */ "../../node_modules/core-js/internals/html.js"); +var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : defineProperties(result, Properties); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-define-properties.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-define-properties.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-define-property.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-define-property.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../../node_modules/core-js/internals/ie8-dom-define.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); + +var TypeError = global.TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js": +/*!**********************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-own-property-descriptor.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../../node_modules/core-js/internals/ie8-dom-define.js"); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-own-property-names-external.js": +/*!**************************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-own-property-names-external.js ***! + \**************************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* eslint-disable es/no-object-getownpropertynames -- safe */ +var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var $getOwnPropertyNames = (__webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js").f); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return $getOwnPropertyNames(it); + } catch (error) { + return arraySlice(windowNames); + } +}; + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && classof(it) == 'Window' + ? getWindowNames(it) + : $getOwnPropertyNames(toIndexedObject(it)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-own-property-names.js": +/*!*****************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-own-property-names.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../../node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-own-property-symbols.js": +/*!*******************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-own-property-symbols.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-get-prototype-of.js": +/*!***********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-get-prototype-of.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "../../node_modules/core-js/internals/correct-prototype-getter.js"); + +var IE_PROTO = sharedKey('IE_PROTO'); +var Object = global.Object; +var ObjectPrototype = Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof Object ? ObjectPrototype : null; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-is-prototype-of.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-is-prototype-of.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +module.exports = uncurryThis({}.isPrototypeOf); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-keys-internal.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-keys-internal.js ***! + \********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var indexOf = (__webpack_require__(/*! ../internals/array-includes */ "../../node_modules/core-js/internals/array-includes.js").indexOf); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-keys.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/object-keys.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../../node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-property-is-enumerable.js": +/*!*****************************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-property-is-enumerable.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-set-prototype-of.js": +/*!***********************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-set-prototype-of.js ***! + \***********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* eslint-disable no-proto -- safe */ +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "../../node_modules/core-js/internals/a-possible-prototype.js"); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-to-array.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-to-array.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var $propertyIsEnumerable = (__webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js").f); + +var propertyIsEnumerable = uncurryThis($propertyIsEnumerable); +var push = uncurryThis([].push); + +// `Object.{ entries, values }` methods implementation +var createMethod = function (TO_ENTRIES) { + return function (it) { + var O = toIndexedObject(it); + var keys = objectKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + while (length > i) { + key = keys[i++]; + if (!DESCRIPTORS || propertyIsEnumerable(O, key)) { + push(result, TO_ENTRIES ? [key, O[key]] : O[key]); + } + } + return result; + }; +}; + +module.exports = { + // `Object.entries` method + // https://tc39.es/ecma262/#sec-object.entries + entries: createMethod(true), + // `Object.values` method + // https://tc39.es/ecma262/#sec-object.values + values: createMethod(false) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/object-to-string.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/internals/object-to-string.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); + +// `Object.prototype.toString` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.tostring +module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { + return '[object ' + classof(this) + ']'; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/ordinary-to-primitive.js": +/*!*********************************************************************!*\ + !*** ../../node_modules/core-js/internals/ordinary-to-primitive.js ***! + \*********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); + +var TypeError = global.TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/own-keys.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/internals/own-keys.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../../node_modules/core-js/internals/object-get-own-property-symbols.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); + +var concat = uncurryThis([].concat); + +// all object keys, includes non-enumerable and symbols +module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/path.js": +/*!****************************************************!*\ + !*** ../../node_modules/core-js/internals/path.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +module.exports = global; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/perform.js": +/*!*******************************************************!*\ + !*** ../../node_modules/core-js/internals/perform.js ***! + \*******************************************************/ +/***/ ((module) => { + +module.exports = function (exec) { + try { + return { error: false, value: exec() }; + } catch (error) { + return { error: true, value: error }; + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/promise-resolve.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/promise-resolve.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); + +module.exports = function (C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/redefine-all.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/redefine-all.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); + +module.exports = function (target, src, options) { + for (var key in src) redefine(target, key, src[key], options); + return target; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/redefine.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/internals/redefine.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); +var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(/*! ../internals/function-name */ "../../node_modules/core-js/internals/function-name.js").CONFIGURABLE); + +var getInternalState = InternalStateModule.get; +var enforceInternalState = InternalStateModule.enforce; +var TEMPLATE = String(String).split('String'); + +(module.exports = function (O, key, value, options) { + var unsafe = options ? !!options.unsafe : false; + var simple = options ? !!options.enumerable : false; + var noTargetGet = options ? !!options.noTargetGet : false; + var name = options && options.name !== undefined ? options.name : key; + var state; + if (isCallable(value)) { + if (String(name).slice(0, 7) === 'Symbol(') { + name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']'; + } + if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { + createNonEnumerableProperty(value, 'name', name); + } + state = enforceInternalState(value); + if (!state.source) { + state.source = TEMPLATE.join(typeof name == 'string' ? name : ''); + } + } + if (O === global) { + if (simple) O[key] = value; + else setGlobal(key, value); + return; + } else if (!unsafe) { + delete O[key]; + } else if (!noTargetGet && O[key]) { + simple = true; + } + if (simple) O[key] = value; + else createNonEnumerableProperty(O, key, value); +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, 'toString', function toString() { + return isCallable(this) && getInternalState(this).source || inspectSource(this); +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/require-object-coercible.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/internals/require-object-coercible.js ***! + \************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +var TypeError = global.TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/set-global.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/set-global.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(global, key, { value: value, configurable: true, writable: true }); + } catch (error) { + global[key] = value; + } return value; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/set-species.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/set-species.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); + +var SPECIES = wellKnownSymbol('species'); + +module.exports = function (CONSTRUCTOR_NAME) { + var Constructor = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = definePropertyModule.f; + + if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) { + defineProperty(Constructor, SPECIES, { + configurable: true, + get: function () { return this; } + }); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/set-to-string-tag.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/set-to-string-tag.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +module.exports = function (it, TAG, STATIC) { + if (it && !hasOwn(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { + defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/shared-key.js": +/*!**********************************************************!*\ + !*** ../../node_modules/core-js/internals/shared-key.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var shared = __webpack_require__(/*! ../internals/shared */ "../../node_modules/core-js/internals/shared.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/shared-store.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/shared-store.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); + +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || setGlobal(SHARED, {}); + +module.exports = store; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/shared.js": +/*!******************************************************!*\ + !*** ../../node_modules/core-js/internals/shared.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); +var store = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.19.0', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2021 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/species-constructor.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/internals/species-constructor.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); +var aConstructor = __webpack_require__(/*! ../internals/a-constructor */ "../../node_modules/core-js/internals/a-constructor.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var SPECIES = wellKnownSymbol('species'); + +// `SpeciesConstructor` abstract operation +// https://tc39.es/ecma262/#sec-speciesconstructor +module.exports = function (O, defaultConstructor) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/string-multibyte.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/internals/string-multibyte.js ***! + \****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); + +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var stringSlice = uncurryThis(''.slice); + +var createMethod = function (CONVERT_TO_STRING) { + return function ($this, pos) { + var S = toString(requireObjectCoercible($this)); + var position = toIntegerOrInfinity(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; + first = charCodeAt(S, position); + return first < 0xD800 || first > 0xDBFF || position + 1 === size + || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF + ? CONVERT_TO_STRING + ? charAt(S, position) + : first + : CONVERT_TO_STRING + ? stringSlice(S, position, position + 2) + : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; + }; +}; + +module.exports = { + // `String.prototype.codePointAt` method + // https://tc39.es/ecma262/#sec-string.prototype.codepointat + codeAt: createMethod(false), + // `String.prototype.at` method + // https://github.com/mathiasbynens/String.prototype.at + charAt: createMethod(true) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/string-trim.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/string-trim.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); + +var replace = uncurryThis(''.replace); +var whitespace = '[' + whitespaces + ']'; +var ltrim = RegExp('^' + whitespace + whitespace + '*'); +var rtrim = RegExp(whitespace + whitespace + '*$'); + +// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation +var createMethod = function (TYPE) { + return function ($this) { + var string = toString(requireObjectCoercible($this)); + if (TYPE & 1) string = replace(string, ltrim, ''); + if (TYPE & 2) string = replace(string, rtrim, ''); + return string; + }; +}; + +module.exports = { + // `String.prototype.{ trimLeft, trimStart }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimstart + start: createMethod(1), + // `String.prototype.{ trimRight, trimEnd }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimend + end: createMethod(2), + // `String.prototype.trim` method + // https://tc39.es/ecma262/#sec-string.prototype.trim + trim: createMethod(3) +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/task.js": +/*!****************************************************!*\ + !*** ../../node_modules/core-js/internals/task.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var apply = __webpack_require__(/*! ../internals/function-apply */ "../../node_modules/core-js/internals/function-apply.js"); +var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var html = __webpack_require__(/*! ../internals/html */ "../../node_modules/core-js/internals/html.js"); +var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); +var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); +var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "../../node_modules/core-js/internals/engine-is-ios.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); + +var set = global.setImmediate; +var clear = global.clearImmediate; +var process = global.process; +var Dispatch = global.Dispatch; +var Function = global.Function; +var MessageChannel = global.MessageChannel; +var String = global.String; +var counter = 0; +var queue = {}; +var ONREADYSTATECHANGE = 'onreadystatechange'; +var location, defer, channel, port; + +try { + // Deno throws a ReferenceError on `location` access without `--location` flag + location = global.location; +} catch (error) { /* empty */ } + +var run = function (id) { + if (hasOwn(queue, id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; + +var runner = function (id) { + return function () { + run(id); + }; +}; + +var listener = function (event) { + run(event.data); +}; + +var post = function (id) { + // old engines have not location.origin + global.postMessage(String(id), location.protocol + '//' + location.host); +}; + +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if (!set || !clear) { + set = function setImmediate(fn) { + var args = arraySlice(arguments, 1); + queue[++counter] = function () { + apply(isCallable(fn) ? fn : Function(fn), undefined, args); + }; + defer(counter); + return counter; + }; + clear = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (IS_NODE) { + defer = function (id) { + process.nextTick(runner(id)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(runner(id)); + }; + // Browsers with MessageChannel, includes WebWorkers + // except iOS - https://github.com/zloirock/core-js/issues/624 + } else if (MessageChannel && !IS_IOS) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = bind(port.postMessage, port); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if ( + global.addEventListener && + isCallable(global.postMessage) && + !global.importScripts && + location && location.protocol !== 'file:' && + !fails(post) + ) { + defer = post; + global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in createElement('script')) { + defer = function (id) { + html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { + html.removeChild(this); + run(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(runner(id), 0); + }; + } +} + +module.exports = { + set: set, + clear: clear +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-absolute-index.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-absolute-index.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-indexed-object.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-indexed-object.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-integer-or-infinity.js": +/*!**********************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-integer-or-infinity.js ***! + \**********************************************************************/ +/***/ ((module) => { + +var ceil = Math.ceil; +var floor = Math.floor; + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- safe + return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-length.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/to-length.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-object.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/to-object.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); + +var Object = global.Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-primitive.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-primitive.js ***! + \************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "../../node_modules/core-js/internals/is-symbol.js"); +var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); +var ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ "../../node_modules/core-js/internals/ordinary-to-primitive.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var TypeError = global.TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-property-key.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-property-key.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "../../node_modules/core-js/internals/to-primitive.js"); +var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "../../node_modules/core-js/internals/is-symbol.js"); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-string-tag-support.js": +/*!*********************************************************************!*\ + !*** ../../node_modules/core-js/internals/to-string-tag-support.js ***! + \*********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; + +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/to-string.js": +/*!*********************************************************!*\ + !*** ../../node_modules/core-js/internals/to-string.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); + +var String = global.String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); + return String(argument); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/try-to-string.js": +/*!*************************************************************!*\ + !*** ../../node_modules/core-js/internals/try-to-string.js ***! + \*************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); + +var String = global.String; + +module.exports = function (argument) { + try { + return String(argument); + } catch (error) { + return 'Object'; + } +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/uid.js": +/*!***************************************************!*\ + !*** ../../node_modules/core-js/internals/uid.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/use-symbol-as-uid.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/use-symbol-as-uid.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../../node_modules/core-js/internals/native-symbol.js"); + +module.exports = NATIVE_SYMBOL + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/well-known-symbol.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/internals/well-known-symbol.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "../../node_modules/core-js/internals/shared.js"); +var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../../node_modules/core-js/internals/native-symbol.js"); +var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "../../node_modules/core-js/internals/use-symbol-as-uid.js"); + +var WellKnownSymbolsStore = shared('wks'); +var Symbol = global.Symbol; +var symbolFor = Symbol && Symbol['for']; +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { + var description = 'Symbol.' + name; + if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { + WellKnownSymbolsStore[name] = Symbol[name]; + } else if (USE_SYMBOL_AS_UID && symbolFor) { + WellKnownSymbolsStore[name] = symbolFor(description); + } else { + WellKnownSymbolsStore[name] = createWellKnownSymbol(description); + } + } return WellKnownSymbolsStore[name]; +}; + + +/***/ }), + +/***/ "../../node_modules/core-js/internals/whitespaces.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/internals/whitespaces.js ***! + \***********************************************************/ +/***/ ((module) => { + +// a string of all valid unicode whitespaces +module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + + '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.aggregate-error.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.aggregate-error.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "../../node_modules/core-js/internals/copy-constructor-properties.js"); +var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); +var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); +var clearErrorStack = __webpack_require__(/*! ../internals/clear-error-stack */ "../../node_modules/core-js/internals/clear-error-stack.js"); +var installErrorCause = __webpack_require__(/*! ../internals/install-error-cause */ "../../node_modules/core-js/internals/install-error-cause.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); +var normalizeStringArgument = __webpack_require__(/*! ../internals/normalize-string-argument */ "../../node_modules/core-js/internals/normalize-string-argument.js"); +var ERROR_STACK_INSTALLABLE = __webpack_require__(/*! ../internals/error-stack-installable */ "../../node_modules/core-js/internals/error-stack-installable.js"); + +var Error = global.Error; +var push = [].push; + +var $AggregateError = function AggregateError(errors, message /* , options */) { + var that = isPrototypeOf(AggregateErrorPrototype, this) ? this : create(AggregateErrorPrototype); + var options = arguments.length > 2 ? arguments[2] : undefined; + if (setPrototypeOf) { + that = setPrototypeOf(new Error(undefined), getPrototypeOf(that)); + } + createNonEnumerableProperty(that, 'message', normalizeStringArgument(message, '')); + if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(that, 'stack', clearErrorStack(that.stack, 1)); + installErrorCause(that, options); + var errorsArray = []; + iterate(errors, push, { that: errorsArray }); + createNonEnumerableProperty(that, 'errors', errorsArray); + return that; +}; + +if (setPrototypeOf) setPrototypeOf($AggregateError, Error); +else copyConstructorProperties($AggregateError, Error); + +var AggregateErrorPrototype = $AggregateError.prototype = create(Error.prototype, { + constructor: createPropertyDescriptor(1, $AggregateError), + message: createPropertyDescriptor(1, ''), + name: createPropertyDescriptor(1, 'AggregateError') +}); + +// `AggregateError` constructor +// https://tc39.es/ecma262/#sec-aggregate-error-constructor +$({ global: true }, { + AggregateError: $AggregateError +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.array.find.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/modules/es.array.find.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var $find = (__webpack_require__(/*! ../internals/array-iteration */ "../../node_modules/core-js/internals/array-iteration.js").find); +var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../../node_modules/core-js/internals/add-to-unscopables.js"); + +var FIND = 'find'; +var SKIPS_HOLES = true; + +// Shouldn't skip holes +if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; }); + +// `Array.prototype.find` method +// https://tc39.es/ecma262/#sec-array.prototype.find +$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables(FIND); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.array.from.js": +/*!***********************************************************!*\ + !*** ../../node_modules/core-js/modules/es.array.from.js ***! + \***********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var from = __webpack_require__(/*! ../internals/array-from */ "../../node_modules/core-js/internals/array-from.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); + +var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { + // eslint-disable-next-line es/no-array-from -- required for testing + Array.from(iterable); +}); + +// `Array.from` method +// https://tc39.es/ecma262/#sec-array.from +$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { + from: from +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.array.iterator.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.array.iterator.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); +var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../../node_modules/core-js/internals/add-to-unscopables.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); + +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); + +// `Array.prototype.entries` method +// https://tc39.es/ecma262/#sec-array.prototype.entries +// `Array.prototype.keys` method +// https://tc39.es/ecma262/#sec-array.prototype.keys +// `Array.prototype.values` method +// https://tc39.es/ecma262/#sec-array.prototype.values +// `Array.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-array.prototype-@@iterator +// `CreateArrayIterator` internal method +// https://tc39.es/ecma262/#sec-createarrayiterator +module.exports = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), // target + index: 0, // next index + kind: kind // kind + }); +// `%ArrayIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next +}, function () { + var state = getInternalState(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return { value: undefined, done: true }; + } + if (kind == 'keys') return { value: index, done: false }; + if (kind == 'values') return { value: target[index], done: false }; + return { value: [index, target[index]], done: false }; +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% +// https://tc39.es/ecma262/#sec-createunmappedargumentsobject +// https://tc39.es/ecma262/#sec-createmappedargumentsobject +Iterators.Arguments = Iterators.Array; + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.map.js": +/*!****************************************************!*\ + !*** ../../node_modules/core-js/modules/es.map.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var collection = __webpack_require__(/*! ../internals/collection */ "../../node_modules/core-js/internals/collection.js"); +var collectionStrong = __webpack_require__(/*! ../internals/collection-strong */ "../../node_modules/core-js/internals/collection-strong.js"); + +// `Map` constructor +// https://tc39.es/ecma262/#sec-map-objects +collection('Map', function (init) { + return function Map() { return init(this, arguments.length ? arguments[0] : undefined); }; +}, collectionStrong); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.number.is-integer.js": +/*!******************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.number.is-integer.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var isIntegralNumber = __webpack_require__(/*! ../internals/is-integral-number */ "../../node_modules/core-js/internals/is-integral-number.js"); + +// `Number.isInteger` method +// https://tc39.es/ecma262/#sec-number.isinteger +$({ target: 'Number', stat: true }, { + isInteger: isIntegralNumber +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.number.is-nan.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.number.is-nan.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); + +// `Number.isNaN` method +// https://tc39.es/ecma262/#sec-number.isnan +$({ target: 'Number', stat: true }, { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare -- NaN check + return number != number; + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.number.parse-float.js": +/*!*******************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.number.parse-float.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var parseFloat = __webpack_require__(/*! ../internals/number-parse-float */ "../../node_modules/core-js/internals/number-parse-float.js"); + +// `Number.parseFloat` method +// https://tc39.es/ecma262/#sec-number.parseFloat +// eslint-disable-next-line es/no-number-parsefloat -- required for testing +$({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, { + parseFloat: parseFloat +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.number.parse-int.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.number.parse-int.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var parseInt = __webpack_require__(/*! ../internals/number-parse-int */ "../../node_modules/core-js/internals/number-parse-int.js"); + +// `Number.parseInt` method +// https://tc39.es/ecma262/#sec-number.parseint +// eslint-disable-next-line es/no-number-parseint -- required for testing +$({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, { + parseInt: parseInt +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.object.assign.js": +/*!**************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.object.assign.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var assign = __webpack_require__(/*! ../internals/object-assign */ "../../node_modules/core-js/internals/object-assign.js"); + +// `Object.assign` method +// https://tc39.es/ecma262/#sec-object.assign +// eslint-disable-next-line es/no-object-assign -- required for testing +$({ target: 'Object', stat: true, forced: Object.assign !== assign }, { + assign: assign +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.object.entries.js": +/*!***************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.object.entries.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var $entries = (__webpack_require__(/*! ../internals/object-to-array */ "../../node_modules/core-js/internals/object-to-array.js").entries); + +// `Object.entries` method +// https://tc39.es/ecma262/#sec-object.entries +$({ target: 'Object', stat: true }, { + entries: function entries(O) { + return $entries(O); + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.object.set-prototype-of.js": +/*!************************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.object.set-prototype-of.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +$({ target: 'Object', stat: true }, { + setPrototypeOf: setPrototypeOf +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.object.to-string.js": +/*!*****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.object.to-string.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var toString = __webpack_require__(/*! ../internals/object-to-string */ "../../node_modules/core-js/internals/object-to-string.js"); + +// `Object.prototype.toString` method +// https://tc39.es/ecma262/#sec-object.prototype.tostring +if (!TO_STRING_TAG_SUPPORT) { + redefine(Object.prototype, 'toString', toString, { unsafe: true }); +} + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.promise.all-settled.js": +/*!********************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.promise.all-settled.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); + +// `Promise.allSettled` method +// https://tc39.es/ecma262/#sec-promise.allsettled +$({ target: 'Promise', stat: true }, { + allSettled: function allSettled(iterable) { + var C = this; + var capability = newPromiseCapabilityModule.f(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var promiseResolve = aCallable(C.resolve); + var values = []; + var counter = 0; + var remaining = 1; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + remaining++; + call(promiseResolve, C, promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = { status: 'fulfilled', value: value }; + --remaining || resolve(values); + }, function (error) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = { status: 'rejected', reason: error }; + --remaining || resolve(values); + }); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.promise.any.js": +/*!************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.promise.any.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); + +var PROMISE_ANY_ERROR = 'No one promise resolved'; + +// `Promise.any` method +// https://tc39.es/ecma262/#sec-promise.any +$({ target: 'Promise', stat: true }, { + any: function any(iterable) { + var C = this; + var AggregateError = getBuiltIn('AggregateError'); + var capability = newPromiseCapabilityModule.f(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var promiseResolve = aCallable(C.resolve); + var errors = []; + var counter = 0; + var remaining = 1; + var alreadyResolved = false; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyRejected = false; + remaining++; + call(promiseResolve, C, promise).then(function (value) { + if (alreadyRejected || alreadyResolved) return; + alreadyResolved = true; + resolve(value); + }, function (error) { + if (alreadyRejected || alreadyResolved) return; + alreadyRejected = true; + errors[index] = error; + --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR)); + }); + }); + --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR)); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.promise.finally.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.promise.finally.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); +var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../node_modules/core-js/internals/native-promise-constructor.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "../../node_modules/core-js/internals/species-constructor.js"); +var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "../../node_modules/core-js/internals/promise-resolve.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); + +// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829 +var NON_GENERIC = !!NativePromise && fails(function () { + NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ }); +}); + +// `Promise.prototype.finally` method +// https://tc39.es/ecma262/#sec-promise.prototype.finally +$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, { + 'finally': function (onFinally) { + var C = speciesConstructor(this, getBuiltIn('Promise')); + var isFunction = isCallable(onFinally); + return this.then( + isFunction ? function (x) { + return promiseResolve(C, onFinally()).then(function () { return x; }); + } : onFinally, + isFunction ? function (e) { + return promiseResolve(C, onFinally()).then(function () { throw e; }); + } : onFinally + ); + } +}); + +// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then` +if (!IS_PURE && isCallable(NativePromise)) { + var method = getBuiltIn('Promise').prototype['finally']; + if (NativePromise.prototype['finally'] !== method) { + redefine(NativePromise.prototype, 'finally', method, { unsafe: true }); + } +} + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.promise.js": +/*!********************************************************!*\ + !*** ../../node_modules/core-js/modules/es.promise.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); +var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); +var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); +var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../node_modules/core-js/internals/native-promise-constructor.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../node_modules/core-js/internals/redefine-all.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); +var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../node_modules/core-js/internals/set-species.js"); +var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); +var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); +var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); +var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "../../node_modules/core-js/internals/species-constructor.js"); +var task = (__webpack_require__(/*! ../internals/task */ "../../node_modules/core-js/internals/task.js").set); +var microtask = __webpack_require__(/*! ../internals/microtask */ "../../node_modules/core-js/internals/microtask.js"); +var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "../../node_modules/core-js/internals/promise-resolve.js"); +var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "../../node_modules/core-js/internals/host-report-errors.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); +var IS_BROWSER = __webpack_require__(/*! ../internals/engine-is-browser */ "../../node_modules/core-js/internals/engine-is-browser.js"); +var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); +var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../node_modules/core-js/internals/engine-v8-version.js"); + +var SPECIES = wellKnownSymbol('species'); +var PROMISE = 'Promise'; + +var getInternalState = InternalStateModule.get; +var setInternalState = InternalStateModule.set; +var getInternalPromiseState = InternalStateModule.getterFor(PROMISE); +var NativePromisePrototype = NativePromise && NativePromise.prototype; +var PromiseConstructor = NativePromise; +var PromisePrototype = NativePromisePrototype; +var TypeError = global.TypeError; +var document = global.document; +var process = global.process; +var newPromiseCapability = newPromiseCapabilityModule.f; +var newGenericPromiseCapability = newPromiseCapability; + +var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent); +var NATIVE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent); +var UNHANDLED_REJECTION = 'unhandledrejection'; +var REJECTION_HANDLED = 'rejectionhandled'; +var PENDING = 0; +var FULFILLED = 1; +var REJECTED = 2; +var HANDLED = 1; +var UNHANDLED = 2; +var SUBCLASSING = false; + +var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; + +var FORCED = isForced(PROMISE, function () { + var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor); + var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor); + // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // We can't detect it synchronously, so just check versions + if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true; + // We need Promise#finally in the pure version for preventing prototype pollution + if (IS_PURE && !PromisePrototype['finally']) return true; + // We can't use @@species feature detection in V8 since it causes + // deoptimization and performance degradation + // https://github.com/zloirock/core-js/issues/679 + if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false; + // Detect correctness of subclassing with @@species support + var promise = new PromiseConstructor(function (resolve) { resolve(1); }); + var FakePromise = function (exec) { + exec(function () { /* empty */ }, function () { /* empty */ }); + }; + var constructor = promise.constructor = {}; + constructor[SPECIES] = FakePromise; + SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise; + if (!SUBCLASSING) return true; + // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT; +}); + +var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) { + PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); +}); + +// helpers +var isThenable = function (it) { + var then; + return isObject(it) && isCallable(then = it.then) ? then : false; +}; + +var notify = function (state, isReject) { + if (state.notified) return; + state.notified = true; + var chain = state.reactions; + microtask(function () { + var value = state.value; + var ok = state.state == FULFILLED; + var index = 0; + // variable length - can't use forEach + while (chain.length > index) { + var reaction = chain[index++]; + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (state.rejection === UNHANDLED) onHandleUnhandled(state); + state.rejection = HANDLED; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // can throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError('Promise-chain cycle')); + } else if (then = isThenable(result)) { + call(then, result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (error) { + if (domain && !exited) domain.exit(); + reject(error); + } + } + state.reactions = []; + state.notified = false; + if (isReject && !state.rejection) onUnhandled(state); + }); +}; + +var dispatchEvent = function (name, promise, reason) { + var event, handler; + if (DISPATCH_EVENT) { + event = document.createEvent('Event'); + event.promise = promise; + event.reason = reason; + event.initEvent(name, false, true); + global.dispatchEvent(event); + } else event = { promise: promise, reason: reason }; + if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event); + else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); +}; + +var onUnhandled = function (state) { + call(task, global, function () { + var promise = state.facade; + var value = state.value; + var IS_UNHANDLED = isUnhandled(state); + var result; + if (IS_UNHANDLED) { + result = perform(function () { + if (IS_NODE) { + process.emit('unhandledRejection', value, promise); + } else dispatchEvent(UNHANDLED_REJECTION, promise, value); + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED; + if (result.error) throw result.value; + } + }); +}; + +var isUnhandled = function (state) { + return state.rejection !== HANDLED && !state.parent; +}; + +var onHandleUnhandled = function (state) { + call(task, global, function () { + var promise = state.facade; + if (IS_NODE) { + process.emit('rejectionHandled', promise); + } else dispatchEvent(REJECTION_HANDLED, promise, state.value); + }); +}; + +var bind = function (fn, state, unwrap) { + return function (value) { + fn(state, value, unwrap); + }; +}; + +var internalReject = function (state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + state.value = value; + state.state = REJECTED; + notify(state, true); +}; + +var internalResolve = function (state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + try { + if (state.facade === value) throw TypeError("Promise can't be resolved itself"); + var then = isThenable(value); + if (then) { + microtask(function () { + var wrapper = { done: false }; + try { + call(then, value, + bind(internalResolve, wrapper, state), + bind(internalReject, wrapper, state) + ); + } catch (error) { + internalReject(wrapper, error, state); + } + }); + } else { + state.value = value; + state.state = FULFILLED; + notify(state, false); + } + } catch (error) { + internalReject({ done: false }, error, state); + } +}; + +// constructor polyfill +if (FORCED) { + // 25.4.3.1 Promise(executor) + PromiseConstructor = function Promise(executor) { + anInstance(this, PromisePrototype); + aCallable(executor); + call(Internal, this); + var state = getInternalState(this); + try { + executor(bind(internalResolve, state), bind(internalReject, state)); + } catch (error) { + internalReject(state, error); + } + }; + PromisePrototype = PromiseConstructor.prototype; + // eslint-disable-next-line no-unused-vars -- required for `.length` + Internal = function Promise(executor) { + setInternalState(this, { + type: PROMISE, + done: false, + notified: false, + parent: false, + reactions: [], + rejection: false, + state: PENDING, + value: undefined + }); + }; + Internal.prototype = redefineAll(PromisePrototype, { + // `Promise.prototype.then` method + // https://tc39.es/ecma262/#sec-promise.prototype.then + then: function then(onFulfilled, onRejected) { + var state = getInternalPromiseState(this); + var reactions = state.reactions; + var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor)); + reaction.ok = isCallable(onFulfilled) ? onFulfilled : true; + reaction.fail = isCallable(onRejected) && onRejected; + reaction.domain = IS_NODE ? process.domain : undefined; + state.parent = true; + reactions[reactions.length] = reaction; + if (state.state != PENDING) notify(state, false); + return reaction.promise; + }, + // `Promise.prototype.catch` method + // https://tc39.es/ecma262/#sec-promise.prototype.catch + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + var state = getInternalState(promise); + this.promise = promise; + this.resolve = bind(internalResolve, state); + this.reject = bind(internalReject, state); + }; + newPromiseCapabilityModule.f = newPromiseCapability = function (C) { + return C === PromiseConstructor || C === PromiseWrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; + + if (!IS_PURE && isCallable(NativePromise) && NativePromisePrototype !== Object.prototype) { + nativeThen = NativePromisePrototype.then; + + if (!SUBCLASSING) { + // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs + redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) { + var that = this; + return new PromiseConstructor(function (resolve, reject) { + call(nativeThen, that, resolve, reject); + }).then(onFulfilled, onRejected); + // https://github.com/zloirock/core-js/issues/640 + }, { unsafe: true }); + + // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then` + redefine(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true }); + } + + // make `.constructor === Promise` work for native promise-based APIs + try { + delete NativePromisePrototype.constructor; + } catch (error) { /* empty */ } + + // make `instanceof Promise` work for native promise-based APIs + if (setPrototypeOf) { + setPrototypeOf(NativePromisePrototype, PromisePrototype); + } + } +} + +$({ global: true, wrap: true, forced: FORCED }, { + Promise: PromiseConstructor +}); + +setToStringTag(PromiseConstructor, PROMISE, false, true); +setSpecies(PROMISE); + +PromiseWrapper = getBuiltIn(PROMISE); + +// statics +$({ target: PROMISE, stat: true, forced: FORCED }, { + // `Promise.reject` method + // https://tc39.es/ecma262/#sec-promise.reject + reject: function reject(r) { + var capability = newPromiseCapability(this); + call(capability.reject, undefined, r); + return capability.promise; + } +}); + +$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, { + // `Promise.resolve` method + // https://tc39.es/ecma262/#sec-promise.resolve + resolve: function resolve(x) { + return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x); + } +}); + +$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, { + // `Promise.all` method + // https://tc39.es/ecma262/#sec-promise.all + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aCallable(C.resolve); + var values = []; + var counter = 0; + var remaining = 1; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + remaining++; + call($promiseResolve, C, promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + }, + // `Promise.race` method + // https://tc39.es/ecma262/#sec-promise.race + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = perform(function () { + var $promiseResolve = aCallable(C.resolve); + iterate(iterable, function (promise) { + call($promiseResolve, C, promise).then(capability.resolve, reject); + }); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "../../node_modules/core-js/modules/es.string.iterator.js": +/*!****************************************************************!*\ + !*** ../../node_modules/core-js/modules/es.string.iterator.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +var charAt = (__webpack_require__(/*! ../internals/string-multibyte */ "../../node_modules/core-js/internals/string-multibyte.js").charAt); +var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); + +var STRING_ITERATOR = 'String Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); + +// `String.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-string.prototype-@@iterator +defineIterator(String, 'String', function (iterated) { + setInternalState(this, { + type: STRING_ITERATOR, + string: toString(iterated), + index: 0 + }); +// `%StringIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next +}, function next() { + var state = getInternalState(this); + var string = state.string; + var index = state.index; + var point; + if (index >= string.length) return { value: undefined, done: true }; + point = charAt(string, index); + state.index += point.length; + return { value: point, done: false }; +}); + + +/***/ }), + +/***/ "../../node_modules/guid/guid.js": +/*!***************************************!*\ + !*** ../../node_modules/guid/guid.js ***! + \***************************************/ +/***/ ((module) => { + +(function () { + var validator = new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", "i"); + + function gen(count) { + var out = ""; + for (var i=0; i { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var TableauEvent = /** @class */ (function () { + function TableauEvent(type) { + this._type = type; + } + Object.defineProperty(TableauEvent.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + return TableauEvent; +}()); +exports.TableauEvent = TableauEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js": +/*!***********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauSheetEvent.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +var TableauSheetEvent = /** @class */ (function (_super) { + __extends(TableauSheetEvent, _super); + function TableauSheetEvent(type, sheet) { + var _this = _super.call(this, type) || this; + _this._sheet = sheet; + return _this; + } + Object.defineProperty(TableauSheetEvent.prototype, "sheet", { + get: function () { + return this._sheet; + }, + enumerable: true, + configurable: true + }); + return TableauSheetEvent; +}(TableauEvent_1.TableauEvent)); +exports.TableauSheetEvent = TableauSheetEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +var TableauWorksheetEvent = /** @class */ (function (_super) { + __extends(TableauWorksheetEvent, _super); + function TableauWorksheetEvent(type, _worksheet) { + var _this = _super.call(this, type, _worksheet) || this; + _this._worksheet = _worksheet; + return _this; + } + Object.defineProperty(TableauWorksheetEvent.prototype, "worksheet", { + get: function () { + return this._worksheet; + }, + enumerable: true, + configurable: true + }); + return TableauWorksheetEvent; +}(TableauSheetEvent_1.TableauSheetEvent)); +exports.TableauWorksheetEvent = TableauWorksheetEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js": +/*!************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +var WorkbookFormattingChangedEvent = /** @class */ (function (_super) { + __extends(WorkbookFormattingChangedEvent, _super); + function WorkbookFormattingChangedEvent(_formatting) { + var _this = _super.call(this, Contract.TableauEventType.WorkbookFormattingChanged) || this; + _this._formatting = _formatting; + return _this; + } + Object.defineProperty(WorkbookFormattingChangedEvent.prototype, "formatting", { + get: function () { + return this._formatting; + }, + enumerable: true, + configurable: true + }); + return WorkbookFormattingChangedEvent; +}(TableauEvent_1.TableauEvent)); +exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js": +/*!*******************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BentonSansFontFamilyName = 'Benton Sans'; +exports.BentonSansLowDPIFontFamilyName = 'Benton Sans Low-DPI'; +exports.BentonSansBookFontFaceName = 'Benton Sans Book'; +exports.BentonSansBookItalicFontFaceName = 'Benton Sans Book Italic'; +exports.BentonSansSemiDemiFontFaceName = 'Benton Sans SemiDemi'; +exports.BentonSansSemiDemiItalicFontFaceName = 'Benton Sans SemiDemi Italic'; +exports.BentonSansLightFontFaceName = 'Benton Sans Light'; +exports.BentonSansMediumFontFaceName = 'Benton Sans Medium'; +exports.SupportedBentonSansFontFaces = [ + exports.BentonSansBookFontFaceName, + exports.BentonSansBookItalicFontFaceName, + exports.BentonSansSemiDemiFontFaceName, + exports.BentonSansSemiDemiItalicFontFaceName, + exports.BentonSansLightFontFaceName, + exports.BentonSansMediumFontFaceName, +]; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js": +/*!*******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ConnectedServer.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ConnectedServer = /** @class */ (function () { + function ConnectedServer(_userId, _siteId, _siteNamespace, _workbookId) { + this._userId = _userId; + this._siteId = _siteId; + this._siteNamespace = _siteNamespace; + this._workbookId = _workbookId; + } + Object.defineProperty(ConnectedServer.prototype, "userId", { + get: function () { + return this._userId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectedServer.prototype, "siteId", { + get: function () { + return this._siteId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectedServer.prototype, "siteNamespace", { + get: function () { + return this._siteNamespace; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectedServer.prototype, "workbookId", { + get: function () { + return this._workbookId; + }, + enumerable: true, + configurable: true + }); + return ConnectedServer; +}()); +exports.ConnectedServer = ConnectedServer; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js": +/*!*************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var ExtensionWorkbookImpl = /** @class */ (function (_super) { + __extends(ExtensionWorkbookImpl, _super); + function ExtensionWorkbookImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + ExtensionWorkbookImpl.prototype.getAllDataSourcesAsync = function () { + var _this = this; + var service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("data-source-service" /* DataSourceService */); + return service.getAllDataSourcesAsync().then(function (result) { + var dataSchema = result; + var dataSources = []; + // Loop through all data sources and add them. + Object.values(dataSchema.dataSources).forEach(function (ds) { + dataSources.push(_this.createDataSourceFromInfo(ds)); + }); + return dataSources; + }); + }; + ExtensionWorkbookImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) { + var dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId); + var dataSource = new api_shared_js_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + }; + return ExtensionWorkbookImpl; +}(api_shared_js_1.WorkbookImpl)); +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 __spreadArrays = (this && this.__spreadArrays) || function () { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var Dashboard_1 = __webpack_require__(/*! ../Models/Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +var Workbook_1 = __webpack_require__(/*! ../Models/Workbook */ "./lib/src/ExtensionsApi/Models/Workbook.js"); +var Worksheet_1 = __webpack_require__(/*! ../Models/Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +var DashboardContent_1 = __webpack_require__(/*! ../Namespaces/DashboardContent */ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js"); +var Environment_1 = __webpack_require__(/*! ../Namespaces/Environment */ "./lib/src/ExtensionsApi/Namespaces/Environment.js"); +var Settings_1 = __webpack_require__(/*! ../Namespaces/Settings */ "./lib/src/ExtensionsApi/Namespaces/Settings.js"); +var UI_1 = __webpack_require__(/*! ../Namespaces/UI */ "./lib/src/ExtensionsApi/Namespaces/UI.js"); +var WorksheetContent_1 = __webpack_require__(/*! ../Namespaces/WorksheetContent */ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js"); +var RegisterAllExtensionsServices_1 = __webpack_require__(/*! ../Services/RegisterAllExtensionsServices */ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var BentonSansFontNameConstants_1 = __webpack_require__(/*! ./BentonSansFontNameConstants */ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js"); +var ExtensionWorkbookImpl_1 = __webpack_require__(/*! ./ExtensionWorkbookImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js"); +var LegacyInternalApiDispatcherHolder_1 = __webpack_require__(/*! ./LegacyInternalApiDispatcherHolder */ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js"); +var SettingsImpl_1 = __webpack_require__(/*! ./SettingsImpl */ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js"); +var TableauBookFontNameConstants_1 = __webpack_require__(/*! ./TableauBookFontNameConstants */ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js"); +var UIImpl_1 = __webpack_require__(/*! ./UIImpl */ "./lib/src/ExtensionsApi/Impl/UIImpl.js"); +var ExtensionsImpl = /** @class */ (function () { + function ExtensionsImpl() { + } + ExtensionsImpl.prototype.initializeAsync = function (isExtensionDialog, contextMenuCallbacks) { + var _this = this; + if (!this._initializationPromise) { + this._initializationPromise = new Promise(function (resolve, reject) { + var _a; + var initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha }; + // First thing we want to do is check to see if there is a desktop dispatcher already registered for us + if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) { + // Running in a pre-2019.3 desktop, use our legacy dispatcher promise + var desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions); + (_a = desktopDispatcherPromise) === null || _a === void 0 ? void 0 : _a.then(function (dispatcherFactory) { return _this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks); }).then(function (openPayload) { + resolve(openPayload); + }).catch(function (error) { + reject(error); + }); + } + else { + // We must be running in server, so we should try to kick of the server dispatcher bootstrapping + var onDispatcherReceivedCallback_1 = _this.onDispatcherReceived.bind(_this); + api_shared_js_1.doCrossFrameBootstrap(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions) + .then(function (factory) { + return onDispatcherReceivedCallback_1(factory, isExtensionDialog, contextMenuCallbacks); + }) + .then(function (openPayload) { + resolve(openPayload); + }) + .catch(function (error) { + reject(error); + }); + } + }); + } + return this._initializationPromise; + }; + ExtensionsImpl.prototype.createVizImageAsync = function (inputSpec) { + var vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* Viz */); + return vizService.createVizImageAsync(inputSpec); + }; + ExtensionsImpl.prototype.setClickThroughAsync = function (clickThroughEnabled) { + var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId); + }; + ExtensionsImpl.prototype.isDashboardExtensionLocator = function (locator) { + var dashboardExtensionLocator = locator; + if (!dashboardExtensionLocator.dashboardPath) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.'); + } + return true; + }; + ExtensionsImpl.prototype.onDispatcherReceived = function (dispatcherFactory, isExtensionDialog, contextMenuFunctions) { + var _this = this; + var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + // Call to register all the services which will use the newly initialized dispatcher + RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher); + // Get the initialization service and initialize this extension + var initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("InitializationService" /* InitializationService */); + var callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : []; + return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then(function (result) { + // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and + // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9 + var platformVersion = result.extensionEnvironment.platformVersion + ? 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, platformVersion); + RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher); + if (result.extensionDashboardInfo && _this.isDashboardExtensionLocator(result.extensionInstance.locator)) { + _this.dashboardContent = _this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath); + _this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId; + } + if (result.extensionWorksheetInfo) { + _this.worksheetContent = _this.initializeWorksheetContent(result.extensionWorksheetInfo); + } + _this.environment = new Environment_1.Environment(result.extensionEnvironment); + _this.settings = _this.initializeSettings(result.extensionSettingsInfo); + _this.ui = new UI_1.UI(new UIImpl_1.UIImpl()); + _this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl()); + if (result.extensionEnvironment.workbookFormatting) { + _this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting); + _this.applyAllFormatting(result.extensionEnvironment.workbookFormatting); + } + // After initialization has completed, setup listeners for the callback functions that + // are meant to be triggered whenever a context menu item is clicked. + _this.initializeContextMenuCallbacks(contextMenuFunctions); + // Also set up listeners for ExtensionStylesChangedEvent + _this.initializeWorkbookFormattingChangedEventCallback(dispatcher); + // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the + // developer, we just ingore that string. In the case of initializing from an extension dialog, this string + // is an optional payload sent from the parent extension. + return result.extensionDialogPayload; + }); + }; + ExtensionsImpl.prototype.applyAllFormatting = function (formattingModel) { + var _this = this; + 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; + } + var stylesheet = this._styleElement.sheet; + while (stylesheet.cssRules.length > 0) { + stylesheet.deleteRule(stylesheet.cssRules.length - 1); + } + formattingModel.formattingSheets.map(function (currentFormattingSheet) { + _this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet); + }); + }; + ExtensionsImpl.prototype.applyFormattingSheetToStyleSheet = function (currentFormattingSheet, stylesheet) { + var styleInfo = ''; + var 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 + '; '; + } + var selector = '.' + currentFormattingSheet.classNameKey; + var rule = selector + ' { ' + styleInfo + ' }'; + stylesheet.insertRule(rule, stylesheet.cssRules.length); + }; + ExtensionsImpl.prototype.initializeWorkbookFormattingChangedEventCallback = function (dispatcher) { + var _this = this; + var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function () { return true; }, function (eventFormatting) { + if (eventFormatting) { + _this.initializeTableauFonts(dispatcher, eventFormatting); + _this.applyAllFormatting(eventFormatting); + } + }); + }; + ExtensionsImpl.prototype.initializeTableauFonts = function (dispatcher, workbookFormatting) { + var _a; + var _this = this; + var fontNames = __spreadArrays(BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, TableauBookFontNameConstants_1.SupportedTableauFontFaces); + workbookFormatting.formattingSheets.forEach(function (formattingSheet) { + if (formattingSheet.cssProperties.fontFamily) { + fontNames.push(formattingSheet.cssProperties.fontFamily); + } + }); + if (fontNames.length > 0) { + var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.FontNameListItems] = fontNames, _a); + dispatcher + .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters) + .then(function (response) { + _this.loadFonts(response.result); + }) + .catch(); + } + }; + ExtensionsImpl.prototype.loadFonts = function (fonts) { + var _this = this; + fonts.forEach(function (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)); + } + }); + }; + ExtensionsImpl.prototype.initializeDashboardContent = function (info, sheetPath) { + // sheets are always active for Extensions + var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true); + var dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId); + var dashboard = new Dashboard_1.Dashboard(dashboardImpl); + return new DashboardContent_1.DashboardContent(dashboard); + }; + ExtensionsImpl.prototype.initializeWorksheetContent = function (info) { + var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific + true); + var worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent + null); + var worksheet = new Worksheet_1.Worksheet(worksheetImpl); + return new WorksheetContent_1.WorksheetContent(worksheet); + }; + ExtensionsImpl.prototype.initializeSettings = function (settingsInfo) { + var settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo); + return new Settings_1.Settings(settingsImpl); + }; + ExtensionsImpl.prototype.initializeContextMenuCallbacks = function (contextMenuFunctions) { + var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + // Unregister function not used since these notifications should be + // observed for the full lifetime of the extension. + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, function () { + // Let through any context menu event, these are already filtered on api-core + // based on the extension locator. + return true; + }, function (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](); + } + }); + }; + ExtensionsImpl.prototype.loadTableauFonts = function (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 + ".'"); + } + }; + ExtensionsImpl.prototype.loadBentonSansFonts = function (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 + ".'"); + } + }; + return ExtensionsImpl; +}()); +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 })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +/** + * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract. + * It supports running a newer external library against a pre 2019.3 desktop. + * Starting in 2019.3, we have a merged bootstrap style for both desktop and server. + * In addition, the alpha checking that is happening here is not necessary in external-api-js + * after 2019.3 because that checking happens in api-platform-js (ApiDispatcherTest.ts) + * TFSID: 1091561 tracks an improvement to this system to make it less complex and tie it directly to + * tableau beta release versions. + * @deprecated + */ +// eslint-disable-next-line @typescript-eslint/no-namespace +var LegacyInternalApiDispatcherHolder; +(function (LegacyInternalApiDispatcherHolder) { + /** + * @param options + */ + function getDesktopDispatcherPromise(options) { + var _a; + if ((!options || typeof options.isAlpha === 'undefined') && !window.__warningIssued) { + // tslint:disable-next-line:no-console + console.warn('This is a beta version of the Extensions API. Please upgrade to an official release.'); + window.__warningIssued = true; + } + else if (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) { + window.__tableauDesktopDispatcher + .then(function (dispatcherFactory) { + var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch(); + }) + .catch(); + } + // this will be undefined if promise is rejected or throws + return window.__tableauDesktopDispatcher; + } + LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise = getDesktopDispatcherPromise; + /** + * @param options + */ + function hasDesktopApiDispatcherPromise(options) { + return !!getDesktopDispatcherPromise(options); + } + LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise = hasDesktopApiDispatcherPromise; +})(LegacyInternalApiDispatcherHolder = exports.LegacyInternalApiDispatcherHolder || (exports.LegacyInternalApiDispatcherHolder = {})); + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js": +/*!****************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var SettingsChangedEvent = /** @class */ (function (_super) { + __extends(SettingsChangedEvent, _super); + function SettingsChangedEvent(_newSettings) { + var _this = _super.call(this, Contract.TableauEventType.SettingsChanged) || this; + _this._newSettings = _newSettings; + return _this; + } + Object.defineProperty(SettingsChangedEvent.prototype, "newSettings", { + get: function () { + return this._newSettings; + }, + enumerable: true, + configurable: true + }); + return SettingsChangedEvent; +}(TableauEvent_1.TableauEvent)); +var SettingsImpl = /** @class */ (function () { + function SettingsImpl(settingsInfo) { + // Since promises can't be introspected for state, keep a variable that + // indicates a save is in progress, so that set/erase can't be called during a save. + this._saveInProgress = false; + this.initializeSettings(settingsInfo); + } + SettingsImpl.prototype.erase = function (key) { + 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; + } + }; + SettingsImpl.prototype.get = function (key) { + api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); + return this._currentSettings[key]; + }; + SettingsImpl.prototype.getAll = function () { + // Returns a mutable copy of the settings + return Object.assign({}, this._currentSettings); + }; + Object.defineProperty(SettingsImpl.prototype, "isModified", { + get: function () { + return this._isModified; + }, + enumerable: true, + configurable: true + }); + SettingsImpl.prototype.saveAsync = function () { + var _this = this; + 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 + var settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("SettingsService" /* SettingsService */); + return settingsService.saveSettingsAsync(this._currentSettings).then(function (newSettings) { + _this._saveInProgress = false; + _this._isModified = false; + if (_this._currentSettings === undefined) { + _this._currentSettings = newSettings; + } + else { + Object.assign(_this._currentSettings, newSettings); + } + return newSettings; + }, function (reason) { + _this._saveInProgress = false; + return Promise.reject(reason); + }); + }; + SettingsImpl.prototype.set = function (key, value) { + api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string. + api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed. + this.verifySettingsAreUnlocked(); + this._currentSettings[key] = value; + this._isModified = true; + }; + /** + * Initializes all events relevant to settings object. This is only a settingsUpdate event currently. + * + * @returns {Array} Collection of event managers to pass to an EventListenerManager. + */ + SettingsImpl.prototype.initializeEvents = function () { + var _this = this; + var results = new Array(); + var notificationService; + 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; + } + var settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, function () { return true; }, function (event) { + _this._currentSettings = event.newSettings; + settingsChangedEvent.triggerEvent(function () { return new SettingsChangedEvent(event.newSettings); }); + }); + results.push(settingsChangedEvent); + return results; + }; + SettingsImpl.prototype.initializeSettings = function (settingsInfo) { + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo'); + api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues'); + this._currentSettings = settingsInfo.settingsValues; + // Reset the isModified flag + this._isModified = false; + }; + /** + * This helper should be called before any local update to this.currentSettings. + * Checks if a current save call is still in progress and throws an error if so. + */ + SettingsImpl.prototype.verifySettingsAreUnlocked = function () { + if (this._saveInProgress) { + throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS); + } + }; + SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; + return SettingsImpl; +}()); +exports.SettingsImpl = SettingsImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableauBookFontFamilyName = 'Tableau Book'; +exports.TableauLightFontFamilyName = 'Tableau Light'; +exports.TableauRegularFontFamilyName = 'Tableau Regular'; +exports.TableauMediumFontFamilyName = 'Tableau Medium'; +exports.TableauSemiboldFontFamilyName = 'Tableau Semibold'; +exports.TableauBoldFontFamilyName = 'Tableau Bold'; +exports.TableauBookFontFaceName = 'Tableau Book'; +exports.TableauBoldFontFaceName = 'Tableau Bold'; +exports.TableauLightFontFaceName = 'Tableau Light'; +exports.TableauMediumFontFaceName = 'Tableau Medium'; +exports.TableauRegularFontFaceName = 'Tableau Regular'; +exports.TableauSemiBoldFontFaceName = 'Tableau Semi Bold'; +exports.SupportedTableauFontFaces = [ + exports.TableauBookFontFaceName, + exports.TableauBoldFontFaceName, + exports.TableauLightFontFaceName, + exports.TableauMediumFontFaceName, + exports.TableauRegularFontFaceName, + exports.TableauSemiBoldFontFaceName, +]; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/UIImpl.js": +/*!**********************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/UIImpl.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var UIImpl = /** @class */ (function () { + function UIImpl() { + } + UIImpl.prototype.displayDialogAsync = function (url, payload, options) { + var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + return new Promise(function (resolve, reject) { + uiService + .displayDialogAsync(url, payload || '', options) + .then(function () { + var unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, function () { + // Let through any dialog update event + return true; + }, function (event) { + if (event.isCloseEvent) { + if (event.closePayload === undefined) { + throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); + } + resolve(event.closePayload); + } + else { + reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.')); + } + unregisterFn(); + }); + }) + .catch(function (error) { + reject(error); + }); + }); + }; + UIImpl.prototype.closeDialog = function (payload) { + var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + uiService.closeDialog(payload); + }; + return UIImpl; +}()); +exports.UIImpl = UIImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Dashboard.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Dashboard.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var DashboardLayoutChangedEvent_1 = __webpack_require__(/*! ../Events/DashboardLayoutChangedEvent */ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js"); +var WorkbookFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorkbookFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var DashboardObject_1 = __webpack_require__(/*! ./DashboardObject */ "./lib/src/ExtensionsApi/Models/DashboardObject.js"); +var Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +var Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +var Dashboard = /** @class */ (function (_super) { + __extends(Dashboard, _super); + function Dashboard(_dashboardImpl) { + var _this = _super.call(this, _dashboardImpl) || this; + _this._dashboardImpl = _dashboardImpl; + _dashboardImpl.initializeWithPublicInterfaces(); + _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Object.defineProperty(Dashboard.prototype, "worksheets", { + get: function () { + return this._dashboardImpl.worksheetsImpl.map(function (worksheetImpl) { + return new Worksheet_1.Worksheet(worksheetImpl); + }); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Dashboard.prototype, "objects", { + get: function () { + return this._dashboardImpl.objects.map(function (dashboardObjectImpl) { + return new DashboardObject_1.DashboardObject(dashboardObjectImpl); + }); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Dashboard.prototype, "activeDashboardObjectId", { + get: function () { + return this._dashboardImpl.activeDashboardObjectId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Dashboard.prototype, "activeDashboardName", { + get: function () { + return this._dashboardImpl.activeDashboardName; + }, + enumerable: true, + configurable: true + }); + Dashboard.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) { + return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap); + }; + Dashboard.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) { + return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap); + }; + Dashboard.prototype.getDashboardObjectById = function (dashboardObjectId) { + var zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId); + return zone && new DashboardObject_1.DashboardObject(zone); + }; + Dashboard.prototype.initializeEvents = function () { + var _this = this; + var results = new Array(); + // Initializing events and registering notification service + var 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; + } + var dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, function () { return true; }, function (event) { + var dashboardObjectChanges = _this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName); + dashboardLayoutChangedEvent.triggerEvent(function () { return new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges); }); + }); + results.push(dashboardLayoutChangedEvent); + var workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function () { return true; }, function (eventFormatting) { + workbookFormattingChangedEvent.triggerEvent(function () { return new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting); }); + }); + results.push(workbookFormattingChangedEvent); + return results; + }; + Dashboard.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) { + return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray); + }; + Dashboard.prototype.replayAnimationAsync = function (replaySpeed) { + return this._dashboardImpl.replayAnimationAsync(replaySpeed); + }; + Dashboard.prototype.getFiltersAsync = function () { + return this._dashboardImpl.getFiltersAsync(); + }; + Dashboard.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options); + }; + return Dashboard; +}(Sheet_1.Sheet)); +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 })); +var Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +var Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + */ +var DashboardObject = /** @class */ (function () { + function DashboardObject(_dashboardObjectImpl) { + this._dashboardObjectImpl = _dashboardObjectImpl; + } + Object.defineProperty(DashboardObject.prototype, "dashboard", { + get: function () { + return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "type", { + get: function () { + return this._dashboardObjectImpl.type; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "position", { + get: function () { + return this._dashboardObjectImpl.position; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "size", { + get: function () { + return this._dashboardObjectImpl.size; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "worksheet", { + get: function () { + if (this._dashboardObjectImpl.worksheetImpl) { + return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl); + } + return undefined; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "name", { + get: function () { + return this._dashboardObjectImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "isFloating", { + get: function () { + return this._dashboardObjectImpl.isFloating; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "isVisible", { + get: function () { + return this._dashboardObjectImpl.isVisible; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "id", { + get: function () { + return this._dashboardObjectImpl.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObject.prototype, "fieldId", { + get: function () { + return this._dashboardObjectImpl.fieldId; + }, + enumerable: true, + configurable: true + }); + return DashboardObject; +}()); +exports.DashboardObject = DashboardObject; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Parameter.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Parameter.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var ParameterChangedEvent_1 = __webpack_require__(/*! ../Events/ParameterChangedEvent */ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +/** + * Implementation of the Parameter contract. Calls down to the impl + * class for almost all of the work it does. + */ +var Parameter = /** @class */ (function (_super) { + __extends(Parameter, _super); + function Parameter(parameterImpl, sheet) { + var _this = _super.call(this) || this; + _this.parameterImpl = parameterImpl; + // Initialize our event handling for this class + _this.initializeEvents(sheet).forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Object.defineProperty(Parameter.prototype, "name", { + get: function () { + return this.parameterImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "currentValue", { + get: function () { + return this.parameterImpl.currentValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "dataType", { + get: function () { + return this.parameterImpl.dataType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "allowableValues", { + get: function () { + return this.parameterImpl.allowableValues; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Parameter.prototype, "id", { + get: function () { + return this.parameterImpl.id; + }, + enumerable: true, + configurable: true + }); + Parameter.prototype.changeValueAsync = function (newValue) { + 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 + */ + Parameter.prototype.initializeEvents = function (sheet) { + var _this = this; + api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet'); + var results = new Array(); + var 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) + var parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, function (model) { + var fieldName = model; + return fieldName === _this.parameterImpl.id; + }, function (fieldName) { + parameterEvent.triggerEvent(function () { return new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet); }); + }); + results.push(parameterEvent); + return results; + }; + return Parameter; +}(api_shared_js_1.EventListenerManager)); +exports.Parameter = Parameter; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Sheet.js": +/*!***********************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Sheet.js ***! + \***********************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var Parameter_1 = __webpack_require__(/*! ./Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); +var Sheet = /** @class */ (function (_super) { + __extends(Sheet, _super); + function Sheet(_sheetImpl) { + var _this = _super.call(this) || this; + _this._sheetImpl = _sheetImpl; + return _this; + } + Object.defineProperty(Sheet.prototype, "name", { + get: function () { + return this._sheetImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Sheet.prototype, "sheetType", { + get: function () { + return this._sheetImpl.sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Sheet.prototype, "size", { + get: function () { + if (this.isValidSize(this._sheetImpl.size)) { + return this._sheetImpl.size; + } + throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented'); + }, + enumerable: true, + configurable: true + }); + Sheet.prototype.isValidSize = function (size) { + var testSize = size; + if (testSize.width !== undefined && testSize.height !== undefined) { + return true; + } + return false; + }; + Sheet.prototype.findParameterAsync = function (parameterName) { + var _this = this; + return this._sheetImpl.findParameterAsync(parameterName).then(function (parameterImpl) { + if (parameterImpl) { + return new Promise(function (resolve) { return resolve(new Parameter_1.Parameter(parameterImpl, _this)); }); + } + else { + return new Promise(function (resolve) { return resolve(undefined); }); + } + }); + }; + Sheet.prototype.getParametersAsync = function () { + var _this = this; + return this._sheetImpl.getParametersAsync().then(function (parametersImpl) { + return parametersImpl.map(function (parameterImpl) { + return new Parameter_1.Parameter(parameterImpl, _this); + }); + }); + }; + return Sheet; +}(api_shared_js_1.EventListenerManager)); +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 })); +var Workbook = /** @class */ (function () { + function Workbook(_workbookImpl) { + this._workbookImpl = _workbookImpl; + } + Workbook.prototype.getAllDataSourcesAsync = function () { + return this._workbookImpl.getAllDataSourcesAsync(); + }; + return Workbook; +}()); +exports.Workbook = Workbook; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Models/Worksheet.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Worksheet.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var FilterChangedEvent_1 = __webpack_require__(/*! ../Events/FilterChangedEvent */ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js"); +var MarksSelectedEvent_1 = __webpack_require__(/*! ../Events/MarksSelectedEvent */ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js"); +var SummaryDataChangedEvent_1 = __webpack_require__(/*! ../Events/SummaryDataChangedEvent */ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +var Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +var Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +var Worksheet = /** @class */ (function (_super) { + __extends(Worksheet, _super); + function Worksheet(_worksheetImpl) { + var _this = _super.call(this, _worksheetImpl) || this; + _this._worksheetImpl = _worksheetImpl; + // Call to initialize events and then call down to the event listener manager to handle things + _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Object.defineProperty(Worksheet.prototype, "parentDashboard", { + get: function () { + // This should never happen for Extensions if the DashboardImpls are created correctly + if (this._worksheetImpl.parentDashboard == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "Parent dashboard not implemented"); + } + return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard); + }, + enumerable: true, + configurable: true + }); + /** + * 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 + */ + Worksheet.prototype.initializeEvents = function () { + var _this = this; + var results = new Array(); + var 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) + var marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, function (model) { + var visualId = model; + return _this.visualIdsAreEqual(visualId, _this._worksheetImpl.visualId); + }, function () { return marksEvent.triggerEvent(function () { return new MarksSelectedEvent_1.MarksSelectedEvent(_this); }); }); + var filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, function (model) { + var filterEventResponse = model; + return _this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet; + }, function (event) { + filterEvent.triggerEvent(function () { return new FilterChangedEvent_1.FilterChangedEvent(_this, event.fieldName, event.fieldId); }); + }); + var summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, function (model) { + var summaryDataEventResponse = model; + return _this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet; + }, function (event) { + summaryDataEvent.triggerEvent(function () { return new SummaryDataChangedEvent_1.SummaryDataChangedEvent(_this); }); + }); + results.push(marksEvent); + results.push(filterEvent); + results.push(summaryDataEvent); + return results; + }; + Worksheet.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options); + }; + Worksheet.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) { + return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions); + }; + Worksheet.prototype.applyHierarchicalFilterAsync = function (fieldName, values, updateType, options) { + return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options); + }; + Worksheet.prototype.applyRelativeDateFilterAsync = function (fieldName, options) { + return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options); + }; + Worksheet.prototype.clearFilterAsync = function (fieldName) { + return this._worksheetImpl.clearFilterAsync(fieldName); + }; + Worksheet.prototype.getDataSourcesAsync = function () { + return this._worksheetImpl.getDataSourcesAsync(); + }; + Worksheet.prototype.getFiltersAsync = function () { + return this._worksheetImpl.getFiltersAsync(); + }; + Worksheet.prototype.getSelectedMarksAsync = function () { + return this._worksheetImpl.getSelectedMarksAsync(); + }; + Worksheet.prototype.getHighlightedMarksAsync = function () { + return this._worksheetImpl.getHighlightedMarksAsync(); + }; + Worksheet.prototype.getSummaryDataAsync = function (options) { + return this._worksheetImpl.getSummaryDataAsync(options); + }; + Worksheet.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) { + return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options); + }; + Worksheet.prototype.getSummaryColumnsInfoAsync = function () { + return this._worksheetImpl.getSummaryColumnsInfoAsync(); + }; + Worksheet.prototype.getUnderlyingDataAsync = function (options) { + console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' + + 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync'); + return this._worksheetImpl.getUnderlyingDataAsync(options); + }; + Worksheet.prototype.getUnderlyingTablesAsync = function () { + return this._worksheetImpl.getUnderlyingTablesAsync(); + }; + Worksheet.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) { + return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options); + }; + Worksheet.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options); + }; + Worksheet.prototype.getVisualSpecificationAsync = function () { + return this._worksheetImpl.getVisualSpecificationAsync(); + }; + Worksheet.prototype.clearSelectedMarksAsync = function () { + return this._worksheetImpl.clearSelectedMarksAsync(); + }; + Worksheet.prototype.selectMarksByIDAsync = function (marksInfo, updateType) { + return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType); + }; + Worksheet.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType); + }; + Worksheet.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) { + return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType); + }; + Worksheet.prototype.annotateMarkAsync = function (mark, annotationText) { + return this._worksheetImpl.annotateMarkAsync(mark, annotationText); + }; + Worksheet.prototype.getAnnotationsAsync = function () { + return this._worksheetImpl.getAnnotationsAsync(); + }; + Worksheet.prototype.removeAnnotationAsync = function (annotation) { + return this._worksheetImpl.removeAnnotationAsync(annotation); + }; + Worksheet.prototype.hoverTupleAsync = function (hoveredTuple, tooltip, allowHoverActions) { + if (allowHoverActions === void 0) { allowHoverActions = true; } + return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions); + }; + Worksheet.prototype.selectTuplesAsync = function (selectedTuples, selectOption, tooltip) { + return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip); + }; + Worksheet.prototype.getTooltipTextAsync = function (tupleId) { + return this._worksheetImpl.getTooltipTextAsync(tupleId); + }; + Worksheet.prototype.leaveMarkNavigationAsync = function () { + return this._worksheetImpl.leaveMarkNavigationAsync(); + }; + Worksheet.prototype.visualIdsAreEqual = function (a, b) { + return (a && + b && + a.worksheet === b.worksheet && + a.dashboard === b.dashboard && + a.storyboard === b.storyboard && + a.storyPointID === b.storyPointID); + }; + return Worksheet; +}(Sheet_1.Sheet)); +exports.Worksheet = Worksheet; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/DashboardContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external DashboardContent namespace. + * This does not follow the Impl pattern as DashboardContent is + * currently just a (single) property bag. + */ +var DashboardContent = /** @class */ (function () { + function DashboardContent(_dashboard) { + this._dashboard = _dashboard; + } + Object.defineProperty(DashboardContent.prototype, "dashboard", { + get: function () { + return this._dashboard; + }, + enumerable: true, + configurable: true + }); + return DashboardContent; +}()); +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 })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var ConnectedServer_1 = __webpack_require__(/*! ../Impl/ConnectedServer */ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js"); +var WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ./WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); +/** + * Implementation of the external environment namespace. + * Environment does not follow the Impl pattern as it is + * just a property bag. + * First class extensions can get to ConnectedServer with: environment['connectedServer'] + */ +var Environment = /** @class */ (function () { + function Environment(extensionEnvironment) { + 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; + } + } + Object.defineProperty(Environment.prototype, "apiVersion", { + get: function () { + return this._apiVersion; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "context", { + get: function () { + return this._context; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "workbookFormatting", { + get: function () { + return this._formatting; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "language", { + get: function () { + return this._language; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "country", { + get: function () { + return this._country; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "locale", { + get: function () { + return this._locale; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "mode", { + get: function () { + return this._mode; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "operatingSystem", { + get: function () { + return this._operatingSystem; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "tableauVersion", { + get: function () { + return this._tableauVersion; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Environment.prototype, "uniqueUserId", { + get: function () { + return this._uniqueUserId; + }, + enumerable: true, + configurable: true + }); + return Environment; +}()); +exports.Environment = Environment; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Extensions.js": +/*!********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Extensions.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external Extensions namespace. + */ +var Extensions = /** @class */ (function () { + function Extensions(extensionImpl) { + this.extensionImpl = extensionImpl; + this.extensionImpl = extensionImpl; + } + Object.defineProperty(Extensions.prototype, "dashboardContent", { + get: function () { + return this.extensionImpl.dashboardContent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "worksheetContent", { + get: function () { + return this.extensionImpl.worksheetContent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "environment", { + get: function () { + return this.extensionImpl.environment; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "settings", { + get: function () { + return this.extensionImpl.settings; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "ui", { + get: function () { + return this.extensionImpl.ui; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "workbook", { + get: function () { + return this.extensionImpl.workbook; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Extensions.prototype, "dashboardObjectId", { + get: function () { + return this.extensionImpl.extensionZoneId; + }, + enumerable: true, + configurable: true + }); + Extensions.prototype.initializeAsync = function (contextMenuCallbacks) { + return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then(); + }; + Extensions.prototype.initializeDialogAsync = function () { + return this.extensionImpl.initializeAsync(true); + }; + Extensions.prototype.createVizImageAsync = function (inputSpec) { + return this.extensionImpl.createVizImageAsync(inputSpec); + }; + Extensions.prototype.setClickThroughAsync = function (clickThroughEnabled) { + return this.extensionImpl.setClickThroughAsync(clickThroughEnabled); + }; + return Extensions; +}()); +exports.Extensions = Extensions; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/Settings.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Settings.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +/** + * Implementation of the external settings namespace. + */ +var Settings = /** @class */ (function (_super) { + __extends(Settings, _super); + function Settings(_settingsImpl) { + var _this = _super.call(this) || this; + _this._settingsImpl = _settingsImpl; + // Initialize our event handling for this class + _this._settingsImpl.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); + return _this; + } + Settings.prototype.erase = function (key) { + this._settingsImpl.erase(key); + }; + Settings.prototype.get = function (key) { + return this._settingsImpl.get(key); + }; + Settings.prototype.getAll = function () { + return this._settingsImpl.getAll(); + }; + Object.defineProperty(Settings.prototype, "isModified", { + get: function () { + return this._settingsImpl.isModified; + }, + enumerable: true, + configurable: true + }); + Settings.prototype.saveAsync = function () { + return this._settingsImpl.saveAsync(); + }; + Settings.prototype.set = function (key, value) { + this._settingsImpl.set(key, value); + }; + return Settings; +}(api_shared_js_1.EventListenerManager)); +exports.Settings = Settings; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/UI.js": +/*!************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/UI.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external UI namespace. + */ +var UI = /** @class */ (function () { + function UI(_impl) { + this._impl = _impl; + } + UI.prototype.displayDialogAsync = function (url, payload, options) { + return this._impl.displayDialogAsync(url, payload, options); + }; + UI.prototype.closeDialog = function (payload) { + this._impl.closeDialog(payload); + }; + return UI; +}()); +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 })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var WorkbookFormattingEnvUtil = /** @class */ (function () { + function WorkbookFormattingEnvUtil() { + } + WorkbookFormattingEnvUtil.convertToWorkbookFormatting = function (workbookFormattingModel) { + if (!workbookFormattingModel) { + return undefined; + } + else { + var formattingMap = workbookFormattingModel.formattingSheets.map(function (currentFormattingSheet) { + var formattingSheet = { + classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey), + cssProperties: { + fontFamily: currentFormattingSheet.cssProperties.fontFamily, + fontSize: currentFormattingSheet.cssProperties.fontSize, + fontWeight: currentFormattingSheet.cssProperties.fontWeight, + fontStyle: currentFormattingSheet.cssProperties.fontStyle, + textDecoration: currentFormattingSheet.cssProperties.textDecoration, + color: currentFormattingSheet.cssProperties.color, + }, + }; + return formattingSheet; + }); + var result = { + formattingSheets: formattingMap, + }; + return result; + } + }; + return WorkbookFormattingEnvUtil; +}()); +exports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the external WorksheetContent namespace. + * This does not follow the Impl pattern as WorksheetContent is + * currently just a (single) property bag. + */ +var WorksheetContent = /** @class */ (function () { + function WorksheetContent(_worksheet) { + this._worksheet = _worksheet; + } + Object.defineProperty(WorksheetContent.prototype, "worksheet", { + get: function () { + return this._worksheet; + }, + enumerable: true, + configurable: true + }); + return WorksheetContent; +}()); +exports.WorksheetContent = WorksheetContent; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js": +/*!**************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js ***! + \**************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var InitializationServiceImpl = /** @class */ (function (_super) { + __extends(InitializationServiceImpl, _super); + function InitializationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(InitializationServiceImpl.prototype, "serviceName", { + get: function () { + return "InitializationService" /* InitializationService */; + }, + enumerable: true, + configurable: true + }); + InitializationServiceImpl.prototype.initializeDashboardExtensionsAsync = function (isExtensionDialog, contextMenuIds) { + var _a; + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'initializeDashboardExtensionsAsync', + _a[api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds] = contextMenuIds, + _a[api_internal_contract_js_1.ParameterId.IsExtensionDialog] = isExtensionDialog, + _a); + return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then(function (response) { + // TODO - Validate return value + var result = response.result; + return result; + }); + }; + return InitializationServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +exports.InitializationServiceImpl = InitializationServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var SettingsServiceImpl = /** @class */ (function (_super) { + __extends(SettingsServiceImpl, _super); + function SettingsServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(SettingsServiceImpl.prototype, "serviceName", { + get: function () { + return "SettingsService" /* SettingsService */; + }, + enumerable: true, + configurable: true + }); + SettingsServiceImpl.prototype.saveSettingsAsync = function (settings) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveSettingsAsync', + _a[api_internal_contract_js_1.ParameterId.SettingsValues] = settings, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then(function (value) { + var result = value.result; + if (!result || !result.settingsValues) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.'); + } + return result.settingsValues; + }); + }; + return SettingsServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +exports.SettingsServiceImpl = SettingsServiceImpl; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js ***! + \**************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var DEFAULT_DIALOG_HEIGHT = 400; // in pixels +var DEFAULT_DIALOG_WIDTH = 600; // in pixels +var DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window; +var UIServiceImpl = /** @class */ (function (_super) { + __extends(UIServiceImpl, _super); + function UIServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(UIServiceImpl.prototype, "serviceName", { + get: function () { + return "UIService" /* UIService */; + }, + enumerable: true, + configurable: true + }); + UIServiceImpl.prototype.displayDialogAsync = function (url, payload, options) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'displayDialogAsync', + _a[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = url, + _a[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload, + _a); + var h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT; + var w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH; + var dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE; + // 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(function (response) { + var 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; + } + }); + }; + UIServiceImpl.prototype.closeDialog = function (payload) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'closeDialog', + _a); + if (payload) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; + } + return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(function () { + return; + }); + }; + UIServiceImpl.prototype.setClickThroughAsync = function (clickThroughEnabled, extensionZoneId) { + var _a; + api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled'); + if (extensionZoneId === undefined || extensionZoneId <= 0) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.'); + } + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.ExtensionZoneId] = extensionZoneId, + _a[api_internal_contract_js_1.ParameterId.ClickThroughEnabled] = clickThroughEnabled, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(function () { + return; + }); + }; + return UIServiceImpl; +}(api_shared_js_1.ServiceImplBase)); +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 })); +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +var InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js"); +var SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js"); +var UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js"); +var ServiceRegistryUtil_1 = __webpack_require__(/*! ./ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +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.PulseLayout = Enums_1.PulseLayout; +exports.SheetSizeBehavior = Enums_1.SheetSizeBehavior; +exports.TableauDialogType = Enums_1.TableauDialogType; +exports.Toolbar = Enums_1.Toolbar; +__export(__webpack_require__(/*! ./ExternalContract/Embedding/PulseInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js")); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/VizInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js")); +__export(__webpack_require__(/*! ./ExternalContract/Embedding/WebComponentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js")); +__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the extensions api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js"); +exports.ErrorCodes = Tableau_1.ErrorCodes; +exports.ExtensionContext = Tableau_1.ExtensionContext; +exports.ExtensionMode = Tableau_1.ExtensionMode; +exports.TableauEventType = Tableau_1.TableauEventType; +exports.VizImageEncodingType = Tableau_1.VizImageEncodingType; +exports.VizImagePaletteType = Tableau_1.VizImagePaletteType; +exports.VizImageSizeSettingAlignmentType = Tableau_1.VizImageSizeSettingAlignmentType; +exports.VizImageSizeSettingType = Tableau_1.VizImageSizeSettingType; +exports.VizImageSortDirectionType = Tableau_1.VizImageSortDirectionType; +__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract.js": +/*!***************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js")); +__export(__webpack_require__(/*! ./ExtensionsApiExternalContract */ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js")); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + * @deprecated + */ +var AskDataAttributes; +(function (AskDataAttributes) { + AskDataAttributes["Origin"] = "origin"; + AskDataAttributes["ShowEmbed"] = "show-embed"; + AskDataAttributes["ShowPin"] = "show-pin"; + AskDataAttributes["ShowSave"] = "show-save"; + AskDataAttributes["ShowShare"] = "show-share"; +})(AskDataAttributes = exports.AskDataAttributes || (exports.AskDataAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js": +/*!*******************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// All enum values made available to Embedding developers. +// Enums should be kept in alphabetical order. +// Most of them should match an enum on the server defined at +// workgroup/vqlweb/scriptsharp/src/ApiShared/PublicEnums.cs#L398:17 +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Crosstab file formats available to use with {@link Viz.exportCrosstabAsync} + */ +var CrosstabFileFormat; +(function (CrosstabFileFormat) { + CrosstabFileFormat["CSV"] = "csv"; + CrosstabFileFormat["Excel"] = "xlsx"; +})(CrosstabFileFormat = exports.CrosstabFileFormat || (exports.CrosstabFileFormat = {})); +/** + * Device types available to use with {@link Viz.device} + */ +var DeviceType; +(function (DeviceType) { + DeviceType["Default"] = "default"; + DeviceType["Desktop"] = "desktop"; + DeviceType["Tablet"] = "tablet"; + DeviceType["Phone"] = "phone"; +})(DeviceType = exports.DeviceType || (exports.DeviceType = {})); +/** + * All error codes used by the Embedding API. + */ +var EmbeddingErrorCodes; +(function (EmbeddingErrorCodes) { + /** + * Raised when a request to the auth endpoint fails. + */ + EmbeddingErrorCodes["AuthFailed"] = "auth-failed"; + /** + * The browser is not capable of supporting the Tableau Embedding API + */ + EmbeddingErrorCodes["BrowserNotCapable"] = "browser-not-capable"; + /** + * The permissions on a workbook or a view do not allow downloading the workbook. + */ + EmbeddingErrorCodes["DownloadWorkbookNotAllowed"] = "download-workbook-not-allowed"; + /** + * Thrown when an error occurs while attempting to perform a filter operation. + */ + EmbeddingErrorCodes["FilterCannotBePerformed"] = "filter-cannot-be-performed"; + /** + * Thrown when attempting to switch to a sheet by index that does not exist in the workbook. + */ + EmbeddingErrorCodes["IndexOutOfRange"] = "index-out-of-range"; + /** + * Thrown when an error occurs within the Tableau Embedding API. Contact Tableau Support. + */ + EmbeddingErrorCodes["InternalError"] = "internal-error"; + /** + * An operation was attempted on a custom view that does not exist. + */ + EmbeddingErrorCodes["InvalidCustomViewName"] = "invalid-custom-view-name"; + /** + * An invalid date was specified in a method that required a date parameter. + */ + EmbeddingErrorCodes["InvalidDateParameter"] = "invalid-date-parameter"; + /** + * Either a filter operation was attempted on a field that does not exist in the data source, or the value supplied + * in the filter operation is the wrong data type or format. + */ + EmbeddingErrorCodes["invalidFilterFieldNameOrValue"] = "invalid-filter-field-name"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message + * field. + */ + EmbeddingErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * A negative size was specified or the maxSize value is less than minSize in Sheet.changeSizeAsync(). + */ + EmbeddingErrorCodes["InvalidSize"] = "invalid-size"; + /** + * Attempted to get an authoring worksheet when the current sheet is not a worksheet. + * @ignore + */ + EmbeddingErrorCodes["InvalidSheetType"] = "invalid-sheet-type"; + /** + * A behavior value was found that is not included in the SheetSizeBehavior enum. + */ + EmbeddingErrorCodes["InvalidSizeBehavior"] = "invalid-size-behavior"; + /** + * A behavior other than SheetSizeBehavior.Automatic was specified in Sheet.changeSizeAsync() when the sheet is a + * Worksheet instance. + */ + EmbeddingErrorCodes["InvalidSizeBehaviorOnWorksheet"] = "invalid-size-behavior-on-worksheet"; + /** + * The URL specified in the Viz class constructor is not valid. + */ + EmbeddingErrorCodes["InvalidUrl"] = "invalid-url"; + /** + * The maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtMost. + */ + EmbeddingErrorCodes["MissingMaxSize"] = "missing-max-size"; + /** + * The minSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtLeast. + */ + EmbeddingErrorCodes["MissingMinSize"] = "missing-min-size"; + /** + * The minSize or maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.Range. + */ + EmbeddingErrorCodes["MissingMinMaxSize"] = "missing-min-max-size"; + /** + * Can occur if the embedding app interacts with a parameter that has been removed from the worksheet. + */ + EmbeddingErrorCodes["MissingParameter"] = "missing-parameter"; + /** + * The rangeN field is missing for a relative date filter of type LASTN or NEXTN. + */ + EmbeddingErrorCodes["MissingRangeNForRelativeDateFilters"] = "missing-range-n-for-relative-date-filters"; + /** + * An attempt was made to access Sheet.getUrl() on a hidden sheet. Hidden sheets do not have URLs. + */ + EmbeddingErrorCodes["NoUrlForHiddenWorksheet"] = "no-url-for-hidden-worksheet"; + /** + * One or both of the parentElement or the URL parameters is not specified in the Viz constructor. + */ + EmbeddingErrorCodes["NoUrlOrParentElementNotFound"] = "no-url-or-parent-element-not-found"; + /** + * An operation was attempted on a sheet that is not active or embedded within the active dashboard. + */ + EmbeddingErrorCodes["NotActiveSheet"] = "not-active-sheet"; + /** + * A required parameter was not specified, null, or an empty string/array. + */ + EmbeddingErrorCodes["NullOrEmptyParameter"] = "null-or-empty-parameter"; + /** + * An operation was attempted on a sheet that does not exist in the workbook. + */ + EmbeddingErrorCodes["SheetNotInWorkbook"] = "sheet-not-in-workbook"; + /** + * An operation is performed on a CustomView object that is no longer valid (it has been removed). + */ + EmbeddingErrorCodes["StaleDataReference"] = "stale-data-reference"; + /** + * Unknown error triggered during the auth flow. + */ + EmbeddingErrorCodes["UnknownAuthError"] = "unknown-auth-error"; + /** + * An unknown event name was specified in the call to Viz.addEventListener or Viz.removeEventListener. + */ + EmbeddingErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; + /** + * A Viz object has already been created as a child of the parentElement specified in the Viz constructor. + */ + EmbeddingErrorCodes["VizAlreadyInManager"] = "viz-already-in-manager"; + /** + * Function is not supported in the embedding api. + */ + EmbeddingErrorCodes["ImplementationError"] = "wrong-implementation"; + /** + * @NotImplemented + */ + EmbeddingErrorCodes["NotImplemented"] = "not-implemented"; + /** + * Unknown error during event initialization + */ + EmbeddingErrorCodes["EventInitializationError"] = "event-initialization-error"; + /** + * Version of the embedding api not supported by the version of tableau + */ + EmbeddingErrorCodes["IncompatibleVersionError"] = "incompatible-version-error"; + /** + * Unknown {@link TableauDialogType} passed in to Viz.displayDialogAsync. + */ + EmbeddingErrorCodes["UnknownDialogType"] = "unknown-dialog-type"; + /** + * Can occur if the API interacts with a filter that has been removed from the worksheet. + * Can also occurs if a {@link FilterType} has not been implemented. + */ + EmbeddingErrorCodes["FilterMissingOrNotImplemented"] = "filter-missing-not-implemented"; + /** + * Can occur if story point ids no longer match. + */ + EmbeddingErrorCodes["StoryPointIdMismatch"] = "storypoint-id-mismatch"; +})(EmbeddingErrorCodes = exports.EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = {})); +/** + * Formats available to use with displayStaticImage in @VizInterfaces + */ +var FileFormats; +(function (FileFormats) { + FileFormats["PDF"] = "pdf"; + FileFormats["PNG"] = "png"; +})(FileFormats = exports.FileFormats || (exports.FileFormats = {})); +var PrintOrientation; +(function (PrintOrientation) { + PrintOrientation["Portrait"] = "portrait"; + PrintOrientation["Landscape"] = "landscape"; +})(PrintOrientation = exports.PrintOrientation || (exports.PrintOrientation = {})); +var PrintPageSize; +(function (PrintPageSize) { + PrintPageSize["Letter"] = "letter"; + PrintPageSize["Legal"] = "legal"; + PrintPageSize["Note"] = "note"; + PrintPageSize["Folio"] = "folio"; + PrintPageSize["Tabloid"] = "tabloid"; + PrintPageSize["Ledger"] = "ledger"; + PrintPageSize["Statement"] = "statement"; + PrintPageSize["Executive"] = "executive"; + PrintPageSize["A3"] = "A3"; + PrintPageSize["A4"] = "A4"; + PrintPageSize["A5"] = "A5"; + PrintPageSize["B4"] = "B4"; + PrintPageSize["B5"] = "B5"; + PrintPageSize["Quarto"] = "quarto"; + PrintPageSize["Unspecified"] = "unspecified"; +})(PrintPageSize = exports.PrintPageSize || (exports.PrintPageSize = {})); +var PrintScaling; +(function (PrintScaling) { + PrintScaling["Automatic"] = "automatic"; + PrintScaling["Perc25"] = "25%"; + PrintScaling["Perc50"] = "50%"; + PrintScaling["Perc60"] = "60%"; + PrintScaling["Perc75"] = "75%"; + PrintScaling["Perc80"] = "80%"; + PrintScaling["Perc90"] = "90%"; + PrintScaling["Perc100"] = "100%"; + PrintScaling["Perc200"] = "200%"; + PrintScaling["Perc400"] = "400%"; + PrintScaling["AtMost1PageHigh"] = "at-most-1-page-high"; + PrintScaling["AtMost2PagesHigh"] = "at-most-2-pages-high"; + PrintScaling["AtMost1PageWide"] = "at-most-1-page-wide"; + PrintScaling["AtMost2PagesWide"] = "at-most-2-pages-wide"; +})(PrintScaling = exports.PrintScaling || (exports.PrintScaling = {})); +var RevertVizSelection; +(function (RevertVizSelection) { + RevertVizSelection["All"] = "all"; + RevertVizSelection["Axes"] = "axes"; + RevertVizSelection["Filters"] = "filters"; + RevertVizSelection["Sorts"] = "sorts"; + RevertVizSelection["Shelves"] = "shelves"; +})(RevertVizSelection = exports.RevertVizSelection || (exports.RevertVizSelection = {})); +var ToolbarButtons; +(function (ToolbarButtons) { + ToolbarButtons["Alerts"] = "alerts"; + ToolbarButtons["AskData"] = "askData"; + ToolbarButtons["CustomViews"] = "customViews"; + ToolbarButtons["DataDetails"] = "dataDetails"; + ToolbarButtons["Share"] = "share"; + ToolbarButtons["Subscribe"] = "subscribe"; +})(ToolbarButtons = exports.ToolbarButtons || (exports.ToolbarButtons = {})); +var Toolbar; +(function (Toolbar) { + Toolbar["Top"] = "top"; + Toolbar["Bottom"] = "bottom"; + Toolbar["Hidden"] = "hidden"; +})(Toolbar = exports.Toolbar || (exports.Toolbar = {})); +var SheetSizeBehavior; +(function (SheetSizeBehavior) { + SheetSizeBehavior["Automatic"] = "automatic"; + SheetSizeBehavior["Exactly"] = "exactly"; + SheetSizeBehavior["Range"] = "range"; + SheetSizeBehavior["AtLeast"] = "atleast"; + SheetSizeBehavior["AtMost"] = "atmost"; +})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {})); +var PulseLayout; +(function (PulseLayout) { + PulseLayout["Default"] = "default"; + PulseLayout["Card"] = "card"; + PulseLayout["Ban"] = "ban"; +})(PulseLayout = exports.PulseLayout || (exports.PulseLayout = {})); +/** + * 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 + */ + 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"; +})(TableauEventType = exports.TableauEventType || (exports.TableauEventType = {})); +/** + * Represents the location of a context menu where users can add external menu items. + */ +var ApiMenuType; +(function (ApiMenuType) { + /** External menu item will be injected in ubertip dialog */ + ApiMenuType["Ubertip"] = "ubertip"; +})(ApiMenuType = exports.ApiMenuType || (exports.ApiMenuType = {})); +/** You can use this type with a {@link Viz} object. */ +var TableauDialogType; +(function (TableauDialogType) { + /** + * Used to display the download PDF dialog. + */ + TableauDialogType["ExportPDF"] = "export-pdf"; + /** + * Used to display the download PowerPoint dialog. + */ + TableauDialogType["ExportPowerPoint"] = "export-powerpoint"; + /** + * Used to display the download Data dialog. + */ + TableauDialogType["ExportData"] = "export-data"; + /** + * Used to display the download CrossTab dialog. + */ + TableauDialogType["ExportCrossTab"] = "export-cross-tab"; + /** + * Used to display the download Workbook dialog. + */ + TableauDialogType["ExportWorkbook"] = "export-workbook"; + /** + * Used to display the Share dialog. + */ + TableauDialogType["Share"] = "share"; +})(TableauDialogType = exports.TableauDialogType || (exports.TableauDialogType = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var PulseAttributes; +(function (PulseAttributes) { + PulseAttributes["DisableExploreFilter"] = "disable-explore-filter"; + PulseAttributes["Layout"] = "layout"; +})(PulseAttributes = exports.PulseAttributes || (exports.PulseAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js": +/*!***************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The shared string constants you can use as HTML attributes for the and web component. + * @ignore + */ +var VizSharedAttributes; +(function (VizSharedAttributes) { + VizSharedAttributes["TouchOptimize"] = "touch-optimize"; + VizSharedAttributes["HideEditInDesktopButton"] = "hide-edit-in-desktop-button"; + VizSharedAttributes["SuppressDefaultEditBehavior"] = "suppress-default-edit-behavior"; + VizSharedAttributes["DisableVersionCheck"] = "disable-version-check"; + VizSharedAttributes["OnEditInDesktopButtonClicked"] = "onEditInDesktopButtonClicked"; + VizSharedAttributes["OnFirstVizSizeKnown"] = "onFirstVizSizeKnown"; + VizSharedAttributes["OnFirstInteractive"] = "onFirstInteractive"; +})(VizSharedAttributes = exports.VizSharedAttributes || (exports.VizSharedAttributes = {})); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var VizAttributes; +(function (VizAttributes) { + VizAttributes["DisableUrlActionsPopups"] = "disable-url-actions"; + VizAttributes["HideTabs"] = "hide-tabs"; + VizAttributes["Toolbar"] = "toolbar"; + VizAttributes["InstanceIdToClone"] = "instance-id-to-clone"; + VizAttributes["Device"] = "device"; + VizAttributes["HideEditButton"] = "hide-edit-button"; + VizAttributes["OnEditButtonClicked"] = "onEditButtonClicked"; + VizAttributes["OnFilterChanged"] = "onFilterChanged"; + VizAttributes["OnCustomMarkContextMenuEvent"] = "onCustomMarkContextMenuEvent"; + VizAttributes["OnMarkSelectionChanged"] = "onMarkSelectionChanged"; + VizAttributes["OnParameterChanged"] = "onParameterChanged"; + VizAttributes["OnToolbarStateChanged"] = "onToolbarStateChanged"; + VizAttributes["OnUrlAction"] = "onUrlAction"; + VizAttributes["OnTabSwitched"] = "onTabSwitched"; + VizAttributes["OnCustomViewLoaded"] = "onCustomViewLoaded"; + VizAttributes["OnCustomViewRemoved"] = "onCustomViewRemoved"; + VizAttributes["OnCustomViewSaved"] = "onCustomViewSaved"; + VizAttributes["OnCustomViewSetDefault"] = "onCustomViewSetDefault"; + VizAttributes["OnStoryPointSwitched"] = "onStoryPointSwitched"; + VizAttributes["OnSummaryDataChanged"] = "onSummaryDataChanged"; + VizAttributes["OnReadyToReceiveAuthToken"] = "onReadyToReceiveAuthToken"; +})(VizAttributes = exports.VizAttributes || (exports.VizAttributes = {})); +/** + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + */ +var VizAuthoringAttributes; +(function (VizAuthoringAttributes) { + VizAuthoringAttributes["OnWorkbookPublished"] = "onWorkbookPublished"; + VizAuthoringAttributes["OnWorkbookPublishedAs"] = "onWorkbookPublishedAs"; + VizAuthoringAttributes["OnWorkbookReadyToClose"] = "onWorkbookReadyToClose"; + VizAuthoringAttributes["HideCloseButton"] = "hide-close-button"; +})(VizAuthoringAttributes = exports.VizAuthoringAttributes || (exports.VizAuthoringAttributes = {})); +/** + * The names of the string constants you can use as child tags for TableauViz and TableauAuthoringViz custom elements. + */ +var VizChildElements; +(function (VizChildElements) { + /** + * Contains a list of filter parameters. Available only in viewing mode. + */ + VizChildElements["VizFilter"] = "viz-filter"; + /** + * Contains a name and value for a parameter. Available only in viewing mode. + */ + VizChildElements["VizParameter"] = "viz-parameter"; + /** + * Contains a list of custom parameters. Available in both viewing and authoring modes. + */ + VizChildElements["CustomParameter"] = "custom-parameter"; +})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {})); +var VizChildElementAttributes; +(function (VizChildElementAttributes) { + VizChildElementAttributes["Field"] = "field"; + VizChildElementAttributes["Value"] = "value"; + VizChildElementAttributes["Name"] = "name"; +})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js": +/*!************************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js ***! + \************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * The names of the common string constants you can use as HTML attributes for the tableau web component. + * @ignore + */ +var WebComponentAttributes; +(function (WebComponentAttributes) { + WebComponentAttributes["Src"] = "src"; + WebComponentAttributes["Width"] = "width"; + WebComponentAttributes["Height"] = "height"; + WebComponentAttributes["Token"] = "token"; + WebComponentAttributes["Debug"] = "debug"; + WebComponentAttributes["IframeAuth"] = "iframe-auth"; + WebComponentAttributes["OnVizLoadError"] = "onvizloaderror"; + WebComponentAttributes["ForceTokenSync"] = "force-token-sync"; +})(WebComponentAttributes = exports.WebComponentAttributes || (exports.WebComponentAttributes = {})); +/** + * The names of the 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"; +})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {})); +var WebComponentChildElementAttributes; +(function (WebComponentChildElementAttributes) { + WebComponentChildElementAttributes["Field"] = "field"; + WebComponentChildElementAttributes["Value"] = "value"; + WebComponentChildElementAttributes["Name"] = "name"; +})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js": +/*!*********************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js ***! + \*********************************************************************************************/ +/***/ ((module) => { + +"use strict"; + +// All enum values made available to Extensions developers. +// Enums should be kept in alphabetical order. +var Tableau; +(function (Tableau) { + /** + * All error codes used by the Extensions API. + */ + var ErrorCodes; + (function (ErrorCodes) { + /** + * Thrown when caller attempts to execute command before initialization has completed. + */ + ErrorCodes["APINotInitialized"] = "api-not-initialized"; + /** + * Thrown when caller attempts to execute command while extension is not visible. + */ + ErrorCodes["VisibilityError"] = "visibility-error"; + /** + * Only one dialog can be opened at time with the UI namespace functionality. + */ + ErrorCodes["DialogAlreadyOpen"] = "dialog-already-open"; + /** + * The open dialog was closed by the user. + */ + ErrorCodes["DialogClosedByUser"] = "dialog-closed-by-user"; + /** + * An error occurred within the Tableau Extensions API. Contact Tableau Support. + */ + ErrorCodes["InternalError"] = "internal-error"; + /** + * A dialog must start on the same domain as the parent extenion. + */ + ErrorCodes["InvalidDomainDialog"] = "invalid-dialog-domain"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. + */ + ErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * Can occur if the extension interacts with a filter that has been removed from the worksheet. + */ + ErrorCodes["MissingFilter"] = "missing-filter"; + /** + * Can occur if the extension interacts with a parameter that has been removed from the worksheet. + */ + ErrorCodes["MissingParameter"] = "missing-parameter"; + /** + * Internal Server Error + */ + ErrorCodes["ServerError"] = "server-error"; + /** + * Developer cannot save settings while another save is still in progress. + */ + ErrorCodes["SettingSaveInProgress"] = "setting-save-in-progress"; + /** + * An unknown event name was specified in the call to `addEventListener` or `removeEventListener`. + */ + ErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; + /** + * A method was used for a type of data source that doesn't support that method (see getActiveTablesAsync for an example) + */ + ErrorCodes["UnsupportedMethodForDataSourceType"] = "unsupported-method-for-data-source-type"; + })(ErrorCodes = Tableau.ErrorCodes || (Tableau.ErrorCodes = {})); + /** + * The context in which the Extensions is currently running. + */ + var ExtensionContext; + (function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {})); + /** + * The mode in which the Extensions is currently running. + */ + var ExtensionMode; + (function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {})); + /** + * Represents the type of event that can be listened for. + */ + var TableauEventType; + (function (TableauEventType) { + /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ + TableauEventType["FilterChanged"] = "filter-changed"; + /** The selected marks on a visualization has changed. + * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */ + TableauEventType["MarkSelectionChanged"] = "mark-selection-changed"; + /** The summary data backing a worksheet has changed + * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ + TableauEventType["SummaryDataChanged"] = "summary-data-changed"; + /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. */ + TableauEventType["ParameterChanged"] = "parameter-changed"; + /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */ + TableauEventType["SettingsChanged"] = "settings-changed"; + /** The dashboard layout has changed + * @category Dashboard Extensions + */ + TableauEventType["DashboardLayoutChanged"] = "dashboard-layout-changed"; + /** The workbook formatting has changed + * @category Dashboard Extensions + */ + TableauEventType["WorkbookFormattingChanged"] = "workbook-formatting-changed"; + })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {})); + /** + * Enum that represents the data type of encodings for createVizImageAsync. + * @since 1.6.0 + */ + var 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 + */ + var 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 + */ + var 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 + */ + var 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 + */ + var VizImageSizeSettingAlignmentType; + (function (VizImageSizeSettingAlignmentType) { + VizImageSizeSettingAlignmentType["Right"] = "right"; + VizImageSizeSettingAlignmentType["Left"] = "left"; + VizImageSizeSettingAlignmentType["Center"] = "center"; + })(VizImageSizeSettingAlignmentType = Tableau.VizImageSizeSettingAlignmentType || (Tableau.VizImageSizeSettingAlignmentType = {})); +})(Tableau || (Tableau = {})); +module.exports = Tableau; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var SharedErrorCodes; +(function (SharedErrorCodes) { + /** + * A CSV or Excel file failed to be created in Viz.exportCrosstabAsync(). + */ + SharedErrorCodes["CrosstabCreationError"] = "crosstab-creation-error"; + /** + * A CSV file failed to be created in Viz.exportDataAsync(). + */ + SharedErrorCodes["DataCreationError"] = "data-creation-error"; + /** + * An invalid aggregation was specified for the filter, such as setting a range filter to "SUM(Sales)" instead of + * "Sales". + */ + SharedErrorCodes["InvalidAggregationFieldName"] = "invalid-aggregation-field-name"; + /** + * A filter operation was attempted on a field that does not exist in the data source. + */ + SharedErrorCodes["InvalidFilterFieldName"] = "invalid-filter-name"; + /** + * A filter operation was attempted using a value that is the wrong data type or format. + */ + SharedErrorCodes["InvalidFilterFieldValue"] = "invalid-filter-fieldValue"; + /** + * An invalid date value was specified in a Sheet.selectMarksAsync() call for a date field. + */ + SharedErrorCodes["InvalidSelectionDate"] = "invalid-selection-date"; + /** + * A field was specified in a Sheet.selectMarksAsync() call that does not exist in the data source. + */ + SharedErrorCodes["InvalidSelectionFieldName"] = "invalid-selection-fieldName"; + /** + * An invalid value was specified in a Sheet.selectMarksAsync() call. + */ + SharedErrorCodes["InvalidSelectionValue"] = "invalid-selection-value"; + /** + * A parameter did not include a valid sheet selection for exporting. + */ + SharedErrorCodes["InvalidSelectionSheet"] = "invalid-selection-sheet"; + /** + * An error occurred within the Tableau API. Contact Tableau Support. + */ + SharedErrorCodes["InternalError"] = "internal-error"; + /** + * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. + */ + SharedErrorCodes["InvalidParameter"] = "invalid-parameter"; + /** + * A PDF file failed to be created in Viz.exportPDFAsync(). + */ + SharedErrorCodes["PDFCreationError"] = "pdf-creation-error"; + /** + * A PowerPoint file failed to be created in Viz.exportPowerPointAsync(). + */ + SharedErrorCodes["PowerPointCreationError"] = "powerpoint-creation-error"; + /** + * An operation was attempted on a sheet that is not active or embedded within the active dashboard. + */ + SharedErrorCodes["NotActiveSheet"] = "not-active-sheet"; + /** + * Property or Function is not supported within the Tableau API. + */ + SharedErrorCodes["ImplementationError"] = "wrong-implementation"; + /** + * Can occur when two incompatible calls are triggered together. + */ + SharedErrorCodes["ApiExecutionError"] = "api-execution-error"; + /** + * A general-purpose server error occurred. Details are contained in the Error object. + */ + SharedErrorCodes["ServerError"] = "server-error"; + /** + * Can occur when an api call times out. + */ + SharedErrorCodes["Timeout"] = "timeout"; +})(SharedErrorCodes = exports.SharedErrorCodes || (exports.SharedErrorCodes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js ***! + \*****************************************************************************************/ +/***/ (function(module) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +/** + * The tableau namespace exists for organization and to avoid polluting + * the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations. + */ +var Tableau; +(function (Tableau) { + var AnalyticsObjectType; + (function (AnalyticsObjectType) { + AnalyticsObjectType["Cluster"] = "cluster"; + AnalyticsObjectType["Forecast"] = "forecast"; + AnalyticsObjectType["TrendLine"] = "trend-line"; + })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {})); + var AnnotationType; + (function (AnnotationType) { + AnnotationType["Mark"] = "mark"; + AnnotationType["Point"] = "point"; + AnnotationType["Area"] = "area"; + })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {})); + var ColumnType; + (function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; + ColumnType["Unknown"] = "unknown"; + })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {})); + var 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 = Tableau.ClassNameKey || (Tableau.ClassNameKey = {})); + /** + * What the object represents in a dashboard. + */ + 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 = Tableau.DashboardObjectType || (Tableau.DashboardObjectType = {})); + /** + * Enum that represents the visibility state of a dashboard object. + * @since 1.7.0 + */ + var 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 + */ + 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 = Tableau.DataType || (Tableau.DataType = {})); + /** + * Enum that represents the changes that occur to a dashboard object. + */ + var 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. + */ + var 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. + */ + var DialogStyle; + (function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; + })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {})); + var 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. + */ + 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 = Tableau.FieldAggregationType || (Tableau.FieldAggregationType = {})); + /** + * Role of a field. + */ + var 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. + */ + var 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 + */ + var 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 + */ + var 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. + */ + var 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 + */ + var 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. + */ + 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 = Tableau.MarkType || (Tableau.MarkType = {})); + /** + * An enumeration describing the different types of allowable values. + * This is used for restricting the domain of a parameter + */ + var 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. + */ + var PeriodType; + (function (PeriodType) { + PeriodType["Years"] = "years"; + PeriodType["Quarters"] = "quarters"; + PeriodType["Months"] = "months"; + PeriodType["Weeks"] = "weeks"; + PeriodType["Days"] = "days"; + PeriodType["Hours"] = "hours"; + PeriodType["Minutes"] = "minutes"; + PeriodType["Seconds"] = "seconds"; + })(PeriodType = Tableau.PeriodType || (Tableau.PeriodType = {})); + var 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. + */ + var 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. + */ + var 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 + */ + var SheetType; + (function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; + })(SheetType = Tableau.SheetType || (Tableau.SheetType = {})); + var SortDirection; + (function (SortDirection) { + SortDirection["Increasing"] = "increasing"; + SortDirection["Decreasing"] = "decreasing"; + })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {})); + var 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 + */ + var 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 + */ + var HierarchicalLevelSelectionState; + (function (HierarchicalLevelSelectionState) { + HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; + HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; + HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; + HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; + })(HierarchicalLevelSelectionState = Tableau.HierarchicalLevelSelectionState || (Tableau.HierarchicalLevelSelectionState = {})); + Tableau.ZoneVisibilityType = __assign({}, DashboardObjectVisibilityType); +})(Tableau || (Tableau = {})); +module.exports = Tableau; + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/SharedApiExternalContract.js": +/*!************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/SharedApiExternalContract.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// This file re-exports everything which is part of the shared api public interface +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +__export(__webpack_require__(/*! ./ExternalContract/Shared/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js")); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Shared/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js"); +exports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType; +exports.AnnotationType = Tableau_1.AnnotationType; +exports.ClassNameKey = Tableau_1.ClassNameKey; +exports.ColumnType = Tableau_1.ColumnType; +exports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange; +exports.DashboardObjectType = Tableau_1.DashboardObjectType; +exports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType; +exports.DataType = Tableau_1.DataType; +exports.DateRangeType = Tableau_1.DateRangeType; +exports.DialogStyle = Tableau_1.DialogStyle; +exports.EncodingType = Tableau_1.EncodingType; +exports.FieldAggregationType = Tableau_1.FieldAggregationType; +exports.FieldRoleType = Tableau_1.FieldRoleType; +exports.FilterDomainType = Tableau_1.FilterDomainType; +exports.FilterNullOption = Tableau_1.FilterNullOption; +exports.FilterType = Tableau_1.FilterType; +exports.FilterUpdateType = Tableau_1.FilterUpdateType; +exports.HierarchicalLevelSelectionState = Tableau_1.HierarchicalLevelSelectionState; +exports.IncludeDataValuesOption = Tableau_1.IncludeDataValuesOption; +exports.MarkType = Tableau_1.MarkType; +exports.ParameterValueType = Tableau_1.ParameterValueType; +exports.PeriodType = Tableau_1.PeriodType; +exports.QuickTableCalcType = Tableau_1.QuickTableCalcType; +exports.ReplaySpeedType = Tableau_1.ReplaySpeedType; +exports.SelectOptions = Tableau_1.SelectOptions; +exports.SelectionUpdateType = Tableau_1.SelectionUpdateType; +exports.SheetType = Tableau_1.SheetType; +exports.SortDirection = Tableau_1.SortDirection; +exports.TrendLineModelType = Tableau_1.TrendLineModelType; +exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/JsApiInternalContract.js": +/*!********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/JsApiInternalContract.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +// The following polyfills are needed for IE11 +__webpack_require__(/*! core-js/es/number/is-integer */ "../../node_modules/core-js/es/number/is-integer.js"); +__webpack_require__(/*! core-js/es/number/is-nan */ "../../node_modules/core-js/es/number/is-nan.js"); +__webpack_require__(/*! core-js/es/object/assign */ "../../node_modules/core-js/es/object/assign.js"); +// Export the version of the internal contract to be available at runtime +// This file is generated by yarn publish:bump via scripts/publish-check.ts +// updateInternalContractRuntimeVersion in the monorepo root. +var internalContractVersion = __webpack_require__(/*! ../internal-contract-version.json */ "../api-internal-contract-js/lib/internal-contract-version.json"); +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/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js")); +__export(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js")); +__export(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js")); +// Export 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 })); +var Enums_1 = __webpack_require__(/*! ./Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"); +var DataTypeConverter = /** @class */ (function () { + function DataTypeConverter() { + } + DataTypeConverter.isSpecial = function (valueAsString) { + // 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 + DataTypeConverter.parseBoolean = function (booleanString) { + // boolean values come to us as 'true'|'false' + var normalizedBoolean = booleanString.toLowerCase(); + return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true'; + }; + // tslint:disable-next-line:no-any + DataTypeConverter.parseNumber = function (valueAsString) { + var value = Number(valueAsString); + return isNaN(value) ? this.specialValueIndicator : value; + }; + DataTypeConverter.parseDate = function (dateAsString) { + // Note that without a time, the date is assumed to be UTC + // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700 + // This matches style used in existing convertFilterValuePresModel + var value = new Date(dateAsString); + return Number.isNaN(value.getTime()) ? null : value; + }; + DataTypeConverter.parseDateTime = function (dateAsString) { + // With a time, the date is assumed to be UTC. + // Our date format is always: yyyy-mm-dd hh:mm:ss + // Unfortunately, IE11 can't parse that format so we add a T between the day and time. + // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC) + var formattedDateString = dateAsString.replace(' ', 'T').concat('Z'); + var value = new Date(formattedDateString); + return Number.isNaN(value.getTime()) ? null : value; + }; + // It would be nice to merge this and the method FilterConverter::convertFilterValuePresModel in api-platform-js + DataTypeConverter.convertValueAsStringToValue = function (valueAsString, type) { + // 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 + DataTypeConverter.convertValueToNativeValue = function (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 + DataTypeConverter.convertStringValueToNativeValue = function (value, type) { + // This handles the conversion from string directly to native value for all types + return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type); + }; + DataTypeConverter.specialValueIndicator = '%null%'; + return DataTypeConverter; +}()); +exports.DataTypeConverter = DataTypeConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Enums.js": +/*!*************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Enums.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ExtensionContext; +(function (ExtensionContext) { + ExtensionContext["Desktop"] = "desktop"; + ExtensionContext["Server"] = "server"; + ExtensionContext["Unknown"] = "unknown"; +})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {})); +var ExtensionMode; +(function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + ExtensionMode["Unknown"] = "unknown"; +})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {})); +var AnnotateEnum; +(function (AnnotateEnum) { + AnnotateEnum["Mark"] = "mark"; + AnnotateEnum["Point"] = "point"; + AnnotateEnum["Area"] = "area"; +})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {})); +var ColumnType; +(function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; + ColumnType["Unknown"] = "unknown"; +})(ColumnType = exports.ColumnType || (exports.ColumnType = {})); +var DashboardObjectType; +(function (DashboardObjectType) { + DashboardObjectType["Blank"] = "blank"; + DashboardObjectType["Worksheet"] = "worksheet"; + DashboardObjectType["QuickFilter"] = "quick-filter"; + DashboardObjectType["ParameterControl"] = "parameter-control"; + DashboardObjectType["PageFilter"] = "page-filter"; + DashboardObjectType["Legend"] = "legend"; + DashboardObjectType["Title"] = "title"; + DashboardObjectType["Text"] = "text"; + DashboardObjectType["Image"] = "image"; + DashboardObjectType["WebPage"] = "web-page"; + DashboardObjectType["Extension"] = "extension"; +})(DashboardObjectType = exports.DashboardObjectType || (exports.DashboardObjectType = {})); +var DataType; +(function (DataType) { + DataType["String"] = "string"; + DataType["Int"] = "int"; + DataType["Float"] = "float"; + DataType["Bool"] = "bool"; + DataType["Date"] = "date"; + DataType["DateTime"] = "date-time"; + DataType["Spatial"] = "spatial"; + DataType["Unknown"] = "unknown"; +})(DataType = exports.DataType || (exports.DataType = {})); +var DialogStyle; +(function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; +})(DialogStyle = exports.DialogStyle || (exports.DialogStyle = {})); +var EncodedDataType; +(function (EncodedDataType) { + EncodedDataType["Number"] = "number"; + EncodedDataType["String"] = "string"; + EncodedDataType["Date"] = "date"; + EncodedDataType["Boolean"] = "boolean"; +})(EncodedDataType = exports.EncodedDataType || (exports.EncodedDataType = {})); +var ErrorCodes; +(function (ErrorCodes) { + ErrorCodes["INITIALIZATION_ERROR"] = "initialization-error"; + ErrorCodes["INTERNAL_ERROR"] = "internal-error"; + ErrorCodes["MISSING_ENUM_MAPPING"] = "missing-enum-mapping"; + ErrorCodes["MISSING_PARAMETER"] = "missing-parameter"; + ErrorCodes["PERMISSION_DENIED"] = "permission-denied"; + ErrorCodes["PRES_MODEL_PARSING_ERROR"] = "pres-model-parsing-error"; + ErrorCodes["VERSION_NOT_CONFIGURED"] = "version-not-configured"; + ErrorCodes["VISIBILITY_ERROR"] = "visibility-error"; + ErrorCodes["UNKNOWN_VERB_ID"] = "unknown-verb-id"; +})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {})); +var FieldAggregationType; +(function (FieldAggregationType) { + FieldAggregationType["Sum"] = "sum"; + FieldAggregationType["Avg"] = "avg"; + FieldAggregationType["Min"] = "min"; + FieldAggregationType["Max"] = "max"; + FieldAggregationType["Stdev"] = "stdev"; + FieldAggregationType["Stdevp"] = "stdevp"; + FieldAggregationType["Var"] = "var"; + FieldAggregationType["Varp"] = "varp"; + FieldAggregationType["Collect"] = "collect"; + FieldAggregationType["Count"] = "count"; + FieldAggregationType["Countd"] = "countd"; + FieldAggregationType["Median"] = "median"; + FieldAggregationType["Attr"] = "attr"; + FieldAggregationType["None"] = "none"; + FieldAggregationType["Year"] = "year"; + FieldAggregationType["Qtr"] = "qtr"; + FieldAggregationType["Month"] = "month"; + FieldAggregationType["Day"] = "day"; + FieldAggregationType["Hour"] = "hour"; + FieldAggregationType["Minute"] = "minute"; + FieldAggregationType["Second"] = "second"; + FieldAggregationType["Week"] = "week"; + FieldAggregationType["Weekday"] = "weekday"; + FieldAggregationType["MonthYear"] = "month-year"; + FieldAggregationType["Mdy"] = "mdy"; + FieldAggregationType["End"] = "end"; + FieldAggregationType["TruncYear"] = "trunc-year"; + FieldAggregationType["TruncQtr"] = "trunc-qtr"; + FieldAggregationType["TruncMonth"] = "trunc-month"; + FieldAggregationType["TruncWeek"] = "trunc-week"; + FieldAggregationType["TruncDay"] = "trunc-day"; + FieldAggregationType["TruncHour"] = "trunc-hour"; + FieldAggregationType["TruncMinute"] = "trunc-minute"; + FieldAggregationType["TruncSecond"] = "trunc-second"; + FieldAggregationType["Quart1"] = "quart1"; + FieldAggregationType["Quart3"] = "quart3"; + FieldAggregationType["Skewness"] = "skewness"; + FieldAggregationType["Kurtosis"] = "kurtosis"; + FieldAggregationType["InOut"] = "in-out"; + FieldAggregationType["User"] = "user"; +})(FieldAggregationType = exports.FieldAggregationType || (exports.FieldAggregationType = {})); +var FieldRoleType; +(function (FieldRoleType) { + FieldRoleType["Dimension"] = "dimension"; + FieldRoleType["Measure"] = "measure"; + FieldRoleType["Unknown"] = "unknown"; +})(FieldRoleType = exports.FieldRoleType || (exports.FieldRoleType = {})); +/** + * The different update types for applying filter. + */ +var FilterUpdateType; +(function (FilterUpdateType) { + FilterUpdateType["Add"] = "add"; + FilterUpdateType["All"] = "all"; + FilterUpdateType["Replace"] = "replace"; + FilterUpdateType["Remove"] = "remove"; +})(FilterUpdateType = exports.FilterUpdateType || (exports.FilterUpdateType = {})); +var SheetType; +(function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; +})(SheetType = exports.SheetType || (exports.SheetType = {})); +var DomainRestrictionType; +(function (DomainRestrictionType) { + DomainRestrictionType["All"] = "all"; + DomainRestrictionType["List"] = "list"; + DomainRestrictionType["Range"] = "range"; +})(DomainRestrictionType = exports.DomainRestrictionType || (exports.DomainRestrictionType = {})); +var DateStepPeriod; +(function (DateStepPeriod) { + DateStepPeriod["Years"] = "years"; + DateStepPeriod["Quarters"] = "quarters"; + DateStepPeriod["Months"] = "months"; + DateStepPeriod["Weeks"] = "weeks"; + DateStepPeriod["Days"] = "days"; + DateStepPeriod["Hours"] = "hours"; + DateStepPeriod["Minutes"] = "minutes"; + DateStepPeriod["Seconds"] = "seconds"; +})(DateStepPeriod = exports.DateStepPeriod || (exports.DateStepPeriod = {})); +/** + * The option for specifying which values to include for filtering. + */ +var FilterNullOption; +(function (FilterNullOption) { + FilterNullOption["NullValues"] = "nullvalues"; + FilterNullOption["NonNullValues"] = "nonnullvalues"; + FilterNullOption["AllValues"] = "allvalues"; +})(FilterNullOption = exports.FilterNullOption || (exports.FilterNullOption = {})); +/** + * The type of filter domain + */ +var FilterDomainType; +(function (FilterDomainType) { + FilterDomainType["Relevant"] = "relevant"; + FilterDomainType["Database"] = "database"; +})(FilterDomainType = exports.FilterDomainType || (exports.FilterDomainType = {})); +/** + * Internal enum for specifying the selection type for select marks api. + */ +var SelectionUpdateType; +(function (SelectionUpdateType) { + SelectionUpdateType["Replace"] = "select-replace"; + SelectionUpdateType["Add"] = "select-add"; + SelectionUpdateType["Remove"] = "select-remove"; +})(SelectionUpdateType = exports.SelectionUpdateType || (exports.SelectionUpdateType = {})); +/** + * Internal enum for specifying the select option for the select tuples api. + */ +var SelectOptions; +(function (SelectOptions) { + SelectOptions["Simple"] = "select-options-simple"; + SelectOptions["Toggle"] = "select-options-toggle"; + SelectOptions["Menu"] = "select-options-menu"; + SelectOptions["Range"] = "select-options-range"; + SelectOptions["Search"] = "select-options-search"; +})(SelectOptions = exports.SelectOptions || (exports.SelectOptions = {})); +/** + * Internal enum for specifying the included values type for range selection. + */ +var QuantitativeIncludedValues; +(function (QuantitativeIncludedValues) { + QuantitativeIncludedValues["IncludeNull"] = "include-null"; + QuantitativeIncludedValues["IncludeNonNull"] = "include-non-null"; + QuantitativeIncludedValues["IncludeAll"] = "include-all"; +})(QuantitativeIncludedValues = exports.QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = {})); +/** + * Internal enum for specifying a hierarchical level selection state. + */ +var HierarchicalLevelSelectionState; +(function (HierarchicalLevelSelectionState) { + HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; + HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; + HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; + HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; +})(HierarchicalLevelSelectionState = exports.HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = {})); +/** + * Type of mark for a given marks card in a viz. + */ +var MarkType; +(function (MarkType) { + MarkType["Bar"] = "bar"; + MarkType["Line"] = "line"; + MarkType["Area"] = "area"; + MarkType["Square"] = "square"; + MarkType["Circle"] = "circle"; + MarkType["Shape"] = "shape"; + MarkType["Text"] = "text"; + MarkType["Map"] = "map"; + MarkType["Pie"] = "pie"; + MarkType["GanttBar"] = "gantt-bar"; + MarkType["Polygon"] = "polygon"; + MarkType["Heatmap"] = "heatmap"; + MarkType["VizExtension"] = "viz-extension"; +})(MarkType = exports.MarkType || (exports.MarkType = {})); +/** + * Internal enum for specifying the type of filter + */ +var FilterType; +(function (FilterType) { + FilterType["Categorical"] = "categorical"; + FilterType["Range"] = "range"; + FilterType["RelativeDate"] = "relativeDate"; + FilterType["Hierarchical"] = "hierarchical"; +})(FilterType = exports.FilterType || (exports.FilterType = {})); +/** + * Internal enum for specifying the DateRangeType of a relative date filter + */ +var DateRangeType; +(function (DateRangeType) { + /** + * Refers to the last day, week, month, etc. of the date period. + */ + DateRangeType["Last"] = "last"; + /** + * Refers to the last N days, weeks, months, etc. of the date period. + */ + DateRangeType["LastN"] = "lastN"; + /** + * Refers to the next day, week, month, etc. of the date period. + */ + DateRangeType["Next"] = "next"; + /** + * Refers to the next N days, weeks, months, etc. of the date period. + */ + DateRangeType["NextN"] = "nextN"; + /** + * Refers to the current day, week, month, etc. of the date period. + */ + DateRangeType["Current"] = "current"; + /** + * Refers to everything up to and including the current day, week, month, etc. of the date period. + */ + DateRangeType["ToDate"] = "toDate"; +})(DateRangeType = exports.DateRangeType || (exports.DateRangeType = {})); +/** + * Used to determine if the launching of an extension dialog succeeded or failed. + */ +var ExtensionDialogResult; +(function (ExtensionDialogResult) { + ExtensionDialogResult["DialogAlreadyOpen"] = "dialog-already-open"; + ExtensionDialogResult["InvalidDomain"] = "invalid-domain"; + ExtensionDialogResult["Success"] = "success"; +})(ExtensionDialogResult = exports.ExtensionDialogResult || (exports.ExtensionDialogResult = {})); +// Enumeration for ApiShowData table id sentinels. +var ApiShowDataTableSentinel; +(function (ApiShowDataTableSentinel) { + // find the one logical table - used in version compatibility check for getUnderlyingDataTable and getLogicalDataTable commands + ApiShowDataTableSentinel["SingleTableId"] = "single-table-id-sentinel"; + ApiShowDataTableSentinel["SingleTableCaption"] = "Single table id sentinel"; +})(ApiShowDataTableSentinel = exports.ApiShowDataTableSentinel || (exports.ApiShowDataTableSentinel = {})); +/** + * Used to optimize the getSummaryData/getUnderlyingTableData results + * Mapped from external IncludeDataValuesOption + */ +var ApiShowDataTableFormat; +(function (ApiShowDataTableFormat) { + ApiShowDataTableFormat["NativeValuesOnly"] = "native-values-only"; + ApiShowDataTableFormat["FormattedValuesOnly"] = "formatted-values-only"; + ApiShowDataTableFormat["NativeAndFormattedValues"] = "native-and-formatted-values"; +})(ApiShowDataTableFormat = exports.ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = {})); +/** + * Used to set page size for export layout options. + */ +var PageSizeOption; +(function (PageSizeOption) { + PageSizeOption["Letter"] = "letter"; + PageSizeOption["Legal"] = "legal"; + PageSizeOption["Note"] = "note"; + PageSizeOption["Folio"] = "folio"; + PageSizeOption["Tabloid"] = "tabloid"; + PageSizeOption["Ledger"] = "ledger"; + PageSizeOption["Statement"] = "statement"; + PageSizeOption["Executive"] = "executive"; + PageSizeOption["A3"] = "a3"; + PageSizeOption["A4"] = "a4"; + PageSizeOption["A5"] = "a5"; + PageSizeOption["B4"] = "b4"; + PageSizeOption["B5"] = "b5"; + PageSizeOption["Quarto"] = "quarto"; + PageSizeOption["Unspecified"] = "unspecified"; +})(PageSizeOption = exports.PageSizeOption || (exports.PageSizeOption = {})); +/** + * Used to set the page orientation mode for export layout options. + */ +var PageOrientation; +(function (PageOrientation) { + PageOrientation["Printer"] = "printer"; + PageOrientation["Portrait"] = "portrait"; + PageOrientation["Landscape"] = "landscape"; +})(PageOrientation = exports.PageOrientation || (exports.PageOrientation = {})); +/** + * Used to set scale mode for export layout options. + */ +var ScaleMode; +(function (ScaleMode) { + ScaleMode["ScaleAuto"] = "auto"; + ScaleMode["ScalePercentage"] = "percent"; + ScaleMode["ScaleFitPages"] = "fit-pages"; +})(ScaleMode = exports.ScaleMode || (exports.ScaleMode = {})); +/** + * Used by setFitAndScaleValues to scale percent values + */ +var PageScalingOption; +(function (PageScalingOption) { + PageScalingOption["ScalePctAuto"] = "auto"; + PageScalingOption["ScalePct400"] = "pct400"; + PageScalingOption["ScalePct200"] = "pct200"; + PageScalingOption["ScalePct100"] = "pct100"; + PageScalingOption["ScalePct90"] = "pct90"; + PageScalingOption["ScalePct80"] = "pct80"; + PageScalingOption["ScalePct75"] = "pct75"; + PageScalingOption["ScalePct60"] = "pct60"; + PageScalingOption["ScalePct50"] = "pct50"; + PageScalingOption["ScalePct25"] = "pct25"; +})(PageScalingOption = exports.PageScalingOption || (exports.PageScalingOption = {})); +/** + * Used by setFitAndScaleValues to scale fit page values + */ +var FitPages; +(function (FitPages) { + FitPages["FitOneHigh"] = "fit0x1"; + FitPages["FitTwoHigh"] = "fit0x2"; + FitPages["FitOneWide"] = "fit1x0"; + FitPages["FitTwoWide"] = "fit2x0"; +})(FitPages = exports.FitPages || (exports.FitPages = {})); +/** + * Used by getVisualSpecificationAsync + */ +var EncodingType; +(function (EncodingType) { + EncodingType["Color"] = "color"; + EncodingType["Size"] = "size"; + EncodingType["Label"] = "label"; + EncodingType["Detail"] = "detail"; + EncodingType["Tooltip"] = "tooltip"; + EncodingType["Shape"] = "shape"; + EncodingType["Path"] = "path"; + EncodingType["Angle"] = "angle"; + EncodingType["Geometry"] = "geometry"; + EncodingType["Custom"] = "custom"; +})(EncodingType = exports.EncodingType || (exports.EncodingType = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Notifications.js": +/*!*********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Notifications.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var NotificationId; +(function (NotificationId) { + NotificationId["CustomMarkContextMenuClicked"] = "custom-mark-context-menu-clicked"; + NotificationId["ContextMenuClick"] = "context-menu-click"; + NotificationId["CustomViewRemoved"] = "custom-view-removed"; + NotificationId["CustomViewSaved"] = "custom-view-saved"; + NotificationId["CustomViewSetDefault"] = "custom-view-set-default"; + NotificationId["CustomViewsLoaded"] = "custom-views-loaded"; + NotificationId["DashboardLayoutChanged"] = "dashboard-layout-changed"; + NotificationId["EditButtonClicked"] = "edit-button-clicked"; + NotificationId["EditInDesktopButtonClicked"] = "edit-in-desktop-button-clicked"; + NotificationId["ExtensionDialogUpdate"] = "extension-dialog-update"; + NotificationId["FilterChanged"] = "filter-changed"; + NotificationId["FirstVizSizeKnown"] = "first-viz-size-known"; + NotificationId["ParameterChanged"] = "parameter-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["UrlAction"] = "url-action"; + NotificationId["TabSwitched"] = "tab-switched"; + NotificationId["StoryPointSwitched"] = "story-point-switched"; + NotificationId["ReadyToReceiveAuthToken"] = "ready-to-receive-auth-token"; +})(NotificationId = exports.NotificationId || (exports.NotificationId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Parameters.js": +/*!******************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Parameters.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put +// new ones, and merge conflicts. +var ParameterId; +(function (ParameterId) { + ParameterId["ActiveTablesInfo"] = "active-tables-info"; + ParameterId["AnchorDate"] = "anchor-date"; + ParameterId["AnnotateEnum"] = "annotate-enum"; + ParameterId["AnnotationList"] = "annotation-list"; + ParameterId["CategoricalDomain"] = "categorical-domain"; + ParameterId["ClickThroughEnabled"] = "click-through-enabled"; + 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["DeltaTimeMs"] = "delta-time-ms"; + ParameterId["DimValSelectionModels"] = "dimensionValueSelectionModels"; + ParameterId["DomainType"] = "domain-type"; + ParameterId["EmbeddingAbstractQuery"] = "embedding-abstract-query"; + ParameterId["EmbeddingBootstrapInfo"] = "embedding-bootstrap-info"; + 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["ExtensionDialogPayload"] = "extension-dialog-payload"; + ParameterId["ExtensionDialogResult"] = "extension-dialog-result"; + ParameterId["ExtensionDialogStyle"] = "extension-dialog-style"; + ParameterId["ExtensionDialogUrl"] = "extension-dialog-url"; + ParameterId["ExtensionDialogW"] = "extension-dialog-width"; + ParameterId["ExtensionLocator"] = "extension-locator"; + ParameterId["ExtensionSettingsInfo"] = "extension-settings-info"; + ParameterId["ExtensionZoneId"] = "extension-zone-id"; + ParameterId["ExternalMenuDescription"] = "external-menu-description"; + ParameterId["ExternalMenuHeader"] = "external-menu-header"; + ParameterId["ExternalMenuItemDisplayName"] = "external-menu-item-display-name"; + ParameterId["ExternalMenuItemId"] = "external-menu-item-id"; + ParameterId["Field"] = "field"; + ParameterId["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["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["IsExcludeMode"] = "is-exclude"; + ParameterId["IsExtensionDialog"] = "is-extension-dialog"; + ParameterId["JoinDescription"] = "join-description"; + ParameterId["LogicalTableId"] = "logical-table-id"; + ParameterId["LogicalTableInfoList"] = "logical-table-info-list"; + 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["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["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["TooltipContext"] = "tooltip-context"; + ParameterId["TooltipTextRequest"] = "tooltip-text-request"; + ParameterId["TooltipText"] = "tooltip-text"; + ParameterId["UnderlyingDataTable"] = "underlying-data-table"; + ParameterId["UnderlyingSummaryDataTable"] = "underlying-summary-data-table"; + ParameterId["Url"] = "url"; + ParameterId["UseTabDelimiters"] = "use-tab-delimiters"; + ParameterId["ViewDataTableCacheId"] = "view-data-table-cache-id"; + ParameterId["ViewDataTableId"] = "view-data-table-id"; + ParameterId["VisualId"] = "visual-id"; + ParameterId["VisualSpecification"] = "visual-specification"; + ParameterId["VizAPIInputJson"] = "vizapi-input-json"; + ParameterId["VizAPIStateWithDataModel"] = "vizapi-state-with-data-model"; + ParameterId["VizAPIStateWarningMsg"] = "vizapi-state-warning-msg"; + ParameterId["VizAPISVG"] = "vizapi-svg"; + ParameterId["WorksheetName"] = "worksheet-name"; + ParameterId["WorksheetFilters"] = "worksheet-filters"; + ParameterId["ZoneIdsVisibilityMap"] = "zone-ids-visibility-map"; +})(ParameterId = exports.ParameterId || (exports.ParameterId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Verbs.js": +/*!*************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Verbs.js ***! + \*************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// Declare this key type and export the NotificationId to make this behave like a string enum. +// +// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put +// new ones, and merge conflicts. +var VerbId; +(function (VerbId) { + VerbId["ActivateNextStoryPoint"] = "activate-next-story-point"; + VerbId["ActivatePreviousStoryPoint"] = "activate-previous-story-point"; + VerbId["ActivateSheet"] = "activateSheet"; + VerbId["ActivateStoryPoint"] = "activate-story-point"; + VerbId["AppendExternalMenuItem"] = "append-external-menu-item"; + VerbId["ApplyCategoricalFilter"] = "categorical-filter"; + 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["ClearFilter"] = "clear-filter"; + 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["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["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["MoveAndResizeZones"] = "move-and-resize-zones"; + VerbId["RaiseLeaveMarkNavNotification"] = "raise-leave-mark-nav-notification"; + VerbId["RaiseHoverTupleNotification"] = "raise-hover-tuple-notification"; + VerbId["RaiseSelectTuplesNotification"] = "raise-select-tuples-notification"; + VerbId["Redo"] = "redo"; + VerbId["RefreshDataSource"] = "refresh-data-source"; + VerbId["ReleaseDataTableReader"] = "release-data-table-reader"; + VerbId["RemoveAnnotation"] = "remove-annotation"; + VerbId["RemoveCustomView"] = "remove-custom-view"; + VerbId["RemoveExternalMenuItem"] = "remove-external-menu-item"; + VerbId["RenameExternalMenu"] = "rename-external-menu"; + VerbId["ReplayAnimation"] = "replay-animation"; + VerbId["RevertStoryPoint"] = "revert-story-point"; + VerbId["RevertWorkbook"] = "revert-workbook"; + VerbId["SaveExtensionSettings"] = "save-extension-settings"; + VerbId["SaveWorkbookAsCustomView"] = "save-workbook-as-custom-view"; + VerbId["SelectByValue"] = "select-by-value"; + VerbId["SetActiveCustomViewAsDefault"] = "set-active-custom-view-as-default"; + VerbId["SetAutoUpdate"] = "set-auto-update"; + VerbId["SetClickThrough"] = "set-click-through"; + VerbId["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["TestConversionVerb"] = "test-conversion-verb"; + VerbId["Undo"] = "undo"; + VerbId["UpdateCustomView"] = "update-custom-view"; + VerbId["VizAPI"] = "viz-api"; +})(VerbId = exports.VerbId || (exports.VerbId = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js": +/*!*************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/AskDataInterface.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var AskDataOptionNames; +(function (AskDataOptionNames) { + AskDataOptionNames["token"] = "token"; + AskDataOptionNames["origin"] = "origin"; + AskDataOptionNames["showEmbed"] = "showEmbed"; + AskDataOptionNames["showPin"] = "showPin"; + AskDataOptionNames["showSave"] = "showSave"; + AskDataOptionNames["showShare"] = "showShare"; + AskDataOptionNames["debug"] = ":jsdebug"; + AskDataOptionNames["ApiID"] = ":apiID"; + AskDataOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + AskDataOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + AskDataOptionNames["AskDataWebComponent"] = ":askDataWebComponent"; +})(AskDataOptionNames = exports.AskDataOptionNames || (exports.AskDataOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/PulseInterface.js": +/*!***********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/PulseInterface.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var PulseOptionNames; +(function (PulseOptionNames) { + PulseOptionNames["embed"] = "embed"; + PulseOptionNames["token"] = "token"; + PulseOptionNames["disableExploreFilter"] = "disableExploreFilter"; + PulseOptionNames["layout"] = "embed_layout"; + PulseOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + PulseOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + PulseOptionNames["PulseWebComponent"] = ":pulseWebComponent"; +})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/VqlInterface.js": +/*!*********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/VqlInterface.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * These strings were *manually copied* from the server, + * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/ + * controller/vizql/constants/ParameterKeys.java#L9 + * should be exported instead + * parameters that vizql will accept in an embedding URL + **/ +var VqlParameterNames; +(function (VqlParameterNames) { + VqlParameterNames["ONE"] = "1"; + VqlParameterNames["ALERTS"] = ":alerts"; + VqlParameterNames["ALIAS"] = "alias"; + VqlParameterNames["ALLOW_DEFERRED_BOOTSTRAP"] = ":allowDeferredBootstrap"; + VqlParameterNames["ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS"] = "allowAutogenWorksheetPhoneLayouts"; + VqlParameterNames["API_ID"] = ":apiID"; + VqlParameterNames["APP"] = ":app"; + VqlParameterNames["ATTACHMENT"] = "attachment"; + VqlParameterNames["IS_IPAD_APP"] = "app"; + VqlParameterNames["ANIMATE_TRANSITION"] = ":animate_transition"; + VqlParameterNames["ASCENDING"] = "ascending"; + VqlParameterNames["AUTHENTICATION"] = "authentication"; + VqlParameterNames["ATTRIBUTES"] = "attributes"; + VqlParameterNames["AUTHORING_SHEET"] = ":authSheet"; + VqlParameterNames["AXIS"] = "axis"; + VqlParameterNames["BOOTSTRAP_WHEN_NOTIFIED"] = ":bootstrapWhenNotified"; + VqlParameterNames["BROWSER_BACK_BUTTON_UNDO"] = ":browserBackButtonUndo"; + VqlParameterNames["BROWSER_RENDERING_ON"] = "isBrowserRendering"; + VqlParameterNames["BROWSER_RENDERING_THRESHOLD"] = "browserRenderingThreshold"; + VqlParameterNames["CHARSET"] = "charset"; + VqlParameterNames["CLIENT_DIMENSION"] = "clientDimension"; + VqlParameterNames["CLIENT_IP"] = "client_ip"; + VqlParameterNames["CLIENT_NUM"] = "clientNum"; + VqlParameterNames["COLON_EMBEDDED"] = ":embedded"; + VqlParameterNames["COLON_MOBILE"] = ":mobile"; + VqlParameterNames["COLON_DEEP_LINKING_DISABLED"] = ":deepLinkingDisabled"; + VqlParameterNames["COLON_WATERMARK"] = ":watermark"; + VqlParameterNames["COMMENTS"] = ":comments"; + VqlParameterNames["COMMENTING_ENABLED"] = ":commentingEnabled"; + VqlParameterNames["COMMENTING_MENTIONS_ENABLED"] = ":commentingMentions"; + VqlParameterNames["CONNECTION"] = "connection"; + VqlParameterNames["CREATED_BY_FEATURE"] = "createdByFeature"; + VqlParameterNames["CRYPTED_PASSWORD"] = "crypted"; + VqlParameterNames["CSSDEBUG"] = ":cssdebug"; + VqlParameterNames["CSV"] = "csv"; + VqlParameterNames["CUSTOM_VIEWS"] = ":customViews"; + VqlParameterNames["CV"] = ":cv"; + VqlParameterNames["CV_ID"] = "cvId"; + VqlParameterNames["DASHBOARD_PORT_SIZE"] = "dashboardPortSize"; + VqlParameterNames["DATA_DETAILS"] = ":dataDetails"; + VqlParameterNames["DATASOURCE"] = "datasource"; + VqlParameterNames["DEBUG"] = ":debug"; + VqlParameterNames["DELAY"] = ":delay"; + VqlParameterNames["DEPTH"] = "depth"; + VqlParameterNames["DEVICE_TYPE"] = ":device"; + VqlParameterNames["DEVICE_PIXEL_RATIO"] = "devicePixelRatio"; + VqlParameterNames["DEVICE_PREVIEW_MODE"] = ":devicepreviewmode"; + VqlParameterNames["DIMENSIONS"] = ":dimensions"; + VqlParameterNames["DISABLE_SHARED_SESSIONS"] = ":disable_shared_sessions"; + VqlParameterNames["DISABLE_URL_ACTIONS_POPUPS"] = ":disableUrlActionsPopups"; + VqlParameterNames["DIRECTION"] = "direction"; + VqlParameterNames["DISPLAY_OVERLAY"] = ":display_overlay"; + VqlParameterNames["DISPLAY_SHARE"] = ":display_share"; + VqlParameterNames["DISPLAY_SPINNER"] = ":display_spinner"; + VqlParameterNames["DISPLAY_STATIC_IMAGE"] = ":display_static_image"; + VqlParameterNames["DISPLAY_TABS"] = "display_tabs"; + VqlParameterNames["DISPLAY_VIEW_COUNT"] = ":display_count"; + VqlParameterNames["IGNORE_STICKY_SESSION"] = ":ignore_sticky_session"; + VqlParameterNames["INCREMENT_VIEW_COUNT"] = ":increment_view_count"; + VqlParameterNames["DOCMODE"] = "docmode"; + VqlParameterNames["DOMAIN"] = "domain"; + VqlParameterNames["DO_WORK"] = "do_work"; + VqlParameterNames["DX"] = "dx"; + VqlParameterNames["DY"] = "dy"; + VqlParameterNames["EDIT_DATA_ALERT"] = ":editDataAlert"; + VqlParameterNames["EMBED"] = ":embed"; + VqlParameterNames["EMBEDDED"] = "embedded"; + VqlParameterNames["ENCRYPTED"] = "encrypted"; + VqlParameterNames["API_EXTERNAL_VERSION"] = ":apiExternalVersion"; + VqlParameterNames["API_INTERNAL_VERSION"] = ":apiInternalVersion"; + VqlParameterNames["EXCLUDE"] = "exclude"; + VqlParameterNames["EXPORT_FORMAT"] = ":export_format"; + VqlParameterNames["FIELDNAME"] = "fieldname"; + VqlParameterNames["FIELD_NAME"] = "field_name"; + VqlParameterNames["FIELD_SEP"] = "field_sep"; + VqlParameterNames["FILE"] = "file"; + VqlParameterNames["FILTER_TILE_SIZE"] = "filterTileSize"; + VqlParameterNames["FN"] = "fn"; + VqlParameterNames["FOCUS"] = "focus"; + VqlParameterNames["FORCE_CACHE"] = "force_cache"; + VqlParameterNames["FORMAT"] = "format"; + VqlParameterNames["FORMAT_DATA_VALUE_LOCALLY"] = "formatDataValueLocally"; + VqlParameterNames["FROM_WG"] = ":from_wg"; + VqlParameterNames["GRAPHQL_DATABASE_ID"] = ":graphQLDatabaseId"; + VqlParameterNames["GRAPHQL_TABLE_ID"] = ":graphQLTableId"; + VqlParameterNames["GUID"] = ":guid"; + VqlParameterNames["H"] = "h"; + VqlParameterNames["HIDDEN"] = "hidden"; + VqlParameterNames["HIDE_CLOSE_BUTTON"] = ":hideCloseButton"; + VqlParameterNames["HIDE_EDIT_BUTTON"] = ":hideEditButton"; + VqlParameterNames["HIDE_EDIT_IN_DESKTOP_BUTTON"] = ":hideEditInDesktopButton"; + VqlParameterNames["HIGH_DPI"] = ":highdpi"; + VqlParameterNames["IMAGE_SIZE_LIMIT"] = "imageSizeLimit"; + VqlParameterNames["TRANSPARENT_LINE_MARKS_LIMIT"] = "transparentLineMarkLimit"; + VqlParameterNames["CLIENT_RENDER_PIXEL_LIMIT"] = "clientRenderPixelLimit"; + VqlParameterNames["IN"] = "in"; + VqlParameterNames["INSTANCE_ID"] = ":iid"; + VqlParameterNames["IS_GUEST_REDIRECT_FROM_VIZPORTAL"] = ":isGuestRedirectFromVizportal"; + VqlParameterNames["IS_MARK_ANIMATION_ENABLED"] = "isMarkAnimationEnabled"; + VqlParameterNames["IS_VIZPORTAL"] = ":isVizPortal"; + VqlParameterNames["INPUT_"] = "input_string"; + VqlParameterNames["JSDEBUG"] = ":jsdebug"; + VqlParameterNames["JSON"] = "json"; + VqlParameterNames["JSON_ONLY"] = ":jsonOnly"; + VqlParameterNames["KEEPFILE"] = "keepfile"; + VqlParameterNames["KEY"] = "key"; + VqlParameterNames["LANGUAGE"] = "language"; + VqlParameterNames["LANGUAGE_REQUESTED"] = ":language"; + VqlParameterNames["LINKTARGET"] = ":linktarget"; + VqlParameterNames["LOAD_ORDER_ID"] = ":loadOrderID"; + VqlParameterNames["LOAD_NEWEST_REVISION"] = ":loadNewestRevision"; + VqlParameterNames["LOCAL_PATHS"] = ":localPaths"; + VqlParameterNames["LOCALE"] = "locale"; + VqlParameterNames["LOCATION_ID"] = "locationid"; + VqlParameterNames["LOCATION_TYPE"] = "locationtype"; + VqlParameterNames["WORKBOOK_LOCALE"] = "workbookLocale"; + VqlParameterNames["MAXROWS"] = "maxrows"; + VqlParameterNames["MAX_AGE"] = "maxAge"; + VqlParameterNames["MAX_ROWS"] = "maxRows"; + VqlParameterNames["METHOD"] = "method"; + VqlParameterNames["MOBILE"] = "mobile"; + VqlParameterNames["MODIFIER"] = "modifier"; + VqlParameterNames["NAME"] = "name"; + VqlParameterNames["NAV_TYPE"] = "navType"; + VqlParameterNames["NAV_SRC"] = "navSrc"; + VqlParameterNames["NOATTACHMENT"] = "no-attachment"; + VqlParameterNames["NO_OVERWRITE"] = "no_overwrite"; + VqlParameterNames["OPEN_AUTHORING_IN_TOP_WINDOW"] = ":openAuthoringInTopWindow"; + VqlParameterNames["OPENID_HD"] = ":openid_hd"; + VqlParameterNames["OPENID_LOGIN_HINT"] = ":openid_login_hint"; + VqlParameterNames["OAUTHREQUEST"] = "oauthrequest"; + VqlParameterNames["OAUTH_CREDENTIAL_IDS"] = "oauth_credential_ids"; + VqlParameterNames["OFFLINE_MODE"] = ":offlinemode"; + VqlParameterNames["ORIGIN"] = ":origin"; + VqlParameterNames["OVERLAY"] = ":overlay"; + VqlParameterNames["P"] = "p"; + VqlParameterNames["PATH"] = "path"; + VqlParameterNames["PANE_RESOLVER_X"] = "paneResolverX"; + VqlParameterNames["PANE_RESOLVER_Y"] = "paneResolverY"; + VqlParameterNames["PARAM"] = "param"; + VqlParameterNames["PARENT_ID"] = "parent_id"; + VqlParameterNames["PASSWORD"] = "password"; + VqlParameterNames["PATTERN"] = "pattern"; + VqlParameterNames["PIXEL_RATIO"] = ":pixelratio"; + VqlParameterNames["PREFIX"] = ":prefix"; + VqlParameterNames["PREVIEW"] = ":preview"; + VqlParameterNames["PRIMARY_CONTENT_URL"] = "primary_content_url"; + VqlParameterNames["PROJECT"] = "project"; + VqlParameterNames["PROTOCOL"] = "protocol"; + VqlParameterNames["PSEUDO"] = ":pseudo"; + VqlParameterNames["QUERY"] = "query"; + VqlParameterNames["R"] = "r"; + VqlParameterNames["RANGE_TYPE"] = "range_type"; + VqlParameterNames["RECORD_SEP"] = "record_sep"; + VqlParameterNames["RECORD_CLIENT_PERFORMANCE"] = ":record_client_performance"; + VqlParameterNames["RECORD_PERFORMANCE"] = ":record_performance"; + VqlParameterNames["RECOVER_OLD_SESSION_ID"] = ":recover_old_session_id"; + VqlParameterNames["RECOVER_SESSION_STATE_TICKETS"] = ":recover_session_state_tickets"; + VqlParameterNames["REFRESH"] = ":refresh"; + VqlParameterNames["REFRESHUNMODIFIED"] = ":refreshunmodified"; + VqlParameterNames["REGION"] = "region"; + VqlParameterNames["RELOAD_ON_CUSTOM_VIEW_SAVE"] = ":reloadOnCustomViewSave"; + VqlParameterNames["RENDER"] = ":render"; + VqlParameterNames["RENDER_MAPS_CLIENT_SIDE"] = "renderMapsClientSide"; + VqlParameterNames["RETRY"] = ":retry"; + VqlParameterNames["REUSE"] = "reuse"; + VqlParameterNames["REUSE_FOREVER"] = "reuse_forever"; + VqlParameterNames["REVERT"] = ":revert"; + VqlParameterNames["SAVE_DB_PASSWORDS"] = "save_db_passwords"; + VqlParameterNames["SELECT_X"] = "select_x"; + VqlParameterNames["SELECT_Y"] = "select_y"; + VqlParameterNames["SESSION_FEATURE_PREFIX"] = ":ff_"; + VqlParameterNames["SESSION_FLAGS"] = ":session_feature_flags"; + VqlParameterNames["SHARE_BUTTON"] = "share_button"; + VqlParameterNames["SHEET_ID"] = "sheet_id"; + VqlParameterNames["SHARED"] = "shared"; + VqlParameterNames["SHOWALL"] = "showall"; + VqlParameterNames["SHOW_APP_BANNER"] = ":showAppBanner"; + VqlParameterNames["SHOW_ASK_DATA"] = ":showAskData"; + VqlParameterNames["SHOW_PARAMS"] = "showParams"; + VqlParameterNames["SHOW_SHARE_OPTIONS"] = ":showShareOptions"; + VqlParameterNames["SIZE"] = ":size"; + VqlParameterNames["SOURCE"] = "source"; + VqlParameterNames["STATE"] = "state"; + VqlParameterNames["STICKY_SESSION_KEY"] = "stickySessionKey"; + VqlParameterNames["SUBSCRIPTIONS"] = ":subscriptions"; + VqlParameterNames["SUMMARY"] = "summary"; + VqlParameterNames["SUPPRESS_DEFAULT_EDIT_BEHAVIOR"] = ":suppressDefaultEditBehavior"; + VqlParameterNames["SYNC_SESSION"] = ":sync_session"; + VqlParameterNames["SYNC_SESSION_STATE"] = "sync_session_state"; + VqlParameterNames["TABS"] = ":tabs"; + VqlParameterNames["TARGET"] = "target"; + VqlParameterNames["TARGET_SITE"] = "target_site"; + VqlParameterNames["TOOLBAR"] = ":toolbar"; + VqlParameterNames["TOOLTIP"] = ":tooltip"; + VqlParameterNames["TS"] = "ts"; + VqlParameterNames["UNDERLYING_TABLE_ID"] = "underlying_table_id"; + VqlParameterNames["UNDERLYING_TABLE_CAPTION"] = "underlying_table_caption"; + VqlParameterNames["UPDATE_TYPE"] = "update_type"; + VqlParameterNames["USE_GUEST"] = ":useGuest"; + VqlParameterNames["USE_INLINE_IMAGES"] = "use_inline_images"; + VqlParameterNames["USERAGENT"] = "useragent"; + VqlParameterNames["USERNAME"] = "username"; + VqlParameterNames["VALUE"] = "value"; + VqlParameterNames["VERBOSE_MODE"] = "verboseMode"; + VqlParameterNames["VIEW_ID"] = "views_id"; + VqlParameterNames["VIZ_SNAPSHOT_ID"] = "viz_snapshot_id"; + VqlParameterNames["VW"] = ":vw"; + VqlParameterNames["W"] = "w"; + VqlParameterNames["WORKSHEET_PORT_SIZE"] = "worksheetPortSize"; + VqlParameterNames["WATERMARK"] = "watermark"; + VqlParameterNames["WATERMARK_MARGIN"] = ":watermark_margin"; + VqlParameterNames["WB"] = ":wb"; + VqlParameterNames["WHICH"] = "which"; + VqlParameterNames["X"] = "x"; + VqlParameterNames["Y"] = "y"; + VqlParameterNames["ZID"] = "zid"; + VqlParameterNames["ZONE_ID"] = "zone_id"; + VqlParameterNames["KEYCHAIN_VERSION"] = "keychain_version"; + VqlParameterNames["DATASOURCE_ID"] = "datasource_id"; + VqlParameterNames["DATASOURCE_NAME"] = "datasource_name"; + VqlParameterNames["LENS_ID"] = "lens_id"; + VqlParameterNames["WIDTH"] = "width"; + VqlParameterNames["HEIGHT"] = "height"; + // Default Layout params + VqlParameterNames["LAYOUT_VIEWS"] = "views"; + VqlParameterNames["LAYOUT_MENUS"] = "menus"; + VqlParameterNames["LAYOUT_GEOMETRY"] = "geometry"; + VqlParameterNames["LAYOUT_PAGES"] = "pages"; + VqlParameterNames["LAYOUT_CACHEURL"] = "cacheurl"; + VqlParameterNames["LAYOUT_SHEET"] = "sheet"; + VqlParameterNames["LAYOUT_DEPTH"] = "depth"; +})(VqlParameterNames || (VqlParameterNames = {})); +/** + * parameters that are only relevant when working with Tableau Public + * maybe not really necessry to split them out + */ +var PublicParameterNames; +(function (PublicParameterNames) { + PublicParameterNames["SHOW_VIZ_HOME"] = ":showVizHome"; + // display view count +})(PublicParameterNames || (PublicParameterNames = {})); +/** + * Map the parameter names as used in the url to what we call them publicly in the embedding library. + * The only parameters listed here should be the ones that get sent to vizql + * - this should match the interface at external-contract:VizInterfaces:VizSettings + */ +var VizOptionNames; +(function (VizOptionNames) { + // publicName = internalStringValue + VizOptionNames["Size"] = ":size"; + VizOptionNames["Embed"] = ":embed"; + VizOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + VizOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; + VizOptionNames["ShowVizHome"] = ":showVizHome"; + VizOptionNames["Jsdebug"] = ":jsdebug"; + VizOptionNames["BootstrapWhenNotified"] = ":bootstrapWhenNotified"; + VizOptionNames["NavType"] = "navType"; + VizOptionNames["NavSrc"] = "navSrc"; + VizOptionNames["debug"] = ":jsdebug"; + VizOptionNames["ApiID"] = ":apiID"; + VizOptionNames["disableUrlActionsPopups"] = ":disableUrlActionsPopups"; + VizOptionNames["hideTabs"] = ":tabs"; + VizOptionNames["toolbar"] = ":toolbar"; + VizOptionNames["device"] = ":device"; + VizOptionNames["instanceIdToClone"] = ":iid"; + VizOptionNames["touchOptimize"] = "mobile"; + VizOptionNames["hideEditButton"] = ":hideEditButton"; + VizOptionNames["hideEditInDesktopButton"] = ":hideEditInDesktopButton"; + VizOptionNames["suppressDefaultEditBehavior"] = ":suppressDefaultEditBehavior"; + VizOptionNames["hideCloseButton"] = ":hideCloseButton"; +})(VizOptionNames = exports.VizOptionNames || (exports.VizOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js": +/*!****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +var JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var CrossFramePreparedMessage_1 = __webpack_require__(/*! ./CrossFramePreparedMessage */ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js"); +var MessageTypeChecks_1 = __webpack_require__(/*! ./MessageTypeChecks */ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js"); +var MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +/** + * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of + * this class can be instantiated on both sides of a frame boundary to facilitate communication + * in both directions between the frames. This class implements both the dispatcher and the listener + * portions, but doesn't require callers to care about both. + */ +var CrossFrameMessenger = /** @class */ (function () { + /** + * 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) + */ + function CrossFrameMessenger(thisWindow, otherWindow, otherWindowOrigin) { + this.thisWindow = thisWindow; + this.otherWindow = otherWindow; + this.otherWindowOrigin = otherWindowOrigin; + // Make sure to call StartListening + } + ///// MessageListener Implementation + CrossFrameMessenger.prototype.startListening = function () { + var _this = this; + // Check if we already are listening, if not, hook up a message listener + if (!this.unregisterFunction) { + var boundHandler_1 = this.onMessageReceived.bind(this); + this.thisWindow.addEventListener('message', boundHandler_1, true); + this.unregisterFunction = function () { return _this.thisWindow.removeEventListener('message', boundHandler_1, true); }; + } + }; + CrossFrameMessenger.prototype.stopListening = function () { + // Stop listening if we have started listening + if (this.unregisterFunction) { + this.unregisterFunction(); + this.unregisterFunction = undefined; + } + }; + CrossFrameMessenger.prototype.setInitializeMessageHandler = function (handler) { + this.initializeMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setCommandResponseMessageHandler = function (handler) { + this.commandResponseMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setCommandMessageHandler = function (handler) { + this.commandMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setNotificationMessageHandler = function (handler) { + this.notificationMessageHandler = handler; + }; + CrossFrameMessenger.prototype.setHandshakeMessageHandler = function (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) + */ + CrossFrameMessenger.prototype.prepareInitializationMessage = function (apiVersion, crossFrameVersion, options) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Initialize, + crossFrameVersion: crossFrameVersion, + apiVersion: apiVersion, + options: options, + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareCommandMessage = function (verbId, parameters) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Command, + verbId: verbId, + parameters: parameters, + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareCommandResponseMessage = function (commandGuid, data, error) { + var message = { + 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); + }; + CrossFrameMessenger.prototype.prepareNotificationMessage = function (notificationId, data) { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Notification, + notificationId: notificationId, + data: data, + }; + return this.prepareMessage(message); + }; + CrossFrameMessenger.prototype.prepareAckMessage = function () { + var message = { + msgGuid: guid.raw(), + msgType: MessageTypes_1.MessageType.Ack, + platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION, + }; + return this.prepareMessage(message); + }; + /** + * Prepares a pending message for sending and returns the prepared message + * + * @param msg The message to be sent to this.otherWindow + * @returns The prepared message + */ + CrossFrameMessenger.prototype.prepareMessage = function (msg) { + if (!this.otherWindow || !this.otherWindowOrigin) { + throw 'Other window not initialized, cannot dispatch messages'; + } + var preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin); + return preparedMessage; + }; + /** + * Called when a message is received. Does some validation of the message, and then + * calls an appropriate message handler if one is defined + * + * @param event The incoming MessageEvent + */ + CrossFrameMessenger.prototype.onMessageReceived = function (event) { + // 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; + } + var message = event.data; + if (!MessageTypeChecks_1.isMessage(message)) { + return; + } + // Check the declared message type, validate the message, and call an appropriate hander if one exists + switch (message.msgType) { + case MessageTypes_1.MessageType.Initialize: { + if (!MessageTypeChecks_1.isInitMessage(message) || !this.initializeMessageHandler) { + return; + } + this.initializeMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.CommandResponse: { + if (!MessageTypeChecks_1.isCommandResponseMessage(message) || !this.commandResponseMessageHandler) { + return; + } + this.commandResponseMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Command: { + if (!MessageTypeChecks_1.isCommandMessage(message) || !this.commandMessageHandler) { + return; + } + this.commandMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Notification: { + if (!MessageTypeChecks_1.isNotificationMessage(message) || !this.notificationMessageHandler) { + return; + } + this.notificationMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Handshake: { + if (!MessageTypeChecks_1.isHandshakeMessage(message) || !this.handshakeMessageHandler) { + return; + } + this.handshakeMessageHandler(message, event.source); + break; + } + default: + // Just ignore this since we don't know how to handle the message type + } + }; + CrossFrameMessenger.prototype.setOtherWindow = function (otherWindow) { + this.otherWindow = otherWindow; + }; + CrossFrameMessenger.prototype.setOtherWindowOrigin = function (origin) { + this.otherWindowOrigin = origin; + }; + return CrossFrameMessenger; +}()); +exports.CrossFrameMessenger = CrossFrameMessenger; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the PreparedMessage interface used to post messages between + * two frames using window.postMessage + */ +var CrossFramePreparedMessage = /** @class */ (function () { + /** + * Creates an instance of CrossFramePreparedMessage. + * @param _message The message to be sent + * @param _target The target window where the message will be sent + * @param _origin The targetOrigin where this message can be received + */ + function CrossFramePreparedMessage(_message, _target, _origin) { + this._message = _message; + this._target = _target; + this._origin = _origin; + } + Object.defineProperty(CrossFramePreparedMessage.prototype, "messageGuid", { + get: function () { + return this._message.msgGuid; + }, + enumerable: true, + configurable: true + }); + CrossFramePreparedMessage.prototype.send = function () { + this._target.postMessage(this._message, this._origin); + return this; + }; + return CrossFramePreparedMessage; +}()); +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 })); +var guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +var Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); +var MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +var expectedEmptyNotifications = new Set([ + 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; + } + var message = data; + if (!message || !message.msgGuid || !message.msgType) { + return false; + } + if (!guid.isGuid(message.msgGuid)) { + return false; + } + if (typeof message.msgType !== 'string') { + return false; + } + var messageTypes = [ + MessageTypes_1.MessageType.Command, + MessageTypes_1.MessageType.CommandResponse, + MessageTypes_1.MessageType.Initialize, + MessageTypes_1.MessageType.Notification, + MessageTypes_1.MessageType.Handshake, + ]; + if (messageTypes.indexOf(message.msgType) < 0) { + return false; + } + return true; +} +exports.isMessage = isMessage; +function isVersion(versionNumber) { + if (!versionNumber) { + return false; + } + var v = versionNumber; + if (typeof v !== 'object') { + return false; + } + if (typeof v.fix !== 'number' || typeof v.minor !== 'number' || typeof v.major !== 'number') { + return false; + } + return true; +} +exports.isVersion = isVersion; +function isInitMessage(message) { + if (!isMessage(message)) { + return false; + } + var initMessage = message; + if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) { + return false; + } + if (!initMessage.apiVersion || !isVersion(initMessage.apiVersion)) { + return false; + } + if (!initMessage.crossFrameVersion || !isVersion(initMessage.crossFrameVersion)) { + return false; + } + return true; +} +exports.isInitMessage = isInitMessage; +function isCommandResponseMessage(message) { + if (!isMessage(message)) { + return false; + } + var crMessage = message; + if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) { + return false; + } + if (!guid.isGuid(crMessage.commandGuid)) { + return false; + } + if (!crMessage.data && !crMessage.error) { + return false; + } + return true; +} +exports.isCommandResponseMessage = isCommandResponseMessage; +function isCommandMessage(message) { + if (!isMessage(message)) { + return false; + } + var commandMessage = message; + if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) { + return false; + } + if (!commandMessage.parameters || typeof commandMessage.parameters !== 'object') { + return false; + } + if (!commandMessage.verbId || typeof commandMessage.verbId !== 'string') { + return false; + } + return true; +} +exports.isCommandMessage = isCommandMessage; +function isNotificationMessage(message) { + if (!isMessage(message)) { + return false; + } + var notificationMessage = message; + if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) { + return false; + } + if (!notificationMessage.data && !expectedEmptyNotifications.has(notificationMessage.notificationId)) { + return false; + } + if (!notificationMessage.notificationId || typeof notificationMessage.notificationId !== 'string') { + return false; + } + return true; +} +exports.isNotificationMessage = isNotificationMessage; +function isHandshakeMessage(message) { + if (!isMessage(message)) { + return false; + } + var handshakeMessage = message; + if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) { + return false; + } + return true; +} +exports.isHandshakeMessage = isHandshakeMessage; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js": +/*!*******************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Enum defining the 4 different types of messages we have defined + */ +var MessageType; +(function (MessageType) { + MessageType["Initialize"] = "initialize"; + MessageType["Notification"] = "notification"; + MessageType["Command"] = "command"; + MessageType["CommandResponse"] = "command-response"; + MessageType["Handshake"] = "v-handshake"; + MessageType["Ack"] = "v-ack"; +})(MessageType = exports.MessageType || (exports.MessageType = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and internal version number + */ +var IdentityVersionConverter = /** @class */ (function () { + function IdentityVersionConverter() { + } + IdentityVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) { + return { + verb: verb, + parameters: parameters, + }; + }; + IdentityVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) { + return executeResponse; + }; + IdentityVersionConverter.prototype.downgradeNotification = function (notification) { + return notification; + }; + return IdentityVersionConverter; +}()); +exports.IdentityVersionConverter = IdentityVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. The only + * mode it supports is external's version <= platform's version. When executing + * commands, it is used to upgrade the external representation to what platform knows on the way in + * and downgrade the representations on the way out. Similarly for notifications, it can + * downgrade those on the way from platform to external. + */ +var StackingVersionConverter = /** @class */ (function () { + /** + * 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 + */ + function StackingVersionConverter(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) { + this._externalMajorVersion = _externalMajorVersion; + this._platformMajorVersion = _platformMajorVersion; + this._upgradeExecuteTranslations = _upgradeExecuteTranslations; + this._downgradeExecuteTranslations = _downgradeExecuteTranslations; + this._downgradeNotificationTranslations = _downgradeNotificationTranslations; + if (this._externalMajorVersion > this._platformMajorVersion) { + throw new Error("Cannot convert between external version " + this._externalMajorVersion + " and " + this._platformMajorVersion); + } + } + /** + * Creates a new instance of the StackingVersionConverter + * + * @param _externalVersion The version of the internal contract api-external-js is using + * @param _platformVersion The version of the internal contract the api-platform-js is using + * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters + * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd + * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification + */ + StackingVersionConverter.fromData = function (externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) { + return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations); + }; + StackingVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) { + // Perform the upgrade of the verb and parameters to the level that platform is using + var upgraded = { verb: verb, parameters: parameters }; + for (var _i = 0, _a = this._upgradeExecuteTranslations; _i < _a.length; _i++) { + var upgradeTranslation = _a[_i]; + upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters); + } + return upgraded; + }; + StackingVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) { + // Downgrade the response to what the external module is expecting + var downgraded = executeResponse; + for (var _i = 0, _a = this._downgradeExecuteTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + }; + StackingVersionConverter.prototype.downgradeNotification = function (notification) { + // Downgrade the notification to what the external module is expecting + var downgraded = notification; + for (var _i = 0, _a = this._downgradeNotificationTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded); + } + return downgraded; + }; + return StackingVersionConverter; +}()); +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 })); +var IdentityVersionConverter_1 = __webpack_require__(/*! ./IdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js"); +var StackingVersionConverter_1 = __webpack_require__(/*! ./StackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js"); +var VersionTranslations_1 = __webpack_require__(/*! ./VersionTranslations */ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js"); +/** + * @returns true if lhs < rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionLessThan(lhs, rhs) { + if (lhs.major > rhs.major) { + return false; + } + if (lhs.major < rhs.major) { + return true; + } + return lhs.minor < rhs.minor; +} +exports.VersionLessThan = VersionLessThan; +/** + * @returns true if lhs == rhs (ignoring fix number) + * @param lhs + * @param rhs + */ +function VersionEqualTo(lhs, rhs) { + return lhs.major === rhs.major && lhs.minor === rhs.minor; +} +exports.VersionEqualTo = VersionEqualTo; +// A mapping from an older client version of internal-contract to the current platform version of this contract. +// Each version bump can have an array of translations to perform in order. Notice that this is +// different than the major upgrades/downgrades above because it handles both major and minor version changes. +// Also please note: downgradeExecuteCall is handled on the client/external side rather than platform side. +// When updating the major or minor version of our internal-contract, you will need to update these data structures. +// * If there are translations to add, add them to the version to "upgrade from" or "downgrade to". +exports.ExecuteMinorUpgrades = { + 1: { + 9: [], + }, +}; +exports.ExecuteMinorDowngrades = { + 1: { + 5: [VersionTranslations_1.DowngradeWorksheetNames], + 9: [], + }, +}; +exports.NotificationMinorDowngrades = { + 1: { + 9: [], + 10: [VersionTranslations_1.DowngradeFlipboardZoneID], + }, +}; +/** + * Creates a new InternalContractVersionConverter which has the ability to upgrade and downgrade the contract + * between the two versions, which are specified. If externalMajorVersion is greater than platformMajorVersion, + * an error will be thrown because we won't know how to do those conversions. + * This converter can handle both major and minor updates when the platform version is greater than external version. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateVersionConverter(externalVersion, platformVersion) { + return CreateVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorUpgrades, exports.ExecuteMinorDowngrades, exports.NotificationMinorDowngrades); +} +exports.CreateVersionConverter = CreateVersionConverter; +/** + * Implementation of CreateVersionConverter. This function takes the upgrade, downgrade, and + * notification arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + * @param upgrades MajorMinorTranslators for upgrades + * @param downgrades MajorMinorTranslators for downgrades + * @param notificationDowngrades MajorMinorTranslators for notification downgrades + */ +function CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) { + var externalMajorVersion = externalVersion.major; + var externalMinorVersion = externalVersion.minor; + var platformMajorVersion = platformVersion.major; + if (externalMajorVersion > platformMajorVersion) { + throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion=" + externalMajorVersion + " platformMajorVersion=" + platformMajorVersion); + } + // If we are using the exact same versions (major.minor), just use the identity converter + if (VersionEqualTo(externalVersion, platformVersion)) { + return new IdentityVersionConverter_1.IdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + var neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades); + var neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades); + var neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades); + // We want to apply the downgrades in reverse order in case of dependencies between them + neededExecuteDowngrades.reverse(); + neededNotificationDowngrades.reverse(); + return StackingVersionConverter_1.StackingVersionConverter.fromData(externalVersion, platformVersion, neededExecuteUpgrades, neededExecuteDowngrades, neededNotificationDowngrades); +} +exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; +function GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) { + var neededTranslations = []; + for (var major = externalMajorVersion; major <= platformMajorVersion; major++) { + if (major in majorMinorTranslators) { + var start = major === externalMajorVersion ? externalMinorVersion : 0; + var maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major])); + for (var minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[major]) { + neededTranslations.push.apply(neededTranslations, majorMinorTranslators[major][minor]); + } + } + } + } + return neededTranslations; +} +function GetMaximumMinorIndex(minorVersions) { + return minorVersions.map(function (a) { return Number(a); }).reduce(function (a, b) { return (a > b ? a : b); }); +} +exports.GetMaximumMinorIndex = GetMaximumMinorIndex; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js": +/*!*****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/VersionTranslations.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var 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. + var bootstrapInfo = executeResponse.result; + if (bootstrapInfo.extensionDashboardInfo !== undefined) { + bootstrapInfo.extensionDashboardInfo.zones.forEach(function (zone) { + if (zone.sheetInfo) { + zone.name = zone.sheetInfo.name; + } + }); + } + return executeResponse; +} +exports.DowngradeWorksheetNames = DowngradeWorksheetNames; +function DowngradeFlipboardZoneID(notification) { + // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs. + // When running against a newer server, if flipboardZoneId is absent, set it to default(0). + if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) { + var visualModel = notification.data; + if (visualModel.flipboardZoneID === undefined) { + visualModel.flipboardZoneID = 0; + } + } + return notification; +} +exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * This version converter doesn't actually do anything but is useful for testing or when we have + * a matching platform and external version number + */ +var ExternalIdentityVersionConverter = /** @class */ (function () { + function ExternalIdentityVersionConverter() { + } + ExternalIdentityVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) { + return { + verb: verb, + parameters: parameters, + }; + }; + ExternalIdentityVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) { + return executeResponse; + }; + ExternalIdentityVersionConverter.prototype.upgradeNotification = function (notification) { + return notification; + }; + return ExternalIdentityVersionConverter; +}()); +exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +// tslint:disable:no-any +/** + * The version converter is designed to allow the platform and external modules + * to seemlessly communicate over two different versions of the internal API. This converter + * supports external's version(minor) >= platform's version(minor). When executing + * commands, it is used to downgrade the external representation to what platform knows on the way in + * and upgrade the representations on the way out. + */ +var ExternalStackingVersionConverter = /** @class */ (function () { + /** + * 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 + */ + function ExternalStackingVersionConverter(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) { + this._externalVersion = _externalVersion; + this._platformVersion = _platformVersion; + this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations; + this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations; + this._upgradeNotificationTranslations = _upgradeNotificationTranslations; + if (this._externalVersion.major > this._platformVersion.major) { + throw new Error("Cannot convert between external version " + this._externalVersion.major + "\n and " + this._platformVersion.major); + } + } + ExternalStackingVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) { + // Perform the downgrade of the verb and parameters to the level that platform is using + var downgraded = { verb: verb, parameters: parameters }; + for (var _i = 0, _a = this._downgradeExecuteCallTranslations; _i < _a.length; _i++) { + var downgradeTranslation = _a[_i]; + downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters); + } + return downgraded; + }; + ExternalStackingVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) { + // Perform the upgrade of the response to what the external module is expecting + var upgraded = executeResponse; + for (var _i = 0, _a = this._upgradeExecuteReturnTranslations; _i < _a.length; _i++) { + var upgradeTranslation = _a[_i]; + upgraded = upgradeTranslation(upgraded, verb, parameters); + } + return upgraded; + }; + ExternalStackingVersionConverter.prototype.upgradeNotification = function (notification) { + // Perform the upgrade of notification to what the external module is expecting + var upgraded = notification; + for (var _i = 0, _a = this._upgradeNotificationTranslations; _i < _a.length; _i++) { + var upgradeNotification = _a[_i]; + upgraded = upgradeNotification(upgraded); + } + return upgraded; + }; + return ExternalStackingVersionConverter; +}()); +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 })); +var VersionConverterFactory_1 = __webpack_require__(/*! ../VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"); +var ExternalIdentityVersionConverter_1 = __webpack_require__(/*! ./ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"); +var ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalStackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js"); +var ExternalVersionTranslations_1 = __webpack_require__(/*! ./ExternalVersionTranslations */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js"); +// 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: [], + 13: [ExternalVersionTranslations_1.DowngradeUnderlyingTableDataAsync, ExternalVersionTranslations_1.DowngradeLogicalTableDataAsync], + }, +}; +exports.ExecuteMinorUpgradeReturnExternal = { + 1: { + 9: [ExternalVersionTranslations_1.UpgradeDataTableTypes], + 29: [ExternalVersionTranslations_1.UpgradeDataTableRowsAndColumns], + }, +}; +exports.ExecuteMinorUpgradeNotification = { + 1: { + 9: [], + }, +}; +/** + * Creates a new ExternalContractVersionConverter which has the ability to upgrade and downgrade + * the contract between the two versions which are specified. If externalMajorVersion is less than + * platformMajorVersion, an ExternalIdentityVersionConverter will be returned. + * Handles upgrade/downgrade for both major and minor updates. + * + * @param externalVersion VersionNumber of the internal api which the external module is using + * @param platformVersion VersionNumber of the internal api which the platform is using + */ +function CreateExternalCompatibleVersionConverter(externalVersion, platformVersion) { + return CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorDowngradeCallExternal, exports.ExecuteMinorUpgradeReturnExternal, exports.ExecuteMinorUpgradeNotification); +} +exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter; +/** + * Implementation of CreateExternalCompatibleVersionConverterWithTranslators. + * This function takes the upgrade, downgrade arrays so that all the logic can be tested. + * + * @param externalVersion VersionNumber of the internal contract which the external module is using + * @param platformVersion VersionNumber of the internal contract which the platform is using + * @param upgrades MajorMinorTranslators for response upgrades + * @param downgrades MajorMinorTranslators for execute call downgrades + */ +function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) { + var externalMajorVersion = externalVersion.major; + var platformMajorVersion = platformVersion.major; + var platformMinorVersion = platformVersion.minor; + // This check is present in VersionConverterFactory. We throw the same error here as well. + // Hence we only need to check the minor versions for translations. + if (externalMajorVersion > platformMajorVersion) { + throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion=" + externalMajorVersion + " platformMajorVersion=" + platformMajorVersion); + } + if (externalMajorVersion < platformMajorVersion || VersionConverterFactory_1.VersionEqualTo(externalVersion, platformVersion)) { + return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter(); + } + // Walk the span between the versions we have here and collect the upgrade and downgrades necessary + var neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades); + var neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades); + var neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications); + // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version + neededExecuteCallDowngrade.reverse(); + return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades); +} +exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; +function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) { + var neededTranslations = []; + if (platformMajorVersion in majorMinorTranslators) { + var start = platformMinorVersion; + var maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion])); + for (var minor = start; minor <= maximumMinorVersion; minor++) { + if (minor in majorMinorTranslators[platformMajorVersion]) { + neededTranslations.push.apply(neededTranslations, majorMinorTranslators[platformMajorVersion][minor]); + } + } + } + return neededTranslations; +} + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js": +/*!**********************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js ***! + \**********************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var JsApiInternalContract_1 = __webpack_require__(/*! ../../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +// 1.2 -> 1.0 Translations +// Uncomment this line to import from the V1 definition of the API +// import * as V1 from '@tableau-api-internal-contract-js_v1'; +/** + * Prior to 2019.2 (internal-contract v1.9), DataValue.value were all strings. + * Go through all DataValue objects. If we have a string, but the type should not be a string, + * convert it to the correct type. The type of DataValue.value is 'any' in the contract, so + * this change doesn't need any updates to classes or types. + */ +function UpgradeDataTableTypes(executeResponse, verb, parameters) { + if (!executeResponse) { + return executeResponse; + } + var oldUnderlyingDataTable = executeResponse.result; + if (oldUnderlyingDataTable.data !== undefined && oldUnderlyingDataTable.isSummary !== undefined) { + convertDataValues(oldUnderlyingDataTable.data); + return executeResponse; + } + var oldSelectedMarksTable = executeResponse.result; + if (oldSelectedMarksTable.data !== undefined && Array.isArray(oldSelectedMarksTable.data)) { + oldSelectedMarksTable.data.forEach(function (marksTable) { + convertDataValues(marksTable); + }); + return executeResponse; + } + return executeResponse; +} +exports.UpgradeDataTableTypes = UpgradeDataTableTypes; +/** + * Prior to 2020.2 (internal-contract v1.13 and older), worksheet.getUnderlyingTableDataAsync doesn't exist. + * Map it to the older GetUnderlyingData verb and validate the the logical table Id. + **/ +function DowngradeUnderlyingTableDataAsync(verb, parameters) { + if (verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData) { + validateParametersForObjectModel(verb, parameters); + verb = JsApiInternalContract_1.VerbId.GetUnderlyingData; + } + return { + verb: verb, + parameters: parameters, + }; +} +exports.DowngradeUnderlyingTableDataAsync = DowngradeUnderlyingTableDataAsync; +/** + * Prior to 2020.2 (internal-contract v1.13 and older), datasource.getLogicalTableDataAsync doesn't exist. + * Map it to the older GetDataSourceData verb and validate the the logical table Id. + **/ +function DowngradeLogicalTableDataAsync(verb, parameters) { + if (verb === JsApiInternalContract_1.VerbId.GetLogicalTableData) { + validateParametersForObjectModel(verb, parameters); + verb = JsApiInternalContract_1.VerbId.GetDataSourceData; + } + return { + verb: verb, + parameters: parameters, + }; +} +exports.DowngradeLogicalTableDataAsync = DowngradeLogicalTableDataAsync; +function convertDataValues(table) { + // dataTable is a two-dimensional array of data. First index is the row, second is the column. + if (table === undefined || table.dataTable === undefined || !Array.isArray(table.dataTable)) { + return; + } + table.dataTable.forEach(function (row) { + row.forEach(function (dataValue, columnIndex) { + var value = dataValue.value; + if (value !== null) { + dataValue.value = JsApiInternalContract_1.DataTypeConverter.convertValueAsStringToValue(value, table.headers[columnIndex].dataType); + } + }); + }); +} +// ToDo: TFS1069027 Refactor input verbs & parameters in api-internal-contract Upgrade/Downgrade framework +function validateParametersForObjectModel(verb, parameters) { + if (parameters[JsApiInternalContract_1.ParameterId.LogicalTableId] !== JsApiInternalContract_1.ApiShowDataTableSentinel.SingleTableId) { + throw new Error("Invalid logical table id passed to " + verb + "."); + } +} +/** + * Prior to 2021.2 (internal-contract v1.29 and below), getSummaryDataAsync did not support maxRows, + * and any get...DataAsync did not support columnsToIncludeById. + * Trim result to maxRows if it is included in the parameters for getSummaryDataAsync + * Trim columns to columnsToInclude if included in the parameters for any get...DataAsync + */ +function UpgradeDataTableRowsAndColumns(executeResponse, verb, parameters) { + if (isGetSummaryDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.MaxRows]) { + executeResponse = adjustDataRowLength(executeResponse, parameters[JsApiInternalContract_1.ParameterId.MaxRows]); + } + if (isGetTableDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]) { + executeResponse = adjustDataColumns(executeResponse, parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]); + } + return executeResponse; +} +exports.UpgradeDataTableRowsAndColumns = UpgradeDataTableRowsAndColumns; +function isGetSummaryDataVerb(verb) { + return verb === JsApiInternalContract_1.VerbId.GetDataSummaryData; +} +function isGetTableDataVerb(verb) { + return (verb === JsApiInternalContract_1.VerbId.GetDataSummaryData || + verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData || + verb === JsApiInternalContract_1.VerbId.GetLogicalTableData || + verb === JsApiInternalContract_1.VerbId.GetDataSourceData || + verb === JsApiInternalContract_1.VerbId.GetUnderlyingData); +} +function adjustDataRowLength(executeResponse, maxRows) { + var underlyingDataTable = executeResponse.result; + if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable)) { + return executeResponse; + } + if (maxRows > 0 && maxRows < underlyingDataTable.data.dataTable.length) { + underlyingDataTable.data.dataTable.length = maxRows; + } + return executeResponse; +} +function adjustDataColumns(executeResponse, columnsToInclude) { + if (columnsToInclude.length === 0) { + return executeResponse; + } + // verify that we have a valid UnderlyingDataTable + var underlyingDataTable = executeResponse.result; + if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable) || !Array.isArray(underlyingDataTable.data.headers)) { + return executeResponse; + } + // 1. filter the headers to only columnsToInclude + // 2. use the new headers to filter all rows + // 3. update the indices in our new headers + var newHeaders = underlyingDataTable.data.headers.filter(function (header, index) { + return columnsToInclude.find(function (name) { return name === header.fieldName; }); + }); + underlyingDataTable.data.dataTable.forEach(function (row, index) { + underlyingDataTable.data.dataTable[index] = row.filter(function (value, valueIndex) { return newHeaders.findIndex(function (header) { return header.index === valueIndex; }) !== -1; }); + }); + var newIndex = 0; + underlyingDataTable.data.headers = newHeaders.map(function (header) { + header.index = newIndex++; + return header; + }); + return executeResponse; +} + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared.js": +/*!*********************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared.js ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +// Export everything which had been previously in the api-shared module +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ApiVersion_1 = __webpack_require__(/*! ./ApiShared/ApiVersion */ "../api-shared-js/lib/src/ApiShared/ApiVersion.js"); +exports.ApiVersion = ApiVersion_1.ApiVersion; +__export(__webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameBootstrap */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js")); +var CrossFrameDispatcher_1 = __webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +exports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher; +var DataSource_1 = __webpack_require__(/*! ./ApiShared/DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +exports.DataSource = DataSource_1.DataSource; +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings; +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; +var EventListenerManager_1 = __webpack_require__(/*! ./ApiShared/EventListenerManager */ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); +exports.EventListenerManager = EventListenerManager_1.EventListenerManager; +var Field_1 = __webpack_require__(/*! ./ApiShared/Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +exports.Field = Field_1.Field; +var CustomViewImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +exports.CustomViewImpl = CustomViewImpl_1.CustomViewImpl; +var DashboardImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +exports.DashboardImpl = DashboardImpl_1.DashboardImpl; +var DashboardObjectImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +exports.DashboardObjectImpl = DashboardObjectImpl_1.DashboardObjectImpl; +var DataSourceImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +exports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl; +var ParameterImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +exports.ParameterImpl = ParameterImpl_1.ParameterImpl; +var SheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +exports.SheetImpl = SheetImpl_1.SheetImpl; +var SheetInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +exports.SheetInfoImpl = SheetInfoImpl_1.SheetInfoImpl; +var SingleEventManagerImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SingleEventManagerImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); +exports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl; +var StoryImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js"); +exports.StoryImpl = StoryImpl_1.StoryImpl; +var StoryPointImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +exports.StoryPointImpl = StoryPointImpl_1.StoryPointImpl; +var StoryPointInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +exports.StoryPointInfoImpl = StoryPointInfoImpl_1.StoryPointInfoImpl; +var WorkbookImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorkbookImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js"); +exports.WorkbookImpl = WorkbookImpl_1.WorkbookImpl; +var WorksheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +exports.WorksheetImpl = WorksheetImpl_1.WorksheetImpl; +var Point_1 = __webpack_require__(/*! ./ApiShared/Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +exports.Point = Point_1.Point; +__export(__webpack_require__(/*! ./ApiShared/Services/RegisterAllSharedServices */ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js")); +__export(__webpack_require__(/*! ./ApiShared/Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js")); +var ClientInfoServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ClientInfoServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js"); +exports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl; +var NotificationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +exports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl; +var NotificationServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +exports.NotificationServiceImplBase = NotificationServiceImplBase_1.NotificationServiceImplBase; +exports.Registration = NotificationServiceImplBase_1.Registration; +var ServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +exports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase; +var SizeServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +exports.SizeServiceImpl = SizeServiceImpl_1.SizeServiceImpl; +var StoryActivationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/StoryActivationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js"); +exports.StoryActivationServiceImpl = StoryActivationServiceImpl_1.StoryActivationServiceImpl; +var TableauError_1 = __webpack_require__(/*! ./ApiShared/TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +exports.TableauError = TableauError_1.TableauError; +var Deferred_1 = __webpack_require__(/*! ./ApiShared/Utils/Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +exports.Deferred = Deferred_1.Deferred; +var ErrorHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +exports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers; +var ExportHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +exports.ExportHelpers = ExportHelpers_1.ExportHelpers; +var SheetUtils_1 = __webpack_require__(/*! ./ApiShared/Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +exports.SheetUtils = SheetUtils_1.SheetUtils; +var VersionNumber_1 = __webpack_require__(/*! ./ApiShared/VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +exports.VersionNumber = VersionNumber_1.VersionNumber; +var VersionedExternalApiDispatcher_1 = __webpack_require__(/*! ./VersionedExternalApiDispatcher */ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js"); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/ApiVersion.js": +/*!********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/ApiVersion.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +/** + * This is the singleton wrapper of VersionNumber + */ +var ApiVersion = /** @class */ (function () { + function ApiVersion() { + } + Object.defineProperty(ApiVersion, "Instance", { + /** + * Gets the singleton instance of the version number. + */ + get: function () { + return ApiVersion._instance; + }, + enumerable: true, + configurable: true + }); + ApiVersion.SetVersionNumber = function (numString, isAlpha) { + ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha); + }; + return ApiVersion; +}()); +exports.ApiVersion = ApiVersion; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js": +/*!***************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/ConnectionSummary.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a connection summary. + * This does not follow the Impl pattern as it is just a property bag. + */ +var ConnectionSummary = /** @class */ (function () { + function ConnectionSummary(_connectionInfo) { + this._connectionInfo = _connectionInfo; + } + Object.defineProperty(ConnectionSummary.prototype, "name", { + get: function () { + return this._connectionInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "id", { + get: function () { + return this._connectionInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "serverURI", { + get: function () { + return this._connectionInfo.serverURI; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ConnectionSummary.prototype, "type", { + get: function () { + return this._connectionInfo.type; + }, + enumerable: true, + configurable: true + }); + return ConnectionSummary; +}()); +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 })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var CrossFrameDispatcher_1 = __webpack_require__(/*! ./CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +// 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(function (resolve, reject) { + var 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 + var messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*'); + // Prepare to send an initialization message to the parent frame + var initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options); + // 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. + var dispatcherFactory = function () { return new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger); }; + resolve(dispatcherFactory); + } + }); + // Now that our handlers are ready, start listening and send our initialization message + messenger.startListening(); + initializationMessage.send(); + }); +} +exports.doCrossFrameBootstrap = doCrossFrameBootstrap; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js": +/*!*****************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +/** + * This is an implementation of the InternalApiDispatcher interface which functions by passing messages + * across a frame boundary. This is usually between the code where our javscript library has been included + * by a 3rd party dev and another frame where Tableau server has content. + */ +var CrossFrameDispatcher = /** @class */ (function () { + /** + * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate + * @param _messenger an instantiated and listening messenger object + */ + function CrossFrameDispatcher(_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 + CrossFrameDispatcher.prototype.execute = function (verb, parameters) { + var _this = this; + // To execute a verb, we first prepare a command message and then define a promise. + var preparedMessage = this._messenger.prepareCommandMessage(verb, parameters); + var promise = new Promise(function (resolve, reject) { + // 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; + }; + CrossFrameDispatcher.prototype.registerNotificationHandler = function (handler) { + this._notificationHandlers.push(handler); + }; + CrossFrameDispatcher.prototype.unregisterNotificationHandler = function (handler) { + this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; }); + }; + ////// End InternalApiDispatcher implementation + CrossFrameDispatcher.prototype.onCommandResponse = function (response) { + // We got a command response, look through the pending promises and resolve + if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) { + return; // We don't have any reference to this command, just return + } + var pendingPromise = this._pendingPromises[response.commandGuid]; + // 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]; + }; + CrossFrameDispatcher.prototype.onNotification = function (notificationMessage) { + // Go through each notification handler we have registered and let them know a notification came in + for (var _i = 0, _a = this._notificationHandlers; _i < _a.length; _i++) { + var handler = _a[_i]; + 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. + } + } + }; + return CrossFrameDispatcher; +}()); +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 })); +var DataSource = /** @class */ (function () { + function DataSource(_dataSourceImpl) { + this._dataSourceImpl = _dataSourceImpl; + } + Object.defineProperty(DataSource.prototype, "name", { + get: function () { + return this._dataSourceImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "id", { + get: function () { + return this._dataSourceImpl.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "fields", { + get: function () { + return this._dataSourceImpl.fields; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "extractUpdateTime", { + get: function () { + return this._dataSourceImpl.extractUpdateTime; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "isExtract", { + get: function () { + return this._dataSourceImpl.isExtract; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSource.prototype, "isPublished", { + get: function () { + return this._dataSourceImpl.isPublished; + }, + enumerable: true, + configurable: true + }); + DataSource.prototype.publishedUrl = function () { + return this._dataSourceImpl.publishedUrl(); + }; + DataSource.prototype.refreshAsync = function () { + return this._dataSourceImpl.refreshAsync(); + }; + DataSource.prototype.getActiveTablesAsync = function () { + console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.'); + return this._dataSourceImpl.getActiveTablesAsync(); + }; + DataSource.prototype.getConnectionSummariesAsync = function () { + return this._dataSourceImpl.getConnectionSummariesAsync(); + }; + DataSource.prototype.getUnderlyingDataAsync = function (options) { + console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' + + 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.'); + return this._dataSourceImpl.getUnderlyingDataAsync(options); + }; + DataSource.prototype.getLogicalTablesAsync = function () { + return this._dataSourceImpl.getLogicalTablesAsync(); + }; + DataSource.prototype.getLogicalTableDataAsync = function (logicalTableId, options) { + return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options); + }; + DataSource.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options); + }; + return DataSource; +}()); +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"; + +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the external-api-contract to the enums used + * in the internal-api-contract, which developers code against. + */ +var ExternalToInternalEnumMappings = /** @class */ (function () { + function ExternalToInternalEnumMappings() { + } + ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter((_a = {}, + _a[api_external_contract_js_1.FilterDomainType.Relevant] = api_internal_contract_js_1.FilterDomainType.Relevant, + _a[api_external_contract_js_1.FilterDomainType.Database] = api_internal_contract_js_1.FilterDomainType.Database, + _a)); + ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter((_b = {}, + _b[api_external_contract_js_1.FilterNullOption.AllValues] = api_internal_contract_js_1.FilterNullOption.AllValues, + _b[api_external_contract_js_1.FilterNullOption.NonNullValues] = api_internal_contract_js_1.FilterNullOption.NonNullValues, + _b[api_external_contract_js_1.FilterNullOption.NullValues] = api_internal_contract_js_1.FilterNullOption.NullValues, + _b)); + ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_c = {}, + _c[api_external_contract_js_1.FilterUpdateType.Add] = api_internal_contract_js_1.FilterUpdateType.Add, + _c[api_external_contract_js_1.FilterUpdateType.All] = api_internal_contract_js_1.FilterUpdateType.All, + _c[api_external_contract_js_1.FilterUpdateType.Remove] = api_internal_contract_js_1.FilterUpdateType.Remove, + _c[api_external_contract_js_1.FilterUpdateType.Replace] = api_internal_contract_js_1.FilterUpdateType.Replace, + _c)); + ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter((_d = {}, + _d[api_external_contract_js_1.ZoneVisibilityType.Show] = true, + _d[api_external_contract_js_1.ZoneVisibilityType.Hide] = false, + _d)); + ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter((_e = {}, + // these numbers are duration multipliers + // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed + _e[api_external_contract_js_1.ReplaySpeedType.Slow] = 2.0, + _e[api_external_contract_js_1.ReplaySpeedType.Normal] = 1.0, + _e[api_external_contract_js_1.ReplaySpeedType.Fast] = 0.5, + _e)); + ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {}, + _f[api_external_contract_js_1.SheetType.Dashboard] = api_internal_contract_js_1.SheetType.Dashboard, + _f[api_external_contract_js_1.SheetType.Worksheet] = api_internal_contract_js_1.SheetType.Worksheet, + _f[api_external_contract_js_1.SheetType.Story] = api_internal_contract_js_1.SheetType.Story, + _f)); + ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter((_g = {}, + _g[api_external_contract_js_1.IncludeDataValuesOption.AllValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues, + _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues] = api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly, + _g)); + ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter((_h = {}, + _h[api_external_contract_js_1.PeriodType.Years] = api_internal_contract_js_1.DateStepPeriod.Years, + _h[api_external_contract_js_1.PeriodType.Quarters] = api_internal_contract_js_1.DateStepPeriod.Quarters, + _h[api_external_contract_js_1.PeriodType.Months] = api_internal_contract_js_1.DateStepPeriod.Months, + _h[api_external_contract_js_1.PeriodType.Weeks] = api_internal_contract_js_1.DateStepPeriod.Weeks, + _h[api_external_contract_js_1.PeriodType.Days] = api_internal_contract_js_1.DateStepPeriod.Days, + _h[api_external_contract_js_1.PeriodType.Hours] = api_internal_contract_js_1.DateStepPeriod.Hours, + _h[api_external_contract_js_1.PeriodType.Minutes] = api_internal_contract_js_1.DateStepPeriod.Minutes, + _h[api_external_contract_js_1.PeriodType.Seconds] = api_internal_contract_js_1.DateStepPeriod.Seconds, + _h)); + ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_j = {}, + _j[api_external_contract_js_1.DateRangeType.Last] = api_internal_contract_js_1.DateRangeType.Last, + _j[api_external_contract_js_1.DateRangeType.LastN] = api_internal_contract_js_1.DateRangeType.LastN, + _j[api_external_contract_js_1.DateRangeType.Next] = api_internal_contract_js_1.DateRangeType.Next, + _j[api_external_contract_js_1.DateRangeType.NextN] = api_internal_contract_js_1.DateRangeType.NextN, + _j[api_external_contract_js_1.DateRangeType.Current] = api_internal_contract_js_1.DateRangeType.Current, + _j[api_external_contract_js_1.DateRangeType.ToDate] = api_internal_contract_js_1.DateRangeType.ToDate, + _j)); + ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter((_k = {}, + _k[api_external_contract_js_1.DialogStyle.Window] = api_internal_contract_js_1.DialogStyle.Window, + _k[api_external_contract_js_1.DialogStyle.Modal] = api_internal_contract_js_1.DialogStyle.Modal, + _k[api_external_contract_js_1.DialogStyle.Modeless] = api_internal_contract_js_1.DialogStyle.Modeless, + _k)); + return ExternalToInternalEnumMappings; +}()); +exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings; +/* 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"; + +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ +/** + * Maps enums used by the internal-api-contract to the enums used + * in the external-api-contract, which developers code against. + */ +var InternalToExternalEnumMappings = /** @class */ (function () { + function InternalToExternalEnumMappings() { + } + InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter((_a = {}, + _a[api_internal_contract_js_1.ExtensionContext.Desktop] = api_external_contract_js_1.ExtensionContext.Desktop, + _a[api_internal_contract_js_1.ExtensionContext.Server] = api_external_contract_js_1.ExtensionContext.Server, + _a)); + InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter((_b = {}, + _b[api_internal_contract_js_1.ExtensionMode.Authoring] = api_external_contract_js_1.ExtensionMode.Authoring, + _b[api_internal_contract_js_1.ExtensionMode.Viewing] = api_external_contract_js_1.ExtensionMode.Viewing, + _b)); + InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter((_c = {}, + _c[api_internal_contract_js_1.ColumnType.Continuous] = api_external_contract_js_1.ColumnType.Continuous, + _c[api_internal_contract_js_1.ColumnType.Discrete] = api_external_contract_js_1.ColumnType.Discrete, + _c[api_internal_contract_js_1.ColumnType.Unknown] = api_external_contract_js_1.ColumnType.Unknown, + _c)); + InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter((_d = {}, + _d[api_internal_contract_js_1.FieldAggregationType.Attr] = api_external_contract_js_1.FieldAggregationType.Attr, + _d[api_internal_contract_js_1.FieldAggregationType.Avg] = api_external_contract_js_1.FieldAggregationType.Avg, + _d[api_internal_contract_js_1.FieldAggregationType.Collect] = api_external_contract_js_1.FieldAggregationType.Collect, + _d[api_internal_contract_js_1.FieldAggregationType.Count] = api_external_contract_js_1.FieldAggregationType.Count, + _d[api_internal_contract_js_1.FieldAggregationType.Countd] = api_external_contract_js_1.FieldAggregationType.Countd, + _d[api_internal_contract_js_1.FieldAggregationType.Day] = api_external_contract_js_1.FieldAggregationType.Day, + _d[api_internal_contract_js_1.FieldAggregationType.End] = api_external_contract_js_1.FieldAggregationType.End, + _d[api_internal_contract_js_1.FieldAggregationType.Hour] = api_external_contract_js_1.FieldAggregationType.Hour, + _d[api_internal_contract_js_1.FieldAggregationType.InOut] = api_external_contract_js_1.FieldAggregationType.InOut, + _d[api_internal_contract_js_1.FieldAggregationType.Kurtosis] = api_external_contract_js_1.FieldAggregationType.Kurtosis, + _d[api_internal_contract_js_1.FieldAggregationType.Max] = api_external_contract_js_1.FieldAggregationType.Max, + _d[api_internal_contract_js_1.FieldAggregationType.Mdy] = api_external_contract_js_1.FieldAggregationType.Mdy, + _d[api_internal_contract_js_1.FieldAggregationType.Median] = api_external_contract_js_1.FieldAggregationType.Median, + _d[api_internal_contract_js_1.FieldAggregationType.Min] = api_external_contract_js_1.FieldAggregationType.Min, + _d[api_internal_contract_js_1.FieldAggregationType.Minute] = api_external_contract_js_1.FieldAggregationType.Minute, + _d[api_internal_contract_js_1.FieldAggregationType.MonthYear] = api_external_contract_js_1.FieldAggregationType.MonthYear, + _d[api_internal_contract_js_1.FieldAggregationType.None] = api_external_contract_js_1.FieldAggregationType.None, + _d[api_internal_contract_js_1.FieldAggregationType.Qtr] = api_external_contract_js_1.FieldAggregationType.Qtr, + _d[api_internal_contract_js_1.FieldAggregationType.Quart1] = api_external_contract_js_1.FieldAggregationType.Quart1, + _d[api_internal_contract_js_1.FieldAggregationType.Quart3] = api_external_contract_js_1.FieldAggregationType.Quart3, + _d[api_internal_contract_js_1.FieldAggregationType.Second] = api_external_contract_js_1.FieldAggregationType.Second, + _d[api_internal_contract_js_1.FieldAggregationType.Skewness] = api_external_contract_js_1.FieldAggregationType.Skewness, + _d[api_internal_contract_js_1.FieldAggregationType.Stdev] = api_external_contract_js_1.FieldAggregationType.Stdev, + _d[api_internal_contract_js_1.FieldAggregationType.Stdevp] = api_external_contract_js_1.FieldAggregationType.Stdevp, + _d[api_internal_contract_js_1.FieldAggregationType.Sum] = api_external_contract_js_1.FieldAggregationType.Sum, + _d[api_internal_contract_js_1.FieldAggregationType.TruncDay] = api_external_contract_js_1.FieldAggregationType.TruncDay, + _d[api_internal_contract_js_1.FieldAggregationType.TruncHour] = api_external_contract_js_1.FieldAggregationType.TruncHour, + _d[api_internal_contract_js_1.FieldAggregationType.TruncMinute] = api_external_contract_js_1.FieldAggregationType.TruncMinute, + _d[api_internal_contract_js_1.FieldAggregationType.TruncMonth] = api_external_contract_js_1.FieldAggregationType.TruncMonth, + _d[api_internal_contract_js_1.FieldAggregationType.TruncQtr] = api_external_contract_js_1.FieldAggregationType.TruncQtr, + _d[api_internal_contract_js_1.FieldAggregationType.TruncSecond] = api_external_contract_js_1.FieldAggregationType.TruncSecond, + _d[api_internal_contract_js_1.FieldAggregationType.TruncWeek] = api_external_contract_js_1.FieldAggregationType.TruncWeek, + _d[api_internal_contract_js_1.FieldAggregationType.TruncYear] = api_external_contract_js_1.FieldAggregationType.TruncYear, + _d[api_internal_contract_js_1.FieldAggregationType.User] = api_external_contract_js_1.FieldAggregationType.User, + _d[api_internal_contract_js_1.FieldAggregationType.Var] = api_external_contract_js_1.FieldAggregationType.Var, + _d[api_internal_contract_js_1.FieldAggregationType.Varp] = api_external_contract_js_1.FieldAggregationType.Varp, + _d[api_internal_contract_js_1.FieldAggregationType.Week] = api_external_contract_js_1.FieldAggregationType.Week, + _d[api_internal_contract_js_1.FieldAggregationType.Weekday] = api_external_contract_js_1.FieldAggregationType.Weekday, + _d[api_internal_contract_js_1.FieldAggregationType.Year] = api_external_contract_js_1.FieldAggregationType.Year, + _d)); + InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter((_e = {}, + _e[api_internal_contract_js_1.FieldRoleType.Dimension] = api_external_contract_js_1.FieldRoleType.Dimension, + _e[api_internal_contract_js_1.FieldRoleType.Measure] = api_external_contract_js_1.FieldRoleType.Measure, + _e[api_internal_contract_js_1.FieldRoleType.Unknown] = api_external_contract_js_1.FieldRoleType.Unknown, + _e)); + InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {}, + _f[api_internal_contract_js_1.SheetType.Dashboard] = api_external_contract_js_1.SheetType.Dashboard, + _f[api_internal_contract_js_1.SheetType.Story] = api_external_contract_js_1.SheetType.Story, + _f[api_internal_contract_js_1.SheetType.Worksheet] = api_external_contract_js_1.SheetType.Worksheet, + _f)); + InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter((_g = {}, + _g[api_internal_contract_js_1.DashboardObjectType.Extension] = api_external_contract_js_1.DashboardObjectType.Extension, + _g[api_internal_contract_js_1.DashboardObjectType.Blank] = api_external_contract_js_1.DashboardObjectType.Blank, + _g[api_internal_contract_js_1.DashboardObjectType.Image] = api_external_contract_js_1.DashboardObjectType.Image, + _g[api_internal_contract_js_1.DashboardObjectType.Legend] = api_external_contract_js_1.DashboardObjectType.Legend, + _g[api_internal_contract_js_1.DashboardObjectType.PageFilter] = api_external_contract_js_1.DashboardObjectType.PageFilter, + _g[api_internal_contract_js_1.DashboardObjectType.ParameterControl] = api_external_contract_js_1.DashboardObjectType.ParameterControl, + _g[api_internal_contract_js_1.DashboardObjectType.QuickFilter] = api_external_contract_js_1.DashboardObjectType.QuickFilter, + _g[api_internal_contract_js_1.DashboardObjectType.Text] = api_external_contract_js_1.DashboardObjectType.Text, + _g[api_internal_contract_js_1.DashboardObjectType.Title] = api_external_contract_js_1.DashboardObjectType.Title, + _g[api_internal_contract_js_1.DashboardObjectType.WebPage] = api_external_contract_js_1.DashboardObjectType.WebPage, + _g[api_internal_contract_js_1.DashboardObjectType.Worksheet] = api_external_contract_js_1.DashboardObjectType.Worksheet, + _g)); + InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter((_h = {}, + _h[api_internal_contract_js_1.DataType.Bool] = api_external_contract_js_1.DataType.Bool, + _h[api_internal_contract_js_1.DataType.Date] = api_external_contract_js_1.DataType.Date, + _h[api_internal_contract_js_1.DataType.DateTime] = api_external_contract_js_1.DataType.DateTime, + _h[api_internal_contract_js_1.DataType.Float] = api_external_contract_js_1.DataType.Float, + _h[api_internal_contract_js_1.DataType.Int] = api_external_contract_js_1.DataType.Int, + _h[api_internal_contract_js_1.DataType.Spatial] = api_external_contract_js_1.DataType.Spatial, + _h[api_internal_contract_js_1.DataType.String] = api_external_contract_js_1.DataType.String, + _h)); + InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_j = {}, + _j[api_internal_contract_js_1.FilterUpdateType.Add] = api_external_contract_js_1.FilterUpdateType.Add, + _j[api_internal_contract_js_1.FilterUpdateType.All] = api_external_contract_js_1.FilterUpdateType.All, + _j[api_internal_contract_js_1.FilterUpdateType.Remove] = api_external_contract_js_1.FilterUpdateType.Remove, + _j[api_internal_contract_js_1.FilterUpdateType.Replace] = api_external_contract_js_1.FilterUpdateType.Replace, + _j)); + InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter((_k = {}, + _k[api_internal_contract_js_1.DomainRestrictionType.All] = api_external_contract_js_1.ParameterValueType.All, + _k[api_internal_contract_js_1.DomainRestrictionType.List] = api_external_contract_js_1.ParameterValueType.List, + _k[api_internal_contract_js_1.DomainRestrictionType.Range] = api_external_contract_js_1.ParameterValueType.Range, + _k)); + InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter((_l = {}, + _l[api_internal_contract_js_1.DateStepPeriod.Years] = api_external_contract_js_1.PeriodType.Years, + _l[api_internal_contract_js_1.DateStepPeriod.Quarters] = api_external_contract_js_1.PeriodType.Quarters, + _l[api_internal_contract_js_1.DateStepPeriod.Months] = api_external_contract_js_1.PeriodType.Months, + _l[api_internal_contract_js_1.DateStepPeriod.Weeks] = api_external_contract_js_1.PeriodType.Weeks, + _l[api_internal_contract_js_1.DateStepPeriod.Days] = api_external_contract_js_1.PeriodType.Days, + _l[api_internal_contract_js_1.DateStepPeriod.Hours] = api_external_contract_js_1.PeriodType.Hours, + _l[api_internal_contract_js_1.DateStepPeriod.Minutes] = api_external_contract_js_1.PeriodType.Minutes, + _l[api_internal_contract_js_1.DateStepPeriod.Seconds] = api_external_contract_js_1.PeriodType.Seconds, + _l)); + InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_m = {}, + _m[api_internal_contract_js_1.DateRangeType.Current] = api_external_contract_js_1.DateRangeType.Current, + _m[api_internal_contract_js_1.DateRangeType.Last] = api_external_contract_js_1.DateRangeType.Last, + _m[api_internal_contract_js_1.DateRangeType.LastN] = api_external_contract_js_1.DateRangeType.LastN, + _m[api_internal_contract_js_1.DateRangeType.Next] = api_external_contract_js_1.DateRangeType.Next, + _m[api_internal_contract_js_1.DateRangeType.NextN] = api_external_contract_js_1.DateRangeType.NextN, + _m[api_internal_contract_js_1.DateRangeType.ToDate] = api_external_contract_js_1.DateRangeType.ToDate, + _m)); + InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter((_o = {}, + _o[api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID] = api_external_contract_js_1.ErrorCodes.InternalError, + _o[api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED] = api_external_contract_js_1.ErrorCodes.APINotInitialized, + _o[api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR] = api_external_contract_js_1.ErrorCodes.VisibilityError, + _o), api_external_contract_js_1.ErrorCodes.InternalError); + InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter((_p = {}, + _p[api_internal_contract_js_1.FilterType.Categorical] = api_external_contract_js_1.FilterType.Categorical, + _p[api_internal_contract_js_1.FilterType.Range] = api_external_contract_js_1.FilterType.Range, + _p[api_internal_contract_js_1.FilterType.RelativeDate] = api_external_contract_js_1.FilterType.RelativeDate, + _p[api_internal_contract_js_1.FilterType.Hierarchical] = api_external_contract_js_1.FilterType.Hierarchical, + _p)); + InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter((_q = {}, + _q["tableau-dashboard-title" /* DashboardTitle */] = api_external_contract_js_1.ClassNameKey.DashboardTitle, + _q["tableau-story-title" /* StoryTitle */] = api_external_contract_js_1.ClassNameKey.StoryTitle, + _q["tableau-tooltip" /* Tooltip */] = api_external_contract_js_1.ClassNameKey.Tooltip, + _q["tableau-worksheet" /* Worksheet */] = api_external_contract_js_1.ClassNameKey.Worksheet, + _q["tableau-worksheet-title" /* WorksheetTitle */] = api_external_contract_js_1.ClassNameKey.WorksheetTitle, + // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed + _q['dashboard-title'] = api_external_contract_js_1.ClassNameKey.DashboardTitle, + _q['story-title'] = api_external_contract_js_1.ClassNameKey.StoryTitle, + _q['tooltip'] = api_external_contract_js_1.ClassNameKey.Tooltip, + _q['worksheet'] = api_external_contract_js_1.ClassNameKey.Worksheet, + _q['worksheet-title'] = api_external_contract_js_1.ClassNameKey.WorksheetTitle, + _q)); + InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter((_r = {}, + _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected, + _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected, + _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected, + _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected, + _r)); + InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter((_s = {}, + _s[api_internal_contract_js_1.AnnotateEnum.Area] = api_external_contract_js_1.AnnotationType.Area, + _s[api_internal_contract_js_1.AnnotateEnum.Mark] = api_external_contract_js_1.AnnotationType.Mark, + _s[api_internal_contract_js_1.AnnotateEnum.Point] = api_external_contract_js_1.AnnotationType.Point, + _s)); + InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter((_t = {}, + _t[api_internal_contract_js_1.MarkType.Area] = api_external_contract_js_1.MarkType.Area, + _t[api_internal_contract_js_1.MarkType.Bar] = api_external_contract_js_1.MarkType.Bar, + _t[api_internal_contract_js_1.MarkType.Circle] = api_external_contract_js_1.MarkType.Circle, + _t[api_internal_contract_js_1.MarkType.GanttBar] = api_external_contract_js_1.MarkType.GanttBar, + _t[api_internal_contract_js_1.MarkType.Heatmap] = api_external_contract_js_1.MarkType.Heatmap, + _t[api_internal_contract_js_1.MarkType.Line] = api_external_contract_js_1.MarkType.Line, + _t[api_internal_contract_js_1.MarkType.Map] = api_external_contract_js_1.MarkType.Map, + _t[api_internal_contract_js_1.MarkType.Pie] = api_external_contract_js_1.MarkType.Pie, + _t[api_internal_contract_js_1.MarkType.Polygon] = api_external_contract_js_1.MarkType.Polygon, + _t[api_internal_contract_js_1.MarkType.Shape] = api_external_contract_js_1.MarkType.Shape, + _t[api_internal_contract_js_1.MarkType.Square] = api_external_contract_js_1.MarkType.Square, + _t[api_internal_contract_js_1.MarkType.Text] = api_external_contract_js_1.MarkType.Text, + _t[api_internal_contract_js_1.MarkType.VizExtension] = api_external_contract_js_1.MarkType.VizExtension, + _t)); + return InternalToExternalEnumMappings; +}()); +exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings; +/* 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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Class designed to register and unregister handlers from a user. Only those events + * which are added via AddNewEventType will be supported by this instance + */ +var EventListenerManager = /** @class */ (function () { + function EventListenerManager() { + this._eventListenerManagers = {}; + } + EventListenerManager.prototype.addEventListener = function (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); + }; + EventListenerManager.prototype.removeEventListener = function (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); + }; + EventListenerManager.prototype.addNewEventType = function (eventManager) { + this._eventListenerManagers[eventManager.eventType] = eventManager; + }; + return EventListenerManager; +}()); +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 })); +var Field = /** @class */ (function () { + function Field(_fieldImpl) { + this._fieldImpl = _fieldImpl; + } + Object.defineProperty(Field.prototype, "name", { + get: function () { + return this._fieldImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "id", { + get: function () { + return this._fieldImpl.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "description", { + get: function () { + return this._fieldImpl.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "dataType", { + get: function () { + return this._fieldImpl.dataType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "aggregation", { + get: function () { + return this._fieldImpl.aggregation; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "dataSource", { + get: function () { + return this._fieldImpl.dataSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "role", { + get: function () { + return this._fieldImpl.role; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "columnType", { + get: function () { + return this._fieldImpl.columnType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isCalculatedField", { + get: function () { + return this._fieldImpl.isCalculatedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isCombinedField", { + get: function () { + return this._fieldImpl.isCombinedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isGenerated", { + get: function () { + return this._fieldImpl.isGenerated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isGeospatial", { + get: function () { + return this._fieldImpl.isGeospatial; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isHidden", { + get: function () { + return this._fieldImpl.isHidden; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Field.prototype, "isPresentOnPublishedDatasource", { + get: function () { + return this._fieldImpl.isPresentOnPublishedDatasource; + }, + enumerable: true, + configurable: true + }); + return Field; +}()); +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 })); +var ApiShared_1 = __webpack_require__(/*! ../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +var CustomViewImpl = /** @class */ (function () { + function CustomViewImpl(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; + } + Object.defineProperty(CustomViewImpl.prototype, "luid", { + get: function () { + return this._luid; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "name", { + get: function () { + return this._name; + }, + set: function (name) { + this._name = name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "shared", { + get: function () { + return this._shared; + }, + set: function (shared) { + this._shared = shared; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "isDefault", { + get: function () { + return this._isDefault; + }, + set: function (isDefault) { + this._isDefault = isDefault; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "ownerName", { + get: function () { + return this._ownerName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CustomViewImpl.prototype, "url", { + get: function () { + return this._url; + }, + enumerable: true, + configurable: true + }); + CustomViewImpl.prototype.saveAsync = function () { + var service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* Viz */); + return service.saveAsync(this); + }; + return CustomViewImpl; +}()); +exports.CustomViewImpl = CustomViewImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var Point_1 = __webpack_require__(/*! ../Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var DashboardObjectImpl_1 = __webpack_require__(/*! ./DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +var SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +var WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +var DashboardImpl = /** @class */ (function (_super) { + __extends(DashboardImpl, _super); + function DashboardImpl(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId) { + if (_activeDashboardObjectId === void 0) { _activeDashboardObjectId = 0; } + var _this = _super.call(this, _sheetInfo, _registryId) || this; + _this._zones = _zones; + _this._sheetPath = _sheetPath; + _this._parentStoryPointImpl = _parentStoryPointImpl; + _this._activeDashboardObjectId = _activeDashboardObjectId; + return _this; + } + Object.defineProperty(DashboardImpl.prototype, "worksheetsImpl", { + get: function () { + return this._worksheetsImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "objects", { + get: function () { + return this._objects; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "parentStoryPoint", { + get: function () { + return this._parentStoryPointImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "activeDashboardObjectId", { + get: function () { + return this._activeDashboardObjectId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardImpl.prototype, "activeDashboardName", { + get: function () { + return this._sheetPath.sheetName; + }, + enumerable: true, + configurable: true + }); + DashboardImpl.prototype.initializeWithPublicInterfaces = function () { + this._worksheetsImpl = new Array(); + this._objects = new Array(); + this.zoneMap = new Map(); + // Process all the zones which are contained in this dashboard + for (var _i = 0, _a = this._zones; _i < _a.length; _i++) { + var zone = _a[_i]; + var worksheetImpl = undefined; + var zoneSize = { width: zone.width, height: zone.height }; + // As the dashboard is active, all other zones in the dashboard are inactive. + var isActive = false; + if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet || zone.zoneType === api_internal_contract_js_1.DashboardObjectType.QuickFilter) { + var worksheetName = ''; + var worksheetUrl = ''; + var isHidden = false; + 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. + var sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl); + var 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); + } + } + var zonePoint = new Point_1.Point(zone.x, zone.y); + var dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false + zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true + zone.zoneId, zone.fieldId); + this._objects.push(dashboardObjectImpl); + this.zoneMap.set(zone.zoneId, dashboardObjectImpl); + } + }; + DashboardImpl.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) { + var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap); + }; + DashboardImpl.prototype.getDashboardObjectById = function (dashboardObjectId) { + return this.zoneMap.get(dashboardObjectId); + }; + DashboardImpl.prototype.updateZones = function (newZones, newActiveZoneId, newActiveDashboardName) { + var _this = this; + if (newActiveZoneId === void 0) { newActiveZoneId = 0; } + if (newActiveDashboardName === void 0) { newActiveDashboardName = ''; } + // getting previous dashboard objects, active zone ID and active dashboard name + var oldDashboardObjects = this._objects; + var oldZoneMap = this.zoneMap; + var oldActiveZoneId = this._activeDashboardObjectId; + var oldActiveDashboardName = this._sheetPath.sheetName; + // 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 + var newDashboardObjects = this._objects; + var newZoneMap = this.zoneMap; + // initializing map for changes + var zoneChanges = new Map(); + // comparing old dashboard objects with new ones + oldDashboardObjects.forEach(function (oldObject) { + var oldId = oldObject.id; + // checking if zone was removed + if (!newZoneMap.has(oldId)) { + _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed); + return; + } + var 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(function (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; + }; + DashboardImpl.prototype.addChange = function (zoneId, zoneChanges, change) { + if (!zoneChanges.has(zoneId)) { + zoneChanges.set(zoneId, []); + } + zoneChanges.get(zoneId).push(change); + }; + DashboardImpl.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) { + var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray); + }; + DashboardImpl.prototype.replayAnimationAsync = function (replaySpeed) { + var animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* Animation */); + return animationService.replayAsync(replaySpeed); + }; + DashboardImpl.prototype.getFiltersAsync = function () { + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getDashboardFiltersAsync(); + }; + DashboardImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'FilterUpdateType'); + ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); + if (!Array.isArray(values)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyDashboardFilterAsync must be an array'); + } + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyDashboardFilterAsync(fieldName, values, updateType, options); + }; + // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class + // This method only exists since worksheetsImpl can be undefined, but we need the worksheet names in the Export APIs + DashboardImpl.prototype.getWorksheetNamesFromZones = function () { + var worksheetNames = []; + for (var _i = 0, _a = this._zones; _i < _a.length; _i++) { + var zone = _a[_i]; + if (zone.zoneType !== api_internal_contract_js_1.DashboardObjectType.Worksheet) { + continue; + } + // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 + var worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name; + worksheetNames.push(worksheetName); + } + return worksheetNames; + }; + DashboardImpl.prototype.verifyActiveSheetOrEmbeddedInActiveStoryPoint = function () { + var isRootAndActiveDashboard = this.active; + var isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active; + if (!isRootAndActiveDashboard && !isWithinActiveStoryPoint) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); + } + }; + return DashboardImpl; +}(SheetImpl_1.SheetImpl)); +exports.DashboardImpl = DashboardImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of the dashboard objects - the zones in a dashboard. + * This does not follow the Impl pattern as it is just a property bag. + */ +var DashboardObjectImpl = /** @class */ (function () { + function DashboardObjectImpl(_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; + } + Object.defineProperty(DashboardObjectImpl.prototype, "dashboardImpl", { + get: function () { + return this._dashboardImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "position", { + get: function () { + return this._position; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "size", { + get: function () { + return this._size; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "worksheetImpl", { + get: function () { + return this._worksheetImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "isFloating", { + get: function () { + return this._isFloating; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "isVisible", { + get: function () { + return this._isVisible; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "id", { + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DashboardObjectImpl.prototype, "fieldId", { + get: function () { + return this._fieldId; + }, + enumerable: true, + configurable: true + }); + return DashboardObjectImpl; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ConnectionSummary_1 = __webpack_require__(/*! ../ConnectionSummary */ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js"); +var Field_1 = __webpack_require__(/*! ../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableSummary_1 = __webpack_require__(/*! ../TableSummary */ "../api-shared-js/lib/src/ApiShared/TableSummary.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var FieldImpl_1 = __webpack_require__(/*! ./FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +var DataSourceImpl = /** @class */ (function () { + function DataSourceImpl(_dataSourceInfo, _registryId) { + var _this = this; + this._dataSourceInfo = _dataSourceInfo; + this._registryId = _registryId; + this._fields = _dataSourceInfo.fields.map(function (fieldModel) { + var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, _this); + return new Field_1.Field(fieldImpl); + }); + } + Object.defineProperty(DataSourceImpl.prototype, "name", { + get: function () { + return this._dataSourceInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "id", { + get: function () { + return this._dataSourceInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "extractUpdateTime", { + get: function () { + return this._dataSourceInfo.extractUpdateTime; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "fields", { + get: function () { + return this._fields; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "isExtract", { + get: function () { + return this._dataSourceInfo.isExtract; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataSourceImpl.prototype, "isPublished", { + get: function () { + return this._dataSourceInfo.isPublished; + }, + enumerable: true, + configurable: true + }); + DataSourceImpl.prototype.publishedUrl = function () { + return this._dataSourceInfo.publishedUrl; + }; + DataSourceImpl.prototype.getMaxPageRowLimit = function () { + return 10000; + }; + DataSourceImpl.prototype.refreshAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.refreshAsync(this._dataSourceInfo.id); + }; + DataSourceImpl.prototype.getConnectionSummariesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then(function (summaries) { + return summaries.map(function (summary) { return new ConnectionSummary_1.ConnectionSummary(summary); }); + }); + }; + DataSourceImpl.prototype.getActiveTablesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then(function (tableInfos) { + return tableInfos.map(function (tableInfo) { return new TableSummary_1.TableSummary(tableInfo); }); + }); + }; + DataSourceImpl.prototype.getUnderlyingDataAsync = function (options) { + var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + DataSourceImpl.prototype.getLogicalTableDataAsync = function (logicalTableId, options) { + var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults + options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + DataSourceImpl.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return getDataService.getLogicalTableDataReaderAsync(this.id, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + DataSourceImpl.prototype.initializeWithPublicInterfaces = function (dataSource) { + ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource'); + this._fields = this._dataSourceInfo.fields.map(function (fieldModel) { + var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource); + return new Field_1.Field(fieldImpl); + }); + }; + DataSourceImpl.prototype.getLogicalTablesAsync = function () { + var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getLogicalTablesAsync(this.id).then(function (logicalTableInfos) { + return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); }); + }); + }; + return DataSourceImpl; +}()); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var FieldImpl = /** @class */ (function () { + function FieldImpl(_fieldInfo, _parentDataSource) { + this._fieldInfo = _fieldInfo; + this._parentDataSource = _parentDataSource; + } + Object.defineProperty(FieldImpl.prototype, "name", { + get: function () { + return this._fieldInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "id", { + get: function () { + return this._fieldInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "description", { + get: function () { + return this._fieldInfo.description; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "dataType", { + get: function () { + var _a; + return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "aggregation", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "dataSource", { + get: function () { + if (!this._parentDataSource) + throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information"); + return this._parentDataSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "role", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "columnType", { + get: function () { + var definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown; + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isCalculatedField", { + get: function () { + return this._fieldInfo.isCalculatedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isCombinedField", { + get: function () { + return this._fieldInfo.isCombinedField; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isGenerated", { + get: function () { + return this._fieldInfo.isGenerated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isGeospatial", { + get: function () { + return this._fieldInfo.isGeospatial; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isHidden", { + get: function () { + return this._fieldInfo.isHidden; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FieldImpl.prototype, "isPresentOnPublishedDatasource", { + get: function () { + return this._fieldInfo.isPresentOnPublishedDatasource; + }, + enumerable: true, + configurable: true + }); + return FieldImpl; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ParameterImpl = /** @class */ (function () { + function ParameterImpl(parameterInfo, _registryId) { + this._registryId = _registryId; + this.setParameterInfo(parameterInfo); + } + Object.defineProperty(ParameterImpl.prototype, "name", { + get: function () { + return this._parameterInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "currentValue", { + get: function () { + return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "dataType", { + get: function () { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "id", { + get: function () { + return this._globalFieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParameterImpl.prototype, "allowableValues", { + get: function () { + return this._allowableValues; + }, + enumerable: true, + configurable: true + }); + ParameterImpl.prototype.changeValueAsync = function (newValue) { + var _this = this; + ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue'); + var coercedValue = Param_1.Param.serializeParameterValue(newValue); + var parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then(function (parameterInfo) { + _this.setParameterInfo(parameterInfo); + return _this.currentValue; + }); + }; + ParameterImpl.prototype.setParameterInfo = function (parameterInfo) { + this._parameterInfo = parameterInfo; + this._globalFieldName = parameterInfo.fieldName; + var type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType); + var listValues; + var minValue; + var maxValue; + var stepSize; + var dateStepPeriod; + if (type === api_external_contract_js_1.ParameterValueType.List) { + var values = parameterInfo.allowableValues || []; + listValues = values.map(function (val) { return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType); }); + } + 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, + }; + }; + return ParameterImpl; +}()); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +var SheetImpl = /** @class */ (function () { + function SheetImpl(_sheetInfoImpl, _registryId) { + this._sheetInfoImpl = _sheetInfoImpl; + this._registryId = _registryId; + } + Object.defineProperty(SheetImpl.prototype, "name", { + get: function () { + return this._sheetInfoImpl.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "sheetType", { + get: function () { + return this._sheetInfoImpl.sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "sheetPath", { + get: function () { + return this._sheetInfoImpl.sheetPath; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "size", { + get: function () { + return this._sheetInfoImpl.sheetSize; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "hidden", { + get: function () { + if (this._sheetInfoImpl.isHidden !== undefined) { + return this._sheetInfoImpl.isHidden; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "isHidden not implemented"); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "active", { + get: function () { + if (this._sheetInfoImpl.isActive !== undefined) { + return this._sheetInfoImpl.isActive; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "active not implemented"); + }, + set: function (active) { + if (this._sheetInfoImpl.isActive !== undefined) { + this._sheetInfoImpl.active = active; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "index", { + get: function () { + if (this._sheetInfoImpl.index !== undefined) { + return this._sheetInfoImpl.index; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "index not implemented"); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetImpl.prototype, "url", { + get: function () { + if (this._sheetInfoImpl.url !== undefined) { + return this._sheetInfoImpl.url; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "url not implemented"); + }, + enumerable: true, + configurable: true + }); + SheetImpl.prototype.getSheetSize = function () { + if (!SheetUtils_1.SheetUtils.isValidSheetSize(this.size)) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InternalError, 'size is not of type SheetSize'); + } + return this.size; + }; + SheetImpl.prototype.findParameterAsync = function (parameterName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName'); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return service.findParameterByNameAsync(parameterName); + }; + SheetImpl.prototype.getParametersAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return service.getParametersForSheetAsync(this.sheetPath); + }; + SheetImpl.prototype.changeSizeAsync = function (newSize) { + var _this = this; + var invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); + if (!newSize || !newSize.behavior) { + throw invalidSizeError; + } + var partialSheetSize = this.normalizeSheetSize(newSize); + var 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); + } + var processedNewSize = this.processNewSize(partialSheetSize); + var sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* Size */); + return sizeService.changeSizeAsync(this.name, processedNewSize).then(function () { + var clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(_this._registryId).getService("client-info-service" /* ClientInfo */); + return clientInfoService.getClientInfoAsync().then(function (bootstrapInfo) { + var sheet = bootstrapInfo.publishedSheets.find(function (s) { return s.name === _this.name; }); + if (!sheet) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, "Can't find sheet with name " + _this.name); + } + var sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint); + _this._sheetInfoImpl.sheetSize = sheetSize; + return sheetSize; + }); + }); + }; + SheetImpl.prototype.normalizeSheetSize = function (newSize) { + var behavior = newSize.behavior; + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior'); + var minSize = SheetImpl.parseDimensions(newSize.minSize); + var maxSize = SheetImpl.parseDimensions(newSize.maxSize); + return { behavior: behavior, minSize: minSize, maxSize: maxSize }; + }; + SheetImpl.prototype.processNewSize = function (newSize) { + var _a, _b, _c, _d; + var behavior = newSize.behavior, minSizeMaybe = newSize.minSize, maxSizeMaybe = newSize.maxSize; + var hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width); + var hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height); + var hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width); + var hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height); + var hasValidMinSize = hasMinWidth && hasMinHeight; + var hasValidMaxSize = hasMaxWidth && hasMaxHeight; + switch (behavior) { + case Contract.SheetSizeBehavior.Automatic: { + return { behavior: behavior }; + } + case Contract.SheetSizeBehavior.AtMost: { + if (!maxSizeMaybe || !hasValidMaxSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMaxSize, 'Missing maxSize for SheetSizeBehavior.AtMost'); + } + var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (maxSize.width < 0 || maxSize.height < 0) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); + } + return { behavior: behavior, maxSize: maxSize }; + } + case Contract.SheetSizeBehavior.AtLeast: { + if (!minSizeMaybe || !hasValidMinSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinSize, 'Missing minSize for SheetSizeBehavior.AtLeast'); + } + var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + if (minSize.width < 0 || minSize.height < 0) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); + } + return { behavior: behavior, minSize: minSize }; + } + case Contract.SheetSizeBehavior.Range: { + if (!minSizeMaybe || !maxSizeMaybe || !hasValidMinSize || !hasValidMaxSize) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinMaxSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); + } + var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + 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: behavior, minSize: minSize, maxSize: maxSize }; + } + case Contract.SheetSizeBehavior.Exactly: { + if (minSizeMaybe && maxSizeMaybe) { + if (hasValidMinSize && hasValidMaxSize) { + var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + if (minSize.width !== maxSize.width || minSize.height !== maxSize.height) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Conflicting size values for SheetSizeBehavior.Exactly'); + } + return { behavior: behavior, minSize: minSize, maxSize: maxSize }; + } + if (hasValidMinSize) { + var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + return { behavior: behavior, minSize: minSize, maxSize: minSize }; + } + if (hasValidMaxSize) { + var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + return { behavior: behavior, minSize: maxSize, 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); + } + } + }; + SheetImpl.parseDimensions = function (size) { + var empty = { width: undefined, height: undefined }; + if (!size) { + return empty; + } + var _a = Param_1.Param.tryParseNumber(size.width), widthParsed = _a.success, parsedWidth = _a.parsed; + var _b = Param_1.Param.tryParseNumber(size.height), heightParsed = _b.success, parsedHeight = _b.parsed; + if (widthParsed && heightParsed) { + return { width: parsedWidth, height: parsedHeight }; + } + if (widthParsed) { + return { width: parsedWidth }; + } + if (heightParsed) { + return { height: parsedHeight }; + } + return empty; + }; + return SheetImpl; +}()); +exports.SheetImpl = SheetImpl; + + +/***/ }), + +/***/ "../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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var SheetInfoImpl = /** @class */ (function () { + function SheetInfoImpl(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) { + this._name = _name; + this._sheetType = _sheetType; + this._sheetSize = _sheetSize; + this._index = _index; + this._isActive = _isActive; + this._isHidden = _isHidden; + this._url = _url; + } + Object.defineProperty(SheetInfoImpl.prototype, "name", { + get: function () { + return this._name; + }, + set: function (sheetName) { + this._name = sheetName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetSize", { + get: function () { + return this._sheetSize; + }, + set: function (value) { + this._sheetSize = value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetType", { + get: function () { + return this._sheetType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "sheetPath", { + get: function () { + return { + sheetName: this.name, + isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard, + }; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "index", { + get: function () { + return this._index; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "isActive", { + get: function () { + return this._isActive; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "active", { + set: function (active) { + this._isActive = active; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "isHidden", { + get: function () { + return this._isHidden; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SheetInfoImpl.prototype, "url", { + get: function () { + return this._url; + }, + enumerable: true, + configurable: true + }); + return SheetInfoImpl; +}()); +exports.SheetInfoImpl = SheetInfoImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js": +/*!*************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * This class implements the SingleEventManager interface for a single type of Tableau event + * + * @template TEventType The Tableau event type this class specializes + */ +var SingleEventManagerImpl = /** @class */ (function () { + function SingleEventManagerImpl(eventType) { + this._eventType = eventType; + this._handlers = []; + } + Object.defineProperty(SingleEventManagerImpl.prototype, "eventType", { + get: function () { + return this._eventType; + }, + enumerable: true, + configurable: true + }); + SingleEventManagerImpl.prototype.addEventListener = function (handler) { + var _this = this; + this._handlers.push(handler); + return function () { return _this.removeEventListener(handler); }; + }; + SingleEventManagerImpl.prototype.removeEventListener = function (handler) { + var beforeCount = this._handlers.length; + this._handlers = this._handlers.filter(function (h) { return h !== handler; }); + return beforeCount > this._handlers.length; + }; + SingleEventManagerImpl.prototype.triggerEvent = function (eventGenerator) { + for (var _i = 0, _a = this._handlers; _i < _a.length; _i++) { + var handler = _a[_i]; + try { + var eventModel = eventGenerator(); + handler(eventModel); + } + catch (e) { + // Since this handler could be outside our control, just catch anything it throws and continue on + continue; + } + } + }; + return SingleEventManagerImpl; +}()); +exports.SingleEventManagerImpl = SingleEventManagerImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js": +/*!************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var ShortLivedDeferred_1 = __webpack_require__(/*! ../Utils/ShortLivedDeferred */ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js"); +var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +var StoryPointImpl_1 = __webpack_require__(/*! ./StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +var StoryPointInfoImpl_1 = __webpack_require__(/*! ./StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +var StoryImpl = /** @class */ (function (_super) { + __extends(StoryImpl, _super); + function StoryImpl(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) { + var _this = _super.call(this, _sheetInfoImpl, _registryId) || this; + _this._sheetInfoImpl = _sheetInfoImpl; + _this._publishedSheetInfos = _publishedSheetInfos; + _this._registryId = _registryId; + _this._storyPointInfoImpls = []; + _this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred(); + _this.initializeStory(storyModel); + return _this; + } + StoryImpl.prototype.initializeStory = function (storyModel) { + var _this = this; + storyModel.storyPoints.forEach(function (storyPointModel) { + var isActive = storyPointModel.index === storyModel.activeStoryPointIndex; + var storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, _this); + _this._storyPointInfoImpls.push(storyPointInfoImpl); + if (isActive) { + _this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, _this._publishedSheetInfos, _this._registryId, storyPointModel.containedSheetInfo); + } + }); + }; + StoryImpl.prototype.updateStoryInfo = function (index, storyPointModel) { + if (!this._storyPointInfoImpls) { + return; + } + var 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; + } + }; + StoryImpl.prototype.updateStory = function (storyPointModel) { + var _this = this; + if (!this._storyPointInfoImpls) { + return; + } + this._storyPointInfoImpls.forEach(function (storyPointInfoImpl) { + var 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); + } + }; + Object.defineProperty(StoryImpl.prototype, "activeStoryPoint", { + get: function () { + return this._activeStoryPointImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryImpl.prototype, "storyPointsInfo", { + get: function () { + return this._storyPointInfoImpls; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryImpl.prototype, "isActive", { + get: function () { + return this._sheetInfoImpl.active; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryImpl.prototype, "isHidden", { + get: function () { + return !!this._sheetInfoImpl.isHidden; + }, + enumerable: true, + configurable: true + }); + StoryImpl.prototype.activateNextStoryPointAsync = function () { + if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) { + return Promise.resolve(this._activeStoryPointImpl); + } + var promise = this._deferred.getNewPromiseOrThrowIfBusy(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activateNextStoryPointAsync(); + return promise; + }; + StoryImpl.prototype.activatePreviousStoryPointAsync = function () { + if (this._activeStoryPointImpl.index === 0) { + return Promise.resolve(this._activeStoryPointImpl); + } + var promise = this._deferred.getNewPromiseOrThrowIfBusy(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activatePreviousStoryPointAsync(); + return promise; + }; + StoryImpl.prototype.activateStoryPointAsync = function (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); + } + var promise = this._deferred.getNewPromiseOrThrowIfBusy(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + service.activateStoryPointAsync(index); + return promise; + }; + StoryImpl.prototype.revertStoryPointAsync = function (index) { + var _this = this; + ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); + ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); + if (index < 0 || index >= this._storyPointInfoImpls.length) { + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); + } + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + return service.revertStoryPointAsync(index).then(function (response) { + _this.updateStoryInfo(response.index, response); + var storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, _this); + return storyPointInfoImpl; + }); + }; + StoryImpl.prototype.clearPendingPromises = function () { + if (this._deferred) { + this._deferred.reject('All pending promises cleared'); + } + }; + return StoryImpl; +}(SheetImpl_1.SheetImpl)); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +var DashboardImpl_1 = __webpack_require__(/*! ./DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +var SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +var WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +var StoryPointImpl = /** @class */ (function () { + function StoryPointImpl(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) { + this._storyPointInfoImpl = _storyPointInfoImpl; + if (containedSheetInfo) { + this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId); + } + } + Object.defineProperty(StoryPointImpl.prototype, "index", { + get: function () { + return this._storyPointInfoImpl.index; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "caption", { + get: function () { + return this._storyPointInfoImpl.caption; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "active", { + get: function () { + return this._storyPointInfoImpl.active; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "updated", { + get: function () { + return this._storyPointInfoImpl.updated; + }, + set: function (updated) { + this._storyPointInfoImpl.updated = updated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "parentStory", { + get: function () { + return this._storyPointInfoImpl.parentStory; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "containedSheet", { + get: function () { + return this._containedSheetImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointImpl.prototype, "storyPointId", { + get: function () { + return this._storyPointInfoImpl.storyPointId; + }, + enumerable: true, + configurable: true + }); + StoryPointImpl.prototype.createContainedSheet = function (containedSheetInfo, sheetInfos, registryId) { + var containedSheetIdx = -1; + var publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos); + var containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize(); + var isContainedSheetHidden = publishedSheetInfo === undefined; + var containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : ''; + // Contained sheets aren't active - the containing sheet is active. + var containedSheetActive = false; + var containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl); + var sheetImpl; + switch (containedSheetInfoImpl.sheetType) { + case Contract.SheetType.Worksheet: { + var vizId = { + worksheet: containedSheetInfoImpl.name, + }; + sheetImpl = new WorksheetImpl_1.WorksheetImpl(containedSheetInfoImpl, registryId, vizId, null, this); + break; + } + case Contract.SheetType.Dashboard: { + var 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; + }; + return StoryPointImpl; +}()); +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 })); +var StoryPointInfoImpl = /** @class */ (function () { + function StoryPointInfoImpl(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) { + this._caption = _caption; + this._index = _index; + this._storyPointId = _storyPointId; + this._active = _active; + this._updated = _updated; + this._parentStoryImpl = _parentStoryImpl; + } + Object.defineProperty(StoryPointInfoImpl.prototype, "caption", { + get: function () { + return this._caption; + }, + set: function (caption) { + this._caption = caption; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "index", { + get: function () { + return this._index; + }, + set: function (index) { + this._index = index; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "storyPointId", { + get: function () { + return this._storyPointId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "active", { + get: function () { + return this._active; + }, + set: function (isActive) { + this._active = isActive; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "updated", { + get: function () { + return this._updated; + }, + set: function (isUpdated) { + this._updated = isUpdated; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StoryPointInfoImpl.prototype, "parentStory", { + get: function () { + return this._parentStoryImpl; + }, + enumerable: true, + configurable: true + }); + return StoryPointInfoImpl; +}()); +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 })); +var WorkbookImpl = /** @class */ (function () { + function WorkbookImpl() { + } + return WorkbookImpl; +}()); +exports.WorkbookImpl = WorkbookImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var DataSource_1 = __webpack_require__(/*! ../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +var GetDataService_1 = __webpack_require__(/*! ../Services/GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var DataSourceImpl_1 = __webpack_require__(/*! ./DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +var WorksheetImpl = /** @class */ (function (_super) { + __extends(WorksheetImpl, _super); + function WorksheetImpl(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl) { + var _this = _super.call(this, sheetInfoImpl, _registryId) || this; + _this._visualId = _visualId; + _this._parentDashboardImpl = _parentDashboardImpl; + _this._parentStoryPointImpl = _parentStoryPointImpl; + return _this; + } + Object.defineProperty(WorksheetImpl.prototype, "parentDashboard", { + get: function () { + return this._parentDashboardImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(WorksheetImpl.prototype, "parentStoryPoint", { + get: function () { + return this._parentStoryPointImpl; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(WorksheetImpl.prototype, "visualId", { + get: function () { + return this._visualId; + }, + enumerable: true, + configurable: true + }); + WorksheetImpl.prototype.getMaxPageRowLimit = function () { + return 10000; + }; + WorksheetImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options); + }; + WorksheetImpl.prototype.applyRangeFilterAsync = function (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(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions); + }; + WorksheetImpl.prototype.applyHierarchicalFilterAsync = function (fieldName, values, updateType, options) { + 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(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options); + }; + WorksheetImpl.prototype.clearFilterAsync = function (fieldName) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.clearFilterAsync(this.visualId, fieldName); + }; + WorksheetImpl.prototype.applyRelativeDateFilterAsync = function (fieldName, options) { + ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyParameter(options, 'options'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.periodType, api_external_contract_js_1.PeriodType, 'PeriodType'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.rangeType, api_external_contract_js_1.DateRangeType, 'DateRangeType'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options); + }; + WorksheetImpl.prototype.getDataSourcesAsync = function () { + var _this = this; + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getDataSourcesAsync(this.visualId).then(function (result) { + var dataSchema = result; + var worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[_this.name]; + var dataSources = []; + // First, add the primary datasource. By convention, it comes first in the returned array. + var primaryId = worksheetDataSourceInfo.primaryDataSource; + dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[primaryId])); + // Then, loop through any secondary data sources and add them. + for (var _i = 0, _a = worksheetDataSourceInfo.referencedDataSourceList; _i < _a.length; _i++) { + var secondaryId = _a[_i]; + if (secondaryId !== primaryId) { + dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId])); + } + } + return dataSources; + }); + }; + WorksheetImpl.prototype.getFiltersAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getFiltersAsync(this.visualId); + }; + WorksheetImpl.prototype.getSelectedMarksAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getSelectedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.getHighlightedMarksAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getHighlightedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.getSummaryDataAsync = function (options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getSummaryDataReaderAsync(this.visualId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, true, // includeAllColumns (can be overridden by columnsToIncludeById) + options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getVisualSpecificationAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + return service.getVisualSpecificationAsync(this.visualId); + }; + WorksheetImpl.prototype.getSummaryColumnsInfoAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getSummaryColumnsInfoAsync(this.visualId); + }; + WorksheetImpl.prototype.getUnderlyingDataAsync = function (options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getUnderlyingTablesAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getUnderlyingTablesAsync(this.visualId).then(function (logicalTableInfos) { + return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); }); + }); + }; + WorksheetImpl.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + options = options || {}; + return service.getUnderlyingTableDataReaderAsync(this.visualId, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); + }; + WorksheetImpl.prototype.clearSelectedMarksAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.clearSelectedMarksAsync(this.visualId); + }; + WorksheetImpl.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType); + }; + WorksheetImpl.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType); + }; + WorksheetImpl.prototype.annotateMarkAsync = function (mark, annotationText) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.annotateMarkAsync(this.visualId, mark, annotationText); + }; + WorksheetImpl.prototype.getAnnotationsAsync = function () { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.getAnnotationsAsync(this.visualId); + }; + WorksheetImpl.prototype.removeAnnotationAsync = function (annotation) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation'); + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + return service.removeAnnotationAsync(this.visualId, annotation); + }; + WorksheetImpl.prototype.appendContextMenuAsync = function (targetMenu, config) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config); + }; + WorksheetImpl.prototype.removeContextMenuAsync = function (targetMenu, menuItemId) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); + }; + WorksheetImpl.prototype.executeContextMenuAsync = function (targetMenu, menuItemId) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); + }; + WorksheetImpl.prototype.renameContextMenuAsync = function (targetMenu, menuHeader, menuDescription) { + this.verifyActiveSheet(); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription); + }; + WorksheetImpl.prototype.hoverTupleAsync = function (hoveredTuple, tooltip, allowHoverActions) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "hoverTupleAsync is not supported in dashboard extensions")); + } + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip, allowHoverActions); + }; + WorksheetImpl.prototype.selectTuplesAsync = function (selectedTuples, selectOption, tooltip) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "selectTuplesAsync is not supported in dashboard extensions")); + } + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip); + }; + WorksheetImpl.prototype.getTooltipTextAsync = function (tupleId) { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "getTooltipTextAsync is not supported in dashboard extensions")); + } + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); + return service.getTooltipTextAsync(this.visualId, tupleId); + }; + WorksheetImpl.prototype.leaveMarkNavigationAsync = function () { + if (this.isInsideDashboardExtension()) { + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "leaveMarkNavigationAsync is not supported in dashboard extensions")); + } + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); + return service.leaveMarkNavigationAsync(this.visualId); + }; + WorksheetImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) { + var dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId); + var dataSource = new DataSource_1.DataSource(dataSourceImpl); + dataSourceImpl.initializeWithPublicInterfaces(dataSource); + return dataSource; + }; + WorksheetImpl.prototype.verifyActiveSheet = function () { + var isRootAndActiveWorksheet = this.active; + var isInsideActiveDashboard = this.isInsideActiveDashboard(); + var isInsideActiveStoryPoint = this.isInsideActiveStoryPoint(); + if (!isRootAndActiveWorksheet && !isInsideActiveDashboard && !isInsideActiveStoryPoint) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); + } + }; + WorksheetImpl.prototype.isInsideActiveStoryPoint = function () { + return this._parentStoryPointImpl && this._parentStoryPointImpl.active; + }; + WorksheetImpl.prototype.isInsideActiveDashboard = function () { + return this._parentDashboardImpl && this._parentDashboardImpl.active; + }; + WorksheetImpl.prototype.isInsideDashboardExtension = function () { + return this._parentDashboardImpl !== null; + }; + return WorksheetImpl; +}(SheetImpl_1.SheetImpl)); +exports.WorksheetImpl = WorksheetImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/LogicalTable.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/LogicalTable.js ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Implementation of a logical table. + * This does not follow the Impl pattern as it is just a property bag. + */ +var LogicalTable = /** @class */ (function () { + function LogicalTable(_logicalTable) { + this._logicalTable = _logicalTable; + } + Object.defineProperty(LogicalTable.prototype, "id", { + get: function () { + return this._logicalTable.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(LogicalTable.prototype, "caption", { + get: function () { + return this._logicalTable.caption; + }, + enumerable: true, + configurable: true + }); + return LogicalTable; +}()); +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 })); +var TooltipTextRequestModel = /** @class */ (function () { + function TooltipTextRequestModel(visualIdPresModel, tupleId) { + this.visualIdPresModel = visualIdPresModel; + this.tupleId = tupleId; + } + return TooltipTextRequestModel; +}()); +exports.TooltipTextRequestModel = TooltipTextRequestModel; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***! + \*****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Filter = /** @class */ (function () { + function Filter(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) { + this._worksheetName = _worksheetName; + this._fieldName = _fieldName; + this._filterType = _filterType; + this._fieldId = _fieldId; + this._registryId = _registryId; + } + Object.defineProperty(Filter.prototype, "worksheetName", { + get: function () { + return this._worksheetName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "fieldName", { + get: function () { + return this._fieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "fieldId", { + get: function () { + return this._fieldId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Filter.prototype, "filterType", { + get: function () { + return this._filterType; + }, + enumerable: true, + configurable: true + }); + Filter.prototype.getFieldAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getFieldAsync(this._fieldId); + }; + Filter.prototype.getAppliedWorksheetsAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId); + }; + Filter.prototype.setAppliedWorksheetsAsync = function (applyToWorksheets) { + ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets'); + var uniqueWorksheets = new Set(applyToWorksheets); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets)); + }; + return Filter; +}()); +exports.Filter = Filter; +var CategoricalFilter = /** @class */ (function (_super) { + __extends(CategoricalFilter, _super); + function CategoricalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; + _this._appliedValues = _appliedValues; + _this._isExcludeMode = _isExcludeMode; + _this._isAllSelected = _isAllSelected; + return _this; + } + Object.defineProperty(CategoricalFilter.prototype, "isAllSelected", { + get: function () { + return this._isAllSelected; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalFilter.prototype, "appliedValues", { + get: function () { + return this._appliedValues; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalFilter.prototype, "isExcludeMode", { + get: function () { + return this._isExcludeMode; + }, + enumerable: true, + configurable: true + }); + CategoricalFilter.prototype.getDomainAsync = function (domainType) { + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType); + }; + return CategoricalFilter; +}(Filter)); +exports.CategoricalFilter = CategoricalFilter; +var HierarchicalDataValue = /** @class */ (function () { + function HierarchicalDataValue(_value, _hierarchicalPath, _level) { + this._value = _value; + this._hierarchicalPath = _hierarchicalPath; + this._level = _level; + } + Object.defineProperty(HierarchicalDataValue.prototype, "value", { + get: function () { + return this._value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalDataValue.prototype, "hierarchicalPath", { + get: function () { + return this._hierarchicalPath; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalDataValue.prototype, "level", { + get: function () { + return this._level; + }, + enumerable: true, + configurable: true + }); + return HierarchicalDataValue; +}()); +exports.HierarchicalDataValue = HierarchicalDataValue; +var HierarchicalLevelDetail = /** @class */ (function () { + function HierarchicalLevelDetail(_name, _levelSelectionState) { + this._name = _name; + this._levelSelectionState = _levelSelectionState; + } + Object.defineProperty(HierarchicalLevelDetail.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalLevelDetail.prototype, "levelSelectionState", { + get: function () { + return this._levelSelectionState; + }, + enumerable: true, + configurable: true + }); + return HierarchicalLevelDetail; +}()); +exports.HierarchicalLevelDetail = HierarchicalLevelDetail; +var HierarchicalFilter = /** @class */ (function (_super) { + __extends(HierarchicalFilter, _super); + function HierarchicalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; + _this._dimensionName = _dimensionName; + _this._hierarchyCaption = _hierarchyCaption; + _this._numberOfLevels = _numberOfLevels; + _this._levelDetails = _levelDetails; + _this._appliedValues = _appliedValues; + _this._isAllSelected = _isAllSelected; + return _this; + } + HierarchicalFilter.prototype.getDomainAsync = function (domainType) { + throw new Error('Method not implemented.'); + }; + Object.defineProperty(HierarchicalFilter.prototype, "dimensionName", { + get: function () { + return this._dimensionName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "hierarchyCaption", { + get: function () { + return this._hierarchyCaption; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "numberOfLevels", { + get: function () { + return this._numberOfLevels; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "levelDetails", { + get: function () { + return this._levelDetails; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "isAllSelected", { + get: function () { + return this._isAllSelected; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(HierarchicalFilter.prototype, "appliedValues", { + get: function () { + return this._appliedValues; + }, + enumerable: true, + configurable: true + }); + return HierarchicalFilter; +}(Filter)); +exports.HierarchicalFilter = HierarchicalFilter; +var RangeFilter = /** @class */ (function (_super) { + __extends(RangeFilter, _super); + function RangeFilter(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; + _this._min = _min; + _this._max = _max; + _this._includeNullValues = _includeNullValues; + return _this; + } + Object.defineProperty(RangeFilter.prototype, "minValue", { + get: function () { + return this._min; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeFilter.prototype, "maxValue", { + get: function () { + return this._max; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeFilter.prototype, "includeNullValues", { + get: function () { + return this._includeNullValues; + }, + enumerable: true, + configurable: true + }); + RangeFilter.prototype.getDomainAsync = function (domainType) { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + if (!domainType) { + domainType = api_external_contract_js_1.FilterDomainType.Relevant; + } + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); + return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType); + }; + return RangeFilter; +}(Filter)); +exports.RangeFilter = RangeFilter; +var RelativeDateFilter = /** @class */ (function (_super) { + __extends(RelativeDateFilter, _super); + function RelativeDateFilter(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) { + var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; + _this._anchorDate = _anchorDate; + _this._periodType = _periodType; + _this._rangeType = _rangeType; + _this._rangeN = _rangeN; + return _this; + } + Object.defineProperty(RelativeDateFilter.prototype, "anchorDate", { + get: function () { + return this._anchorDate; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "periodType", { + get: function () { + return this._periodType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "rangeType", { + get: function () { + return this._rangeType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RelativeDateFilter.prototype, "rangeN", { + get: function () { + return this._rangeN; + }, + enumerable: true, + configurable: true + }); + return RelativeDateFilter; +}(Filter)); +exports.RelativeDateFilter = RelativeDateFilter; +var CategoricalDomain = /** @class */ (function () { + function CategoricalDomain(_values, _domainType) { + this._values = _values; + this._domainType = _domainType; + } + Object.defineProperty(CategoricalDomain.prototype, "values", { + get: function () { + return this._values; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CategoricalDomain.prototype, "type", { + get: function () { + return this._domainType; + }, + enumerable: true, + configurable: true + }); + return CategoricalDomain; +}()); +exports.CategoricalDomain = CategoricalDomain; +var RangeDomain = /** @class */ (function () { + function RangeDomain(_min, _max, _domainType) { + this._min = _min; + this._max = _max; + this._domainType = _domainType; + } + Object.defineProperty(RangeDomain.prototype, "type", { + get: function () { + return this._domainType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeDomain.prototype, "min", { + get: function () { + return this._min; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RangeDomain.prototype, "max", { + get: function () { + return this._max; + }, + enumerable: true, + configurable: true + }); + return RangeDomain; +}()); +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 })); +var DataTable = /** @class */ (function () { + function DataTable(_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'; + } + Object.defineProperty(DataTable.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "data", { + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "columns", { + get: function () { + return this._columns; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "marksInfo", { + get: function () { + return this._marksInfo; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "totalRowCount", { + get: function () { + return this._totalRowCount; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "isTotalRowCountLimited", { + get: function () { + return this._isTotalRowCountLimited; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTable.prototype, "isSummaryData", { + get: function () { + return this._isSummaryData; + }, + enumerable: true, + configurable: true + }); + return DataTable; +}()); +exports.DataTable = DataTable; +var MarkInfo = /** @class */ (function () { + function MarkInfo(_type, _color, _tupleId) { + this._type = _type; + this._color = _color; + this._tupleId = _tupleId; + } + Object.defineProperty(MarkInfo.prototype, "type", { + get: function () { + return this._type; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MarkInfo.prototype, "color", { + get: function () { + return this._color; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MarkInfo.prototype, "tupleId", { + get: function () { + return this._tupleId; + }, + enumerable: true, + configurable: true + }); + return MarkInfo; +}()); +exports.MarkInfo = MarkInfo; +var Column = /** @class */ (function () { + function Column(_fieldName, _fieldId, _dataType, _isReferenced, _index) { + this._fieldName = _fieldName; + this._fieldId = _fieldId; + this._dataType = _dataType; + this._isReferenced = _isReferenced; + this._index = _index; + } + Object.defineProperty(Column.prototype, "fieldName", { + get: function () { + return this._fieldName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "fieldId", { + get: function () { + return this._fieldId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "dataType", { + get: function () { + return this._dataType; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "isReferenced", { + get: function () { + return this._isReferenced; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Column.prototype, "index", { + get: function () { + return this._index; + }, + enumerable: true, + configurable: true + }); + return Column; +}()); +exports.Column = Column; +var DataValue = /** @class */ (function () { + /* tslint:disable:no-any */ + function DataValue(_value, _nativeValue, _formattedValue) { + this._value = _value; + this._nativeValue = _nativeValue; + this._formattedValue = _formattedValue; + } + Object.defineProperty(DataValue.prototype, "value", { + get: function () { + return this._value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataValue.prototype, "nativeValue", { + get: function () { + return this._nativeValue; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataValue.prototype, "formattedValue", { + get: function () { + return this._formattedValue; + }, + enumerable: true, + configurable: true + }); + return DataValue; +}()); +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()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var DataTableReader = /** @class */ (function () { + function DataTableReader(_id, _totalRowCount, _pageRowCount, _registryId) { + this._id = _id; + this._totalRowCount = _totalRowCount; + this._pageRowCount = _pageRowCount; + this._registryId = _registryId; + this._pageCount = Math.ceil(_totalRowCount / _pageRowCount); + } + Object.defineProperty(DataTableReader.prototype, "totalRowCount", { + get: function () { + return this._totalRowCount; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataTableReader.prototype, "pageCount", { + get: function () { + return this._pageCount; + }, + enumerable: true, + configurable: true + }); + DataTableReader.prototype.getPageAsync = function (pageNumber) { + ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount); + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.getPageAsync(this._id, pageNumber, this._pageRowCount); + }; + DataTableReader.prototype.getAllPagesAsync = function (maxRows) { + return __awaiter(this, void 0, void 0, function () { + var firstPage, rowsRequested, pagesRequested, pagesToFetch, isDataLimited, remainingData, i, page, fullData; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, this.getPageAsync(0)]; + case 1: + firstPage = _b.sent(); + maxRows = maxRows || this.totalRowCount; + rowsRequested = Math.min(maxRows, this.totalRowCount); + pagesRequested = Math.ceil(rowsRequested / this._pageRowCount); + pagesToFetch = Math.min(pagesRequested, 400); + isDataLimited = pagesToFetch < pagesRequested; + remainingData = []; + i = 1; + _b.label = 2; + case 2: + if (!(i < pagesToFetch)) return [3 /*break*/, 5]; + return [4 /*yield*/, this.getPageAsync(i)]; + case 3: + page = _b.sent(); + remainingData.push(page.data); + _b.label = 4; + case 4: + i++; + return [3 /*break*/, 2]; + case 5: + fullData = (_a = firstPage.data).concat.apply(_a, remainingData); + // This slices the array only if maxRows has been set and is less than totalRowCount + fullData.length = rowsRequested; + return [2 /*return*/, { + name: firstPage.name, + data: fullData, + columns: firstPage.columns, + totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested, + isTotalRowCountLimited: isDataLimited, + isSummaryData: firstPage.isSummaryData, + }]; + } + }); + }); + }; + DataTableReader.prototype.releaseAsync = function () { + var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + return service.releaseAsync(this._id); + }; + return DataTableReader; +}()); +exports.DataTableReader = DataTableReader; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Selection Model. + */ +var SelectionModel = /** @class */ (function () { + function SelectionModel() { + } + return SelectionModel; +}()); +exports.SelectionModel = SelectionModel; +/** + * Value based selection model. Meant for hierarchical, range and categorical selections. + */ +var ValueSelectionModel = /** @class */ (function (_super) { + __extends(ValueSelectionModel, _super); + function ValueSelectionModel() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.selectValues = []; + return _this; + } + return ValueSelectionModel; +}(SelectionModel)); +exports.ValueSelectionModel = ValueSelectionModel; +/** + * Hierarchical value selection model + */ +var HierarchicalSelectionModel = /** @class */ (function (_super) { + __extends(HierarchicalSelectionModel, _super); + function HierarchicalSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return HierarchicalSelectionModel; +}(ValueSelectionModel)); +exports.HierarchicalSelectionModel = HierarchicalSelectionModel; +/** + * Range based value selection model + */ +var RangeSelectionModel = /** @class */ (function (_super) { + __extends(RangeSelectionModel, _super); + function RangeSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return RangeSelectionModel; +}(SelectionModel)); +exports.RangeSelectionModel = RangeSelectionModel; +/** + * Dimension value selection model + */ +var DimensionSelectionModel = /** @class */ (function (_super) { + __extends(DimensionSelectionModel, _super); + function DimensionSelectionModel() { + return _super !== null && _super.apply(this, arguments) || this; + } + return DimensionSelectionModel; +}(ValueSelectionModel)); +exports.DimensionSelectionModel = DimensionSelectionModel; +/** + * Tuple based selection model + */ +var TupleSelectionModel = /** @class */ (function () { + function TupleSelectionModel() { + this.objectIds = []; + } + return TupleSelectionModel; +}()); +exports.TupleSelectionModel = TupleSelectionModel; +/** + * Container class to populate all the selection models when parsing input + */ +var SelectionModelsContainer = /** @class */ (function () { + function SelectionModelsContainer() { + this.hierModelArr = []; + this.dimModelArr = []; + this.quantModelArr = []; + } + return SelectionModelsContainer; +}()); +exports.SelectionModelsContainer = SelectionModelsContainer; +var SelectTuplesInteractionModel = /** @class */ (function () { + function SelectTuplesInteractionModel(visualIdPresModel, tupleIds, selectOptions, tooltipContext) { + if (tupleIds === void 0) { tupleIds = []; } + this.visualIdPresModel = visualIdPresModel; + this.tupleIds = tupleIds; + this.selectOptions = selectOptions; + this.tooltipContext = tooltipContext; + } + return SelectTuplesInteractionModel; +}()); +exports.SelectTuplesInteractionModel = SelectTuplesInteractionModel; +var HoverTupleInteractionModel = /** @class */ (function () { + function HoverTupleInteractionModel(visualIdPresModel, tupleId, tooltipContext, allowHoverActions) { + this.visualIdPresModel = visualIdPresModel; + this.tupleId = tupleId; + this.tooltipContext = tooltipContext; + this.allowHoverActions = allowHoverActions; + } + return HoverTupleInteractionModel; +}()); +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 })); +var Point = /** @class */ (function () { + function Point(_x, _y) { + this._x = _x; + this._y = _y; + } + Object.defineProperty(Point.prototype, "x", { + get: function () { + return this._x; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Point.prototype, "y", { + get: function () { + return this._y; + }, + enumerable: true, + configurable: true + }); + return Point; +}()); +exports.Point = Point; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js": +/*!*********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/GetDataService.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Defines which type of getData call to make. + */ +var GetDataType; +(function (GetDataType) { + GetDataType["Summary"] = "summary"; + GetDataType["Underlying"] = "underlying"; +})(GetDataType = exports.GetDataType || (exports.GetDataType = {})); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +var AccessibilityServiceImpl_1 = __webpack_require__(/*! ./impl/AccessibilityServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js"); +var AnimationServiceImpl_1 = __webpack_require__(/*! ./impl/AnimationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js"); +var AnnotationServiceImpl_1 = __webpack_require__(/*! ./impl/AnnotationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js"); +var DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js"); +var ExportServiceImpl_1 = __webpack_require__(/*! ./impl/ExportServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js"); +var ExternalContextMenuServiceImpl_1 = __webpack_require__(/*! ./impl/ExternalContextMenuServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js"); +var FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js"); +var GetDataServiceImpl_1 = __webpack_require__(/*! ./impl/GetDataServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js"); +var NotificationServiceImpl_1 = __webpack_require__(/*! ./impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +var ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js"); +var SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js"); +var SizeServiceImpl_1 = __webpack_require__(/*! ./impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +var VisualModelServiceImpl_1 = __webpack_require__(/*! ./impl/VisualModelServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js"); +var VizServiceImpl_1 = __webpack_require__(/*! ./impl/VizServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js"); +var ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js"); +function registerAllSharedServices(dispatcher, registryId, platformVersion) { + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, registryId, platformVersion)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExportServiceImpl_1.ExportServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnnotationServiceImpl_1.AnnotationServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SizeServiceImpl_1.SizeServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VisualModelServiceImpl_1.VisualModelServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VizServiceImpl_1.VizServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExternalContextMenuServiceImpl_1.ExternalContextMenuServiceImpl(dispatcher, registryId)); + ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AccessibilityServiceImpl_1.AccessibilityServiceImpl(dispatcher, registryId)); +} +exports.registerAllSharedServices = registerAllSharedServices; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +window.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {}; +var ServiceRegistryImpl = /** @class */ (function () { + function ServiceRegistryImpl() { + this._services = {}; + } + ServiceRegistryImpl.prototype.registerService = function (service) { + this._services[service.serviceName] = service; + }; + ServiceRegistryImpl.prototype.getService = function (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]; + }; + return ServiceRegistryImpl; +}()); +/** + * 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). + */ +var ApiServiceRegistry = /** @class */ (function () { + // Private to avoid anyone constructing this + function ApiServiceRegistry() { + } + /** + * Gets the singleton instance of the ServiceRegistry + */ + ApiServiceRegistry.get = function (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 + */ + ApiServiceRegistry.setInstance = function (registryId, serviceRegistry) { + if (!window.__tableauApiServiceRegistry) { + window.__tableauApiServiceRegistry = {}; + } + window.__tableauApiServiceRegistry[registryId] = serviceRegistry; + }; + /** + * Only used by unit tests + */ + ApiServiceRegistry.clearRegistry = function () { + window.__tableauApiServiceRegistry = {}; + }; + return ApiServiceRegistry; +}()); +exports.ApiServiceRegistry = ApiServiceRegistry; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js": +/*!************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js ***! + \************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var AccessibilityModels_1 = __webpack_require__(/*! ../../Models/AccessibilityModels */ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var AccessibilityServiceImpl = /** @class */ (function (_super) { + __extends(AccessibilityServiceImpl, _super); + function AccessibilityServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(AccessibilityServiceImpl.prototype, "serviceName", { + get: function () { + return "accessibility" /* Accessibility */; + }, + enumerable: true, + configurable: true + }); + AccessibilityServiceImpl.prototype.getTooltipTextAsync = function (visualId, tupleId) { + var _a; + var tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getTooltipTextAsync', + _a[api_internal_contract_js_1.ParameterId.TooltipTextRequest] = tooltipTextRequest, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then(function (response) { + return response.result; + }); + }; + AccessibilityServiceImpl.prototype.leaveMarkNavigationAsync = function (visualId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'leaveMarkNavigationAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then(function (response) { + return; + }); + }; + return AccessibilityServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.AccessibilityServiceImpl = AccessibilityServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var AnimationServiceImpl = /** @class */ (function (_super) { + __extends(AnimationServiceImpl, _super); + function AnimationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(AnimationServiceImpl.prototype, "serviceName", { + get: function () { + return "animation-service" /* Animation */; + }, + enumerable: true, + configurable: true + }); + AnimationServiceImpl.prototype.replayAsync = function (replaySpeed) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.ReplaySpeed] = 1.0, + _a); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType'); + parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed); + return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then(function (response) { + return; + }); + }; + return AnimationServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.AnimationServiceImpl = AnimationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var AnnotationServiceImpl = /** @class */ (function (_super) { + __extends(AnnotationServiceImpl, _super); + function AnnotationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(AnnotationServiceImpl.prototype, "serviceName", { + get: function () { + return "annotation-service" /* Annotation */; + }, + enumerable: true, + configurable: true + }); + /** + * Method to annotate a mark on the given worksheet. + * + * @param visualId + * @param mark + * @param annotationText + */ + AnnotationServiceImpl.prototype.annotateMarkAsync = function (visualId, mark, annotationText) { + var _a; + var selectionModelContainer = this.parseMarkSelectionIds([mark]); + var dummyTargetPoint = { x: 0, y: 0 }; + var formattedText = "" + annotationText + ""; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'annotateMarkAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.AnnotateEnum] = api_internal_contract_js_1.AnnotateEnum.Mark, + _a[api_internal_contract_js_1.ParameterId.TargetPoint] = dummyTargetPoint, + _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection], + _a[api_internal_contract_js_1.ParameterId.FormattedText] = formattedText, + _a); + return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then(function (response) { + // Expecting an empty model and hence the void response. + return; + }); + }; + /** + * Method to retrieve annotations for the given worksheet. + * + * @param visualId + * @returns {Promise>} + */ + AnnotationServiceImpl.prototype.getAnnotationsAsync = function (visualId) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAnnotationsAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then(function (response) { + var annotationsList = response.result; + return _this.annotationFilterMap(annotationsList); + }); + }; + /** + * Method to remove an annotation from a given worksheet. + * + * @param visualId + * @param annotation + */ + AnnotationServiceImpl.prototype.removeAnnotationAsync = function (visualId, annotation) { + var _a; + var selectionModelContainer = this.parseAnnotationSelectionIds([annotation]); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeAnnotationAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection], + _a); + return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then(function (response) { + // Expecting an empty model and hence the void response. + return; + }); + }; + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + AnnotationServiceImpl.prototype.parseMarkSelectionIds = function (marks) { + var ids = []; + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + marks.forEach(function (mark) { + var tupleId = mark.tupleId; + 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 + var tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'tuples'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + }; + /** + * Method to prepare the pres models for selection by MarkAnnotationInfo + * @param marks + */ + AnnotationServiceImpl.prototype.parseAnnotationSelectionIds = function (annotations) { + var ids = []; + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + annotations.forEach(function (annotation) { + var annotationId = annotation.annotationId; + 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 + var tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + tupleSelectionModel.selectionType = 'annotations'; + tupleSelectionModel.objectIds = ids; + selectionModelContainer.selection = tupleSelectionModel; + } + return selectionModelContainer; + }; + /** + * Method to map Annotation to MarkAnnotationInfo + * @param annotation + * @returns {Annotation} + */ + AnnotationServiceImpl.prototype.mapAnnotation = function (annotation) { + 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} + */ + AnnotationServiceImpl.prototype.annotationFilterMap = function (annotations) { + var _this = this; + var annotationInfos = annotations.map(function (annotation) { return _this.mapAnnotation(annotation); }); + return annotationInfos; + }; + return AnnotationServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.AnnotationServiceImpl = AnnotationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ClientInfoServiceImpl = /** @class */ (function (_super) { + __extends(ClientInfoServiceImpl, _super); + function ClientInfoServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ClientInfoServiceImpl.prototype, "serviceName", { + get: function () { + return "client-info-service" /* ClientInfo */; + }, + enumerable: true, + configurable: true + }); + ClientInfoServiceImpl.prototype.getClientInfoAsync = function () { + var _a; + var verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getClientInfoAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + var clientInfo = response.result; + return clientInfo; + }); + }; + return ClientInfoServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.ClientInfoServiceImpl = ClientInfoServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var DataSource_1 = __webpack_require__(/*! ../../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +var Field_1 = __webpack_require__(/*! ../../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +var DataSourceImpl_1 = __webpack_require__(/*! ../../Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +var FieldImpl_1 = __webpack_require__(/*! ../../Impl/FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +exports.SENTINEL_LOGICAL_TABLE_INFO = { + id: InternalContract.ApiShowDataTableSentinel.SingleTableId, + caption: InternalContract.ApiShowDataTableSentinel.SingleTableCaption, +}; +// The minimum platform version when Object Model was supported +var platformVersionObjectModelSupport = { major: 1, minor: 20, fix: 1 }; +var DataSourceServiceImpl = /** @class */ (function (_super) { + __extends(DataSourceServiceImpl, _super); + // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the + // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional + // code in here for Object Model can be removed. + function DataSourceServiceImpl(dispatcher, registryId, _platformVersion) { + if (_platformVersion === void 0) { _platformVersion = platformVersionObjectModelSupport; } + var _this = _super.call(this, dispatcher, registryId) || this; + _this._platformVersion = _platformVersion; + return _this; + } + Object.defineProperty(DataSourceServiceImpl.prototype, "serviceName", { + get: function () { + return "data-source-service" /* DataSourceService */; + }, + enumerable: true, + configurable: true + }); + DataSourceServiceImpl.prototype.refreshAsync = function (dataSourceId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'refreshAsync', + _a[api_internal_contract_js_1.ParameterId.DeltaTimeMs] = 0, + _a[api_internal_contract_js_1.ParameterId.ShouldRefreshDS] = true, + _a); + // On server: Not passing the datasource id will refresh all datasources. + if (dataSourceId) { + parameters[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId; + } + return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then(function (response) { + return; + }); + }; + DataSourceServiceImpl.prototype.getActiveTablesAsync = function (dataSourceId) { + var _a; + var joinParameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getActiveTablesAsync', + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a); + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then(function (joinResponse) { + var tableInfos = joinResponse.result; + // 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; + }); + }; + DataSourceServiceImpl.prototype.getDataSourcesAsync = function (visualId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourcesAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then(function (response) { + var dataSchema = response.result; + return dataSchema; + }); + }; + DataSourceServiceImpl.prototype.getAllDataSourcesAsync = function () { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAllDataSourcesAsync', + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then(function (response) { + var dataSchema = response.result; + return dataSchema; + }); + }; + DataSourceServiceImpl.prototype.getConnectionSummariesAsync = function (dataSourceId) { + var _a; + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getConnectionSummariesAsync', + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a); + // Get the description of the tables used by this connection + return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then(function (response) { + var descriptionSummaries = response.result; + return descriptionSummaries; + }); + }; + DataSourceServiceImpl.prototype.getFieldAsync = function (globalfieldName) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFieldAsync', + _a[api_internal_contract_js_1.ParameterId.FieldId] = globalfieldName, + _a); + return this.execute(verb, parameters).then(function (response) { + var dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource]; + var field = response.result[api_internal_contract_js_1.ParameterId.Field]; + return _this.convertField(field, _this.convertDataSource(dataSource)); + }); + }; + DataSourceServiceImpl.prototype.getLogicalTablesAsync = function (dataSourceId) { + var _a; + if (!this.isObjectModelSupportedByPlatform()) { + /** + * This sentinel ID can be passed to datasource.getLogicalTableData. + * Once the desktop is upgraded to a version that supports object model, + * the sentinel ID will automatically fetch the upgraded table. + * */ + return new Promise(function (resolve) { return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); }); + } + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTablesAsync', + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then(function (response) { + return response.result; + }); + }; + DataSourceServiceImpl.prototype.getUnderlyingTablesAsync = function (visualId) { + var _a; + if (!this.isObjectModelSupportedByPlatform()) { + /** + * This sentinel ID can be passed to worksheet.getUnderlyingTableData. + * Once the desktop is upgraded to a version that supports object model, + * the sentinel ID will automatically fetch the upgraded table. + * */ + return new Promise(function (resolve) { return resolve([exports.SENTINEL_LOGICAL_TABLE_INFO]); }); + } + var params = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTablesAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then(function (response) { + return response.result; + }); + }; + DataSourceServiceImpl.prototype.convertField = function (field, dataSource) { + return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource)); + }; + DataSourceServiceImpl.prototype.convertDataSource = function (dataSource) { + return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId)); + }; + DataSourceServiceImpl.prototype.isObjectModelSupportedByPlatform = function () { + var platformVersionNoObjectModelSupport = { major: 1, minor: 13, fix: 0 }; + return InternalContract.VersionLessThan(platformVersionNoObjectModelSupport, this._platformVersion); + }; + return DataSourceServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +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 __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + 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()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ExportServiceImpl = /** @class */ (function (_super) { + __extends(ExportServiceImpl, _super); + function ExportServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ExportServiceImpl.prototype, "serviceName", { + get: function () { + return "export-service" /* Export */; + }, + enumerable: true, + configurable: true + }); + ExportServiceImpl.prototype.getExportCrosstabSheetMapAsync = function (currentSheetType) { + var _a; + var verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportCrosstabSheetMapAsync', + _a[api_internal_contract_js_1.ParameterId.CurrentSheetType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType), + _a); + return this.execute(verb, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + ExportServiceImpl.prototype.exportCrosstabAsync = function (sheetName, format, exportableWorksheetNames, currentSheetType) { + return __awaiter(this, void 0, void 0, function () { + var sheetNameToIdMap, parameters, verb; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat'); + return [4 /*yield*/, this.getExportCrosstabSheetMapAsync(currentSheetType)]; + case 1: + sheetNameToIdMap = _b.sent(); + if (!sheetNameToIdMap[sheetName]) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap'); + } + parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportCrosstabAsync', + _a[api_internal_contract_js_1.ParameterId.SheetIdentifier] = sheetNameToIdMap[sheetName], + _a[api_internal_contract_js_1.ParameterId.SendNotifications] = true, + _a); + switch (format) { + case api_external_contract_js_1.CrosstabFileFormat.CSV: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload; + // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo + parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true; + break; + case api_external_contract_js_1.CrosstabFileFormat.Excel: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.'); + } + return [2 /*return*/, this.execute(verb, parameters) + .then(function (response) { + var result = response.result; + return result; + }) + .catch(function () { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.'); + })]; + } + }); + }); + }; + ExportServiceImpl.prototype.exportDataAsync = function (visualId, options) { + var _a; + var _b; + ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options); + // Remove any duplicates from the input array + var columnsAsSet = new Set(options.columnsToIncludeById); + var columnsToIncludeById = Array.from(columnsAsSet); + var verb = api_internal_contract_js_1.VerbId.ExportDataDownload; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportDataAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = (_b = options.ignoreAliases, (_b !== null && _b !== void 0 ? _b : false)), + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = columnsToIncludeById, + _a); + return this.execute(verb, parameters) + .then(function () { }) + .catch(function () { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.'); + }); + }; + ExportServiceImpl.prototype.exportPowerPointAsync = function (sheetNames, exportScenarios) { + var _a; + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + // Note: the ExportOriginUrl param is listed as optional for the pres layer command we are invoking; however, + // recent changes were made that enforced the use of the empty string when invoking this command with no ExportOriginUrl. + // see browser-clients/export-powerpoint-options-dialog repo. + var verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPowerPointAsync', + _a[api_internal_contract_js_1.ParameterId.ExportOriginUrl] = '', + _a[api_internal_contract_js_1.ParameterId.SelectedSheetNames] = sheetNames, + _a); + return this.execute(verb, parameters) + .then(function (response) { + var result = response.result; + return result; + }) + .catch(function () { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PowerPointCreationError, 'An error occured while attempting to generate the PowerPoint file.'); + }); + }; + ExportServiceImpl.prototype.exportPDFAsync = function (sheetNames, externalExportPdfOptions, exportScenarios) { + return __awaiter(this, void 0, void 0, function () { + var internalExportPdfOptions, verb, parameters; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions); + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + return [4 /*yield*/, this.getExportPDFOptionsAsync()]; + case 1: + internalExportPdfOptions = _b.sent(); + ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames); + verb = api_internal_contract_js_1.VerbId.ExportPdfDownload; + parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPDFAsync', + _a[api_internal_contract_js_1.ParameterId.ExportPdfOptions] = internalExportPdfOptions, + _a); + return [2 /*return*/, this.execute(verb, parameters) + .then(function (response) { + var result = response.result; + return result; + }) + .catch(function () { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.'); + })]; + } + }); + }); + }; + ExportServiceImpl.prototype.getExportPDFOptionsAsync = function () { + var _a; + var verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportPdfOptionsAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + return ExportServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.ExportServiceImpl = ExportServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js": +/*!******************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js ***! + \******************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ExternalContextMenuServiceImpl = /** @class */ (function (_super) { + __extends(ExternalContextMenuServiceImpl, _super); + function ExternalContextMenuServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ExternalContextMenuServiceImpl.prototype, "serviceName", { + get: function () { + return "external-context-menu-service" /* ExternalContextMenu */; + }, + enumerable: true, + configurable: true + }); + ExternalContextMenuServiceImpl.prototype.appendContextMenuAsync = function (sheetName, targetMenu, config) { + var _a; + var verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'appendContextMenuAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName] = config.displayName, + _a); + return this.execute(verb, parameters).then(function (response) { + var newMenuItemId = response.result; + return newMenuItemId; + }); + }; + ExternalContextMenuServiceImpl.prototype.removeContextMenuAsync = function (sheetName, targetMenu, menuItemId) { + var _a; + var verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeContextMenuAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId, + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + ExternalContextMenuServiceImpl.prototype.executeContextMenuAsync = function (sheetName, targetMenu, menuItemId) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'executeContextMenuAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId, + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + ExternalContextMenuServiceImpl.prototype.renameContextMenuAsync = function (sheetName, targetMenu, menuHeader, menuDescription) { + var _a; + var verb = api_internal_contract_js_1.VerbId.RenameExternalMenu; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'renameContextMenuAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuHeader] = menuHeader, + _a[api_internal_contract_js_1.ParameterId.ExternalMenuDescription] = menuDescription, + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + return ExternalContextMenuServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +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 __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + 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()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var FilterModels_1 = __webpack_require__(/*! ../../Models/FilterModels */ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var FilterServiceImpl = /** @class */ (function (_super) { + __extends(FilterServiceImpl, _super); + function FilterServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(FilterServiceImpl.prototype, "serviceName", { + get: function () { + return "filter-service" /* Filter */; + }, + enumerable: true, + configurable: true + }); + FilterServiceImpl.prototype.applyFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyFilterAsync', + _a); + 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(function (response) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.applyRangeFilterAsync = function (visualId, fieldName, filterOptions) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRangeFilterAsync', + _a); + if (filterOptions.min !== undefined && filterOptions.min !== null) { + var min = void 0; + 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) { + var max = void 0; + 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(function (response) { + _this.apiFilterHandlerCheckForCommandError(response.result); + return fieldName; + }); + }; + FilterServiceImpl.prototype.applyHierarchicalFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) { + var _a; + var verb = api_internal_contract_js_1.VerbId.HierarchicalFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyHierarchicalFilterAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + var 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(function (response) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.clearFilterAsync = function (visualId, fieldName) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ClearFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearFilterAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + return this.execute(verb, parameters).then(function (resposne) { + return fieldName; + }); + }; + FilterServiceImpl.prototype.applyRelativeDateFilterAsync = function (visualId, fieldName, options) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRelativeDateFilterAsync', + _a); + 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(function (response) { + return response.result; + }); + }; + FilterServiceImpl.prototype.getFiltersAsync = function (visualId) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetFilters; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFiltersAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; + return this.execute(verb, parameters).then(function (response) { + var filters = response.result; + return _this.convertDomainFilters(filters); + }); + }; + FilterServiceImpl.prototype.getCategoricalDomainAsync = function (worksheetName, fieldId, domainType) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCategoricalDomainAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then(function (response) { + var domain = response.result; + return _this.convertCategoricalDomain(domain, domainType); + }); + }; + FilterServiceImpl.prototype.getRangeDomainAsync = function (worksheetName, fieldId, domainType) { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetRangeDomain; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getRangeDomainAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); + return this.execute(verb, parameters).then(function (response) { + var domain = response.result; + return _this.convertRangeDomain(domain, domainType); + }); + }; + FilterServiceImpl.prototype.getDashboardFiltersAsync = function () { + var _a; + var _this = this; + var verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDashboardFiltersAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + var filters = response.result; + return _this.convertDomainFilters(filters); + }); + }; + FilterServiceImpl.prototype.applyDashboardFilterAsync = function (fieldName, values, updateType, filterOptions) { + var _a; + var verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyDashboardFilterAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; + parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; + parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); + parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; + return this.execute(verb, parameters).then(function (response) { + return response.result; + }); + }; + FilterServiceImpl.prototype.getAppliedWorksheetsAsync = function (worksheetName, fieldId) { + var _a; + return __awaiter(this, void 0, void 0, function () { + var sharedFilterModel, worksheetNames; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync')]; + case 1: + sharedFilterModel = _b.sent(); + worksheetNames = []; + (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map(function (worksheetInfo) { + if (worksheetInfo.isSelected) { + worksheetNames.push(worksheetInfo.worksheetName); + } + }); + return [2 /*return*/, worksheetNames]; + } + }); + }); + }; + FilterServiceImpl.prototype.setAppliedWorksheetsAsync = function (worksheetName, fieldName, fieldId, applyToWorksheets) { + return __awaiter(this, void 0, void 0, function () { + var sharedFilterModel, allowedWorksheets, activeWorksheet, verb, parameters; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal')]; + case 1: + sharedFilterModel = _a.sent(); + if (!sharedFilterModel || !sharedFilterModel.worksheets) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets'); + } + allowedWorksheets = []; + activeWorksheet = ''; + sharedFilterModel.worksheets.forEach(function (worksheet) { + // Get active worksheet + if (worksheet.isActive) { + activeWorksheet = worksheet.worksheetName; + } + // Populate allowed worksheets + if (worksheet.isSelected || worksheet.isEnabled) { + allowedWorksheets.push(worksheet.worksheetName); + } + }); + if (activeWorksheet === '') { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet'); + } + if (!applyToWorksheets.includes(activeWorksheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, activeWorksheet + " must be included in the applied worksheets"); + } + applyToWorksheets.forEach(function (sheet) { + // check if it's present within compatible sheets + if (!allowedWorksheets.includes(sheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, "The field " + fieldName + " isn't applicable to the worksheet " + sheet); + } + }); + verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter; + parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync'; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets; + return [2 /*return*/, this.execute(verb, parameters).then(function (response) { + return applyToWorksheets; + })]; + } + }); + }); + }; + // Helper Methods + FilterServiceImpl.prototype.executeGetAppliedWorksheets = function (worksheetName, fieldId, telemetryFunctionName) { + var verb = api_internal_contract_js_1.VerbId.GetSharedFilter; + var parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = telemetryFunctionName; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + return this.execute(verb, parameters).then(function (response) { + var sharedFilterModel = response.result; + return sharedFilterModel; + }); + }; + FilterServiceImpl.prototype.convertDomainFilters = function (domainFilters) { + var _this = this; + var filters = []; + domainFilters.forEach(function (domainFilter) { + switch (domainFilter.filterType) { + case api_internal_contract_js_1.FilterType.Categorical: { + var 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: { + var 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: { + var 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: { + var filter = domainFilter; + if (filter) { + filters.push(_this.convertRelativeDateFilter(filter)); + } + else { + throw new Error('Invalid Relative Date Filter'); + } + break; + } + default: { + break; + } + } + }); + return filters; + }; + FilterServiceImpl.prototype.convertCategoricalFilter = function (domainFilter) { + var appliedValues = domainFilter.values.map(function (dv) { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv); + }); + return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Categorical, this._registryId, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected); + }; + FilterServiceImpl.prototype.convertHierarchicalFilter = function (domainFilter) { + var appliedValues = domainFilter.values.map(function (hierarchicalDataValue) { + return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level); + }); + var levelDetails = domainFilter.levelInfo.map(function (aLevel) { + return new FilterModels_1.HierarchicalLevelDetail(aLevel.name, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(aLevel.levelSelectionState)); + }); + return new FilterModels_1.HierarchicalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected); + }; + FilterServiceImpl.prototype.convertRangeFilter = function (domainFilter) { + var minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min); + var maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max); + return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Range, this._registryId, minValue, maxValue, domainFilter.includeNullValues); + }; + FilterServiceImpl.prototype.convertRelativeDateFilter = function (domainFilter) { + var anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate); + return new FilterModels_1.RelativeDateFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.RelativeDate, this._registryId, anchorDateValue, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(domainFilter.periodType), InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateRangeType.convert(domainFilter.rangeType), domainFilter.rangeN); + }; + FilterServiceImpl.prototype.convertCategoricalDomain = function (domain, domainType) { + var values = domain.values.map(function (domainDv) { + return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv); + }); + return new FilterModels_1.CategoricalDomain(values, domainType); + }; + FilterServiceImpl.prototype.convertRangeDomain = function (domain, domainType) { + var min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min); + var max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max); + return new FilterModels_1.RangeDomain(min, max, domainType); + }; + FilterServiceImpl.prototype.convertAnchorDate = function (anchorDate) { + // Converts a Date object into a string format that the server expects for date/time values. + // If anchorDate doesn't represent a valid Date object, any of these would be NaN. + var year = anchorDate.getUTCFullYear(); + var month = anchorDate.getUTCMonth() + 1; + var day = anchorDate.getUTCDate(); + var hh = anchorDate.getUTCHours(); + var mm = anchorDate.getUTCMinutes(); + var sec = anchorDate.getUTCSeconds(); + if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hh) || isNaN(mm) || isNaN(sec)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.InvalidDateParameter, 'Invalid date parameter: anchorDate'); + } + var result = year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + sec; + return result; + }; + FilterServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (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'); + }; + return FilterServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.FilterServiceImpl = FilterServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js": +/*!******************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***! + \******************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var uuid_1 = __webpack_require__(/*! uuid */ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js"); +var ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var GetDataModels_1 = __webpack_require__(/*! ../../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +var GetDataTableReaderModels_1 = __webpack_require__(/*! ../../Models/GetDataTableReaderModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js"); +var DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +var GetDataService_1 = __webpack_require__(/*! ../GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var GetDataServiceImpl = /** @class */ (function (_super) { + __extends(GetDataServiceImpl, _super); + function GetDataServiceImpl() { + var _this = _super !== null && _super.apply(this, arguments) || this; + // The extension/embedding instance uses the same cache for all DataTableReaders. + _this.viewDataTableCacheId = uuid_1.v4(); + return _this; + } + Object.defineProperty(GetDataServiceImpl.prototype, "serviceName", { + get: function () { + return "get-data-service" /* GetData */; + }, + enumerable: true, + configurable: true + }); + GetDataServiceImpl.prototype.getMaxRowLimit = function () { + return 10000; + }; + GetDataServiceImpl.prototype.getViewDataTableCacheId = function () { + return this.viewDataTableCacheId; + }; + GetDataServiceImpl.prototype.getLimitedMaxRows = function (requestedRows, rowCountLimit) { + return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit; + }; + GetDataServiceImpl.prototype.getUnderlyingDataAsync = function (visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) { + var _a; + var _this = this; + // Create all of our parameters + var summaryData = getType === GetDataService_1.GetDataType.Summary; + var functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync'; + var verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData; + var requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = functionName, + _a); + 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); + return this.execute(verb, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, responseData.isSummary); + }); + }; + GetDataServiceImpl.prototype.getSummaryDataReaderAsync = function (visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryDataReaderAsync', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then(function (response) { + var responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); + }); + }; + GetDataServiceImpl.prototype.getSummaryColumnsInfoAsync = function (visualId) { + var _a; + // Create all the parameters for GetDataType of Summary with 1 row, and only native values + // Then return just the columns + var verb = api_internal_contract_js_1.VerbId.GetDataSummaryData; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryColumnsInfoAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = true, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = true, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = true, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = 1, + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + _a); + return this.execute(verb, parameters).then(function (response) { + var underlyingDataTable = response.result; + var dataTable = underlyingDataTable.data; + var columns = dataTable.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + return columns; + }); + }; + GetDataServiceImpl.prototype.getSelectedMarksAsync = function (visualId) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSelectedMarksAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then(function (response) { + var responseData = response.result; + return { + data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }), + }; + }); + }; + GetDataServiceImpl.prototype.getHighlightedMarksAsync = function (visualId) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getHighlightedMarksAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then(function (response) { + var responseData = response.result; + return { + data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }), + }; + }); + }; + GetDataServiceImpl.prototype.getDataSourceDataAsync = function (dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourceDataAsync', + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = this.verifyIncludeColumnArray(columnsToInclude), + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.getLogicalTableDataAsync = function (datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataAsync', + _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = columnsToInclude, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.getLogicalTableDataReaderAsync = function (datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataReaderAsync', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then(function (response) { + var responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); + }); + }; + GetDataServiceImpl.prototype.getUnderlyingTableDataAsync = function (visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsTable(responseData.data, false); + }); + }; + GetDataServiceImpl.prototype.getUnderlyingTableDataReaderAsync = function (visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption) { + var _a; + var _this = this; + pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataReaderAsync', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, + _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, + _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, + _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, + _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), + _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then(function (response) { + var responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); + }); + }; + GetDataServiceImpl.prototype.getPageAsync = function (tableId, pageNumber, pageSize) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getPageAsync', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId, + _a[api_internal_contract_js_1.ParameterId.DataRowIndex] = pageNumber * pageSize, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then(function (response) { + var responseData = response.result; + return _this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false); + }); + }; + GetDataServiceImpl.prototype.releaseAsync = function (tableId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'release', + _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), + _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then(function (response) { + return; + }); + }; + GetDataServiceImpl.prototype.verifyIncludeColumnArray = function (columns) { + // columns must be a valid array + if (!Array.isArray(columns)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays'); + } + // Remove any duplicates from the input array + var columnsAsSet = new Set(columns); + return Array.from(columnsAsSet); + }; + GetDataServiceImpl.prototype.processResultsTable = function (responseData, isSummary) { + var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + // TODO This should be controlled by a flag indicating whether this api will respond marks info or not + var marks; + if (responseData.marks) { + marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); }); + } + // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch. + // Remove the last element so we always return MaxRowLimit + var isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1; + if (isTotalRowCountLimited) { + responseData.dataTable.length -= 1; + } + var table = responseData.dataTable.map(function (row) { + return row.map(function (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); + }; + GetDataServiceImpl.prototype.processResultsPage = function (responseData, isSummary) { + var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + var marks; + if (responseData.marks) { + marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); }); + } + var table = responseData.dataTable.map(function (row) { + return row.map(function (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); + }; + GetDataServiceImpl.summaryTableId = ''; + return GetDataServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.GetDataServiceImpl = GetDataServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js": +/*!***********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***! + \***********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var NotificationServiceImplBase_1 = __webpack_require__(/*! ./NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +var NotificationServiceImpl = /** @class */ (function (_super) { + __extends(NotificationServiceImpl, _super); + function NotificationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(NotificationServiceImpl.prototype, "serviceName", { + get: function () { + return "notification-service" /* Notification */; + }, + enumerable: true, + configurable: true + }); + return NotificationServiceImpl; +}(NotificationServiceImplBase_1.NotificationServiceImplBase)); +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 })); +var Registration = /** @class */ (function () { + function Registration(_filterFn, _callbackFn) { + this._filterFn = _filterFn; + this._callbackFn = _callbackFn; + // Nothing Here + } + Registration.prototype.onNotification = function (notificationModel) { + if (this._filterFn(notificationModel)) { + this._callbackFn(notificationModel); + } + }; + return Registration; +}()); +exports.Registration = Registration; +var NotificationServiceImplBase = /** @class */ (function () { + function NotificationServiceImplBase(dispatcher) { + this.dispatcher = dispatcher; + this._handlers = {}; + this.dispatcher.registerNotificationHandler(this.onNotification.bind(this)); + } + NotificationServiceImplBase.prototype.registerHandler = function (id, filterFn, handler) { + var _this = this; + var handlers = this._handlers[id] || new Array(); + var registration = new Registration(filterFn, handler); + handlers.push(registration); + this._handlers[id] = handlers; + return function () { return _this.removeRegistration(id, registration); }; + }; + NotificationServiceImplBase.prototype.hasHandlersForNotificationType = function (id) { + // eslint-disable-next-line no-prototype-builtins + return this._handlers.hasOwnProperty(id); + }; + NotificationServiceImplBase.prototype.onNotification = function (notification) { + if (!this.hasHandlersForNotificationType(notification.notificationId)) { + return; + } + // Go through and check for all the handlers of this particular notification + this._handlers[notification.notificationId].forEach(function (h) { return h.onNotification(notification.data); }); + }; + NotificationServiceImplBase.prototype.removeRegistration = function (id, registration) { + if (!this.hasHandlersForNotificationType(id)) { + return; + } + this._handlers[id] = this._handlers[id].filter(function (reg) { return reg !== registration; }); + }; + return NotificationServiceImplBase; +}()); +exports.NotificationServiceImplBase = NotificationServiceImplBase; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js": +/*!*********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ParameterImpl_1 = __webpack_require__(/*! ../../Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ParametersServiceImpl = /** @class */ (function (_super) { + __extends(ParametersServiceImpl, _super); + function ParametersServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ParametersServiceImpl.prototype, "serviceName", { + get: function () { + return "parameters-service" /* Parameters */; + }, + enumerable: true, + configurable: true + }); + ParametersServiceImpl.prototype.getParametersForSheetAsync = function (sheetPath) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync', + _a[api_internal_contract_js_1.ParameterId.SheetPath] = sheetPath, + _a); + return this.getParametersAsync(parameters); + }; + ParametersServiceImpl.prototype.getAllParametersAsync = function () { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync', + _a); + return this.getParametersAsync(parameters); + }; + ParametersServiceImpl.prototype.getParametersAsync = function (inputParameters) { + var _this = this; + return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then(function (response) { + var result = response.result; + return result.map(function (parameterInfo) { + return new ParameterImpl_1.ParameterImpl(parameterInfo, _this._registryId); + }); + }); + }; + ParametersServiceImpl.prototype.changeParameterValueAsync = function (fieldName, newValue) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeParameterValueAsync', + _a[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName, + _a[api_internal_contract_js_1.ParameterId.ParameterValue] = newValue, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + ParametersServiceImpl.prototype.findParameterByNameAsync = function (name) { + return this.findParameterAsync(name, undefined); + }; + ParametersServiceImpl.prototype.findParameterByGlobalFieldNameAsync = function (fieldName) { + return this.findParameterAsync(undefined, fieldName); + }; + ParametersServiceImpl.prototype.findParameterAsync = function (name, fieldName) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'findParameterAsync', + _a); + 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(function (response) { + var instanceOfParameterInfo = function (object) { + return 'fieldName' in object; + }; + // We need to check to see if we got a valid response back again + if (instanceOfParameterInfo(response.result)) { + var result = response.result; + return new ParameterImpl_1.ParameterImpl(result, _this._registryId); + } + else { + return undefined; + } + }); + }; + return ParametersServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.ParametersServiceImpl = ParametersServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js": +/*!********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var SelectionServiceImpl = /** @class */ (function (_super) { + __extends(SelectionServiceImpl, _super); + function SelectionServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(SelectionServiceImpl.prototype, "serviceName", { + get: function () { + return "selection-service" /* Selection */; + }, + enumerable: true, + configurable: true + }); + /** + * Method to clear all the selected marks for the given worksheet. + * + * @param visualId + */ + SelectionServiceImpl.prototype.clearSelectedMarksAsync = function (visualId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearSelectedMarksAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then(function (response) { + return; // Expecting an empty model and hence the void response. + }); + }; + /** + * Method to select marks for the given worksheet. + * + * @param visualId + * @param selectionCriteria + * @param selectionUpdateType + */ + SelectionServiceImpl.prototype.selectMarksByValueAsync = function (visualId, selectionCriterias, selectionUpdateType) { + var _a; + var _this = this; + if (selectionCriterias.length === 0) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value'); + } + var selectionType = this.validateSelectionUpdateType(selectionUpdateType); + var selectionModelContainer = this.parseSelectionMarks(selectionCriterias); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByValueAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType, + _a); + 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(function (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 + */ + SelectionServiceImpl.prototype.hoverTupleAsync = function (visualId, hoveredTuple, tooltip, allowHoverActions) { + var _a; + var interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'hoverTupleAsync', + _a[api_internal_contract_js_1.ParameterId.HoverTupleInteraction] = interactionModel, + _a); + return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then(function (response) { + 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 + */ + SelectionServiceImpl.prototype.selectTuplesAsync = function (visualId, selectedTuples, selectOption, tooltip) { + var _a; + var interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectTuplesAsync', + _a[api_internal_contract_js_1.ParameterId.SelectTuplesInteraction] = interactionModel, + _a); + return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then(function (response) { + return; + }); + }; + SelectionServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (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 + */ + SelectionServiceImpl.prototype.selectMarksByIdAsync = function (visualId, marks, selectionUpdateType) { + var _a; + if (marks.length === 0) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id'); + } + var selectionType = this.validateSelectionUpdateType(selectionUpdateType); + var selectionModelContainer = this.parseSelectionIds(marks); + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByIdAsync', + _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, + _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType, + _a[api_internal_contract_js_1.ParameterId.Selection] = selectionModelContainer.selection, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then(function (response) { + // Expecting an empty model and hence the void response. + return; + // TODO Investigate the error response with multiple output params and throw error accordingly. + }); + }; + /** + * Method to prepare the pres models for selection by MarksInfo + * @param marks + */ + SelectionServiceImpl.prototype.parseSelectionIds = function (marks) { + var ids = []; + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (var i = 0; i < marks.length; i++) { + var tupleId = marks[i].tupleId; + 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 + var 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 + */ + SelectionServiceImpl.prototype.parseSelectionMarks = function (selectionCriterias) { + var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (var i = 0; i < selectionCriterias.length; i++) { + var st = selectionCriterias[i]; + if (!(st.fieldName && st.value !== undefined && st.value !== null)) { + throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'Selection Criteria parsing error'); + } + var catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g'); + var rangeOption = st.value; + if (catRegex.test(st.fieldName)) { + // Hierarchical value selection + var hierModel = this.addToParamsList(st.fieldName, st.value); + selectionModelContainer.hierModelArr.push(hierModel); + } + else if (rangeOption.min !== undefined && rangeOption.max !== undefined) { + // Range value selection + var quantModel = this.addToRangeParamsList(st.fieldName, rangeOption); + selectionModelContainer.quantModelArr.push(quantModel); + } + else { + // Dimension value selection + var 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 + */ + SelectionServiceImpl.prototype.addToParamsList = function (fieldName, value) { + var valueSelectionModel = new SelectionModels_1.ValueSelectionModel(); + var markValues = []; + if (value instanceof Array) { + var valueArr = value; + for (var 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 + */ + SelectionServiceImpl.prototype.addToRangeParamsList = function (fieldName, value) { + var 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 + */ + SelectionServiceImpl.prototype.validateSelectionUpdateType = function (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 + */ + SelectionServiceImpl.prototype.validateNullOptionType = function (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; + }; + SelectionServiceImpl.prototype.ensureTupleIDIsNonNegative = function (tupleId) { + if (tupleId && tupleId > 0) { + return tupleId; + } + // 0 will not refer to a valid tuple (since tuple ids are 1-based), + // but can be used for clearing the current hover or selection + return 0; + }; + return SelectionServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.SelectionServiceImpl = SelectionServiceImpl; + + +/***/ }), + +/***/ "../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 })); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var EnumConverter_1 = __webpack_require__(/*! ../../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +/** + * Each ServceImpl should extend this base class for the sake of + * proper error handling. This base handles the conversion + * from internal errors to external errors that we throw to developers + */ +var ServiceImplBase = /** @class */ (function () { + function ServiceImplBase(_dispatcher, _registryId) { + this._dispatcher = _dispatcher; + this._registryId = _registryId; + } + ServiceImplBase.prototype.execute = function (verb, params) { + return this._dispatcher.execute(verb, params).catch(function (error) { + // Any internal error that comes from the dispatcher should be converted + // to an external error using the enum mapper for error codes. + var internalError = error; + var externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No); + throw new TableauError_1.TableauError(externalErrorCode, internalError.message); + }); + }; + return ServiceImplBase; +}()); +exports.ServiceImplBase = ServiceImplBase; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var SizeServiceImpl = /** @class */ (function (_super) { + __extends(SizeServiceImpl, _super); + function SizeServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(SizeServiceImpl.prototype, "serviceName", { + get: function () { + return "size-service" /* Size */; + }, + enumerable: true, + configurable: true + }); + SizeServiceImpl.prototype.changeSizeAsync = function (name, newSize) { + var _a; + var _b, _c, _d, _e; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeSizeAsync', + _a[api_internal_contract_js_1.ParameterId.SheetName] = name, + _a[api_internal_contract_js_1.ParameterId.MinHeight] = ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.height) || 0, + _a[api_internal_contract_js_1.ParameterId.MinWidth] = ((_c = newSize.minSize) === null || _c === void 0 ? void 0 : _c.width) || 0, + _a[api_internal_contract_js_1.ParameterId.MaxHeight] = ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.height) || 0, + _a[api_internal_contract_js_1.ParameterId.MaxWidth] = ((_e = newSize.maxSize) === null || _e === void 0 ? void 0 : _e.width) || 0, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then(function (_response) { + return; + }); + }; + return SizeServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.SizeServiceImpl = SizeServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js": +/*!**************************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js ***! + \**************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var StoryActivationServiceImpl = /** @class */ (function (_super) { + __extends(StoryActivationServiceImpl, _super); + function StoryActivationServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(StoryActivationServiceImpl.prototype, "serviceName", { + get: function () { + return "story-activation-service" /* StoryActivation */; + }, + enumerable: true, + configurable: true + }); + StoryActivationServiceImpl.prototype.activateNextStoryPointAsync = function () { + var _a; + var verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateNextStoryPointAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + StoryActivationServiceImpl.prototype.activatePreviousStoryPointAsync = function () { + var _a; + var verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activatePreviousStoryPointAsync', + _a); + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + StoryActivationServiceImpl.prototype.activateStoryPointAsync = function (index) { + var _a; + var verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateStoryPointAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; + return this.execute(verb, parameters).then(function (response) { + return; + }); + }; + StoryActivationServiceImpl.prototype.revertStoryPointAsync = function (index) { + var _a; + var verb = api_internal_contract_js_1.VerbId.RevertStoryPoint; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'revertStoryPointAsync', + _a); + parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; + return this.execute(verb, parameters).then(function (response) { + return response.result; + }); + }; + return StoryActivationServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.StoryActivationServiceImpl = StoryActivationServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js": +/*!**********************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js ***! + \**********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var VisualModelServiceImpl = /** @class */ (function (_super) { + __extends(VisualModelServiceImpl, _super); + function VisualModelServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(VisualModelServiceImpl.prototype, "serviceName", { + get: function () { + return "visual-model-service" /* VisualModel */; + }, + enumerable: true, + configurable: true + }); + VisualModelServiceImpl.prototype.getVisualSpecificationAsync = function (visualId) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getVisualSpecificationAsync', + _a[api_internal_contract_js_1.ParameterId.WorksheetName] = visualId.worksheet, + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + return VisualModelServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.VisualModelServiceImpl = VisualModelServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js": +/*!**************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***! + \**************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var CustomViewImpl_1 = __webpack_require__(/*! ../../Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var VizServiceImpl = /** @class */ (function (_super) { + __extends(VizServiceImpl, _super); + function VizServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(VizServiceImpl.prototype, "serviceName", { + get: function () { + return "viz-service" /* Viz */; + }, + enumerable: true, + configurable: true + }); + VizServiceImpl.prototype.createVizImageAsync = function (inputSpec) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'createVizImageAsync', + _a[api_internal_contract_js_1.ParameterId.VizAPIInputJson] = JSON.stringify(inputSpec), + _a); + return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then(function (response) { + var result = response.result; + return result; + }); + }; + VizServiceImpl.prototype.activateSheetAsync = function (name) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateSheetAsync', + _a[api_internal_contract_js_1.ParameterId.SwitchToSheetName] = name, + _a); + return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(function () { + return; + }); + }; + VizServiceImpl.prototype.getCustomViewsAsync = function () { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCustomViewsAsync', + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then(function (response) { + var customViews = response.result; + return customViews.map(function (customView) { + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }); + }; + VizServiceImpl.prototype.showCustomViewAsync = function (customViewName) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'showCustomViewAsync', + _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName || '', + _a); + return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then(function (response) { + var _a; + var customView = response.result; + return ((_a = customView) === null || _a === void 0 ? void 0 : _a.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId) : undefined; + }); + }; + VizServiceImpl.prototype.removeCustomViewAsync = function (customViewName) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeCustomViewAsync', + _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName, + _a); + return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then(function (response) { + var customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }; + VizServiceImpl.prototype.saveCustomViewAsync = function (customViewName) { + var _a; + var _this = this; + // CustomViewIsDefault is a required parameter, but our API has not been updated to allow it to be specified yet. + // We should add a 'default' parameter to the interface. + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveCustomViewAsync', + _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName, + _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = false, + _a); + return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then(function (response) { + var customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }; + VizServiceImpl.prototype.setActiveCustomViewAsDefaultAsync = function () { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setActiveCustomViewAsDefaultAsync', + _a); + return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(function () { + return; + }); + }; + VizServiceImpl.prototype.saveAsync = function (customView) { + var _a; + var _this = this; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveAsync', + _a[api_internal_contract_js_1.ParameterId.CustomViewLuid] = customView.luid, + _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customView.name, + _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = customView.isDefault, + _a[api_internal_contract_js_1.ParameterId.CustomViewIsPublic] = customView.shared, + _a); + return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then(function (response) { + var customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + }); + }; + VizServiceImpl.prototype.getCurrentSrcAsync = function () { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCurrentSrcAsync', + _a); + return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then(function (response) { return response.result; }); + }; + return VizServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +exports.VizServiceImpl = VizServiceImpl; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js": +/*!***************************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +var ZoneServiceImpl = /** @class */ (function (_super) { + __extends(ZoneServiceImpl, _super); + function ZoneServiceImpl() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(ZoneServiceImpl.prototype, "serviceName", { + get: function () { + return "zone-service" /* Zone */; + }, + enumerable: true, + configurable: true + }); + ZoneServiceImpl.prototype.setVisibilityAsync = function (dashboard, dashboardZoneMap, zoneVisibilityMap) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setVisibilityAsync', + _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard, + _a[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap] = {}, + _a); + // zoneVisibilityMap can be either an object or a Map - convert it to a Map + var parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap'); + parameterAsMap.forEach(function (value, key) { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10)); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType'); + parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value); + }); + return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then(function (response) { + return; + }); + }; + ZoneServiceImpl.prototype.moveAndResizeAsync = function (dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) { + var _a; + var parameters = (_a = {}, + _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard, + _a[api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList] = dashboardObjectPositionAndSizeUpdateArray, + _a); + dashboardObjectPositionAndSizeUpdateArray.forEach(function (dashboardObject) { + ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID); + ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject); + }); + return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then(function (response) { + return; + }); + }; + return ZoneServiceImpl; +}(ServiceImplBase_1.ServiceImplBase)); +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. + */ +var TableSummary = /** @class */ (function () { + function TableSummary(_tableInfo) { + this._tableInfo = _tableInfo; + } + Object.defineProperty(TableSummary.prototype, "name", { + get: function () { + return this._tableInfo.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "id", { + get: function () { + return this._tableInfo.id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "connectionId", { + get: function () { + return this._tableInfo.connectionId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TableSummary.prototype, "customSQL", { + get: function () { + return this._tableInfo.customSQL; + }, + enumerable: true, + configurable: true + }); + return TableSummary; +}()); +exports.TableSummary = TableSummary; + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/TableauError.js": +/*!**********************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/TableauError.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Custom error class that extends the default JavaScript Error object. + * This allows us to provide a field with a specific error code + * so that developers can more easily programmatically respond + * to error scenarios. + */ +var TableauError = /** @class */ (function (_super) { + __extends(TableauError, _super); + function TableauError(_errorCode, message) { + var _this = _super.call(this, _errorCode + ": " + message) || this; + _this._errorCode = _errorCode; + /*tslint:disable-next-line */ + // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work + // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force + // the proto chain to be built correctly. See the github link above for details. + Object.setPrototypeOf(_this, TableauError.prototype); + return _this; + } + Object.defineProperty(TableauError.prototype, "errorCode", { + get: function () { + return this._errorCode; + }, + enumerable: true, + configurable: true + }); + return TableauError; +}(Error)); +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 })); +var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var GetDataModels_1 = __webpack_require__(/*! ../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +/** + * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over + * in the platform. + */ +var DataValueFactory = /** @class */ (function () { + function DataValueFactory() { + } + DataValueFactory.MakeParameterDataValue = function (internalDataValue, dataType) { + // 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); + }; + DataValueFactory.MakeFilterDataValue = function (internalDataValue) { + // Filters already have native type in value, just use that for nativeValue also + return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue); + }; + DataValueFactory.MakeTableDataValue = function (internalDataValue, dataType) { + // 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); + }; + return DataValueFactory; +}()); +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 + */ +var Deferred = /** @class */ (function () { + /** + * Creates an instance of Deferred. + */ + function Deferred() { + var _this = this; + this._promise = new Promise(function (resolve, reject) { + _this._resolve = resolve; + _this._reject = reject; + }); + } + Object.defineProperty(Deferred.prototype, "promise", { + /** + * Gets the Promise. + * + * @readonly + * @type {Promise} + */ + get: function () { + return this._promise; + }, + enumerable: true, + configurable: true + }); + /** + * Resolves the wrapped Promise. + * + * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise. + * @returns {*} {void} + */ + Deferred.prototype.resolve = function (response) { + if (!this._resolve) { + return; + } + this._resolve(response); + }; + /** + * + * + * @param {TReject} [reason] The reason why the Promise rejected. + * @returns {*} {void} + */ + Deferred.prototype.reject = function (reason) { + if (!this._reject) { + return; + } + this._reject(reason); + }; + return Deferred; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * 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. + */ +var EnumConverter = /** @class */ (function () { + function EnumConverter(_mappings, _defaultVal) { + this._mappings = _mappings; + this._defaultVal = _defaultVal; + } + EnumConverter.prototype.convert = function (enumVal, throwIfMissing) { + if (throwIfMissing === void 0) { throwIfMissing = ShouldThrow.Yes; } + if (this._mappings.hasOwnProperty(enumVal)) { + return this._mappings[enumVal]; + } + if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) { + return this._defaultVal; + } + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Enum Mapping not found for: " + enumVal); + }; + return EnumConverter; +}()); +exports.EnumConverter = EnumConverter; +var ShouldThrow; +(function (ShouldThrow) { + ShouldThrow["Yes"] = "yes"; + ShouldThrow["No"] = "no"; +})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {})); + + +/***/ }), + +/***/ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js": +/*!****************************************************************!*\ + !*** ../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var Param_1 = __webpack_require__(/*! ./Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +/** + * This class is used to construct common errors throughout the external + * projects (api-shared, extensions-api, etc.). It has some duplication with + * the ErrorHelpers class in api-core, but is separate due to the need to throw + * an external TableauError vs. an InternalTableauError. + */ +var ErrorHelpers = /** @class */ (function () { + function ErrorHelpers() { + } + /** + * Throws with code InternalError. + * + * @param apiName name of api that was called. + */ + ErrorHelpers.apiNotImplemented = function (apiName) { + return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, apiName + " API not yet implemented."); + }; + /** + * 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 */ + ErrorHelpers.verifyInternalValue = function (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 */ + ErrorHelpers.verifyParameter = function (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 */ + ErrorHelpers.verifyParameterType = function (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 */ + ErrorHelpers.verifyStringParameter = function (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. + * 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 */ + ErrorHelpers.verifyEnumValue = function (enumValue, enumType, enumName) { + var isValid = false; + Object.keys(enumType).forEach(function (enumKey) { + if (enumType[enumKey] === enumValue.toString()) { + isValid = true; + } + }); + if (!isValid) { + 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 + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyRange = function (value, min, max) { + var 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 + */ + /*tslint:disable-next-line */ + ErrorHelpers.verifyRangeParamType = function (min, max) { + if (!min && !max) { + 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 (min && !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 (max && !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 (min && max && 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 + */ + ErrorHelpers.verifyZoneIsValid = function (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 + */ + ErrorHelpers.verifyZoneIsValidAndFloating = function (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 + */ + ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate = function (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 + */ + ErrorHelpers.verifySheetName = function (exportableSheetNames, sheetName) { + if (!exportableSheetNames.includes(sheetName)) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetName parameter must belong to a worksheet within the current view'); + } + }; + /** + * Verifies the ExportDataOptions object + * Throws with error code InvalidParameter if the parameter is not of ExportDataOptions type. + * + * @param options The ExportDataOptions object used to configure the output CSV file for exportDataAsync. + */ + ErrorHelpers.verifyExportDataOptions = function (options) { + 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. + */ + ErrorHelpers.verifySheetNamesForPDFAndPPT = function (sheetNames, exportScenarios) { + if (!Array.isArray(sheetNames)) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'sheetNames parameter must be an array'); + if (sheetNames.length === 0) + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'sheetNames should not be empty'); + var isIncludedInDashboard = sheetNames.every(function (sheetName) { + return exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName); + }); + if (isIncludedInDashboard) { + return; + } + var isIncludedInWorkbook = sheetNames.every(function (sheetName) { + return exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName); + }); + if (isIncludedInWorkbook) { + return; + } + var isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName; + if (isCurrentSheet) { + return; + } + // Export requirement: all sheet names must be included in the list of exportable sheets in the dashboard or + // all sheet names must be included in the list of exportable sheets in the workbook, or the sheet name is the current sheet + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook'); + }; + /** + * Verifies the external ExportPDFOptions object's properties. + * Throws with error code InvalidParameter if the parameter is not of external ExportPDFOptions type. + * + * @param options The external user-facing ExportPDFOptions object used to configure the output PDF file for exportPDFAsync. + */ + ErrorHelpers.verifyExportPDFOptions = function (options) { + 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'); + } + }; + return ErrorHelpers; +}()); +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 })); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Helper methods for Export APIs. + * + * @class ExportHelpers + */ +var ExportHelpers = /** @class */ (function () { + function 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. + */ + ExportHelpers.updateInternalExportPDFOptions = function (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. + */ + ExportHelpers.updateExportLayoutOptions = function (internalExportPdfOptions, externalExportPdfOptions) { + var 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. + */ + ExportHelpers.updateSheetOptions = function (internalExportPdfOptions, sheetNames) { + var exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions, sheetOptions = internalExportPdfOptions.sheetOptions; + // updating the export layouts options for each sheet and selecting sheet for export if included in list + for (var _i = 0, sheetOptions_1 = sheetOptions; _i < sheetOptions_1.length; _i++) { + var sheetOption = sheetOptions_1[_i]; + 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. + */ + ExportHelpers.setFitAndScaleValues = function (exportLayoutOptions, scalingSelection) { + var _a; + var _b = this.DefaultLayoutOptions, pageFitHorizontal = _b.pageFitHorizontal, pageFitVertical = _b.pageFitVertical, pageScaleMode = _b.pageScaleMode, pageScalePercent = _b.pageScalePercent; + var fitMatch = this.fitRegex.exec(scalingSelection); + var percentMatch = this.pctRegex.exec(scalingSelection); + if (fitMatch) { + _a = fitMatch.slice(1).map(function (value) { return Number(value); }), pageFitHorizontal = _a[0], pageFitVertical = _a[1]; + pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages; + } + else if (percentMatch) { + pageScalePercent = percentMatch.slice(1).map(function (value) { return Number(value); })[0]; + 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; + }; + ExportHelpers.DefaultDataOptions = { + ignoreAliases: false, + columnsToIncludeById: [], + }; + ExportHelpers.DefaultPDFOptions = { + scaling: api_external_contract_js_1.PrintScaling.Automatic, + pageSize: api_external_contract_js_1.PrintPageSize.Letter, + orientation: api_external_contract_js_1.PrintOrientation.Portrait, + }; + ExportHelpers.DefaultLayoutOptions = { + imageHeight: 0, + imageWidth: 0, + pageFitHorizontal: 1, + pageFitVertical: 1, + pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait, + pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto, + pageScalePercent: 100, + pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter, + }; + ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)'); + ExportHelpers.pctRegex = new RegExp('pct([0-9]+)'); + return ExportHelpers; +}()); +exports.ExportHelpers = ExportHelpers; + + +/***/ }), + +/***/ "../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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var ErrorHelpers_1 = __webpack_require__(/*! ./ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +var Param = /** @class */ (function () { + function Param() { + } + /** + * serializes the date into the format that the server expects. + * @param date the date to serialize + */ + Param.serializeDateForPlatform = function (date) { + var year = date.getUTCFullYear(); + var month = date.getUTCMonth() + 1; + var day = date.getUTCDate(); + var hh = date.getUTCHours(); + var mm = date.getUTCMinutes(); + var sec = date.getUTCSeconds(); + return year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + sec; + }; + Param.serializeBooleanForPlatform = function (bool) { + return bool ? 'true' : 'false'; + }; + Param.serializeNumberForPlatform = function (num) { + return num.toString(10); + }; + /** + * Verifies the input is a number + */ + /* tslint:disable-next-line:no-any */ + Param.isTypeNumber = function (input) { + return typeof input === 'number' || input instanceof Number; + }; + /** + * Verifies the input is a Date + */ + /* tslint:disable-next-line:no-any */ + Param.isTypeDate = function (input) { + return input instanceof Date; + }; + /* tslint:disable-next-line:no-any */ + Param.isTypeString = function (input) { + return typeof input === 'string' || input instanceof String; + }; + /* tslint:disable-next-line:no-any */ + Param.isTypeBool = function (input) { + return typeof input === 'boolean' || input instanceof Boolean; + }; + /** + * Determines if the input is null or undefined + */ + /* tslint:disable-next-line:no-any */ + Param.isNullOrUndefined = function (input) { + return input === null || input === undefined; + }; + /* tslint:disable-next-line:no-any */ + Param.serializeParameterValue = function (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 + Param.convertParameterToMap = function (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 */ + Param.tryParseNumber = function (value) { + if (Param.isNullOrUndefined(value)) { + return { success: false }; + } + if (Param.isTypeNumber(value)) { + return { parsed: value, success: true }; + } + var valueString = value.toString(); + if (valueString === 'NaN') { + // 'NaN' parses as NaN which is indistinguishable from a failed parse. + return { parsed: NaN, success: true }; + } + var parsed = parseFloat(valueString); + if (isNaN(parsed)) { + return { success: false }; + } + return { parsed: parsed, success: true }; + }; + return Param; +}()); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var SheetUtils = /** @class */ (function () { + function SheetUtils() { + } + // This is a direct port from SheetSize.cs - SheetSizeFactory + SheetUtils.getSheetSizeFromSizeConstraints = function (sizeConstraint) { + var minWidth = sizeConstraint.minWidth, minHeight = sizeConstraint.minHeight, maxWidth = sizeConstraint.maxWidth, maxHeight = sizeConstraint.maxHeight; + 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 + var isDsdLayout = minWidth === 0 && maxWidth === 0; + return { + behavior: Contract.SheetSizeBehavior.Range, + minSize: { width: minWidth, height: minHeight }, + maxSize: { width: isDsdLayout ? 2147483647 : maxWidth, height: maxHeight }, + }; + }; + SheetUtils.createAutomaticSize = function () { + var behavior = Contract.SheetSizeBehavior.Automatic; + var minSize = { width: 0, height: 0 }; + var maxSize = { width: 0, height: 0 }; + return { behavior: behavior, minSize: minSize, maxSize: maxSize }; + }; + SheetUtils.getPublishedSheetInfoByName = function (name, sheetInfos) { + var sheetInfo = sheetInfos.find(function (sheet) { return sheet.name === name; }); + return sheetInfo; + }; + SheetUtils.getSheetTypeEnum = function (internalSheetType) { + var 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; + }; + SheetUtils.isValidSheetSize = function (sizeObject) { + return sizeObject.behavior !== undefined; + }; + return SheetUtils; +}()); +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 })); +var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +var Deferred_1 = __webpack_require__(/*! ./Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +/** + * 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. + * + */ +var ShortLivedDeferred = /** @class */ (function () { + function ShortLivedDeferred(_timeoutInMilliseconds) { + if (_timeoutInMilliseconds === void 0) { _timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds; } + this._timeoutInMilliseconds = _timeoutInMilliseconds; + } + ShortLivedDeferred.prototype.getNewPromiseOrThrowIfBusy = function () { + var _this = this; + if (this._deferred) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.'); + } + this._deferred = new Deferred_1.Deferred(); + this._timeoutId = setTimeout(function () { + var error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, "Api failed to complete in " + _this._timeoutInMilliseconds / 1000 + " seconds"); + _this.reject(error); + }, this._timeoutInMilliseconds); + return this._deferred.promise; + }; + ShortLivedDeferred.prototype.resolve = function (response) { + if (this._deferred) { + clearTimeout(this._timeoutId); + this._deferred.resolve(response); + this._deferred = undefined; + } + }; + ShortLivedDeferred.prototype.reject = function (error) { + if (this._deferred) { + clearTimeout(this._timeoutId); + this._deferred.reject(error); + this._deferred = undefined; + } + }; + return ShortLivedDeferred; +}()); +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 })); +var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +/** + * Represents the current version of the extensions, embedding + * and extensions-api-types library + */ +var VersionNumber = /** @class */ (function () { + // private constructor so everyone uses the singleton instance + // build numbers have this form: M.m.f-pre.N + function VersionNumber(versionString, isAlpha) { + var partStr = versionString.split('-'); + this.build = this.getBuildNumber(partStr[1]); + versionString = partStr[0]; + var parts = versionString.split('.').map(function (p) { return 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; + } + VersionNumber.prototype.getBuildNumber = function (preReleaseString) { + var noBuildNumber = -1; + if (!preReleaseString) { + return noBuildNumber; + } + // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre' + var partStr = preReleaseString.split('.'); + return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber; + }; + Object.defineProperty(VersionNumber.prototype, "formattedValue", { + get: function () { + return this.major + "." + this.minor + "." + this.fix; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(VersionNumber.prototype, "fullFormattedValue", { + get: function () { + return this.major + "." + this.minor + "." + this.fix + "-pre." + this.build; + }, + enumerable: true, + configurable: true + }); + return VersionNumber; +}()); +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 })); +var 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} + */ +var VersionedExternalApiDispatcher = /** @class */ (function () { + /** + * 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 + */ + function VersionedExternalApiDispatcher(_apiDelegateDispatcher, platformVersionNumber) { + var _this = this; + this._apiDelegateDispatcher = _apiDelegateDispatcher; + this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber); + this._notificationHandlers = []; + _apiDelegateDispatcher.registerNotificationHandler(function (notification) { + if (_this._notificationHandlers.length === 0) { + return; + } + var upgradedNotification = _this._versionConverter.upgradeNotification(notification); + _this._notificationHandlers.forEach(function (handler) { + handler(upgradedNotification); + }); + }); + } + VersionedExternalApiDispatcher.needsVersionConverter = function (platformVersion) { + // If our platform is less than external library version, then we need a converter + return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + }; + VersionedExternalApiDispatcher.prototype.execute = function (verb, parameters) { + var _this = this; + try { + var downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters); + return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then(function (response) { + var upgradeResponse = _this._versionConverter.upgradeExecuteReturn(response, verb, parameters); + return upgradeResponse; + }); + } + catch (e) { + return Promise.reject(e); + } + }; + VersionedExternalApiDispatcher.prototype.registerNotificationHandler = function (handler) { + this._notificationHandlers.push(handler); + }; + VersionedExternalApiDispatcher.prototype.unregisterNotificationHandler = function (handler) { + this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; }); + }; + return VersionedExternalApiDispatcher; +}()); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher; + + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/index.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ NIL: () => (/* reexport safe */ _nil_js__WEBPACK_IMPORTED_MODULE_4__["default"]), +/* harmony export */ parse: () => (/* reexport safe */ _parse_js__WEBPACK_IMPORTED_MODULE_8__["default"]), +/* harmony export */ stringify: () => (/* reexport safe */ _stringify_js__WEBPACK_IMPORTED_MODULE_7__["default"]), +/* harmony export */ v1: () => (/* reexport safe */ _v1_js__WEBPACK_IMPORTED_MODULE_0__["default"]), +/* harmony export */ v3: () => (/* reexport safe */ _v3_js__WEBPACK_IMPORTED_MODULE_1__["default"]), +/* harmony export */ v4: () => (/* reexport safe */ _v4_js__WEBPACK_IMPORTED_MODULE_2__["default"]), +/* harmony export */ v5: () => (/* reexport safe */ _v5_js__WEBPACK_IMPORTED_MODULE_3__["default"]), +/* harmony export */ validate: () => (/* reexport safe */ _validate_js__WEBPACK_IMPORTED_MODULE_6__["default"]), +/* harmony export */ version: () => (/* reexport safe */ _version_js__WEBPACK_IMPORTED_MODULE_5__["default"]) +/* harmony export */ }); +/* harmony import */ var _v1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js"); +/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js"); +/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js"); +/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js"); +/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js"); +/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js"); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); + + + + + + + + + + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* + * Browser-compatible JavaScript MD5 + * + * Modification of JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ +function md5(bytes) { + if (typeof bytes === 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + + bytes = new Uint8Array(msg.length); + + for (var i = 0; i < msg.length; ++i) { + bytes[i] = msg.charCodeAt(i); + } + } + + return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8)); +} +/* + * Convert an array of little-endian words to an array of bytes + */ + + +function md5ToHexEncodedArray(input) { + var output = []; + var length32 = input.length * 32; + var hexTab = '0123456789abcdef'; + + for (var i = 0; i < length32; i += 8) { + var x = input[i >> 5] >>> i % 32 & 0xff; + var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16); + output.push(hex); + } + + return output; +} +/** + * Calculate output length with padding and bit length + */ + + +function getOutputLength(inputLength8) { + return (inputLength8 + 64 >>> 9 << 4) + 14 + 1; +} +/* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ + + +function wordsToMd5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << len % 32; + x[getOutputLength(len) - 1] = len; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (var i = 0; i < x.length; i += 16) { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + + return [a, b, c, d]; +} +/* + * Convert an array bytes to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ + + +function bytesToWords(input) { + if (input.length === 0) { + return []; + } + + var length8 = input.length * 8; + var output = new Uint32Array(getOutputLength(length8)); + + for (var i = 0; i < length8; i += 8) { + output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; + } + + return output; +} +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ + + +function safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return msw << 16 | lsw & 0xffff; +} +/* + * Bitwise rotate a 32-bit number to the left. + */ + + +function bitRotateLeft(num, cnt) { + return num << cnt | num >>> 32 - cnt; +} +/* + * These functions implement the four basic operations the algorithm uses. + */ + + +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} + +function md5ff(a, b, c, d, x, s, t) { + return md5cmn(b & c | ~b & d, a, b, x, s, t); +} + +function md5gg(a, b, c, d, x, s, t) { + return md5cmn(b & d | c & ~d, a, b, x, s, t); +} + +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} + +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (md5); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ('00000000-0000-0000-0000-000000000000'); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + + +function parse(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + var v; + var arr = new Uint8Array(16); // Parse ########-....-....-....-............ + + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; // Parse ........-####-....-....-............ + + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; // Parse ........-....-####-....-............ + + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; // Parse ........-....-....-####-............ + + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) + + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js": +/*!********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (/* binding */ rng) +/* harmony export */ }); +// Unique ID creation requires a high quality random # generator. In the browser we therefore +// require the crypto API and do not support built-in fallback to lower quality random number +// generators (like Math.random()). +var getRandomValues; +var rnds8 = new Uint8Array(16); +function rng() { + // lazy load so that environments that need to polyfill have a chance to do so + if (!getRandomValues) { + // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, + // find the complete implementation of crypto (msCrypto) on IE11. + getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); + + if (!getRandomValues) { + throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); + } + } + + return getRandomValues(rnds8); +} + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js": +/*!*******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +// Adapted from Chris Veness' SHA1 code at +// http://www.movable-type.co.uk/scripts/sha1.html +function f(s, x, y, z) { + switch (s) { + case 0: + return x & y ^ ~x & z; + + case 1: + return x ^ y ^ z; + + case 2: + return x & y ^ x & z ^ y & z; + + case 3: + return x ^ y ^ z; + } +} + +function ROTL(x, n) { + return x << n | x >>> 32 - n; +} + +function sha1(bytes) { + var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + + if (typeof bytes === 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + + bytes = []; + + for (var i = 0; i < msg.length; ++i) { + bytes.push(msg.charCodeAt(i)); + } + } else if (!Array.isArray(bytes)) { + // Convert Array-like to Array + bytes = Array.prototype.slice.call(bytes); + } + + bytes.push(0x80); + var l = bytes.length / 4 + 2; + var N = Math.ceil(l / 16); + var M = new Array(N); + + for (var _i = 0; _i < N; ++_i) { + var arr = new Uint32Array(16); + + for (var j = 0; j < 16; ++j) { + arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3]; + } + + M[_i] = arr; + } + + M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32); + M[N - 1][14] = Math.floor(M[N - 1][14]); + M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff; + + for (var _i2 = 0; _i2 < N; ++_i2) { + var W = new Uint32Array(80); + + for (var t = 0; t < 16; ++t) { + W[t] = M[_i2][t]; + } + + for (var _t = 16; _t < 80; ++_t) { + W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); + } + + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + for (var _t2 = 0; _t2 < 80; ++_t2) { + var s = Math.floor(_t2 / 20); + var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + + H[0] = H[0] + a >>> 0; + H[1] = H[1] + b >>> 0; + H[2] = H[2] + c >>> 0; + H[3] = H[3] + d >>> 0; + H[4] = H[4] + e >>> 0; + } + + return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff]; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js": +/*!************************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js ***! + \************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ + +var byteToHex = []; + +for (var i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify(arr) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); + + // **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +var _nodeId; + +var _clockseq; // Previous uuid creation time + + +var _lastMSecs = 0; +var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details + +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || new Array(16); + options = options || {}; + var node = options.node || _nodeId; + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + + if (node == null || clockseq == null) { + var seedBytes = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); + + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; + } + + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + + + var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) + + var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression + + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + + + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } // Per 4.2.1.2 Throw error if too many uuids are requested + + + if (nsecs >= 10000) { + throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + + msecs += 12219292800000; // `time_low` + + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; // `time_mid` + + var tmh = msecs / 0x100000000 * 10000 & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; // `time_high_and_version` + + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + + b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + + b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` + + b[i++] = clockseq & 0xff; // `node` + + for (var n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf || (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js"); + + +var v3 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v3', 0x30, _md5_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v3); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js": +/*!******************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js ***! + \******************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ DNS: () => (/* binding */ DNS), +/* harmony export */ URL: () => (/* binding */ URL), +/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); + + + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + + var bytes = []; + + for (var i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); + } + + return bytes; +} + +var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + if (typeof value === 'string') { + value = stringToBytes(value); + } + + if (typeof namespace === 'string') { + namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); + } + + if (namespace.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` + + + var bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + + return buf; + } + + return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bytes); + } // Function#name is not settable on some platforms (#270) + + + try { + generateUUID.name = name; // eslint-disable-next-line no-empty + } catch (err) {} // For CommonJS default export support + + + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); + + + +function v4(options, buf, offset) { + options = options || {}; + var rnds = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rnds); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js": +/*!*****************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js ***! + \*****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js"); + + +var v5 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v5', 0x50, _sha1_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v5); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js": +/*!***********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _regex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js"); + + +function validate(uuid) { + return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__["default"].test(uuid); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate); + +/***/ }), + +/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js": +/*!**********************************************************************!*\ + !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/version.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); + + +function version(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + return parseInt(uuid.substr(14, 1), 16); +} + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version); + +/***/ }), + +/***/ "../api-internal-contract-js/lib/internal-contract-version.json": +/*!**********************************************************************!*\ + !*** ../api-internal-contract-js/lib/internal-contract-version.json ***! + \**********************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":162,"fix":0}'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +var exports = __webpack_exports__; +/*!**********************************!*\ + !*** ./lib/src/ExtensionsApi.js ***! + \**********************************/ + +/** + * This is your main. This is where you re-export everything you want to be publicly available. + * + * The build enforces that the file has the same name as the global variable that is exported. + */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +// The following polyfills are needed for IE11 +var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +__webpack_require__(/*! core-js/es/array/find */ "../../node_modules/core-js/es/array/find.js"); +__webpack_require__(/*! core-js/es/array/from */ "../../node_modules/core-js/es/array/from.js"); +__webpack_require__(/*! core-js/es/map */ "../../node_modules/core-js/es/map/index.js"); +__webpack_require__(/*! core-js/es/number/is-integer */ "../../node_modules/core-js/es/number/is-integer.js"); +__webpack_require__(/*! core-js/es/number/is-nan */ "../../node_modules/core-js/es/number/is-nan.js"); +__webpack_require__(/*! core-js/es/number/parse-float */ "../../node_modules/core-js/es/number/parse-float.js"); +__webpack_require__(/*! core-js/es/number/parse-int */ "../../node_modules/core-js/es/number/parse-int.js"); +__webpack_require__(/*! core-js/es/object/assign */ "../../node_modules/core-js/es/object/assign.js"); +__webpack_require__(/*! core-js/es/object/entries */ "../../node_modules/core-js/es/object/entries.js"); +__webpack_require__(/*! core-js/es/object/set-prototype-of */ "../../node_modules/core-js/es/object/set-prototype-of.js"); +__webpack_require__(/*! core-js/es/promise */ "../../node_modules/core-js/es/promise/index.js"); +// Due to the way we configured webpack, we should be exporting things which will be under +// a global variable called "tableau". Export everything we want to be visible under tableau +// from this file. +var ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); +var Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "./lib/src/ExtensionsApi/Namespaces/Extensions.js"); +var isAlpha = typeof VERSION_IS_ALPHA !== 'undefined' ? VERSION_IS_ALPHA : false; +api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.12.1-pre.1" : 0, isAlpha); +var 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.SelectOptions = api_external_contract_js_1.SelectOptions; +exports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType; +exports.SheetType = api_external_contract_js_1.SheetType; +exports.SortDirection = api_external_contract_js_1.SortDirection; +exports.TableauEventType = api_external_contract_js_1.TableauEventType; +exports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType; +exports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType; +exports.VizImagePaletteType = api_external_contract_js_1.VizImagePaletteType; +exports.VizImageSizeSettingAlignmentType = api_external_contract_js_1.VizImageSizeSettingAlignmentType; +exports.VizImageSizeSettingType = api_external_contract_js_1.VizImageSizeSettingType; +exports.VizImageSortDirectionType = api_external_contract_js_1.VizImageSortDirectionType; +exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType; + +})(); + +window.tableau = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuMTIuMS1wcmUuMS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxrQkFBa0IsbUJBQU8sQ0FBQywwRkFBOEI7O0FBRXhEOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLG1CQUFPLENBQUMsd0ZBQTZCO0FBQ3JDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0pBLG1CQUFPLENBQUMsZ0dBQWlDO0FBQ3pDLG1CQUFPLENBQUMsMEVBQXNCO0FBQzlCLG1CQUFPLENBQUMsb0dBQW1DO0FBQzNDLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ05BLG1CQUFPLENBQUMsc0dBQW9DO0FBQzVDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsOEZBQWdDO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsd0dBQXFDO0FBQzdDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsb0dBQW1DO0FBQzNDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsOEZBQWdDO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsZ0dBQWlDO0FBQ3pDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0hBQTBDO0FBQ2xELFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLG1CQUFP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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixxQkFBcUIsYUFBYTtBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPLElBQUksY0FBYzs7QUFFekI7QUFDQSw2RUFBNkUsY0FBYztBQUMzRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdCQUFnQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksMENBQTBDO0FBQzlDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsSUFBSSw2Q0FBNkM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELElBQUksd0RBQXdEO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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MEVBQWtCO0FBQ2xCLDhFQUFvQjtBQUNwQiw0RUFBbUI7QUFDbkIsc0dBQWdDO0FBQ2hDLG9GQUF1QjtBQUN2Qix3RkFBeUI7QUFDekIsMEVBQWtCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9maW5kLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL21hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3Byb21pc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGVhci1lcnJvci1zdGFjay5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1icm93c2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MtcGViYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnRyeS11bmJpbmQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvZ3VpZC9ndWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvTWFya3NTZWxlY3RlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1U2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVXb3Jrc2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1dvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQ29ubmVjdGVkU2VydmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvU2V0dGluZ3NJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVUlJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkT2JqZWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvUGFyYW1ldGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvU2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3JrYm9vay50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtzaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Vudmlyb25tZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvVUkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9VSVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUHVsc2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9WaXpJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvTm90aWZpY2F0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvUGFyYW1ldGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvVmVyYnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VUeXBlQ2hlY2tzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25UcmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uQ29udmVydGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQXBpVmVyc2lvbi50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Db25uZWN0aW9uU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9EYXRhU291cmNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FdmVudExpc3RlbmVyTWFuYWdlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9GaWVsZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXRhU291cmNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0ZpZWxkSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1BhcmFtZXRlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2luZ2xlRXZlbnRNYW5hZ2VySW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvV29ya3NoZWV0SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Mb2dpY2FsVGFibGUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0FjY2Vzc2liaWxpdHlNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0ZpbHRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvR2V0RGF0YU1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvR2V0RGF0YVRhYmxlUmVhZGVyTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvUG9pbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvR2V0RGF0YVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9BY2Nlc3NpYmlsaXR5U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0Fubm90YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0RhdGFTb3VyY2VTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4cG9ydFNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRmlsdGVyU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9HZXREYXRhU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1BhcmFtZXRlcnNTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VydmljZUltcGxCYXNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2l6ZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9WaXN1YWxNb2RlbFNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVml6U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9ab25lU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVGFibGVTdW1tYXJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlYXVFcnJvci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EYXRhVmFsdWVGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0VudW1Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRXJyb3JIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0V4cG9ydEhlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvUGFyYW0udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9TaG9ydExpdmVkRGVmZXJyZWQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVmVyc2lvbk51bWJlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9tZDUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbmlsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JlZ2V4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92My5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MzUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnZmluZCcpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZnJvbScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguQXJyYXkuZnJvbTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5NYXA7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNOYU47XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLnBhcnNlRmxvYXQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5wYXJzZUludDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmFzc2lnbjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LnNldFByb3RvdHlwZU9mO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguUHJvbWlzZTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ29uc3RydWN0b3IoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmICh0eXBlb2YgYXJndW1lbnQgPT0gJ29iamVjdCcgfHwgaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKGFyZ3VtZW50KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogY3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUHJvdG90eXBlKSB7XG4gIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcihTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgdmFyIElTX0NPTlNUUlVDVE9SID0gaXNDb25zdHJ1Y3Rvcih0aGlzKTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgaWYgKG1hcHBpbmcpIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICYmICEodGhpcyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IElTX0NPTlNUUlVDVE9SID8gbmV3IHRoaXMoKSA6IFtdO1xuICAgIGZvciAoOyEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKGxlbmd0aCkgOiBBcnJheShsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsInZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZm9yRWFjaCwgbWFwLCBmaWx0ZXIsIHNvbWUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbHRlclJlamVjdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBJU19GSUxURVJfUkVKRUNUID0gVFlQRSA9PSA3O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCwgc3BlY2lmaWNDcmVhdGUpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQpO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShzZWxmKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjcmVhdGUgPSBzcGVjaWZpY0NyZWF0ZSB8fCBhcnJheVNwZWNpZXNDcmVhdGU7XG4gICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiB8fCBJU19GSUxURVJfUkVKRUNUID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaCh0YXJnZXQsIHZhbHVlKTsgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgNDogcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAvLyBldmVyeVxuICAgICAgICAgIGNhc2UgNzogcHVzaCh0YXJnZXQsIHZhbHVlKTsgICAgICAvLyBmaWx0ZXJSZWplY3RcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogdGFyZ2V0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbiAgZm9yRWFjaDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgZmlsdGVyOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuc29tZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbiAgc29tZTogY3JlYXRlTWV0aG9kKDMpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuICBmaW5kOiBjcmVhdGVNZXRob2QoNSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gIGZpbmRJbmRleDogY3JlYXRlTWV0aG9kKDYpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlclJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWZpbHRlcmluZ1xuICBmaWx0ZXJSZWplY3Q6IGNyZWF0ZU1ldGhvZCg3KVxufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyhbXS5zbGljZSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG5cbi8vIGEgcGFydCBvZiBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5KSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKGlzQ29uc3RydWN0b3IoQykgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcbn07XG4iLCJ2YXIgYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoYXJyYXlTcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWxBcnJheSkpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tLCBuby10aHJvdy1saXRlcmFsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyh7fS50b1N0cmluZyk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBzdHJpbmdTbGljZSh0b1N0cmluZyhpdCksIDgsIC0xKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuXG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuLy8gZ2V0dGluZyB0YWcgZnJvbSBFUzYrIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyBjbGFzc29mUmF3IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcblxudmFyIFRFU1QgPSAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gU3RyaW5nKEVycm9yKGFyZykuc3RhY2spOyB9KSgnenhjYXNkJyk7XG52YXIgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZID0gL1xcblxccyphdCBbXjpdKjpbXlxcbl0qLztcbnZhciBJU19WOF9PUl9DSEFLUkFfU1RBQ0sgPSBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkudGVzdChURVNUKTtcbnZhciBJU19GSVJFRk9YX09SX1NBRkFSSV9TVEFDSyA9IC9AW15cXG5dKlxcbi8udGVzdChURVNUKSAmJiAhL3p4Y2FzZC8udGVzdChURVNUKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gIGlmICh0eXBlb2Ygc3RhY2sgIT0gJ3N0cmluZycpIHJldHVybiBzdGFjaztcbiAgaWYgKElTX1Y4X09SX0NIQUtSQV9TVEFDSykge1xuICAgIHdoaWxlIChkcm9wRW50cmllcy0tKSBzdGFjayA9IHJlcGxhY2Uoc3RhY2ssIFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWSwgJycpO1xuICB9IGVsc2UgaWYgKElTX0ZJUkVGT1hfT1JfU0FGQVJJX1NUQUNLKSB7XG4gICAgcmV0dXJuIGpvaW4oYXJyYXlTbGljZShzcGxpdChzdGFjaywgJ1xcbicpLCBkcm9wRW50cmllcyksICdcXG4nKTtcbiAgfSByZXR1cm4gc3RhY2s7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmZhc3RLZXk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIFByb3RvdHlwZSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSxcbiAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiAwXG4gICAgICB9KTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMpIHRoYXQuc2l6ZSA9IDA7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgUHJvdG90eXBlID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4gICAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gICAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgIHZhciBwcmV2aW91cywgaW5kZXg7XG4gICAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUubGFzdCA9IGVudHJ5ID0ge1xuICAgICAgICAgIGluZGV4OiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSxcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzID0gc3RhdGUubGFzdCxcbiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVtb3ZlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzdGF0ZS5maXJzdCkgc3RhdGUuZmlyc3QgPSBlbnRyeTtcbiAgICAgICAgaWYgKHByZXZpb3VzKSBwcmV2aW91cy5uZXh0ID0gZW50cnk7XG4gICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSsrO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSsrO1xuICAgICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHN0YXRlLmluZGV4W2luZGV4XSA9IGVudHJ5O1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9O1xuXG4gICAgdmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIC8vIGZhc3QgY2FzZVxuICAgICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpO1xuICAgICAgdmFyIGVudHJ5O1xuICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiBzdGF0ZS5pbmRleFtpbmRleF07XG4gICAgICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgICAgIGZvciAoZW50cnkgPSBzdGF0ZS5maXJzdDsgZW50cnk7IGVudHJ5ID0gZW50cnkubmV4dCkge1xuICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgcmV0dXJuIGVudHJ5O1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZWRlZmluZUFsbChQcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmNsZWFyKClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5jbGVhclxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmNsZWFyXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDtcbiAgICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wcmV2aW91cykgZW50cnkucHJldmlvdXMgPSBlbnRyeS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUgPSAwO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5kZWxldGVcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5kZWxldGVcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uZXh0O1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uZXh0ID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wcmV2aW91cyA9IHByZXY7XG4gICAgICAgICAgaWYgKHN0YXRlLmZpcnN0ID09IGVudHJ5KSBzdGF0ZS5maXJzdCA9IG5leHQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmxhc3QgPT0gZW50cnkpIHN0YXRlLmxhc3QgPSBwcmV2O1xuICAgICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZS0tO1xuICAgICAgICAgIGVsc2UgdGhhdC5zaXplLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmZvcmVhY2hcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuZmlyc3QpIHtcbiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXR9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmhhc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmhhc1xuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChQcm90b3R5cGUsIElTX01BUCA/IHtcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLmdldChrZXkpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5nZXRcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudmFsdWU7XG4gICAgICB9LFxuICAgICAgLy8gYE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5zZXRcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIGBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmFkZFxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eShQcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKSB7XG4gICAgdmFyIElURVJBVE9SX05BTUUgPSBDT05TVFJVQ1RPUl9OQU1FICsgJyBJdGVyYXRvcic7XG4gICAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICB2YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihJVEVSQVRPUl9OQU1FKTtcbiAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS57IGtleXMsIHZhbHVlcywgZW50cmllcywgQEBpdGVyYXRvciB9KClgIG1ldGhvZHNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZW50cmllc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5rZXlzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLnZhbHVlc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmVudHJpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUua2V5c1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS52YWx1ZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUtQEBpdGVyYXRvclxuICAgIGRlZmluZUl0ZXJhdG9yKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9O1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS52YWx1ZSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGVbQEBzcGVjaWVzXWAgYWNjZXNzb3JzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXQtbWFwLUBAc3BlY2llc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXNldC1AQHNwZWNpZXNcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUsIHdyYXBwZXIsIGNvbW1vbikge1xuICB2YXIgSVNfTUFQID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdNYXAnKSAhPT0gLTE7XG4gIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgTmF0aXZlQ29uc3RydWN0b3IgPSBnbG9iYWxbQ09OU1RSVUNUT1JfTkFNRV07XG4gIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHZhciBDb25zdHJ1Y3RvciA9IE5hdGl2ZUNvbnN0cnVjdG9yO1xuICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24gKEtFWSkge1xuICAgIHZhciB1bmN1cnJpZWROYXRpdmVNZXRob2QgPSB1bmN1cnJ5VGhpcyhOYXRpdmVQcm90b3R5cGVbS0VZXSk7XG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvdG90eXBlLCBLRVksXG4gICAgICBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyB1bmRlZmluZWQgOiB1bmN1cnJpZWROYXRpdmVNZXRob2QodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgdmFyIFJFUExBQ0UgPSBpc0ZvcmNlZChcbiAgICBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICFpc0NhbGxhYmxlKE5hdGl2ZUNvbnN0cnVjdG9yKSB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gICAgfSkpXG4gICk7XG5cbiAgaWYgKFJFUExBQ0UpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBOYXRpdmVQcm90b3R5cGUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBOYXRpdmVQcm90b3R5cGU7XG4gICAgICBOYXRpdmVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORykgZml4TWV0aG9kKEFEREVSKTtcblxuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgTmF0aXZlUHJvdG90eXBlLmNsZWFyKSBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyO1xuICB9XG5cbiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjtcbiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBDb25zdHJ1Y3RvciAhPSBOYXRpdmVDb25zdHJ1Y3RvciB9LCBleHBvcnRlZCk7XG5cbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgRnVuY3Rpb25OYW1lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuUFJPUEVSO1xudmFyIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FID0gRnVuY3Rpb25OYW1lLkNPTkZJR1VSQUJMRTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYWxsYWJsZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICAgICAgICAgIHJlZGVmaW5lKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5LnByb3RvdHlwZS57IHZhbHVlcywgQEBpdGVyYXRvciB9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoUFJPUEVSX0ZVTkNUSU9OX05BTUUgJiYgREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgaWYgKCFJU19QVVJFICYmIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsICduYW1lJywgVkFMVUVTKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIGNhbGwobmF0aXZlSXRlcmF0b3IsIHRoaXMpOyB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGV4cG9ydCBhZGRpdGlvbmFsIG1ldGhvZHNcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKVxuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIHx8ICEoS0VZIGluIEl0ZXJhYmxlUHJvdG90eXBlKSkge1xuICAgICAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvciwgeyBuYW1lOiBERUZBVUxUIH0pO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JztcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL2lwYWR8aXBob25lfGlwb2QvaS50ZXN0KHVzZXJBZ2VudCkgJiYgZ2xvYmFsLlBlYmJsZSAhPT0gdW5kZWZpbmVkO1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC8oPzppcGFkfGlwaG9uZXxpcG9kKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc29mKGdsb2JhbC5wcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBEZW5vID0gZ2xvYmFsLkRlbm87XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnMgfHwgRGVubyAmJiBEZW5vLnZlcnNpb247XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgLy8gaW4gb2xkIENocm9tZSwgdmVyc2lvbnMgb2YgVjggaXNuJ3QgVjggPSBDaHJvbWUgLyAxMFxuICAvLyBidXQgdGhlaXIgY29ycmVjdCB2ZXJzaW9ucyBhcmUgbm90IGludGVyZXN0aW5nIGZvciB1c1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gPiAwICYmIG1hdGNoWzBdIDwgNCA/IDEgOiArKG1hdGNoWzBdICsgbWF0Y2hbMV0pO1xufVxuXG4vLyBCcm93c2VyRlMgTm9kZUpTIGBwcm9jZXNzYCBwb2x5ZmlsbCBpbmNvcnJlY3RseSBzZXQgYC52OGAgdG8gYDAuMGBcbi8vIHNvIGNoZWNrIGB1c2VyQWdlbnRgIGV2ZW4gaWYgYC52OGAgZXhpc3RzLCBidXQgMFxuaWYgKCF2ZXJzaW9uICYmIHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9ICttYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9EKSB7XG4gIHJldHVybiB1bmN1cnJ5VGhpcyhnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdKTtcbn07XG4iLCIvLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBlcnJvciA9IEVycm9yKCdhJyk7XG4gIGlmICghKCdzdGFjaycgaW4gZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIDcpKTtcbiAgcmV0dXJuIGVycm9yLnN0YWNrICE9PSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4gIG9wdGlvbnMubmFtZSAgICAgICAgLSB0aGUgLm5hbWUgb2YgdGhlIGZ1bmN0aW9uIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBrZXlcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHtcbiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0O1xuICB2YXIgR0xPQkFMID0gb3B0aW9ucy5nbG9iYWw7XG4gIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7XG4gIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7XG4gIGlmIChHTE9CQUwpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWw7XG4gIH0gZWxzZSBpZiAoU1RBVElDKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlO1xuICB9XG4gIGlmICh0YXJnZXQpIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07XG4gICAgaWYgKG9wdGlvbnMubm9UYXJnZXRHZXQpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfSBlbHNlIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG4gICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0XG4gICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuIiwidmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGFwcGx5ID0gRnVuY3Rpb25Qcm90b3R5cGUuYXBwbHk7XG52YXIgYmluZCA9IEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQ7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1yZWZsZWN0IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFJlZmxlY3QgPT0gJ29iamVjdCcgJiYgUmVmbGVjdC5hcHBseSB8fCAoYmluZCA/IGNhbGwuYmluZChhcHBseSkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpO1xufSk7XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcblxudmFyIGJpbmQgPSB1bmN1cnJ5VGhpcyh1bmN1cnJ5VGhpcy5iaW5kKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCkge1xuICBhQ2FsbGFibGUoZm4pO1xuICByZXR1cm4gdGhhdCA9PT0gdW5kZWZpbmVkID8gZm4gOiBiaW5kID8gYmluZChmbiwgdGhhdCkgOiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gY2FsbC5iaW5kID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXREZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIEVYSVNUUyA9IGhhc093bihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKTtcbi8vIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBmcm9tIG1pbmlmaWVkIC8gbWFuZ2xlZCAvIGRyb3BwZWQgZnVuY3Rpb24gbmFtZXNcbnZhciBQUk9QRVIgPSBFWElTVFMgJiYgKGZ1bmN0aW9uIHNvbWV0aGluZygpIHsgLyogZW1wdHkgKi8gfSkubmFtZSA9PT0gJ3NvbWV0aGluZyc7XG52YXIgQ09ORklHVVJBQkxFID0gRVhJU1RTICYmICghREVTQ1JJUFRPUlMgfHwgKERFU0NSSVBUT1JTICYmIGdldERlc2NyaXB0b3IoRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJykuY29uZmlndXJhYmxlKSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBFWElTVFM6IEVYSVNUUyxcbiAgUFJPUEVSOiBQUk9QRVIsXG4gIENPTkZJR1VSQUJMRTogQ09ORklHVVJBQkxFXG59O1xuIiwidmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGJpbmQgPSBGdW5jdGlvblByb3RvdHlwZS5iaW5kO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xudmFyIGNhbGxCaW5kID0gYmluZCAmJiBiaW5kLmJpbmQoY2FsbCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZCA/IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZm4gJiYgY2FsbEJpbmQoY2FsbCwgZm4pO1xufSA6IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZm4gJiYgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWxsLmFwcGx5KGZuLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKGFyZ3VtZW50KSA/IGFyZ3VtZW50IDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKSA6IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBnZXRNZXRob2QoaXQsIElURVJBVE9SKVxuICAgIHx8IGdldE1ldGhvZChpdCwgJ0BAaXRlcmF0b3InKVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgdXNpbmdJdGVyYXRvcikge1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGdldEl0ZXJhdG9yTWV0aG9kKGFyZ3VtZW50KSA6IHVzaW5nSXRlcmF0b3I7XG4gIGlmIChhQ2FsbGFibGUoaXRlcmF0b3JNZXRob2QpKSByZXR1cm4gYW5PYmplY3QoY2FsbChpdGVyYXRvck1ldGhvZCwgYXJndW1lbnQpKTtcbiAgdGhyb3cgVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuIiwidmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG5cbi8vIGBHZXRNZXRob2RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXRtZXRob2Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFYsIFApIHtcbiAgdmFyIGZ1bmMgPSBWW1BdO1xuICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcbiIsInZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBhcmd1bWVudHMubGVuZ3RoID09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfVxufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWllZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3Ncbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgaXNDYWxsYWJsZShOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gdW5jdXJyeVRoaXMoRnVuY3Rpb24udG9TdHJpbmcpO1xuXG4vLyB0aGlzIGhlbHBlciBicm9rZW4gaW4gYGNvcmUtanNAMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAoIWlzQ2FsbGFibGUoc3RvcmUuaW5zcGVjdFNvdXJjZSkpIHtcbiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBmdW5jdGlvblRvU3RyaW5nKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcblxuLy8gYEluc3RhbGxFcnJvckNhdXNlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1lcnJvci1jYXVzZS8jc2VjLWVycm9yb2JqZWN0cy1pbnN0YWxsLWVycm9yLWNhdXNlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBvcHRpb25zKSB7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSAmJiAnY2F1c2UnIGluIG9wdGlvbnMpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywgJ2NhdXNlJywgb3B0aW9ucy5jYXVzZSk7XG4gIH1cbn07XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBSRVFVSVJFRCA9IGZhbHNlO1xudmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7XG52YXIgaWQgPSAwO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSAtLSBzYWZlXG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIHNldE1ldGFkYXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeyB2YWx1ZToge1xuICAgIG9iamVjdElEOiAnTycgKyBpZCsrLCAvLyBvYmplY3QgSURcbiAgICB3ZWFrRGF0YToge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG5cbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIGEgcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhc093bihpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBREFUQV0ub2JqZWN0SUQ7XG59O1xuXG52YXIgZ2V0V2Vha0RhdGEgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhc093bihpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIHRoZSBzdG9yZSBvZiB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBREFUQV0ud2Vha0RhdGE7XG59O1xuXG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpJTkcgJiYgUkVRVUlSRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzT3duKGl0LCBNRVRBREFUQSkpIHNldE1ldGFkYXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIGVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWV0YS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4gIFJFUVVJUkVEID0gdHJ1ZTtcbiAgdmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmY7XG4gIHZhciBzcGxpY2UgPSB1bmN1cnJ5VGhpcyhbXS5zcGxpY2UpO1xuICB2YXIgdGVzdCA9IHt9O1xuICB0ZXN0W01FVEFEQVRBXSA9IDE7XG5cbiAgLy8gcHJldmVudCBleHBvc2luZyBvZiBtZXRhZGF0YSBrZXlcbiAgaWYgKGdldE93blByb3BlcnR5TmFtZXModGVzdCkubGVuZ3RoKSB7XG4gICAgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZXN1bHRbaV0gPT09IE1FVEFEQVRBKSB7XG4gICAgICAgICAgc3BsaWNlKHJlc3VsdCwgaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWxNb2R1bGUuZlxuICAgIH0pO1xuICB9XG59O1xuXG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBlbmFibGU6IGVuYWJsZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cbmhpZGRlbktleXNbTUVUQURBVEFdID0gdHJ1ZTtcbiIsInZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEID0gJ09iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVAgfHwgc2hhcmVkLnN0YXRlKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIHZhciB3bWdldCA9IHVuY3VycnlUaGlzKHN0b3JlLmdldCk7XG4gIHZhciB3bWhhcyA9IHVuY3VycnlUaGlzKHN0b3JlLmhhcyk7XG4gIHZhciB3bXNldCA9IHVuY3VycnlUaGlzKHN0b3JlLnNldCk7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAod21oYXMoc3RvcmUsIGl0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgd21zZXQoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChoYXNPd24oaXQsIFNUQVRFKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZ3VtZW50KSB7XG4gIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PSAnQXJyYXknO1xufTtcbiIsIi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgZW1wdHkgPSBbXTtcbnZhciBjb25zdHJ1Y3QgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ2NvbnN0cnVjdCcpO1xudmFyIGNvbnN0cnVjdG9yUmVnRXhwID0gL15cXHMqKD86Y2xhc3N8ZnVuY3Rpb24pXFxiLztcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoY29uc3RydWN0b3JSZWdFeHAuZXhlYyk7XG52YXIgSU5DT1JSRUNUX1RPX1NUUklORyA9ICFjb25zdHJ1Y3RvclJlZ0V4cC5leGVjKG5vb3ApO1xuXG52YXIgaXNDb25zdHJ1Y3Rvck1vZGVybiA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3RydWN0KG5vb3AsIGVtcHR5LCBhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG52YXIgaXNDb25zdHJ1Y3RvckxlZ2FjeSA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgICAvLyB3ZSBjYW4ndCBjaGVjayAucHJvdG90eXBlIHNpbmNlIGNvbnN0cnVjdG9ycyBwcm9kdWNlZCBieSAuYmluZCBoYXZlbid0IGl0XG4gIH0gcmV0dXJuIElOQ09SUkVDVF9UT19TVFJJTkcgfHwgISFleGVjKGNvbnN0cnVjdG9yUmVnRXhwLCBpbnNwZWN0U291cmNlKGFyZ3VtZW50KSk7XG59O1xuXG4vLyBgSXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gIWNvbnN0cnVjdCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBjYWxsZWQ7XG4gIHJldHVybiBpc0NvbnN0cnVjdG9yTW9kZXJuKGlzQ29uc3RydWN0b3JNb2Rlcm4uY2FsbClcbiAgICB8fCAhaXNDb25zdHJ1Y3Rvck1vZGVybihPYmplY3QpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oZnVuY3Rpb24gKCkgeyBjYWxsZWQgPSB0cnVlOyB9KVxuICAgIHx8IGNhbGxlZDtcbn0pID8gaXNDb25zdHJ1Y3RvckxlZ2FjeSA6IGlzQ29uc3RydWN0b3JNb2Rlcm47XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBJc0ludGVncmFsTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNpbnRlZ3JhbG51bWJlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1pc2ludGVnZXIgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iLCJ2YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCBPYmplY3QoaXQpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbnZhciBSZXN1bHRQcm90b3R5cGUgPSBSZXN1bHQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgdW5ib3VuZEZ1bmN0aW9uLCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoYXQ7XG4gIHZhciBBU19FTlRSSUVTID0gISEob3B0aW9ucyAmJiBvcHRpb25zLkFTX0VOVFJJRVMpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBiaW5kKHVuYm91bmRGdW5jdGlvbiwgdGhhdCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX0lURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKCFpdGVyRm4pIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdGVyYWJsZSkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlcmFibGUpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pO1xuICB9XG5cbiAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gIHdoaWxlICghKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG4iLCJ2YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGtpbmQsIHZhbHVlKSB7XG4gIHZhciBpbm5lclJlc3VsdCwgaW5uZXJFcnJvcjtcbiAgYW5PYmplY3QoaXRlcmF0b3IpO1xuICB0cnkge1xuICAgIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgaWYgKCFpbm5lclJlc3VsdCkge1xuICAgICAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbm5lclJlc3VsdCA9IGNhbGwoaW5uZXJSZXN1bHQsIGl0ZXJhdG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbm5lckVycm9yID0gdHJ1ZTtcbiAgICBpbm5lclJlc3VsdCA9IGVycm9yO1xuICB9XG4gIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgaWYgKGlubmVyRXJyb3IpIHRocm93IGlubmVyUmVzdWx0O1xuICBhbk9iamVjdChpbm5lclJlc3VsdCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUta2V5cyAtLSBzYWZlICovXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbnZhciBORVdfSVRFUkFUT1JfUFJPVE9UWVBFID0gSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgLy8gRkY0NC0gbGVnYWN5IGl0ZXJhdG9ycyBjYXNlXG4gIHJldHVybiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0uY2FsbCh0ZXN0KSAhPT0gdGVzdDtcbn0pO1xuXG5pZiAoTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbmVsc2UgaWYgKElTX1BVUkUpIEl0ZXJhdG9yUHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtQEBpdGVyYXRvclxuaWYgKCFpc0NhbGxhYmxlKEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSkpIHtcbiAgcmVkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcblxuLy8gYExlbmd0aE9mQXJyYXlMaWtlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdG9MZW5ndGgob2JqLmxlbmd0aCk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX0lPU19QRUJCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy1wZWJibGUnKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdCcpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcblxudmFyIE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xuLy8gTm9kZS5qcyAxMSBzaG93cyBFeHBlcmltZW50YWxXYXJuaW5nIG9uIGdldHRpbmcgYHF1ZXVlTWljcm90YXNrYFxudmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpO1xudmFyIHF1ZXVlTWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcblxudmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghcXVldWVNaWNyb3Rhc2spIHtcbiAgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgLy8gYWxzbyBleGNlcHQgV2ViT1MgV2Via2l0IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84OThcbiAgaWYgKCFJU19JT1MgJiYgIUlTX05PREUgJiYgIUlTX1dFQk9TX1dFQktJVCAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50KSB7XG4gICAgdG9nZ2xlID0gdHJ1ZTtcbiAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoIUlTX0lPU19QRUJCTEUgJiYgUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAvLyB3b3JrYXJvdW5kIG9mIFdlYktpdCB+IGlPUyBTYWZhcmkgMTAuMSBidWdcbiAgICBwcm9taXNlLmNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbiAgICB0aGVuID0gYmluZChwcm9taXNlLnRoZW4sIHByb21pc2UpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmJpbmQoZ2xvYmFsKVxuICAgIG1hY3JvdGFzayA9IGJpbmQobWFjcm90YXNrLCBnbG9iYWwpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hY3JvdGFzayhmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSBTeW1ib2woKTtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gYGdldC1vd24tcHJvcGVydHktc3ltYm9sc2AgcG9seWZpbGwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gb2JqZWN0IGFyZSBub3QgU3ltYm9sIGluc3RhbmNlc1xuICByZXR1cm4gIVN0cmluZyhzeW1ib2wpIHx8ICEoT2JqZWN0KHN5bWJvbCkgaW5zdGFuY2VvZiBTeW1ib2wpIHx8XG4gICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXNcbiAgICAhU3ltYm9sLnNoYW0gJiYgVjhfVkVSU0lPTiAmJiBWOF9WRVJTSU9OIDwgNDE7XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0NhbGxhYmxlKFdlYWtNYXApICYmIC9uYXRpdmUgY29kZS8udGVzdChpbnNwZWN0U291cmNlKFdlYWtNYXApKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUNhbGxhYmxlKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFDYWxsYWJsZShyZWplY3QpO1xufTtcblxuLy8gYE5ld1Byb21pc2VDYXBhYmlsaXR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbmV3cHJvbWlzZWNhcGFiaWxpdHlcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsInZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsICRkZWZhdWx0KSB7XG4gIHJldHVybiBhcmd1bWVudCA9PT0gdW5kZWZpbmVkID8gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyAnJyA6ICRkZWZhdWx0IDogdG9TdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBuJFBhcnNlRmxvYXQgPSBnbG9iYWwucGFyc2VGbG9hdDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGT1JDRUQgPSAxIC8gbiRQYXJzZUZsb2F0KHdoaXRlc3BhY2VzICsgJy0wJykgIT09IC1JbmZpbml0eVxuICAvLyBNUyBFZGdlIDE4LSBicm9rZW4gd2l0aCBib3hlZCBzeW1ib2xzXG4gIHx8IChJVEVSQVRPUiAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyBuJFBhcnNlRmxvYXQoT2JqZWN0KElURVJBVE9SKSk7IH0pKTtcblxuLy8gYHBhcnNlRmxvYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWZsb2F0LXN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUZsb2F0KHN0cmluZykge1xuICB2YXIgdHJpbW1lZFN0cmluZyA9IHRyaW0odG9TdHJpbmcoc3RyaW5nKSk7XG4gIHZhciByZXN1bHQgPSBuJFBhcnNlRmxvYXQodHJpbW1lZFN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgY2hhckF0KHRyaW1tZWRTdHJpbmcsIDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6IG4kUGFyc2VGbG9hdDtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgJHBhcnNlSW50ID0gZ2xvYmFsLnBhcnNlSW50O1xudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgSVRFUkFUT1IgPSBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIGhleCA9IC9eWystXT8weC9pO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhoZXguZXhlYyk7XG52YXIgRk9SQ0VEID0gJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzB4MTYnKSAhPT0gMjJcbiAgLy8gTVMgRWRnZSAxOC0gYnJva2VuIHdpdGggYm94ZWQgc3ltYm9sc1xuICB8fCAoSVRFUkFUT1IgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsgJHBhcnNlSW50KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4KSB7XG4gIHZhciBTID0gdHJpbSh0b1N0cmluZyhzdHJpbmcpKTtcbiAgcmV0dXJuICRwYXJzZUludChTLCAocmFkaXggPj4+IDApIHx8IChleGVjKGhleCwgUykgPyAxNiA6IDEwKSk7XG59IDogJHBhcnNlSW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gc2FmZVxudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHNob3VsZCBoYXZlIGNvcnJlY3Qgb3JkZXIgb2Ygb3BlcmF0aW9ucyAoRWRnZSBidWcpXG4gIGlmIChERVNDUklQVE9SUyAmJiAkYXNzaWduKHsgYjogMSB9LCAkYXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1zeW1ib2wgLS0gc2FmZVxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBhbHBoYWJldDtcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG4gIHdoaWxlIChhcmd1bWVudHNMZW5ndGggPiBpbmRleCkge1xuICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KG9iamVjdEtleXMoUyksIGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlLCBTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG4iLCIvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUsIFdTSCAqL1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xuXG52YXIgR1QgPSAnPic7XG52YXIgTFQgPSAnPCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgU0NSSVBUID0gJ3NjcmlwdCc7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBFbXB0eUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG52YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIExUICsgU0NSSVBUICsgR1QgKyBjb250ZW50ICsgTFQgKyAnLycgKyBTQ1JJUFQgKyBHVDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBBY3RpdmVYIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHtcbiAgYWN0aXZlWERvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnJykpO1xuICBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTtcbiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDtcbiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDsgLy8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgcmV0dXJuIHRlbXA7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzVcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7XG59O1xuXG4vLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0XG4vLyBObyBuZWVkIHRvIHVzZSBhY3RpdmUgeCBhcHByb2FjaCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyBub3Qgc2V0XG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2XG4vLyBhdm9pZCBJRSBHQyBidWdcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfVxuICBOdWxsUHJvdG9PYmplY3QgPSB0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCdcbiAgICA/IGRvY3VtZW50LmRvbWFpbiAmJiBhY3RpdmVYRG9jdW1lbnRcbiAgICAgID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIC8vIG9sZCBJRVxuICAgICAgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKVxuICAgIDogTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpOyAvLyBXU0hcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gTnVsbFByb3RvT2JqZWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydGllcyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBwcm9wc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzT3duKE8sIFApKSByZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYsIE8sIFApLCBPW1BdKTtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlICovXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJykuZjtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBhcnJheVNsaWNlKHdpbmRvd05hbWVzKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIGNsYXNzb2YoaXQpID09ICdXaW5kb3cnXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKE8pIHtcbiAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzT3duKG9iamVjdCwgSUVfUFJPVE8pKSByZXR1cm4gb2JqZWN0W0lFX1BST1RPXTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBpZiAoaXNDYWxsYWJsZShjb25zdHJ1Y3RvcikgJiYgb2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyh7fS5pc1Byb3RvdHlwZU9mKTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qta2V5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gTmFzaG9ybiB+IEpESzggYnVnXG52YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgISRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlXG5leHBvcnRzLmYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlO1xufSA6ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvIC0tIHNhZmUgKi9cbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LXNldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICAgIHNldHRlciA9IHVuY3VycnlUaGlzKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCk7XG4gICAgc2V0dGVyKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICBhbk9iamVjdChPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHVuY3VycnlUaGlzKCRwcm9wZXJ0eUlzRW51bWVyYWJsZSk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgT2JqZWN0LnsgZW50cmllcywgdmFsdWVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVE9fRU5UUklFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBrZXkgPSBrZXlzW2krK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IHByb3BlcnR5SXNFbnVtZXJhYmxlKE8sIGtleSkpIHtcbiAgICAgICAgcHVzaChyZXN1bHQsIFRPX0VOVFJJRVMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4gIGVudHJpZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYE9iamVjdC52YWx1ZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbi8vIGBPcmRpbmFyeVRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb3JkaW5hcnl0b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChwcmVmID09PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoaXNDYWxsYWJsZShmbiA9IGlucHV0LnZhbHVlT2YpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAocHJlZiAhPT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChrZXlzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCB2YWx1ZTogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9O1xuICB9XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJykuQ09ORklHVVJBQkxFO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlO1xuICB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7XG4gIHZhciBuYW1lID0gb3B0aW9ucyAmJiBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiAgdmFyIHN0YXRlO1xuICBpZiAoaXNDYWxsYWJsZSh2YWx1ZSkpIHtcbiAgICBpZiAoU3RyaW5nKG5hbWUpLnNsaWNlKDAsIDcpID09PSAnU3ltYm9sKCcpIHtcbiAgICAgIG5hbWUgPSAnWycgKyBTdHJpbmcobmFtZSkucmVwbGFjZSgvXlN5bWJvbFxcKChbXildKilcXCkvLCAnJDEnKSArICddJztcbiAgICB9XG4gICAgaWYgKCFoYXNPd24odmFsdWUsICduYW1lJykgfHwgKENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FICYmIHZhbHVlLm5hbWUgIT09IG5hbWUpKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodmFsdWUsICduYW1lJywgbmFtZSk7XG4gICAgfVxuICAgIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpO1xuICAgIGlmICghc3RhdGUuc291cmNlKSB7XG4gICAgICBzdGF0ZS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBuYW1lID09ICdzdHJpbmcnID8gbmFtZSA6ICcnKTtcbiAgICB9XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKHRoaXMpICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXNPd24oaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZTtcbiIsInZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjE5LjAnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMjEgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jb25zdHJ1Y3RvcicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgU3BlY2llc0NvbnN0cnVjdG9yYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUNvbnN0cnVjdG9yKFMpO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7XG4gICAgdmFyIFMgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyT3JJbmZpbml0eShwb3MpO1xuICAgIHZhciBzaXplID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBmaXJzdCA9IGNoYXJDb2RlQXQoUywgcG9zaXRpb24pO1xuICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICAgIHx8IChzZWNvbmQgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBjaGFyQXQoUywgcG9zaXRpb24pXG4gICAgICAgICAgOiBmaXJzdFxuICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBzdHJpbmdTbGljZShTLCBwb3NpdGlvbiwgcG9zaXRpb24gKyAyKVxuICAgICAgICAgIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuICBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxuICBjaGFyQXQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgd2hpdGVzcGFjZSA9ICdbJyArIHdoaXRlc3BhY2VzICsgJ10nO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cCh3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgbHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBydHJpbSwgJycpO1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1SaWdodCwgdHJpbUVuZCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1cbiAgdHJpbTogY3JlYXRlTWV0aG9kKDMpXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgRnVuY3Rpb24gPSBnbG9iYWwuRnVuY3Rpb247XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGxvY2F0aW9uLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudHJ5IHtcbiAgLy8gRGVubyB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciBvbiBgbG9jYXRpb25gIGFjY2VzcyB3aXRob3V0IGAtLWxvY2F0aW9uYCBmbGFnXG4gIGxvY2F0aW9uID0gZ2xvYmFsLmxvY2F0aW9uO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChoYXNPd24ocXVldWUsIGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBwb3N0ID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWwucG9zdE1lc3NhZ2UoU3RyaW5nKGlkKSwgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwcGx5KGlzQ2FsbGFibGUoZm4pID8gZm4gOiBGdW5jdGlvbihmbiksIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKFxuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmXG4gICAgaXNDYWxsYWJsZShnbG9iYWwucG9zdE1lc3NhZ2UpICYmXG4gICAgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmXG4gICAgbG9jYXRpb24gJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOicgJiZcbiAgICAhZmFpbHMocG9zdClcbiAgKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCIvLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyT3JJbmZpbml0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvaW50ZWdlcm9yaW5maW5pdHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBudW1iZXIgPSArYXJndW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gc2FmZVxuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IChudW1iZXIgPiAwID8gZmxvb3IgOiBjZWlsKShudW1iZXIpO1xufTtcbiIsInZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXJPckluZmluaXR5KGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gIH1cbiAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdudW1iZXInO1xuICByZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgcHJlZik7XG59O1xuIiwidmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ1N5bWJvbCcpIHRocm93IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcnKTtcbiAgcmV0dXJuIFN0cmluZyhhcmd1bWVudCk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIFN0cmluZyhhcmd1bWVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG59O1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzeW1ib2xGb3IgPSBTeW1ib2wgJiYgU3ltYm9sWydmb3InXTtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXNPd24oV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSB8fCAhKE5BVElWRV9TWU1CT0wgfHwgdHlwZW9mIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9PSAnc3RyaW5nJykpIHtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSAnU3ltYm9sLicgKyBuYW1lO1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpKSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgfSBlbHNlIGlmIChVU0VfU1lNQk9MX0FTX1VJRCAmJiBzeW1ib2xGb3IpIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IHN5bWJvbEZvcihkZXNjcmlwdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbChkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07XG59O1xuIiwiLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgY2xlYXJFcnJvclN0YWNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsZWFyLWVycm9yLXN0YWNrJyk7XG52YXIgaW5zdGFsbEVycm9yQ2F1c2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQnKTtcbnZhciBFUlJPUl9TVEFDS19JTlNUQUxMQUJMRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZScpO1xuXG52YXIgRXJyb3IgPSBnbG9iYWwuRXJyb3I7XG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbnZhciAkQWdncmVnYXRlRXJyb3IgPSBmdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UgLyogLCBvcHRpb25zICovKSB7XG4gIHZhciB0aGF0ID0gaXNQcm90b3R5cGVPZihBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSwgdGhpcykgPyB0aGlzIDogY3JlYXRlKEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlKTtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgdGhhdCA9IHNldFByb3RvdHlwZU9mKG5ldyBFcnJvcih1bmRlZmluZWQpLCBnZXRQcm90b3R5cGVPZih0aGF0KSk7XG4gIH1cbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgbm9ybWFsaXplU3RyaW5nQXJndW1lbnQobWVzc2FnZSwgJycpKTtcbiAgaWYgKEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ3N0YWNrJywgY2xlYXJFcnJvclN0YWNrKHRoYXQuc3RhY2ssIDEpKTtcbiAgaW5zdGFsbEVycm9yQ2F1c2UodGhhdCwgb3B0aW9ucyk7XG4gIHZhciBlcnJvcnNBcnJheSA9IFtdO1xuICBpdGVyYXRlKGVycm9ycywgcHVzaCwgeyB0aGF0OiBlcnJvcnNBcnJheSB9KTtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdlcnJvcnMnLCBlcnJvcnNBcnJheSk7XG4gIHJldHVybiB0aGF0O1xufTtcblxuaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZigkQWdncmVnYXRlRXJyb3IsIEVycm9yKTtcbmVsc2UgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcygkQWdncmVnYXRlRXJyb3IsIEVycm9yKTtcblxudmFyIEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlID0gJEFnZ3JlZ2F0ZUVycm9yLnByb3RvdHlwZSA9IGNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAkQWdncmVnYXRlRXJyb3IpLFxuICBtZXNzYWdlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJycpLFxuICBuYW1lOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJ0FnZ3JlZ2F0ZUVycm9yJylcbn0pO1xuXG4vLyBgQWdncmVnYXRlRXJyb3JgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFnZ3JlZ2F0ZS1lcnJvci1jb25zdHJ1Y3RvclxuJCh7IGdsb2JhbDogdHJ1ZSB9LCB7XG4gIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3Jcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmluZDtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG52YXIgRklORCA9ICdmaW5kJztcbnZhciBTS0lQU19IT0xFUyA9IHRydWU7XG5cbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoRklORCBpbiBbXSkgQXJyYXkoMSlbRklORF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFNLSVBTX0hPTEVTIH0sIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKEZJTkQpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogZnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgQVJSQVlfSVRFUkFUT1IgPSAnQXJyYXkgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfSVRFUkFUT1IpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllc1xuLy8gYEFycmF5LnByb3RvdHlwZS5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnZhbHVlc1xuLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4vLyBgQ3JlYXRlQXJyYXlJdGVyYXRvcmAgaW50ZXJuYWwgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7XG4gIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKztcbiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkge1xuICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogaW5kZXgsIGRvbmU6IGZhbHNlIH07XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogdGFyZ2V0W2luZGV4XSwgZG9uZTogZmFsc2UgfTtcbiAgcmV0dXJuIHsgdmFsdWU6IFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGRvbmU6IGZhbHNlIH07XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGV1bm1hcHBlZGFyZ3VtZW50c29iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYE1hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLW9iamVjdHNcbmNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0ludGVncmFsTnVtYmVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlcicpO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNJbnRlZ2VyOiBpc0ludGVncmFsTnVtYmVyXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTnVtYmVyLmlzTmFOYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzbmFuXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWZsb2F0Jyk7XG5cbi8vIGBOdW1iZXIucGFyc2VGbG9hdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZUZsb2F0XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbnVtYmVyLXBhcnNlZmxvYXQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUZsb2F0ICE9IHBhcnNlRmxvYXQgfSwge1xuICBwYXJzZUZsb2F0OiBwYXJzZUZsb2F0XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlSW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQnKTtcblxuLy8gYE51bWJlci5wYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZWludFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1wYXJzZWludCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUsIGZvcmNlZDogTnVtYmVyLnBhcnNlSW50ICE9IHBhcnNlSW50IH0sIHtcbiAgcGFyc2VJbnQ6IHBhcnNlSW50XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoTykge1xuICAgIHJldHVybiAkZW50cmllcyhPKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIHNldFByb3RvdHlwZU9mOiBzZXRQcm90b3R5cGVPZlxufSk7XG4iLCJ2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZycpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVycm9yIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxudmFyIFBST01JU0VfQU5ZX0VSUk9SID0gJ05vIG9uZSBwcm9taXNlIHJlc29sdmVkJztcblxuLy8gYFByb21pc2UuYW55YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbnlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFueTogZnVuY3Rpb24gYW55KGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBBZ2dyZWdhdGVFcnJvciA9IGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJyk7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yc1tpbmRleF0gPSBlcnJvcjtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgTmF0aXZlUHJvbWlzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3RvcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIE5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10uY2FsbCh7IHRoZW46IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSBpc0NhbGxhYmxlKG9uRmluYWxseSk7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuXG4vLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNmaW5hbGx5YCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbmlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2UpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J107XG4gIGlmIChOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddICE9PSBtZXRob2QpIHtcbiAgICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfQlJPV1NFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3NlcicpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZSAmJiBOYXRpdmVQcm9taXNlLnByb3RvdHlwZTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlO1xudmFyIFByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcbnZhciBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eTtcblxudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIE5BVElWRV9SRUpFQ1RJT05fRVZFTlQgPSBpc0NhbGxhYmxlKGdsb2JhbC5Qcm9taXNlUmVqZWN0aW9uRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG5cbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuO1xuXG52YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkge1xuICB2YXIgUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgPSBpbnNwZWN0U291cmNlKFByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgIT09IFN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO1xuICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAvLyBXZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UgJiYgVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAvLyBXZSBuZWVkIFByb21pc2UjZmluYWxseSBpbiB0aGUgcHVyZSB2ZXJzaW9uIGZvciBwcmV2ZW50aW5nIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgaWYgKElTX1BVUkUgJiYgIVByb21pc2VQcm90b3R5cGVbJ2ZpbmFsbHknXSkgcmV0dXJuIHRydWU7XG4gIC8vIFdlIGNhbid0IHVzZSBAQHNwZWNpZXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4gIC8vIGRlb3B0aW1pemF0aW9uIGFuZCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5XG4gIGlmIChWOF9WRVJTSU9OID49IDUxICYmIC9uYXRpdmUgY29kZS8udGVzdChQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSkpIHJldHVybiBmYWxzZTtcbiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICB9O1xuICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgaWYgKCFTVUJDTEFTU0lORykgcmV0dXJuIHRydWU7XG4gIC8vIFVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgcmV0dXJuICFHTE9CQUxfQ09SRV9KU19QUk9NSVNFICYmIElTX0JST1dTRVIgJiYgIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQ7XG59KTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiBpc0NhbGxhYmxlKHRoZW4gPSBpdC50aGVuKSA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAoc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9ucztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PSBGVUxGSUxMRUQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gY2hhaW5baW5kZXgrK107XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQoc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICBjYWxsKHRoZW4sIHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoSVNfVU5IQU5ETEVEKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKElTX05PREUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50O1xufTtcblxudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNhbGwodGFzaywgZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgaWYgKElTX05PREUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7XG4gIH0pO1xufTtcblxudmFyIGJpbmQgPSBmdW5jdGlvbiAoZm4sIHN0YXRlLCB1bndyYXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZuKHN0YXRlLCB2YWx1ZSwgdW53cmFwKTtcbiAgfTtcbn07XG5cbnZhciBpbnRlcm5hbFJlamVjdCA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7XG4gIG5vdGlmeShzdGF0ZSwgdHJ1ZSk7XG59O1xuXG52YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdGUuZmFjYWRlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgdmFyIHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKTtcbiAgICBpZiAodGhlbikge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IGRvbmU6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbCh0aGVuLCB2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRCkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICBhQ2FsbGFibGUoZXhlY3V0b3IpO1xuICAgIGNhbGwoSW50ZXJuYWwsIHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHN0YXRlLCBlcnJvcik7XG4gICAgfVxuICB9O1xuICBQcm9taXNlUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBbXSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoUHJvbWlzZVByb3RvdHlwZSwge1xuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbnMgPSBzdGF0ZS5yZWFjdGlvbnM7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IGlzQ2FsbGFibGUob25GdWxmaWxsZWQpID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IGlzQ2FsbGFibGUob25SZWplY3RlZCkgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgICByZWFjdGlvbnNbcmVhY3Rpb25zLmxlbmd0aF0gPSByZWFjdGlvbjtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcblxuICBpZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlKSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGUudGhlbjtcblxuICAgIGlmICghU1VCQ0xBU1NJTkcpIHtcbiAgICAgIC8vIG1ha2UgYFByb21pc2UjdGhlbmAgcmV0dXJuIGEgcG9seWZpbGxlZCBgUHJvbWlzZWAgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBjYWxsKG5hdGl2ZVRoZW4sIHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG5cbiAgICAgIC8vIG1ha2VzIHN1cmUgdGhhdCBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzIGBQcm9taXNlI2NhdGNoYCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbiAgICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICdjYXRjaCcsIFByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10sIHsgdW5zYWZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIG1ha2UgYC5jb25zdHJ1Y3RvciA9PT0gUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIHRyeSB7XG4gICAgICBkZWxldGUgTmF0aXZlUHJvbWlzZVByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcbiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbiAgICAvLyBtYWtlIGBpbnN0YW5jZW9mIFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIHNldFByb3RvdHlwZU9mKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsIFByb21pc2VQcm90b3R5cGUpO1xuICAgIH1cbiAgfVxufVxuXG4kKHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvclxufSk7XG5cbnNldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpO1xuc2V0U3BlY2llcyhQUk9NSVNFKTtcblxuUHJvbWlzZVdyYXBwZXIgPSBnZXRCdWlsdEluKFBST01JU0UpO1xuXG4vLyBzdGF0aWNzXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZWplY3RcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgY2FsbChjYXBhYmlsaXR5LnJlamVjdCwgdW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoSVNfUFVSRSAmJiB0aGlzID09PSBQcm9taXNlV3JhcHBlciA/IFByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgLy8gYFByb21pc2UuYWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoYXJBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlJykuY2hhckF0O1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIFNUUklOR19JVEVSQVRPUiA9ICdTdHJpbmcgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiB0b1N0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIihmdW5jdGlvbiAoKSB7XG4gIHZhciB2YWxpZGF0b3IgPSBuZXcgUmVnRXhwKFwiXlthLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfSRcIiwgXCJpXCIpO1xuXG4gIGZ1bmN0aW9uIGdlbihjb3VudCkge1xuICAgIHZhciBvdXQgPSBcIlwiO1xuICAgIGZvciAodmFyIGk9MDsgaTxjb3VudDsgaSsrKSB7XG4gICAgICBvdXQgKz0gKCgoMStNYXRoLnJhbmRvbSgpKSoweDEwMDAwKXwwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gR3VpZChndWlkKSB7XG4gICAgaWYgKCFndWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudDsgYHZhbHVlYCBoYXMgbm8gdmFsdWUuXCIpO1xuICAgICAgXG4gICAgdGhpcy52YWx1ZSA9IEd1aWQuRU1QVFk7XG4gICAgXG4gICAgaWYgKGd1aWQgJiYgZ3VpZCBpbnN0YW5jZW9mIEd1aWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBndWlkLnRvU3RyaW5nKCk7XG5cbiAgICB9IGVsc2UgaWYgKGd1aWQgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGd1aWQpID09PSBcIltvYmplY3QgU3RyaW5nXVwiICYmIEd1aWQuaXNHdWlkKGd1aWQpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcikge1xuICAgICAgLy8gQ29tcGFyaW5nIHN0cmluZyBgdmFsdWVgIGFnYWluc3QgcHJvdmlkZWQgYGd1aWRgIHdpbGwgYXV0by1jYWxsXG4gICAgICAvLyB0b1N0cmluZyBvbiBgZ3VpZGAgZm9yIGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBHdWlkLmlzR3VpZChvdGhlcikgJiYgdGhpcy52YWx1ZSA9PSBvdGhlcjtcbiAgICB9O1xuXG4gICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gR3VpZC5FTVBUWTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgR3VpZC5FTVBUWSA9IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG5cbiAgR3VpZC5pc0d1aWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodmFsdWUgaW5zdGFuY2VvZiBHdWlkIHx8IHZhbGlkYXRvci50ZXN0KHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgfTtcblxuICBHdWlkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgR3VpZChbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpKTtcbiAgfTtcblxuICBHdWlkLnJhdyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpO1xuICB9O1xuXG4gIGlmKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEd1aWQ7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJykge1xuICAgIHdpbmRvdy5HdWlkID0gR3VpZDtcbiAgfVxufSkoKTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIF9kYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzOiBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscygpOiBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXJDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQsIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nLCBwcml2YXRlIF9maWVsZElkPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkLCB3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0LmdldEZpbHRlcnNBc3luYygpLnRoZW48Q29udHJhY3QuRmlsdGVyPigoZmlsdGVycykgPT4ge1xuICAgICAgLy8gVE9ETzogRmlsdGVyaW5nIG9mIHRoZSBmaWx0ZXJzIHNob3VsZCBldmVudHVhbGx5IGJlIGRvbmUgcGxhdGZvcm0gc2lkZS5cbiAgICAgIGNvbnN0IGV2ZW50ZWRGaWx0ZXIgPSB0aGlzLmZpZWxkSWRcbiAgICAgICAgPyBmaWx0ZXJzLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkSWQgPT09IHRoaXMuZmllbGRJZCwgdGhpcylcbiAgICAgICAgOiBmaWx0ZXJzLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkTmFtZSA9PT0gdGhpcy5maWVsZE5hbWUsIHRoaXMpO1xuXG4gICAgICBpZiAoIWV2ZW50ZWRGaWx0ZXIpIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGhpdCB0aGlzIHVubGVzcyB0aGUgZmlsdGVyIHdhcyByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldFxuICAgICAgICAvLyBhZnRlciB0aGUgZXZlbnQgd2FzIHJhaXNlZC5cbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLk1pc3NpbmdGaWx0ZXIsIGBjYW5ub3QgZmluZCBmaWx0ZXI6ICR7dGhpcy5fZmllbGROYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZlbnRlZEZpbHRlcjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgTWFya3NTZWxlY3RlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuTWFya3NTZWxlY3RlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMud29ya3NoZWV0LmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFBhcmFtZXRlcnNTZXJ2aWNlLCBTZXJ2aWNlTmFtZXMsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi4vTW9kZWxzL1BhcmFtZXRlcic7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVGFibGVhdVNoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVTaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dsb2JhbEZpZWxkTmFtZTogc3RyaW5nLCBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQsIHNoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlcj4ge1xuICAgIC8vIENhbGwgZG93biB0byBvdXIgc2VydmljZSB0byBnZXQgdGhlIHBhcmFtZXRlciBiYWNrIHZpYSBpdHMgZmllbGQgbmFtZVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5R2xvYmFsRmllbGROYW1lQXN5bmModGhpcy5fZ2xvYmFsRmllbGROYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nUGFyYW1ldGVyLCBgQ2Fubm90IGZpbmQgcGFyYW1ldGVyOiAke3RoaXMuX2dsb2JhbEZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXIocGFyYW1ldGVySW1wbCwgdGhpcy5zaGVldCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLlN1bW1hcnlEYXRhQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdUV2ZW50IHtcbiAgcHJpdmF0ZSBfdHlwZTogVGFibGVhdUV2ZW50VHlwZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1U2hlZXRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVTaGVldEV2ZW50IHtcbiAgcHJpdmF0ZSBfc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0O1xuXG4gIHB1YmxpYyBnZXQgc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICAgIHJldHVybiB0aGlzLl9zaGVldDtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXMuX3NoZWV0ID0gc2hlZXQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVXb3Jrc2hlZXRFdmVudCB7XG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBwcm90ZWN0ZWQgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIodHlwZSwgX3dvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSA9ICdCZW50b24gU2FucyBMb3ctRFBJJztcblxuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIEJvb2snO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIEJvb2sgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWknO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBTZW1pRGVtaSBJdGFsaWMnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBMaWdodCc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBNZWRpdW0nO1xuXG5leHBvcnQgY29uc3QgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlczogTW9kZWxbXSA9IFtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xpZ2h0Rm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0ZWRTZXJ2ZXIgaW1wbGVtZW50cyBDb250cmFjdC5Db25uZWN0ZWRTZXJ2ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF91c2VySWQ/OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9zaXRlSWQ/OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9zaXRlTmFtZXNwYWNlPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfd29ya2Jvb2tJZD86IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgdXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l0ZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NpdGVJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l0ZU5hbWVzcGFjZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlTmFtZXNwYWNlO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9va0lkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgRGF0YVNvdXJjZSwgRGF0YVNvdXJjZUltcGwsIERhdGFTb3VyY2VTZXJ2aWNlLCBTZXJ2aWNlTmFtZXMsIFdvcmtib29rSW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbldvcmtib29rSW1wbCBleHRlbmRzIFdvcmtib29rSW1wbCB7XG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldEFsbERhdGFTb3VyY2VzQXN5bmMoKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3QgZGF0YVNvdXJjZXM6IEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+ID0gW107XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIE9iamVjdC52YWx1ZXMoZGF0YVNjaGVtYS5kYXRhU291cmNlcykuZm9yRWFjaCgoZHMpID0+IHtcbiAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkcykpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTb3VyY2VJbmZvOiBEYXRhU291cmNlSW5mbyk6IERhdGFTb3VyY2Uge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VJbXBsID0gbmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2VJbmZvLCBFeHRlbnNpb25zUmVnaXN0cnlJZCk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMsIFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb250ZXh0TWVudUV2ZW50LFxuICBEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLFxuICBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvLFxuICBGb250TmFtZUFuZEluZm8sXG4gIEZvcm1hdHRpbmdTaGVldCxcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25JZCxcbiAgUGFyYW1ldGVySWQsXG4gIFNoZWV0UGF0aCxcbiAgVmVyYklkLFxuICBXb3JrYm9va0Zvcm1hdHRpbmcsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEFwaVZlcnNpb24sXG4gIERhc2hib2FyZEltcGwsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2hlZXRJbmZvSW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIFZpelNlcnZpY2UsXG4gIFdvcmtzaGVldEltcGwsXG4gIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCxcbiAgcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuLi9Nb2RlbHMvRGFzaGJvYXJkJztcbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSAnLi4vTW9kZWxzL1dvcmtib29rJztcbmltcG9ydCB7IFdvcmtzaGVldCB9IGZyb20gJy4uL01vZGVscy9Xb3Jrc2hlZXQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ29udGVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvRW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuLi9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9VSSc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQsIHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvICYmIHRoaXMuaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yKSkge1xuICAgICAgICB0aGlzLmRhc2hib2FyZENvbnRlbnQgPSB0aGlzLmluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yLmRhc2hib2FyZFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uWm9uZUlkID0gcmVzdWx0LmV4dGVuc2lvbkRhc2hib2FyZEluZm8uZXh0ZW5zaW9uWm9uZUlkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pIHtcbiAgICAgICAgdGhpcy53b3Jrc2hlZXRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplV29ya3NoZWV0Q29udGVudChyZXN1bHQuZXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50KTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhyZXN1bHQuZXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTtcbiAgICAgIHRoaXMudWkgPSBuZXcgVUkobmV3IFVJSW1wbCgpKTtcbiAgICAgIHRoaXMud29ya2Jvb2sgPSBuZXcgV29ya2Jvb2sobmV3IEV4dGVuc2lvbldvcmtib29rSW1wbCgpKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgICAgICB0aGlzLmFwcGx5QWxsRm9ybWF0dGluZyhyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZCwgc2V0dXAgbGlzdGVuZXJzIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXRcbiAgICAgIC8vIGFyZSBtZWFudCB0byBiZSB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBjb250ZXh0IG1lbnUgaXRlbSBpcyBjbGlja2VkLlxuICAgICAgdGhpcy5pbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnMpO1xuXG4gICAgICAvLyBBbHNvIHNldCB1cCBsaXN0ZW5lcnMgZm9yIEV4dGVuc2lvblN0eWxlc0NoYW5nZWRFdmVudFxuICAgICAgdGhpcy5pbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcik7XG5cbiAgICAgIC8vIEluIHRoZSBub3JtYWwgaW5pdGlhbGl6YXRpb24gY2FzZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy4gIFdoZW4gcmV0dXJuaW5nIGZyb20gaW5pdGlhbGl6ZUFzeW5jIHRvIHRoZVxuICAgICAgLy8gZGV2ZWxvcGVyLCB3ZSBqdXN0IGluZ29yZSB0aGF0IHN0cmluZy4gIEluIHRoZSBjYXNlIG9mIGluaXRpYWxpemluZyBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2csIHRoaXMgc3RyaW5nXG4gICAgICAvLyBpcyBhbiBvcHRpb25hbCBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICAgIHJldHVybiByZXN1bHQuZXh0ZW5zaW9uRGlhbG9nUGF5bG9hZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUFsbEZvcm1hdHRpbmcoZm9ybWF0dGluZ01vZGVsOiBXb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5fc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudC5pZCA9ICdUYWJsZWF1LUV4dGVuc2lvbi1Gb3JtYXR0aW5nJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5fc3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCB8fCAhZm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCA9IHRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCBhcyBDU1NTdHlsZVNoZWV0O1xuICAgIHdoaWxlIChzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBmb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXR0aW5nU2hlZXRUb1N0eWxlU2hlZXQoY3VycmVudEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQ6IEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCk6IHZvaWQge1xuICAgIGxldCBzdHlsZUluZm8gPSAnJztcblxuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXM7XG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LWZhbWlseTogJyArIGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250U2l6ZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXNpemU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC13ZWlnaHQ6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtc3R5bGU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbikge1xuICAgICAgc3R5bGVJbmZvICs9ICd0ZXh0LWRlY29yYXRpb246ICcgKyBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmNvbG9yKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2NvbG9yOiAnICsgY3NzUHJvcGVydGllcy5jb2xvciArICc7ICc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3I6IHN0cmluZyA9ICcuJyArIGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5O1xuICAgIGNvbnN0IHJ1bGU6IHN0cmluZyA9IHNlbGVjdG9yICsgJyB7ICcgKyBzdHlsZUluZm8gKyAnIH0nO1xuICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcbiAgICAvLyBVbnJlZ2lzdGVyIGZ1bmN0aW9uIG5vdCB1c2VkIHNpbmNlIHRoZXNlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlXG4gICAgLy8gb2JzZXJ2ZWQgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBleHRlbnNpb24uXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnRGb3JtYXR0aW5nKSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcoZXZlbnRGb3JtYXR0aW5nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgd29ya2Jvb2tGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmb250TmFtZXM6IE1vZGVsW10gPSBbLi4uU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcywgLi4uU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlc107XG4gICAgd29ya2Jvb2tGb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZm9yRWFjaCgoZm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICBpZiAoZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgICBmb250TmFtZXMucHVzaChmb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmb250TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5Gb250TmFtZUxpc3RJdGVtc106IGZvbnROYW1lcyB9O1xuICAgICAgZGlzcGF0Y2hlclxuICAgICAgICAuZXhlY3V0ZShWZXJiSWQuR2V0Rm9udHMsIHBhcmFtZXRlcnMpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEZvbnRzKHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxGb250TmFtZUFuZEluZm8+KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRm9udHMoZm9udHM6IEFycmF5PEZvbnROYW1lQW5kSW5mbz4pOiB2b2lkIHtcbiAgICBmb250cy5mb3JFYWNoKChmb250TmFtZUFuZEluZm8pID0+IHtcbiAgICAgIGlmIChTdXBwb3J0ZWRUYWJsZWF1Rm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVhdUZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMuaW5jbHVkZXMoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSkge1xuICAgICAgICB0aGlzLmxvYWRCZW50b25TYW5zRm9udHMoZm9udE5hbWVBbmRJbmZvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURhc2hib2FyZENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbywgc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBEYXNoYm9hcmRDb250ZW50IHtcbiAgICAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICBjb25zdCBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoaW5mby5uYW1lLCBTaGVldFR5cGUuRGFzaGJvYXJkLCB7IHdpZHRoOiBpbmZvLnNpemUudywgaGVpZ2h0OiBpbmZvLnNpemUuaCB9LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIGNvbnN0IGRhc2hib2FyZEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChzaGVldEluZm9JbXBsLCBpbmZvLnpvbmVzLCBzaGVldFBhdGgsIEV4dGVuc2lvbnNSZWdpc3RyeUlkLCBudWxsLCBpbmZvLmFjdGl2ZURhc2hib2FyZE9iamVjdElkKTtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKGRhc2hib2FyZEltcGwpO1xuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkQ29udGVudChkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya3NoZWV0Q29udGVudChpbmZvOiBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvKTogV29ya3NoZWV0Q29udGVudCB7XG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgaW5mby52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gaW5kZXggcHJvcGVydHkgaXMgZW1iZWRkaW5nIHNwZWNpZmljXG4gICAgICB0cnVlLCAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKFxuICAgICAgc2hlZXRJbmZvSW1wbCxcbiAgICAgIEV4dGVuc2lvbnNSZWdpc3RyeUlkLFxuICAgICAgaW5mby52aXN1YWxJZCxcbiAgICAgIG51bGwsIC8vIHBhcmVudERhc2hib2FyZCBpcyBhbHdheXMgbnVsbCBmb3Igd29ya3NoZWV0IGluIFdvcmtzaGVldENvbnRlbnRcbiAgICAgIG51bGwsIC8vIHBhcmVudFN0b3J5UG9pbnQgaXMgb25seSB1c2VkIGZvciBlbWJlZGRpbmdcbiAgICApO1xuICAgIGNvbnN0IHdvcmtzaGVldCA9IG5ldyBXb3Jrc2hlZXQod29ya3NoZWV0SW1wbCk7XG4gICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXRDb250ZW50KHdvcmtzaGVldCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IFNldHRpbmdzIHtcbiAgICBjb25zdCBzZXR0aW5nc0ltcGwgPSBuZXcgU2V0dGluZ3NJbXBsKHNldHRpbmdzSW5mbyk7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5ncyhzZXR0aW5nc0ltcGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuQ29udGV4dE1lbnVDbGljayxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGNvbnRleHQgbWVudSBldmVudCwgdGhlc2UgYXJlIGFscmVhZHkgZmlsdGVyZWQgb24gYXBpLWNvcmVcbiAgICAgICAgLy8gYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBsb2NhdG9yLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IENvbnRleHRNZW51RXZlbnQpID0+IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBtZW51IElEXG4gICAgICAgIGlmIChjb250ZXh0TWVudUZ1bmN0aW9ucykge1xuICAgICAgICAgIGlmICghY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlY2VpdmVkIHVuZXhwZWN0ZWQgY29udGV4dCBtZW51IElkIGZyb20gZXZlbnQ6ICR7ZXZlbnQuaWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbzogRm9udE5hbWVBbmRJbmZvKTogdm9pZCB7XG4gICAgc3dpdGNoIChmb250TmFtZUFuZEluZm8uZm9udE5hbWUpIHtcbiAgICAgIGNhc2UgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHN0eWxlOiAnaXRhbGljJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAnYXR0ZW1wdGVkIHRvIGxvYWQgdW5zdXBwb3J0ZWQgZm9udDogJHtmb250TmFtZUFuZEluZm8uZm9udE5hbWV9LidgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucywgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSwgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIgaGFzIGJlZW4gbW92ZWQgKGFuZCByZW5hbWVkKSBmcm9tIGFwaS1pbnRlcm5hbC1jb250cmFjdC5cbiAqIEl0IHN1cHBvcnRzIHJ1bm5pbmcgYSBuZXdlciBleHRlcm5hbCBsaWJyYXJ5IGFnYWluc3QgYSBwcmUgMjAxOS4zIGRlc2t0b3AuXG4gKiBTdGFydGluZyBpbiAyMDE5LjMsIHdlIGhhdmUgYSBtZXJnZWQgYm9vdHN0cmFwIHN0eWxlIGZvciBib3RoIGRlc2t0b3AgYW5kIHNlcnZlci5cbiAqIEluIGFkZGl0aW9uLCB0aGUgYWxwaGEgY2hlY2tpbmcgdGhhdCBpcyBoYXBwZW5pbmcgaGVyZSBpcyBub3QgbmVjZXNzYXJ5IGluIGV4dGVybmFsLWFwaS1qc1xuICogIGFmdGVyIDIwMTkuMyBiZWNhdXNlIHRoYXQgY2hlY2tpbmcgaGFwcGVucyBpbiBhcGktcGxhdGZvcm0tanMgKEFwaURpc3BhdGNoZXJUZXN0LnRzKVxuICogVEZTSUQ6IDEwOTE1NjEgdHJhY2tzIGFuIGltcHJvdmVtZW50IHRvIHRoaXMgc3lzdGVtIHRvIG1ha2UgaXQgbGVzcyBjb21wbGV4IGFuZCB0aWUgaXQgZGlyZWN0bHkgdG9cbiAqICB0YWJsZWF1IGJldGEgcmVsZWFzZSB2ZXJzaW9ucy5cbiAqIEBkZXByZWNhdGVkXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgbmFtZXNwYWNlIExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucy5pc0FscGhhID09PSAndW5kZWZpbmVkJykgJiYgIXdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ1RoaXMgaXMgYSBiZXRhIHZlcnNpb24gb2YgdGhlIEV4dGVuc2lvbnMgQVBJLiBQbGVhc2UgdXBncmFkZSB0byBhbiBvZmZpY2lhbCByZWxlYXNlLicpO1xuICAgICAgd2luZG93Ll9fd2FybmluZ0lzc3VlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zPy5pc0FscGhhICYmIHdpbmRvdy5fX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2UpIHtcbiAgICAgIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlclxuICAgICAgICAudGhlbigoZGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlckZhY3RvcnkoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG4gICAgICAgICAgZGlzcGF0Y2hlci5leGVjdXRlKFZlcmJJZC5CbG9ja0V4dGVuc2lvbiwge30pLmNhdGNoKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgd2lsbCBiZSB1bmRlZmluZWQgaWYgcHJvbWlzZSBpcyByZWplY3RlZCBvciB0aHJvd3NcbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PjtcbiAgICBfX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2U6IGJvb2xlYW47XG4gICAgX193YXJuaW5nSXNzdWVkOiBib29sZWFuO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBOb3RpZmljYXRpb25JZCwgU2V0dGluZ3NFdmVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEVycm9ySGVscGVycyxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuLi9FdmVudHMvVGFibGVhdUV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbmNsYXNzIFNldHRpbmdzQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuU2V0dGluZ3NDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmV3U2V0dGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5ld1NldHRpbmdzKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX25ld1NldHRpbmdzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0ltcGwge1xuICBwcml2YXRlIHN0YXRpYyBBU1lOQ19TQVZFX0lOX1BST0dSRVNTID0gJ0FzeW5jIFNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHVwZGF0aW5nIHNldHRpbmdzIGlzIG5vdCBhbGxvd2VkLic7XG4gIHByaXZhdGUgX2lzTW9kaWZpZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2N1cnJlbnRTZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uO1xuXG4gIC8vIFNpbmNlIHByb21pc2VzIGNhbid0IGJlIGludHJvc3BlY3RlZCBmb3Igc3RhdGUsIGtlZXAgYSB2YXJpYWJsZSB0aGF0XG4gIC8vIGluZGljYXRlcyBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHNvIHRoYXQgc2V0L2VyYXNlIGNhbid0IGJlIGNhbGxlZCBkdXJpbmcgYSBzYXZlLlxuICBwcml2YXRlIF9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbyk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgLy8gT25seSBtYWtlIGEgbW9kaWZpY2F0aW9uIGlmIHdlIGhhdmUgdGhlIGtleSBhbHJlYWR5XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldKSB7XG4gICAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICAgICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICAvLyBSZXR1cm5zIGEgbXV0YWJsZSBjb3B5IG9mIHRoZSBzZXR0aW5nc1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgLy8gSnVzdCByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIHNldHRpbmdzIGFyZSB1bmNoYW5nZWRcbiAgICBpZiAoIXRoaXMuX2lzTW9kaWZpZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmU8U2V0dGluZ3NDb2xsZWN0aW9uPih0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgc2V0dGluZ3Mgc2VydmljZSB0byBzYXZlIHNldHRpbmdzIHRvIHR3YlxuICAgIGNvbnN0IHNldHRpbmdzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2V0dGluZ3NTZXJ2aWNlPihcbiAgICAgIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlLFxuICAgICk7XG5cbiAgICByZXR1cm4gc2V0dGluZ3NTZXJ2aWNlLnNhdmVTZXR0aW5nc0FzeW5jKHRoaXMuX2N1cnJlbnRTZXR0aW5ncykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KFxuICAgICAgKG5ld1NldHRpbmdzKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gbmV3U2V0dGluZ3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jdXJyZW50U2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3U2V0dGluZ3M7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGtleSwgJ2tleScpOyAvLyBLZXkgc2hvdWxkbid0IGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlLCAndmFsdWUnKTsgLy8gRW1wdHkgc3RyaW5nIHZhbHVlIGlzIGFsbG93ZWQuXG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gc2V0dGluZ3Mgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IGEgc2V0dGluZ3NVcGRhdGUgZXZlbnQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U2V0dGluZ3NDaGFuZ2VkRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuU2V0dGluZ3NDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlNldHRpbmdzQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnQ6IFNldHRpbmdzRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gZXZlbnQubmV3U2V0dGluZ3M7XG4gICAgICAgIHNldHRpbmdzQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoZXZlbnQubmV3U2V0dGluZ3MpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChzZXR0aW5nc0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8sICdzZXR0aW5nc0luZm8nKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcywgJ3NldHRpbmdzSW5mby5TZXR0aW5nc1ZhbHVlcycpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gc2V0dGluZ3NJbmZvLnNldHRpbmdzVmFsdWVzO1xuXG4gICAgLy8gUmVzZXQgdGhlIGlzTW9kaWZpZWQgZmxhZ1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGhlbHBlciBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgbG9jYWwgdXBkYXRlIHRvIHRoaXMuY3VycmVudFNldHRpbmdzLlxuICAgKiBDaGVja3MgaWYgYSBjdXJyZW50IHNhdmUgY2FsbCBpcyBzdGlsbCBpbiBwcm9ncmVzcyBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIHNvLlxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zYXZlSW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLlNldHRpbmdTYXZlSW5Qcm9ncmVzcywgU2V0dGluZ3NJbXBsLkFTWU5DX1NBVkVfSU5fUFJPR1JFU1MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgVGFibGVhdUJvb2tGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBSZWd1bGFyJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgU2VtaWJvbGQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9vayc7XG5leHBvcnQgY29uc3QgVGFibGVhdUJvbGRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBCb2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBMaWdodCc7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IE1lZGl1bSc7XG5leHBvcnQgY29uc3QgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWUgPSAnVGFibGVhdSBSZWd1bGFyJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBTZW1pIEJvbGQnO1xuXG5leHBvcnQgY29uc3QgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlczogTW9kZWxbXSA9IFtcbiAgVGFibGVhdUJvb2tGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG5dO1xuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgTm90aWZpY2F0aW9uU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgVUlJbXBsIHtcbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdWlTZXJ2aWNlXG4gICAgICAgIC5kaXNwbGF5RGlhbG9nQXN5bmModXJsLCBwYXlsb2FkIHx8ICcnLCBvcHRpb25zKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5yZWdpc3RlckZuID0gbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICAgICAgICBOb3RpZmljYXRpb25JZC5FeHRlbnNpb25EaWFsb2dVcGRhdGUsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBkaWFsb2cgdXBkYXRlIGV2ZW50XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChldmVudDogRGlhbG9nVXBkYXRlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmlzQ2xvc2VFdmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5jbG9zZVBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdjbG9zZVBheWxvYWQgaXMgdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnQuY2xvc2VQYXlsb2FkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkRpYWxvZ0Nsb3NlZEJ5VXNlciwgJ0V4dGVuc2lvbiBkaWFsb2cgY2xvc2VkIGJ5IHVzZXIuJykpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdW5yZWdpc3RlckZuKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsIFRhYmxlYXVFdmVudFR5cGUsIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBEYXNoYm9hcmRPYmplY3RJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0JztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsKSB7XG4gICAgc3VwZXIoX2Rhc2hib2FyZEltcGwpO1xuICAgIF9kYXNoYm9hcmRJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC53b3Jrc2hlZXRzSW1wbC5tYXAoKHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm9iamVjdHMubWFwKChkYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhc2hib2FyZE9iamVjdChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFjdGl2ZURhc2hib2FyZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9uZVZpc2liaWxpdHlBc3luYyh6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5zZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgcmV0dXJuIHpvbmUgJiYgbmV3IERhc2hib2FyZE9iamVjdCh6b25lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuXG4gICAgLy8gSW5pdGlhbGl6aW5nIGV2ZW50cyBhbmQgcmVnaXN0ZXJpbmcgbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVybiAoYWxsb3dzIHVuaXQgdGVzdGluZyB3aXRob3V0IE5vdGlmaWNhdGlvblNlcnZpY2UgbW9jaylcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPERhc2hib2FyZExheW91dENoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkRhc2hib2FyZExheW91dENoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEYXNoYm9hcmRMYXlvdXRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gdGhpcy5fZGFzaGJvYXJkSW1wbC51cGRhdGVab25lcyhcbiAgICAgICAgICBldmVudC56b25lcyxcbiAgICAgICAgICBldmVudC5hY3RpdmVab25lSWQsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlRGFzaGJvYXJkTmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KGRhc2hib2FyZE9iamVjdENoYW5nZXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQoZXZlbnRGb3JtYXR0aW5nKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2god29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5tb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwucmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmRhc2hib2FyZEltcGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKSB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuZmllbGRJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBFdmVudExpc3RlbmVyTWFuYWdlcixcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgUGFyYW1ldGVySW1wbCxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgICAgIH0sXG4gICAgICAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU2l6ZSh0aGlzLl9zaGVldEltcGwuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTaXplKHNpemU6IGFueSk6IHNpemUgaXMgQ29udHJhY3QuU2l6ZSB7XG4gICAgY29uc3QgdGVzdFNpemUgPSBzaXplIGFzIENvbnRyYWN0LlNpemU7XG4gICAgaWYgKHRlc3RTaXplLndpZHRoICE9PSB1bmRlZmluZWQgJiYgdGVzdFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcCgocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge31cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSW1wbC5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb2x1bW4sIEZpbHRlclVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsIFRhYmxlYXVFdmVudFR5cGUsIFRvb2x0aXBDb250ZXh0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpbHRlckV2ZW50LCBOb3RpZmljYXRpb25JZCwgU3VtbWFyeURhdGFFdmVudCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBXb3Jrc2hlZXRJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEZpbHRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgTWFya3NTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudCc7XG5pbXBvcnQgeyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgU2hlZXQgfSBmcm9tICcuL1NoZWV0JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldCBleHRlbmRzIFNoZWV0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkge1xuICAgIHN1cGVyKF93b3Jrc2hlZXRJbXBsKTtcblxuICAgIC8vIENhbGwgdG8gaW5pdGlhbGl6ZSBldmVudHMgYW5kIHRoZW4gY2FsbCBkb3duIHRvIHRoZSBldmVudCBsaXN0ZW5lciBtYW5hZ2VyIHRvIGhhbmRsZSB0aGluZ3NcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudERhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBmb3IgRXh0ZW5zaW9ucyBpZiB0aGUgRGFzaGJvYXJkSW1wbHMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgUGFyZW50IGRhc2hib2FyZCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsSWQgPSBtb2RlbCBhcyBWaXN1YWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQpO1xuICAgICAgfSxcbiAgICAgICgpID0+IG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPEZpbHRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkZpbHRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIEZpbHRlckV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgICAgZmlsdGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBGaWx0ZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZmllbGROYW1lLCBldmVudC5maWVsZElkKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlN1bW1hcnlEYXRhQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBTdW1tYXJ5RGF0YUV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBTdW1tYXJ5RGF0YUV2ZW50KSA9PiB7XG4gICAgICAgIHN1bW1hcnlEYXRhRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCh0aGlzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2gobWFya3NFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKGZpbHRlckV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goc3VtbWFyeURhdGFFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb2x1bW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SURBc3luYyhtYXJrc0luZm86IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgdXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdE1hcmtzQnlJZEFzeW5jKG1hcmtzSW5mbywgdXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmMobWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hbm5vdGF0ZU1hcmtBc3luYyhtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0QW5ub3RhdGlvbnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwucmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb24pO1xuICB9XG5cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGU/OiBudW1iZXIsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCB8IG51bGwsIGFsbG93SG92ZXJBY3Rpb25zID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGUsIHRvb2x0aXAsIGFsbG93SG92ZXJBY3Rpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPiwgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwcml2YXRlIHZpc3VhbElkc0FyZUVxdWFsKGE6IFZpc3VhbElkLCBiOiBWaXN1YWxJZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhICYmXG4gICAgICBiICYmXG4gICAgICBhLndvcmtzaGVldCA9PT0gYi53b3Jrc2hlZXQgJiZcbiAgICAgIGEuZGFzaGJvYXJkID09PSBiLmRhc2hib2FyZCAmJlxuICAgICAgYS5zdG9yeWJvYXJkID09PSBiLnN0b3J5Ym9hcmQgJiZcbiAgICAgIGEuc3RvcnlQb2ludElEID09PSBiLnN0b3J5UG9pbnRJRFxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIERhc2hib2FyZENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBEYXNoYm9hcmRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZDogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbkVudmlyb25tZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVZlcnNpb24sIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENvbm5lY3RlZFNlcnZlciB9IGZyb20gJy4uL0ltcGwvQ29ubmVjdGVkU2VydmVyJztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwgfSBmcm9tICcuL1dvcmtib29rRm9ybWF0dGluZ0VudlV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudCBuYW1lc3BhY2UuXG4gKiBFbnZpcm9ubWVudCBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpc1xuICoganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqIEZpcnN0IGNsYXNzIGV4dGVuc2lvbnMgY2FuIGdldCB0byBDb25uZWN0ZWRTZXJ2ZXIgd2l0aDogZW52aXJvbm1lbnRbJ2Nvbm5lY3RlZFNlcnZlciddXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgLyoqVGhlIGZvbGxvd2luZyBpcyBhbiBpbmRleCBzaWduYXR1cmUuIEl0IGFsbG93cyBwcm9wZXJ0aWVzIHRvIGJlIGFjY2Vzc2VkIGJ5IG5hbWUuXG4gICAqIFRoaXMgYWxsb3dzIHVzIHRvIGFkZCBwcm9wZXJ0aWVzIGR5bmFtaWNhbGx5IChzZWUgdXNhZ2Ugb2YgdGhpcy5jb25uZWN0ZWRTZXJ2ZXIgYmVsb3cpIHdpdGhvdXQgVHlwZXNjcmlwdCBlcnJvcnMuXG4gICAqIFRoZSByZWFzb24gd2UgZG8gdGhpcyBpcyBzbyB0aGF0IDNyZC1wYXJ0eSBleHRlbnNpb24gZGV2ZWxvcGVycyBkbyBub3Qgc2VlIHRoZSBjb25uZWN0ZWRTZXJ2ZXIgcHJvcGVydHlcbiAgICogdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSB0byBmaXJzdCBjbGFzcyBleHRlbnNpb24gZGV2ZWxvcGVycy5cbiAgICogVGhlIHR5cGUgb2YgdGhlIGluZGV4IHNpZ2F0dXJlIG5lZWRzIHRvIGJlIGEgdW5pb24gb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9iamVjdCwgc2luY2Ugd2UgY291bGRcbiAgICogYWNjZXNzIGFueSBwcm9wZXJ0eSB1c2luZyB0aGUgcHJvcGVydHkgaW5kZXggbWV0aG9kLlxuICAgKi9cbiAgW3g6IHN0cmluZ106IENvbm5lY3RlZFNlcnZlciB8IHN0cmluZyB8IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hcGlWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRleHQ6IENvbnRyYWN0LkV4dGVuc2lvbkNvbnRleHQ7XG4gIHByaXZhdGUgX2Zvcm1hdHRpbmc/OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvdW50cnk/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nO1xuICBwcml2YXRlIF9tb2RlOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlO1xuICBwcml2YXRlIF9vcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbiAgcHJpdmF0ZSBfdGFibGVhdVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfdW5pcXVlVXNlcklkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQpIHtcbiAgICB0aGlzLl9hcGlWZXJzaW9uID0gQXBpVmVyc2lvbi5JbnN0YW5jZSAmJiBBcGlWZXJzaW9uLkluc3RhbmNlLmZvcm1hdHRlZFZhbHVlOyAvLyBtYWoubWluLmZpeCAobm8gYnVpbGQpXG4gICAgdGhpcy5fY29udGV4dCA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Db250ZXh0LmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCk7XG4gICAgdGhpcy5fZm9ybWF0dGluZyA9IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgdGhpcy5fbGFuZ3VhZ2UgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25MYW5ndWFnZTtcbiAgICB0aGlzLl9jb3VudHJ5ID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ291bnRyeTtcbiAgICB0aGlzLl9sb2NhbGUgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Mb2NhbGU7XG4gICAgdGhpcy5fbW9kZSA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Nb2RlLmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTW9kZSk7XG4gICAgdGhpcy5fb3BlcmF0aW5nU3lzdGVtID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQub3BlcmF0aW5nU3lzdGVtO1xuICAgIHRoaXMuX3RhYmxlYXVWZXJzaW9uID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudGFibGVhdVZlcnNpb247XG4gICAgdGhpcy5fdW5pcXVlVXNlcklkID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudW5pcXVlVXNlcklkO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHVzZXJJZCwgdGhlbiB3ZSBhcmUgYSBmaXJzdCBjbGFzcyBleHRlbnNpb25cbiAgICBpZiAoZXh0ZW5zaW9uRW52aXJvbm1lbnQudXNlcklkKSB7XG4gICAgICB0aGlzLmNvbm5lY3RlZFNlcnZlciA9IG5ldyBDb25uZWN0ZWRTZXJ2ZXIoXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnVzZXJJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQuc2l0ZUlkLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC5zaXRlTmFtZXNwYWNlLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0lkLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5mZWF0dXJlRmxhZ3MgPSBleHRlbnNpb25FbnZpcm9ubWVudC5mZWF0dXJlRmxhZ3M7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhcGlWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rRm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY291bnRyeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb3VudHJ5O1xuICB9XG5cbiAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2RlKCk6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBvcGVyYXRpbmdTeXN0ZW0oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW5nU3lzdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJsZWF1VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZWF1VmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5pcXVlVXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VuaXF1ZVVzZXJJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENhbGxiYWNrTWFwLCBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4uL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBFeHRlbnNpb25zIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnMgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25zIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uSW1wbDogRXh0ZW5zaW9uc0ltcGwpIHtcbiAgICB0aGlzLmV4dGVuc2lvbkltcGwgPSBleHRlbnNpb25JbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRDb250ZW50KCk6IENvbnRyYWN0LkRhc2hib2FyZENvbnRlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZGFzaGJvYXJkQ29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0Q29udGVudCgpOiBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLndvcmtzaGVldENvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVudmlyb25tZW50KCk6IENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmVudmlyb25tZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBDb250cmFjdC5TZXR0aW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5zZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdWkoKTogQ29udHJhY3QuVUkge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwudWk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rKCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtib29rIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLndvcmtib29rO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZXh0ZW5zaW9uWm9uZUlkO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVBc3luYyhjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5pbml0aWFsaXplQXN5bmMoZmFsc2UsIGNvbnRleHRNZW51Q2FsbGJhY2tzKS50aGVuPHZvaWQ+KCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURpYWxvZ0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5pbml0aWFsaXplQXN5bmModHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNldHRpbmdzIGFzIFNldHRpbmdzQ29udHJhY3QgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4uL0ltcGwvU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIHNldHRpbmdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBTZXR0aW5nc0NvbnRyYWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldHRpbmdzSW1wbDogU2V0dGluZ3NJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuZXJhc2Uoa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0KGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5nZXRBbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmlzTW9kaWZpZWQ7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8U2V0dGluZ3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5zYXZlQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuc2V0KGtleSwgdmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBpbXBsZW1lbnRzIENvbnRyYWN0LlVJIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ltcGw6IFVJSW1wbCkge31cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGwuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2ltcGwuY2xvc2VEaWFsb2cocGF5bG9hZCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvbGliL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB7XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKHdvcmtib29rRm9ybWF0dGluZ01vZGVsPzogV29ya2Jvb2tGb3JtYXR0aW5nKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXdvcmtib29rRm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmb3JtYXR0aW5nTWFwOiBBcnJheTxDb250cmFjdC5Gb3JtYXR0aW5nU2hlZXQ+ID0gd29ya2Jvb2tGb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGluZ1NoZWV0OiBDb250cmFjdC5Gb3JtYXR0aW5nU2hlZXQgPSB7XG4gICAgICAgICAgY2xhc3NOYW1lS2V5OiBFbnVtTWFwcGluZ3MuY2xhc3NOYW1lS2V5LmNvbnZlcnQoY3VycmVudEZvcm1hdHRpbmdTaGVldC5jbGFzc05hbWVLZXkpLFxuICAgICAgICAgIGNzc1Byb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgICAgICAgICAgZm9udFNpemU6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LFxuICAgICAgICAgICAgZm9udFN0eWxlOiBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb246IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbixcbiAgICAgICAgICAgIGNvbG9yOiBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuY29sb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRpbmdTaGVldDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgPSB7XG4gICAgICAgIGZvcm1hdHRpbmdTaGVldHM6IGZvcm1hdHRpbmdNYXAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFdvcmtzaGVldENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBXb3Jrc2hlZXRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFeHRlbnNpb25Cb290c3RyYXBJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHNdOiBjb250ZXh0TWVudUlkcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Jc0V4dGVuc2lvbkRpYWxvZ106IGlzRXh0ZW5zaW9uRGlhbG9nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Jbml0aWFsaXplRXh0ZW5zaW9uLCBwYXJhbXMpLnRoZW48RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBUT0RPIC0gVmFsaWRhdGUgcmV0dXJuIHZhbHVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NldHRpbmdzU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2V0dGluZ3NTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3NBc3luYyhzZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZVNldHRpbmdzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNldHRpbmdzVmFsdWVzXTogc2V0dGluZ3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNhdmVFeHRlbnNpb25TZXR0aW5ncywgcGFyYW1ldGVycykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0IGFzIEV4dGVuc2lvblNldHRpbmdzSW5mbztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zZXR0aW5nc1ZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3Igc2F2aW5ncyBzZXR0aW5ncy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdC5zZXR0aW5nc1ZhbHVlcztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlhbG9nT3B0aW9ucywgRGlhbG9nU3R5bGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCwgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMsIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncywgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVCA9IDQwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19XSURUSCA9IDYwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19TVFlMRTogRGlhbG9nU3R5bGUgPSBEaWFsb2dTdHlsZS5XaW5kb3c7XG5cbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVUlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZywgb3B0aW9ucz86IERpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZGlzcGxheURpYWxvZ0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxdOiB1cmwsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF06IHBheWxvYWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGg6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5oZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSBvcHRpb25zICYmIG9wdGlvbnMud2lkdGggPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG4gICAgY29uc3QgZGlhbG9nU3R5bGU6IERpYWxvZ1N0eWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRpYWxvZ1N0eWxlID8gb3B0aW9ucy5kaWFsb2dTdHlsZSA6IERFRkFVTFRfRElBTE9HX1NUWUxFO1xuXG4gICAgLy8gT24gdGhlIHBsYXRmb3JtIHNpZGUsIHdlIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIHJlZ2FyZGVzcyBvZiB3aGV0aGVyIHRoZSBwYXNzZWRcbiAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiAgQnV0IHRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGRldmVsb3BlciBlcnJvcixcbiAgICAvLyBzbyB3ZSB0aHJvdyBhbiBlcnJvciBoZXJlIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gICAgaWYgKGggPD0gMCB8fCB3IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2l6ZSBwYXJhbWV0ZXJzIGZvciBkaXNwbGF5RGlhbG9nQXN5bmMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nSF0gPSBoO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nV10gPSB3O1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGlhbG9nU3R5bGU+KGRpYWxvZ1N0eWxlLCBEaWFsb2dTdHlsZSwgJ0RpYWxvZ1N0eWxlJyk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dTdHlsZV0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MuZGlhbG9nU3R5bGVzLmNvbnZlcnQoZGlhbG9nU3R5bGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRGlzcGxheURpYWxvZywgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZXMuSW52YWxpZERvbWFpbkRpYWxvZyxcbiAgICAgICAgICAgICdUaGUgdXJsIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgbXVzdCBtYXRjaCB0aGUgZG9tYWluIG9mIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBTdWNjZXNzIGNhc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbG9zZURpYWxvZycsXG4gICAgfTtcblxuICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbiwgZXh0ZW5zaW9uWm9uZUlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShjbGlja1Rocm91Z2hFbmFibGVkLCAnYm9vbGVhbicsICdjbGlja1Rocm91Z2hFbmFibGVkJyk7XG5cbiAgICBpZiAoZXh0ZW5zaW9uWm9uZUlkID09PSB1bmRlZmluZWQgfHwgZXh0ZW5zaW9uWm9uZUlkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnRXh0ZW5zaW9uIElkIGlzIGludmFsaWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uWm9uZUlkXTogZXh0ZW5zaW9uWm9uZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLkNsaWNrVGhyb3VnaEVuYWJsZWRdOiBjbGlja1Rocm91Z2hFbmFibGVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRDbGlja1Rocm91Z2gsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFVJU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvVUlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZXR0aW5nc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVUlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG59XG4iLCJleHBvcnQgY29uc3QgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgPSAwO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvQXNrRGF0YUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRGV2aWNlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgVGFibGVhdUV2ZW50VHlwZSBhcyBFbWJlZGRpbmdUYWJsZWF1RXZlbnRUeXBlLFxuICBGaWxlRm9ybWF0cyxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBQdWxzZUxheW91dCxcbiAgU2hlZXRTaXplQmVoYXZpb3IsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXdFdmVudCxcbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgYXMgRW1iZWRkaW5nQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQsXG4gIEZpbHRlckNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdGaWx0ZXJDaGFuZ2VkRXZlbnQsXG4gIE1hcmtzU2VsZWN0ZWRFdmVudCBhcyBFbWJlZGRpbmdNYXJrU2VsZWN0ZWRFdmVudCxcbiAgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ1BhcmFtZXRlckNoYW5nZWRFdmVudCxcbiAgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQsXG4gIFRhYmxlYXVTaGVldEV2ZW50IGFzIEVtYmVkZGluZ1RhYmxlYXVTaGVldEV2ZW50LFxuICBUYWJsZWF1V29ya3NoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVdvcmtzaGVldEV2ZW50LFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nVG9vbGJhclN0YXRlQ2hhbmdlZEV2ZW50LFxuICBGaXJzdFZpelNpemVLbm93bkV2ZW50LFxuICBTdG9yeVBvaW50U3dpdGNoZWRFdmVudCxcbiAgVGFiU3dpdGNoZWRFdmVudCxcbiAgVXJsQWN0aW9uRXZlbnQsXG4gIFZpekxvYWRFcnJvckV2ZW50LFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzRXZlbnQsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFBhcmFtZXRlciBhcyBFbWJlZGRpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5LFxuICBBdXRob3JpbmdXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya3NoZWV0LFxuICBEYXNoYm9hcmQgYXMgRW1iZWRkaW5nRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRW1iZWRkaW5nRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFbWJlZGRpbmdTaGVldCxcbiAgRW1iZWRkaW5nVml6U3RhdGVXaXRoRGF0YU1vZGVsLFxuICBXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nV29ya3NoZWV0LFxuICBIaWVyYXJjaGljYWxMZXZlbHMsXG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeSwgU3RvcnlQb2ludCwgU3RvcnlQb2ludEluZm8gfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXcsXG4gIEF1dGhvcmluZ1dvcmtib29rIGFzIEVtYmVkZGluZ0F1dGhvcmluZ1dvcmtib29rLFxuICBXb3JrYm9vayBhcyBFbWJlZGRpbmdXb3JrYm9vayxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Xb3JrYm9va0ludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL0V2ZW50SW50ZXJmYWNlJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmV4cG9ydCB7XG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCB7IFdvcmtzaGVldENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwLFxuICBEYXNoYm9hcmQgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IFdvcmtib29rIGFzIEV4dGVuc2lvbldvcmtib29rIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvV29ya2Jvb2tJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsImltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXNrLWRhdGE+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZW51bSBBc2tEYXRhQXR0cmlidXRlcyB7XG4gIE9yaWdpbiA9ICdvcmlnaW4nLFxuICBTaG93RW1iZWQgPSAnc2hvdy1lbWJlZCcsXG4gIFNob3dQaW4gPSAnc2hvdy1waW4nLFxuICBTaG93U2F2ZSA9ICdzaG93LXNhdmUnLFxuICBTaG93U2hhcmUgPSAnc2hvdy1zaGFyZScsXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc2tEYXRhU2V0dGluZ3MgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCwgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1iZWQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctZW1iZWQ+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBpbiBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1waW4+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1Bpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzYXZlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXNhdmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2hhcmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2hhcmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NoYXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogIFVzZWQgZm9yIHRlbGVtZXRyeVxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIG9yaWdpbj1cImVtYmVkZGluZ1NpdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICBvcmlnaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBc2tEYXRhIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGEgZXh0ZW5kcyBBc2tEYXRhU2V0dGluZ3Mge31cbiIsIi8vIEFsbCBlbnVtIHZhbHVlcyBtYWRlIGF2YWlsYWJsZSB0byBFbWJlZGRpbmcgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cbi8vIE1vc3Qgb2YgdGhlbSBzaG91bGQgbWF0Y2ggYW4gZW51bSBvbiB0aGUgc2VydmVyIGRlZmluZWQgYXRcbi8vIHdvcmtncm91cC92cWx3ZWIvc2NyaXB0c2hhcnAvc3JjL0FwaVNoYXJlZC9QdWJsaWNFbnVtcy5jcyNMMzk4OjE3XG5cbi8qKlxuICogQ3Jvc3N0YWIgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgVml6LmV4cG9ydENyb3NzdGFiQXN5bmN9XG4gKi9cbmV4cG9ydCBlbnVtIENyb3NzdGFiRmlsZUZvcm1hdCB7XG4gIENTViA9ICdjc3YnLFxuICBFeGNlbCA9ICd4bHN4Jyxcbn1cblxuLyoqXG4gKiBEZXZpY2UgdHlwZXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZGV2aWNlfVxuICovXG5leHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgVGFibGV0ID0gJ3RhYmxldCcsXG4gIFBob25lID0gJ3Bob25lJyxcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIHJlcXVlc3QgdG8gdGhlIGF1dGggZW5kcG9pbnQgZmFpbHMuXG4gICAqL1xuICBBdXRoRmFpbGVkID0gJ2F1dGgtZmFpbGVkJyxcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGlzIG5vdCBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIFRhYmxlYXUgRW1iZWRkaW5nIEFQSVxuICAgKi9cbiAgQnJvd3Nlck5vdENhcGFibGUgPSAnYnJvd3Nlci1ub3QtY2FwYWJsZScsXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgb24gYSB3b3JrYm9vayBvciBhIHZpZXcgZG8gbm90IGFsbG93IGRvd25sb2FkaW5nIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIERvd25sb2FkV29ya2Jvb2tOb3RBbGxvd2VkID0gJ2Rvd25sb2FkLXdvcmtib29rLW5vdC1hbGxvd2VkJyxcbiAgLyoqXG4gICAqIFRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJLiBDb250YWN0IFRhYmxlYXUgU3VwcG9ydC5cbiAgICovXG4gIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEVpdGhlciBhIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLCBvciB0aGUgdmFsdWUgc3VwcGxpZWRcbiAgICogaW4gdGhlIGZpbHRlciBvcGVyYXRpb24gaXMgdGhlIHdyb25nIGRhdGEgdHlwZSBvciBmb3JtYXQuXG4gICAqL1xuICBpbnZhbGlkRmlsdGVyRmllbGROYW1lT3JWYWx1ZSA9ICdpbnZhbGlkLWZpbHRlci1maWVsZC1uYW1lJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZVxuICAgKiBmaWVsZC5cbiAgICovXG4gIEludmFsaWRQYXJhbWV0ZXIgPSAnaW52YWxpZC1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQSBuZWdhdGl2ZSBzaXplIHdhcyBzcGVjaWZpZWQgb3IgdGhlIG1heFNpemUgdmFsdWUgaXMgbGVzcyB0aGFuIG1pblNpemUgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkuXG4gICAqL1xuICBJbnZhbGlkU2l6ZSA9ICdpbnZhbGlkLXNpemUnLFxuICAvKipcbiAgICogQXR0ZW1wdGVkIHRvIGdldCBhbiBhdXRob3Jpbmcgd29ya3NoZWV0IHdoZW4gdGhlIGN1cnJlbnQgc2hlZXQgaXMgbm90IGEgd29ya3NoZWV0LlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBJbnZhbGlkU2hlZXRUeXBlID0gJ2ludmFsaWQtc2hlZXQtdHlwZScsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIHZhbHVlIHdhcyBmb3VuZCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgU2hlZXRTaXplQmVoYXZpb3IgZW51bS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3IgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yJyxcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb3RoZXIgdGhhbiBTaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMgd2FzIHNwZWNpZmllZCBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHRoZSBzaGVldCBpcyBhXG4gICAqIFdvcmtzaGVldCBpbnN0YW5jZS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCA9ICdpbnZhbGlkLXNpemUtYmVoYXZpb3Itb24td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIFRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBWaXogY2xhc3MgY29uc3RydWN0b3IgaXMgbm90IHZhbGlkLlxuICAgKi9cbiAgSW52YWxpZFVybCA9ICdpbnZhbGlkLXVybCcsXG4gIC8qKlxuICAgKiBUaGUgbWF4U2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QuXG4gICAqL1xuICBNaXNzaW5nTWF4U2l6ZSA9ICdtaXNzaW5nLW1heC1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QuXG4gICAqL1xuICBNaXNzaW5nTWluU2l6ZSA9ICdtaXNzaW5nLW1pbi1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIG9yIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UuXG4gICAqL1xuICBNaXNzaW5nTWluTWF4U2l6ZSA9ICdtaXNzaW5nLW1pbi1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIGVtYmVkZGluZyBhcHAgaW50ZXJhY3RzIHdpdGggYSBwYXJhbWV0ZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldC5cbiAgICovXG4gIE1pc3NpbmdQYXJhbWV0ZXIgPSAnbWlzc2luZy1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIHJhbmdlTiBmaWVsZCBpcyBtaXNzaW5nIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIHR5cGUgTEFTVE4gb3IgTkVYVE4uXG4gICAqL1xuICBNaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyA9ICdtaXNzaW5nLXJhbmdlLW4tZm9yLXJlbGF0aXZlLWRhdGUtZmlsdGVycycsXG4gIC8qKlxuICAgKiBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyBTaGVldC5nZXRVcmwoKSBvbiBhIGhpZGRlbiBzaGVldC4gSGlkZGVuIHNoZWV0cyBkbyBub3QgaGF2ZSBVUkxzLlxuICAgKi9cbiAgTm9VcmxGb3JIaWRkZW5Xb3Jrc2hlZXQgPSAnbm8tdXJsLWZvci1oaWRkZW4td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIE9uZSBvciBib3RoIG9mIHRoZSBwYXJlbnRFbGVtZW50IG9yIHRoZSBVUkwgcGFyYW1ldGVycyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBOb1VybE9yUGFyZW50RWxlbWVudE5vdEZvdW5kID0gJ25vLXVybC1vci1wYXJlbnQtZWxlbWVudC1ub3QtZm91bmQnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGlzIG5vdCBhY3RpdmUgb3IgZW1iZWRkZWQgd2l0aGluIHRoZSBhY3RpdmUgZGFzaGJvYXJkLlxuICAgKi9cbiAgTm90QWN0aXZlU2hlZXQgPSAnbm90LWFjdGl2ZS1zaGVldCcsXG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IHNwZWNpZmllZCwgbnVsbCwgb3IgYW4gZW1wdHkgc3RyaW5nL2FycmF5LlxuICAgKi9cbiAgTnVsbE9yRW1wdHlQYXJhbWV0ZXIgPSAnbnVsbC1vci1lbXB0eS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIFNoZWV0Tm90SW5Xb3JrYm9vayA9ICdzaGVldC1ub3QtaW4td29ya2Jvb2snLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBhIEN1c3RvbVZpZXcgb2JqZWN0IHRoYXQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpdCBoYXMgYmVlbiByZW1vdmVkKS5cbiAgICovXG4gIFN0YWxlRGF0YVJlZmVyZW5jZSA9ICdzdGFsZS1kYXRhLXJlZmVyZW5jZScsXG4gIC8qKlxuICAgKiBVbmtub3duIGVycm9yIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGF1dGggZmxvdy5cbiAgICovXG4gIFVua25vd25BdXRoRXJyb3IgPSAndW5rbm93bi1hdXRoLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIFZpei5hZGRFdmVudExpc3RlbmVyIG9yIFZpei5yZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gIC8qKlxuICAgKiBBIFZpeiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudEVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBWaXpBbHJlYWR5SW5NYW5hZ2VyID0gJ3Zpei1hbHJlYWR5LWluLW1hbmFnZXInLFxuICAvKipcbiAgICogRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW1iZWRkaW5nIGFwaS5cbiAgICovXG4gIEltcGxlbWVudGF0aW9uRXJyb3IgPSAnd3JvbmctaW1wbGVtZW50YXRpb24nLFxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqL1xuICBOb3RJbXBsZW1lbnRlZCA9ICdub3QtaW1wbGVtZW50ZWQnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciBkdXJpbmcgZXZlbnQgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIEV2ZW50SW5pdGlhbGl6YXRpb25FcnJvciA9ICdldmVudC1pbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBlbWJlZGRpbmcgYXBpIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgdGFibGVhdVxuICAgKi9cbiAgSW5jb21wYXRpYmxlVmVyc2lvbkVycm9yID0gJ2luY29tcGF0aWJsZS12ZXJzaW9uLWVycm9yJyxcblxuICAvKipcbiAgICogVW5rbm93biB7QGxpbmsgVGFibGVhdURpYWxvZ1R5cGV9IHBhc3NlZCBpbiB0byBWaXouZGlzcGxheURpYWxvZ0FzeW5jLlxuICAgKi9cbiAgVW5rbm93bkRpYWxvZ1R5cGUgPSAndW5rbm93bi1kaWFsb2ctdHlwZScsXG5cbiAgLyoqXG4gICAqIENhbiBvY2N1ciBpZiB0aGUgQVBJIGludGVyYWN0cyB3aXRoIGEgZmlsdGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAqIENhbiBhbHNvIG9jY3VycyBpZiBhIHtAbGluayBGaWx0ZXJUeXBlfSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQuXG4gICAqL1xuICBGaWx0ZXJNaXNzaW5nT3JOb3RJbXBsZW1lbnRlZCA9ICdmaWx0ZXItbWlzc2luZy1ub3QtaW1wbGVtZW50ZWQnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgc3RvcnkgcG9pbnQgaWRzIG5vIGxvbmdlciBtYXRjaC5cbiAgICovXG4gIFN0b3J5UG9pbnRJZE1pc21hdGNoID0gJ3N0b3J5cG9pbnQtaWQtbWlzbWF0Y2gnLFxufVxuXG4vKipcbiAqIEZvcm1hdHMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIGRpc3BsYXlTdGF0aWNJbWFnZSBpbiBAVml6SW50ZXJmYWNlc1xuICovXG5leHBvcnQgZW51bSBGaWxlRm9ybWF0cyB7XG4gIFBERiA9ICdwZGYnLFxuICBQTkcgPSAncG5nJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRPcmllbnRhdGlvbiB7XG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50UGFnZVNpemUge1xuICBMZXR0ZXIgPSAnbGV0dGVyJyxcbiAgTGVnYWwgPSAnbGVnYWwnLFxuICBOb3RlID0gJ25vdGUnLFxuICBGb2xpbyA9ICdmb2xpbycsXG4gIFRhYmxvaWQgPSAndGFibG9pZCcsXG4gIExlZGdlciA9ICdsZWRnZXInLFxuICBTdGF0ZW1lbnQgPSAnc3RhdGVtZW50JyxcbiAgRXhlY3V0aXZlID0gJ2V4ZWN1dGl2ZScsXG4gIEEzID0gJ0EzJyxcbiAgQTQgPSAnQTQnLFxuICBBNSA9ICdBNScsXG4gIEI0ID0gJ0I0JyxcbiAgQjUgPSAnQjUnLFxuICBRdWFydG8gPSAncXVhcnRvJyxcbiAgVW5zcGVjaWZpZWQgPSAndW5zcGVjaWZpZWQnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFNjYWxpbmcge1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgUGVyYzI1ID0gJzI1JScsXG4gIFBlcmM1MCA9ICc1MCUnLFxuICBQZXJjNjAgPSAnNjAlJyxcbiAgUGVyYzc1ID0gJzc1JScsXG4gIFBlcmM4MCA9ICc4MCUnLFxuICBQZXJjOTAgPSAnOTAlJyxcbiAgUGVyYzEwMCA9ICcxMDAlJyxcbiAgUGVyYzIwMCA9ICcyMDAlJyxcbiAgUGVyYzQwMCA9ICc0MDAlJyxcbiAgQXRNb3N0MVBhZ2VIaWdoID0gJ2F0LW1vc3QtMS1wYWdlLWhpZ2gnLFxuICBBdE1vc3QyUGFnZXNIaWdoID0gJ2F0LW1vc3QtMi1wYWdlcy1oaWdoJyxcbiAgQXRNb3N0MVBhZ2VXaWRlID0gJ2F0LW1vc3QtMS1wYWdlLXdpZGUnLFxuICBBdE1vc3QyUGFnZXNXaWRlID0gJ2F0LW1vc3QtMi1wYWdlcy13aWRlJyxcbn1cblxuZXhwb3J0IGVudW0gUmV2ZXJ0Vml6U2VsZWN0aW9uIHtcbiAgQWxsID0gJ2FsbCcsXG4gIEF4ZXMgPSAnYXhlcycsXG4gIEZpbHRlcnMgPSAnZmlsdGVycycsXG4gIFNvcnRzID0gJ3NvcnRzJyxcbiAgU2hlbHZlcyA9ICdzaGVsdmVzJyxcbn1cblxuZXhwb3J0IGVudW0gVG9vbGJhckJ1dHRvbnMge1xuICBBbGVydHMgPSAnYWxlcnRzJyxcbiAgQXNrRGF0YSA9ICdhc2tEYXRhJyxcbiAgQ3VzdG9tVmlld3MgPSAnY3VzdG9tVmlld3MnLFxuICBEYXRhRGV0YWlscyA9ICdkYXRhRGV0YWlscycsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU3Vic2NyaWJlID0gJ3N1YnNjcmliZScsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXIge1xuICBUb3AgPSAndG9wJyxcbiAgQm90dG9tID0gJ2JvdHRvbScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFNpemVCZWhhdmlvciB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBFeGFjdGx5ID0gJ2V4YWN0bHknLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIEF0TGVhc3QgPSAnYXRsZWFzdCcsXG4gIEF0TW9zdCA9ICdhdG1vc3QnLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUxheW91dCB7XG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXG4gIENhcmQgPSAnY2FyZCcsXG4gIEJhbiA9ICdiYW4nLFxufVxuXG4vKipcbiAqIEJlIGNhcmVmdWwgd2hlbiBhZGRpbmcgbmV3IGV2ZW50IHR5cGVzLiBFeHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgZm9sbG93IHR3byBkaWZmZXJlbnQgcGF0dGVybnMgb24gaG93IGV2ZW50cyBhcmUgbmFtZWQuXG4gKiBFdmVudHMgc2hvdWxkIGJlIGFsbCBsb3dlciBjYXNlIGFuZCB3aXRob3V0IGh5cGhlbnMgb3IgdW5kZXJzY29yZXMuXG4gKi9cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB0eXBlIG9mIHRhYmxlYXUgZW1iZWRkaW5nIGV2ZW50IHRoYXQgY2FuIGJlIGxpc3RlbmVkIGZvci5cbiAqL1xuZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBmaW5pc2hlZCBsb2FkaW5nLiBUaGlzIGV2ZW50IGlzIHJhaXNlZCBhZnRlciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHtAbGluayBGaXJzdEludGVyYWN0aXZlfSAoaWYgYW55KSBoYXMgYmVlbiBjYWxsZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3TG9hZGVkID0gJ2N1c3RvbXZpZXdsb2FkZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b212aWV3cmVtb3ZlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2F2ZWQgKG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3U2F2ZWQgPSAnY3VzdG9tdmlld3NhdmVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQgYXMgdGhlIGRlZmF1bHQgdmlldyBmb3IgYSB3b3JrYm9vay5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ2N1c3RvbXZpZXdzZXRkZWZhdWx0JyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEJ1dHRvbi5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEVkaXRCdXR0b25DbGlja2VkID0gJ2VkaXRidXR0b25jbGlja2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBFZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdlZGl0aW5kZXNrdG9wYnV0dG9uY2xpY2tlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyY2hhbmdlZCcsXG5cbiAgLyoqIEZpcmVkIHdoZW4gdml6IHNpemUgaXMga25vd25cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3R2aXpzaXpla25vd24nLFxuXG4gIC8qKiBGaXJlZCB3aGVuIGEgdml6IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmVcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRmlyc3RJbnRlcmFjdGl2ZSA9ICdmaXJzdGludGVyYWN0aXZlJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ2N1c3RvbW1hcmtjb250ZXh0bWVudScsXG5cbiAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrc2VsZWN0aW9uY2hhbmdlZCcsXG5cbiAgLyoqIEEgcGFyYW1ldGVyIGhhcyBoYWQgaXRzIHZhbHVlIG1vZGlmaWVkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBbW1BhcmFtZXRlcl1dIG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlcmNoYW5nZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIHRvb2xiYXIgYnV0dG9uIG9yIGNvbnRyb2wgYmVjb21lcyBhdmFpbGFibGUgb3IgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhcnN0YXRlY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2tyZWFkeXRvY2xvc2UnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9va3B1Ymxpc2hlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2twdWJsaXNoZWRhcycsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgVVJMIGFjdGlvbiBvY2N1cnMuIFNlZSB0aGUge0BsaW5rIFVybEFjdGlvbkV2ZW50fSBjbGFzcy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFVybEFjdGlvbiA9ICd1cmxhY3Rpb24nLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVGFiU3dpdGNoZWQgPSAndGFic3dpdGNoZWQnLFxuICAvKipcbiAgICpcbiAgICogUmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5cG9pbnRzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudHMgb2YgdGhlIHdlYmNvbXBvbmVudC5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgVml6TG9hZEVycm9yID0gJ3ZpemxvYWRlcnJvcicsXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgdGhlIGlmcmFtZSBzcmMgYXR0cmlidXRlIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgSWZyYW1lU3JjVXBkYXRlZCA9ICdpZnJhbWVzcmN1cGRhdGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSB0byBzdW1tYXJ5IGRhdGEuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeWRhdGFjaGFuZ2VkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gdGFibGVhdSAodml6LWNsaWVudCkgaXMgcmVhZHkgdG8gcmVjZWl2ZSBhbiBhdXRoIHRva2VuLlxuICAgKiBVc2VkIGZvciBhdXRoZW50aWNhdGlvbiBpbiBzYWxlc2ZvcmNlIG5hdGl2ZSBtb2RlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsXG4gICAqL1xuICBSZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdyZWFkeXRvcmVjZWl2ZWF1dGh0b2tlbicsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgYSBjb250ZXh0IG1lbnUgd2hlcmUgdXNlcnMgY2FuIGFkZCBleHRlcm5hbCBtZW51IGl0ZW1zLlxuICovXG5leHBvcnQgZW51bSBBcGlNZW51VHlwZSB7XG4gIC8qKiBFeHRlcm5hbCBtZW51IGl0ZW0gd2lsbCBiZSBpbmplY3RlZCBpbiB1YmVydGlwIGRpYWxvZyAqL1xuICBVYmVydGlwID0gJ3ViZXJ0aXAnLFxufVxuXG4vKiogWW91IGNhbiB1c2UgdGhpcyB0eXBlIHdpdGggYSB7QGxpbmsgVml6fSBvYmplY3QuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RGlhbG9nVHlwZSB7XG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBERiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRQREYgPSAnZXhwb3J0LXBkZicsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBvd2VyUG9pbnQgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UG93ZXJQb2ludCA9ICdleHBvcnQtcG93ZXJwb2ludCcsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIERhdGEgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIENyb3NzVGFiIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydENyb3NzVGFiID0gJ2V4cG9ydC1jcm9zcy10YWInLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBXb3JrYm9vayBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRXb3JrYm9vayA9ICdleHBvcnQtd29ya2Jvb2snLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBTaGFyZSBkaWFsb2cuXG4gICAqL1xuICBTaGFyZSA9ICdzaGFyZScsXG59XG4iLCJpbXBvcnQgeyBQdWxzZUxheW91dCB9IGZyb20gJy4vRW51bXMnO1xuaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXB1bHNlPiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBQdWxzZUF0dHJpYnV0ZXMge1xuICBEaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlLWV4cGxvcmUtZmlsdGVyJyxcbiAgTGF5b3V0ID0gJ2xheW91dCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGN1c3RvbSBsYXlvdXQgb2YgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgbGF5b3V0PVwiY2FyZFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGxheW91dD86IFB1bHNlTGF5b3V0O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AtbGV2ZWwgUHVsc2Ugb2JqZWN0LlxuICoqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZSBleHRlbmRzIFB1bHNlU2V0dGluZ3Mge31cbiIsImltcG9ydCB7XG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRGV2aWNlVHlwZSxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBUYWJsZWF1RGlhbG9nVHlwZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVG9vbGJhcixcbn0gZnJvbSAnLi9FbnVtcyc7XG5pbXBvcnQgeyBTaGVldFNpemUgfSBmcm9tICcuL1NoZWV0SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4vV29ya2Jvb2tJbnRlcmZhY2UnO1xuXG4vKipcbiAqIFRoZSBzaGFyZWQgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS12aXo+IGFuZCA8dGFibGVhdS1hdXRob3Jpbmctdml6PiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBWaXpTaGFyZWRBdHRyaWJ1dGVzIHtcbiAgVG91Y2hPcHRpbWl6ZSA9ICd0b3VjaC1vcHRpbWl6ZScsXG4gIEhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uID0gJ2hpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbicsXG4gIFN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvciA9ICdzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3InLFxuICBEaXNhYmxlVmVyc2lvbkNoZWNrID0gJ2Rpc2FibGUtdmVyc2lvbi1jaGVjaycsXG4gIE9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCcsXG4gIE9uRmlyc3RWaXpTaXplS25vd24gPSAnb25GaXJzdFZpelNpemVLbm93bicsXG4gIE9uRmlyc3RJbnRlcmFjdGl2ZSA9ICdvbkZpcnN0SW50ZXJhY3RpdmUnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF0dHJpYnV0ZXMge1xuICBEaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9ICdkaXNhYmxlLXVybC1hY3Rpb25zJyxcbiAgSGlkZVRhYnMgPSAnaGlkZS10YWJzJyxcbiAgVG9vbGJhciA9ICd0b29sYmFyJyxcbiAgSW5zdGFuY2VJZFRvQ2xvbmUgPSAnaW5zdGFuY2UtaWQtdG8tY2xvbmUnLFxuICBEZXZpY2UgPSAnZGV2aWNlJyxcbiAgSGlkZUVkaXRCdXR0b24gPSAnaGlkZS1lZGl0LWJ1dHRvbicsXG4gIE9uRWRpdEJ1dHRvbkNsaWNrZWQgPSAnb25FZGl0QnV0dG9uQ2xpY2tlZCcsXG4gIE9uRmlsdGVyQ2hhbmdlZCA9ICdvbkZpbHRlckNoYW5nZWQnLFxuICBPbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ29uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQnLFxuICBPbk1hcmtTZWxlY3Rpb25DaGFuZ2VkID0gJ29uTWFya1NlbGVjdGlvbkNoYW5nZWQnLFxuICBPblBhcmFtZXRlckNoYW5nZWQgPSAnb25QYXJhbWV0ZXJDaGFuZ2VkJyxcbiAgT25Ub29sYmFyU3RhdGVDaGFuZ2VkID0gJ29uVG9vbGJhclN0YXRlQ2hhbmdlZCcsXG4gIE9uVXJsQWN0aW9uID0gJ29uVXJsQWN0aW9uJyxcbiAgT25UYWJTd2l0Y2hlZCA9ICdvblRhYlN3aXRjaGVkJyxcbiAgT25DdXN0b21WaWV3TG9hZGVkID0gJ29uQ3VzdG9tVmlld0xvYWRlZCcsXG4gIE9uQ3VzdG9tVmlld1JlbW92ZWQgPSAnb25DdXN0b21WaWV3UmVtb3ZlZCcsXG4gIE9uQ3VzdG9tVmlld1NhdmVkID0gJ29uQ3VzdG9tVmlld1NhdmVkJyxcbiAgT25DdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdvbkN1c3RvbVZpZXdTZXREZWZhdWx0JyxcbiAgT25TdG9yeVBvaW50U3dpdGNoZWQgPSAnb25TdG9yeVBvaW50U3dpdGNoZWQnLFxuICBPblN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdvblN1bW1hcnlEYXRhQ2hhbmdlZCcsXG4gIE9uUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4gPSAnb25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbicsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF1dGhvcmluZ0F0dHJpYnV0ZXMge1xuICBPbldvcmtib29rUHVibGlzaGVkID0gJ29uV29ya2Jvb2tQdWJsaXNoZWQnLFxuICBPbldvcmtib29rUHVibGlzaGVkQXMgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZEFzJyxcbiAgT25Xb3JrYm9va1JlYWR5VG9DbG9zZSA9ICdvbldvcmtib29rUmVhZHlUb0Nsb3NlJyxcbiAgSGlkZUNsb3NlQnV0dG9uID0gJ2hpZGUtY2xvc2UtYnV0dG9uJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiBhbmQgVGFibGVhdUF1dGhvcmluZ1ZpeiBjdXN0b20gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGZpbHRlciBwYXJhbWV0ZXJzLiBBdmFpbGFibGUgb25seSBpbiB2aWV3aW5nIG1vZGUuXG4gICAqL1xuICBWaXpGaWx0ZXIgPSAndml6LWZpbHRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbmFtZSBhbmQgdmFsdWUgZm9yIGEgcGFyYW1ldGVyLiBBdmFpbGFibGUgb25seSBpbiB2aWV3aW5nIG1vZGUuXG4gICAqL1xuICBWaXpQYXJhbWV0ZXIgPSAndml6LXBhcmFtZXRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcbn1cblxuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AgbGV2ZWwgVml6IG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6IGV4dGVuZHMgVml6U2V0dGluZ3MsIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogT25lIFdvcmtib29rIGlzIHN1cHBvcnRlZCBwZXIgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rPzogV29ya2Jvb2s7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEF1dGhvcmluZyBWaXogb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcmluZ1ZpeiBleHRlbmRzIFZpekF1dGhvcmluZ1NldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgLSBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgdml6XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6QWN0aW9ucyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhdXRvbWF0aWMgdXBkYXRlcyBhcmUgY3VycmVudGx5IHBhdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF1dG9tYXRpY1VwZGF0ZXNBcmVQYXVzZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdXNlIGxheW91dCB1cGRhdGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlc2l6aW5nIHRoZSB2aXN1YWxpemF0aW9uIG9yIHBlcmZvcm1pbmcgbXVsdGlwbGUgY2FsbHMgdGhhdCBjb3VsZCBhZmZlY3QgdGhlIGxheW91dC5cbiAgICovXG4gIHBhdXNlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBsYXlvdXQgdXBkYXRlcy5cbiAgICovXG4gIHJlc3VtZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICB0b2dnbGVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiB0aGUgUmV2ZXJ0IEFsbCB0b29sYmFyIGJ1dHRvbiwgd2hpY2ggcmVzdG9yZXMgdGhlIHdvcmtib29rIHRvIGl0cyBzdGFydGluZyBzdGF0ZS5cbiAgICovXG4gIHJldmVydEFsbEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJlZnJlc2ggRGF0YSB0b29sYmFyIGJ1dHRvbi5cbiAgICovXG4gIHJlZnJlc2hEYXRhQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiBEb3dubG9hZCA+IEltYWdlIGZyb20gdGhlIHRvb2xiYXIsIHdoaWNoIGNyZWF0ZXMgYSBQTkcgZmlsZSBvZiB0aGUgY3VycmVudCB2aXN1YWxpemF0aW9uLlxuICAgKi9cbiAgZXhwb3J0SW1hZ2VBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBjcm9zc3RhYiBvZiBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3IHRvIGFcbiAgICogc3BlY2lmaWVkIGZvcm1hdCAoQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKS5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzaGVldCBuYW1lIGRvZXMgbm90IG1hdGNoIGFueSB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgYWN0aXZlIHNoZWV0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNyb3NzdGFiIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydENyb3NzdGFiQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogdml6LmV4cG9ydENyb3NzdGFiQXN5bmMoJ1NhbGVzIGJ5IFNlZ21lbnQnLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRDcm9zc3RhYkFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIHN1bW1hcnkgZGF0YSBzaG93biBpbiB0aGUgVmlldyBEYXRhIHdpbmRvd1xuICAgKiAoc2hvd24gd2hlbiB5b3UgY2xpY2sgRG93bmxvYWQgPiBEYXRhIGZyb20gdGhlIHRvb2xiYXIgZm9yIGFueSBnaXZlbiB3b3Jrc2hlZXQgd2l0aGluIHRoZSBjdXJyZW50IHZpZXcpLlxuICAgKiBUaGUgY3VycmVudCBmaWxlIGZvcm1hdCBpcyBDU1YuIFRoZXJlIGlzIG5vIGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCBvZiBzdW1tYXJ5IGRhdGEgeW91IGNhbiBleHBvcnQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZC5cbiAgICogTm90ZTogZXhwb3J0RGF0YUFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gdml6Lndvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAqICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IGFjdGl2ZVNoZWV0LmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk7XG4gICAqICAgLy8gR2V0dGluZyBmaWVsZElkJ3MgZm9yIExhdGl0dWRlIGFuZCBMb25naXR1ZGUgY29sdW1uc1xuICAgKiAgIGNvbnN0IGNvbHVtbnNUb0luY2x1ZGVCeUlkID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgKiAgICAgaWYgKGNvbHVtbi5maWVsZE5hbWUgPT09ICdMYXRpdHVkZScgfHwgY29sdW1uLmZpZWxkTmFtZSA9PT0gJ0xvbmdpdHVkZScpIHtcbiAgICogICAgICAgcmV0dXJuIGNvbHVtbi5maWVsZElkO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMoYWN0aXZlU2hlZXQubmFtZSwgeyBjb2x1bW5zVG9JbmNsdWRlQnlJZCB9KTtcbiAgICogfVxuICAgKiBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgaW4gdGhlIGRhc2hib2FyZCB3aGlsZSBhbHNvIGlnbm9yaW5nIGFsaWFzZXNcbiAgICogICBmb3IgKGNvbnN0IHdvcmtzaGVldCBvZiBhY3RpdmVTaGVldC53b3Jrc2hlZXRzKSB7XG4gICAqICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKHdvcmtzaGVldC5uYW1lLCB7IGlnbm9yZUFsaWFzZXM6IHRydWUgfSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGVsc2VcbiAgICoge1xuICAgKiAgIC8vIGFjdGl2ZVNoZWV0IGlzIGEgU3RvcnkgYW5kIHdlIHdhbnQgdG8gZXhwb3J0IHdvcmtzaGVldHMgd2l0aGluIHRoZSBjdXJyZW50IHZpZXdcbiAgICogICBjb25zdCBjb250YWluZWRTaGVldCA9IGFjdGl2ZVNoZWV0LmFjdGl2ZVN0b3J5UG9pbnQuY29udGFpbmVkU2hlZXQ7XG4gICAqICAgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgc3VtbWFyeSBkYXRhIG9mIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgYWN0aXZlIHN0b3J5IHBvaW50XG4gICAqICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGNvbnRhaW5lZFNoZWV0Lm5hbWUpO1xuICAgKiAgIH0gZWxzZSBpZiAoY29udGFpbmVkU2hlZXQgIT09IHVuZGVmaW5lZCAmJiBjb250YWluZWRTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICAgIC8vIEV4cG9ydGluZyB0aGUgc3VtbWFyeSBkYXRhIGZvciBlYWNoIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgY29udGFpbmVkU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKHdvcmtzaGVldC5uYW1lKTtcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBleHBvcnREYXRhQXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBFeHBvcnREYXRhT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGxpc3Qgb2Ygc2hlZXRzIHRvIGEgUG93ZXJQb2ludCBmaWxlLiBJZiBubyBzaGVldHMgYXJlIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2hlZXQgaXMgZXhwb3J0ZWQuXG4gICAqIFRoZSBvcmRlciB0aGUgc2hlZXRzIGFwcGVhciBpbiB0aGUgbGlzdCBpcyB0aGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIFBvd2VyUG9pbnQgZmlsZS5cbiAgICogVGhlIGxpc3Qgb2Ygc2hlZXRzIGNhbiBlaXRoZXIgZXhjbHVzaXZlbHkgaW5jbHVkZSB0aGUgd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgb3IgZXhjbHVzaXZlbHkgaW5jbHVkZSB0aGUgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBsaXN0IG9mIHNoZWV0cyBjb250YWlucyBib3RoIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIGFuZCBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIFBvd2VyUG9pbnQgZmlsZSBmYWlscyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBOb3RlOiBleHBvcnRQb3dlclBvaW50QXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCk7XG4gICAqIH0gZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSAgU2hlZXRUeXBlLkRhc2hib2FyZCkge1xuICAgKiAgIGNvbnN0IHdvcmtzaGVldE5hbWVzID0gYWN0aXZlU2hlZXQud29ya3NoZWV0cy5tYXAoKHdvcmtzaGVldCkgPT4gd29ya3NoZWV0Lm5hbWUpO1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQb3dlclBvaW50QXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUG93ZXJQb2ludFxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHB1Ymxpc2hlZFNoZWV0TmFtZXMpO1xuICAgKiBgYGBcbiAgICovXG4gIGV4cG9ydFBvd2VyUG9pbnRBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGxpc3Qgb2Ygc2hlZXRzIHdpdGggdGhlIGdpdmVuIHtAbGluayBFeHBvcnRQREZPcHRpb25zfSBvcHRpb25zLiBJZiBubyBzaGVldHMgYXJlIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2hlZXQgaXMgZXhwb3J0ZWQuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIElmIG5vIEV4cG9ydFBERk9wdGlvbnMgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXJlOiBTY2FsaW5nID0gQXV0b21hdGljLCBQYWdlU2l6ZSA9IExldHRlciwgYW5kIE9yaWVudGF0aW9uID0gUG9ydHJhaXQuXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQREYgZmlsZSBmYWlscyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBOb3RlOiBleHBvcnRQREZBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCB3b3JrYm9vayA9IHZpei53b3JrYm9vaztcbiAgICogY29uc3QgYWN0aXZlU2hlZXQgPSB3b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCB8fCBhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5TdG9yeSkge1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQREZBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUERGXG4gICAqIGNvbnN0IHB1Ymxpc2hlZFNoZWV0TmFtZXMgPSB3b3JrYm9vay5wdWJsaXNoZWRTaGVldHNJbmZvLm1hcCgocHVibGlzaGVkU2hlZXRJbmZvKSA9PiBwdWJsaXNoZWRTaGVldEluZm8ubmFtZSk7XG4gICAqIGF3YWl0IHZpei5leHBvcnRQREZBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQREZBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPiwgb3B0aW9ucz86IEV4cG9ydFBERk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG9uZSBvZiB0aGUgZXhwb3J0IGRpYWxvZ3MgYmFzZWQgb24gdGhlIGRpYWxvZ1R5cGUgcGFyYW1ldGVyXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBkaWFsb2dUeXBlIGlzIGludmFsaWRcbiAgICovXG4gIGRpc3BsYXlEaWFsb2dBc3luYyhkaWFsb2dUeXBlOiBUYWJsZWF1RGlhbG9nVHlwZSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFJlZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICByZWRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5kb2VzIHRoZSBsYXN0IGFjdGlvbiBwZXJmb3JtZWQgb24gYSBzaGVldC5cbiAgICovXG4gIHVuZG9Bc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqXG4gICAqIGBgYFxuICAgKiBhc3luYyBmdW5jdGlvbiBnZXRTZWxlY3RlZE1hcmtzKGV2ZW50KSB7XG4gICAqICAgICBjb25zdCBtYXJrc1NlbGVjdGVkID0gYXdhaXQgZXZlbnQuZGV0YWlsLmdldE1hcmtzQXN5bmMoKTtcbiAgICogICAgIGNvbnN0IG51bU1hcmtzID0gbWFya3NTZWxlY3RlZC5kYXRhWzBdLmRhdGEubGVuZ3RoO1xuICAgKiAgICAgY29uc29sZS5sb2coYCR7bnVtTWFya3N9IG1hcmtzIFNlbGVjdGVkYCk7XG4gICAqIH1cbiAgICpcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5hZGRFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5yZW1vdmVFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIHZpeiBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSB2aXouXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDx2aXotZmlsdGVyPmAgZWxlbWVudCBpbiB0aGUgYDx0YWJsZWF1LXZpej5gIHdlYiBjb21wb25lbnQsXG4gICAqIHlvdSBtaWdodCBleHBlcmllbmNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlIFNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiB2aXouYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXpTaXplIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNoZWV0U2l6ZSByZWNvcmQgZm9yIHRoZSBjdXJyZW50IHNoZWV0XG4gICAqL1xuICByZWFkb25seSBzaGVldFNpemU6IFNoZWV0U2l6ZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBUYWJsZWF1IFVJIGVsZW1lbnRzICh0aGUgY2hyb21lKSBzdXJyb3VuZGluZyB0aGUgdmlldy5cbiAgICovXG4gIHJlYWRvbmx5IGNocm9tZUhlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGUuXG4gKi9cbmludGVyZmFjZSBWaXpTZXR0aW5nc1NoYXJlZCBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHRvdWNoIG9wdGltaXplIHZpeiBjb250cm9scy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRvdWNoLW9wdGltaXplIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG91Y2hPcHRpbWl6ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogYGBgXG4gICAqL1xuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGVkaXQgYmVoYXZpb3IgaXMgc3VwcHJlc3NlZC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIG5vdCBzdXBwcmVzc2VkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHN1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIGBgYFxuICAgKi9cbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPVwib25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzaXplIG9mIHRoZSB2aXogaXMga25vd24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gcGVyZm9ybSB0YXNrcyBzdWNoIGFzIHJlc2l6aW5nXG4gICAqIHRoZSBlbGVtZW50cyBzdXJyb3VuZGluZyB0aGUgVml6IG9iamVjdCBvbmNlIHRoZSBvYmplY3QncyBzaXplIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdFZpelNpemVLbm93blwiPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlyc3RWaXpTaXplS25vd249XCJvbkZpcnN0Vml6U2l6ZUtub3duSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdFZpelNpemVLbm93bj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIFZpeiBvYmplY3QgZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZS4gVGhpcyBpcyBvbmx5IHJhaXNlZCBvbmNlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdEludGVyYWN0aXZlXCI9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0SW50ZXJhY3RpdmU9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpcnN0SW50ZXJhY3RpdmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIHZpZXcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHN1cHByZXNzIHRoZSBleGVjdXRpb24gb2YgVVJMIGFjdGlvbnMuIFRoaXMgb3B0aW9uIGRvZXMgbm90IHByZXZlbnQgdGhlIFVSTCBhY3Rpb25cbiAgICogZXZlbnQgZnJvbSBiZWluZyByYWlzZWQuIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBJZiBzZXRcbiAgICogdG8gdHJ1ZSBhbmQgeW91IGNyZWF0ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIFVSTF9BQ1RJT04gZXZlbnQsIHlvdSBjYW4gdXNlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqIGhhbmRsZXIgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRpc2FibGUtdXJsLWFjdGlvbnMgLz5cbiAgICogYGBgXG4gICAqL1xuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYnMgYXJlIGhpZGRlbiBvciBzaG93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgaGlkZS10YWJzIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZVRhYnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sYmFyLCBpZiBpdCBpcyBzaG93bi4gVGhlIHZhbHVlcyBjYW4gYmUgVG9vbGJhci5Ub3AsXG4gICAqIFRvb2xiYXIuQm90dG9tIG9yIFRvb2xiYXIuSGlkZGVuLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBUb29sYmFyLkJvdHRvbS5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgdG9vbGJhcj1cImhpZGRlblwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9vbGJhcj86IFRvb2xiYXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGRldmljZSBsYXlvdXQgZm9yIGEgZGFzaGJvYXJkLCBpZiBpdCBleGlzdHMuXG4gICAqIFZhbHVlcyBjYW4gYmUgZGVmYXVsdCwgZGVza3RvcCwgdGFibGV0LCBvciBwaG9uZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gbG9hZGluZyBhIGxheW91dCBiYXNlZCBvbiB0aGVcbiAgICogc21hbGxlc3QgZGltZW5zaW9uIG9mIHRoZSBob3N0aW5nIGlmcmFtZSBlbGVtZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBkZXZpY2U9XCJkZXNrdG9wXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBkZXZpY2U/OiBEZXZpY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIElEIG9mIGFuIGV4aXN0aW5nIGluc3RhbmNlIHRvIG1ha2UgYSBjb3B5IChjbG9uZSkgb2YuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlIGFuYWx5c2lzIG9mIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb25cbiAgICogd2l0aG91dCBsb3NpbmcgdGhlIHN0YXRlIG9mIHRoZSBvcmlnaW5hbC4gSWYgdGhlIElEIGRvZXMgbm90IHJlZmVyIHRvIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb24sXG4gICAqIHRoZSBjbG9uZWQgdmVyc2lvbiBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGluc3RhbmNlLWlkLXRvLWNsb25lPVwiaWQxXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpbnN0YW5jZUlkVG9DbG9uZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEVkaXQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25FZGl0QnV0dG9uQ2xpY2tlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlsdGVyQ2hhbmdlZD1cIm9uRmlsdGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlsdGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50PVwib25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD1cIm9uTWFya1NlbGVjdGlvbkNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIHBhcmFtZXRlciBoYXMgaGFkIGl0cyB2YWx1ZSBtb2RpZmllZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tQYXJhbWV0ZXJdXSBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uUGFyYW1ldGVyQ2hhbmdlZD1cIm9uUGFyYW1ldGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uUGFyYW1ldGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSB0b29sYmFyIGJ1dHRvbiBvciBjb250cm9sIGJlY29tZXMgYXZhaWxhYmxlIG9yIGJlY29tZXMgdW5hdmFpbGFibGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPVwib25Ub29sYmFyU3RhdGVDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBTZWUgdGhlIHtAbGluayBVcmxBY3Rpb25FdmVudH0gY2xhc3MuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25VcmxBY3Rpb249XCJvblVybEFjdGlvbkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVXJsQWN0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVGFiU3dpdGNoZWQ9XCJvblRhYlN3aXRjaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25UYWJTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrXG4gICAqIGZ1bmN0aW9uIGZvciB7QGxpbmsgRmlyc3RJbnRlcmFjdGl2ZX0gKGlmIGFueSkgaGFzIGJlZW4gY2FsbGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld0xvYWRlZD1cIm9uQ3VzdG9tVmlld0xvYWRlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld0xvYWRlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiByZW1vdmVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1JlbW92ZWQ9XCJvbkN1c3RvbVZpZXdSZW1vdmVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3UmVtb3ZlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdTYXZlZD1cIm9uQ3VzdG9tVmlld1NhdmVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2F2ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0IGFzIHRoZSBkZWZhdWx0IHZpZXcgZm9yIGEgd29ya2Jvb2suXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2V0RGVmYXVsdD1cIm9uQ3VzdG9tVmlld1NldERlZmF1bHRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdTZXREZWZhdWx0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSBuZXcgc3RvcnkgcG9pbnQgYmVjb21lcyBhY3RpdmUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdG9yeVBvaW50U3dpdGNoZWQ9XCJvblN0b3J5UG9pbnRTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3RvcnlQb2ludFN3aXRjaGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc3VtbWFyeSBkYXRhIG9uIGEgdmlzdWFsaXphdGlvbiBoYXZlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblN1bW1hcnlEYXRhQ2hhbmdlZD1cIm9uU3VtbWFyeURhdGFDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25TdW1tYXJ5RGF0YUNoYW5nZWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogKEJldGEpIFJlcHJlc2VudHMgdGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIGF1dGhvcmluZyBtb2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekF1dGhvcmluZ1NldHRpbmdzIGV4dGVuZHMgVml6U2V0dGluZ3NTaGFyZWQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIENsb3NlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgQ2xvc2UgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtY2xvc2UtYnV0dG9uIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUNsb3NlQnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGhhcyBiZWVuIHB1Ymxpc2hlZC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZD1cIm9uV29ya2Jvb2tQdWJsaXNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUHVibGlzaGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBcInB1Ymxpc2ggYXNcIiBpcyBzdWNjZXNzZnVsLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbldvcmtib29rUHVibGlzaGVkQXM9XCJvbldvcmtib29rUHVibGlzaGVkQXNIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUHVibGlzaGVkQXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT1cIm9uV29ya2Jvb2tSZWFkeVRvQ2xvc2VIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUmVhZHlUb0Nsb3NlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlclBhcmFtZXRlcnMge1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZpelBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gc2V0IFBhcmFtZXRlciB2YWx1ZXMgb24gdGhlIHZpei5cbiAqXG4gKiAqIGBgYFxuICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICogIDx2aXotcGFyYW1ldGVyIG5hbWU9XCJwYXJhbWV0ZXItbmFtZVwiIHZhbHVlPVwicGFyYW1ldGVyLXZhbHVlXCI+PC92aXotcGFyYW1ldGVyPlxuICogPC90YWJsZWF1LXZpej5cbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpQYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDdXN0b21QYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHBhc3MgYWxvbmcgc2V0dGluZ3MsIGluZm9ybWF0aW9uLCBldGMuLCB0aGF0IGFyZW4ndCBleHBvc2VkIG9uIHRoZVxuICogdGFibGVhdS12aXogZWxlbWVudC4gQ3VzdG9tUGFyYW1ldGVycyB3aWxsIG92ZXJyaWRlIGF0dHJpYnV0ZXMsIG9yIGZpbHRlcnMsIHNldCBvbiB0aGUgdGFibGVhdS12aXogZWxlbWVudC5cbiAqXG4gKiAqIGBgYFxuICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICogIDxjdXN0b20tcGFyYW1ldGVyIG5hbWU9XCJwYXJhbWV0ZXItbmFtZVwiIHZhbHVlPVwicGFyYW1ldGVyLXZhbHVlXCI+PC9jdXN0b20tcGFyYW1ldGVyPlxuICogPC90YWJsZWF1LXZpej5cbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21QYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgZXhwb3J0aW5nIGRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0RGF0YU9wdGlvbnMge1xuICAvKipcbiAgICogRG8gbm90IHVzZSBhbGlhc2VzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBzb3VyY2UgaW4gVGFibGVhdS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAgICovXG4gIGlnbm9yZUFsaWFzZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGNvbHVtbnMgdG8gaW5jbHVkZSBzcGVjaWZpZWQgYnkgZmllbGQgaWQsIGluY2x1ZGVzIGFsbCBieSBkZWZhdWx0LlxuICAgKiBUaGUgb3JkZXIgb2YgdGhlIGNvbHVtbiBpZHMgaW4gdGhlIGFycmF5IGRldGVybWluZXMgdGhlIGNvbHVtbiBvcmRlciBzaG93biBpbiB0aGUgc3VtbWFyeSBkYXRhIHRhYmxlLlxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFBERk9wdGlvbnMge1xuICBzY2FsaW5nOiBQcmludFNjYWxpbmc7XG4gIHBhZ2VTaXplOiBQcmludFBhZ2VTaXplO1xuICBvcmllbnRhdGlvbjogUHJpbnRPcmllbnRhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50IHtcbiAgY3VycmVudFNoZWV0TmFtZTogc3RyaW5nO1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21EYXNoYm9hcmQ6IEFycmF5PHN0cmluZz47XG4gIGV4cG9ydGFibGVTaGVldE5hbWVzRnJvbVdvcmtib29rOiBBcnJheTxzdHJpbmc+O1xufVxuIiwiLyoqXG4gKiBVc2VyIHN1cHBsaWVkIG9wdGlvbnMgdGhhdCBkbyBub3QgZ2V0IHBhc3NlZCBhcyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gbG9hZCBhIFRhYmxlYXUgdml6LCBUYWJsZWF1IGFza2RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFRoZSB2aXogc3JjXG4gICAqL1xuICBzcmM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHdpZHRoIGluIHBpeGVsc1xuICAgKiBDYW4gYmUgYW55IHZhbGlkIENTUyBzaXplIHNwZWNpZmllci4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHB1Ymxpc2hlZCB3aWR0aCBvZiB0aGUgdmlldy5cbiAgICovXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGhlaWdodCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgaGVpZ2h0IG9mIHRoZSB2aWV3LlxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHdlYmNvbXBvbmVudCB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdml6IGFuZCBhc2tkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbiB1c2VkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vbi1taW5pZmllZCB2ZXJzaW9uIG9mIEphdmFTY3JpcHQgaXMgbG9hZGVkLiBJZiBzcGVjaWZpZWQgKG9yIHNldCB0byB0cnVlKSwgdGhlXG4gICAqIG5vbi1taW5pZmllZCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGJvdGggdGhlIGxvY2FsIGNvbXBvbmVudCBhbmQgdGhlIFRhYmxlYXUgU2VydmVyIHZpc3VhbGl6YXRpb24gKGlmIGVuYWJsZWQpLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkIChvciBzZXQgdG8gZmFsc2UpLCB0aGUgbWluaWZpZWQgdmVyc2lvbiBvZiB0aGUgSmF2YVNjcmlwdCBmaWxlcyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgZGVidWcgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIGRlYnVnIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgdGhlIG9sZCBhdXRoIG1lY2hhbmlzbSBmb3IgYXV0aGVudGljYXRpb24gd2hpY2ggaGFwcGVucyBpbnNpZGUgdGhlIGlmcmFtZS4gSWYgc3BlY2lmaWVkLCBWaXpMb2FkRXJyb3JFdmVudHNcbiAgICogdHJpZ2dlcmVkIGR1ZSB0byBhdXRoIGZhaWx1cmVzIHdpbGwgbm90IGJlIHRocm93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdXRoIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF1dGg/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgY29tbW9uIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgdGFibGVhdSB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRBdHRyaWJ1dGVzIHtcbiAgU3JjID0gJ3NyYycsXG4gIFdpZHRoID0gJ3dpZHRoJyxcbiAgSGVpZ2h0ID0gJ2hlaWdodCcsXG4gIFRva2VuID0gJ3Rva2VuJyxcbiAgRGVidWcgPSAnZGVidWcnLFxuICBJZnJhbWVBdXRoID0gJ2lmcmFtZS1hdXRoJyxcbiAgT25WaXpMb2FkRXJyb3IgPSAnb252aXpsb2FkZXJyb3InLFxuICBGb3JjZVRva2VuU3luYyA9ICdmb3JjZS10b2tlbi1zeW5jJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIEV4dGVuc2lvbnMgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAqL1xuICBleHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgICBWaWV3aW5nID0gJ3ZpZXdpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdG8gYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWVcbi8vICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHlhcm4gcHVibGlzaDpidW1wIHZpYSBzY3JpcHRzL3B1Ymxpc2gtY2hlY2sudHNcbi8vICB1cGRhdGVJbnRlcm5hbENvbnRyYWN0UnVudGltZVZlcnNpb24gaW4gdGhlIG1vbm9yZXBvIHJvb3QuXG5pbXBvcnQgKiBhcyBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiBmcm9tICcuLi9pbnRlcm5hbC1jb250cmFjdC12ZXJzaW9uLmpzb24nO1xuZXhwb3J0IGNvbnN0IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04gPSBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjtcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1BhcmFtZXRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9WZXJicyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9JbnRlcm5hbEFwaURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuXG4vLyBFeHBvcnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIG1lc3NhZ2luZyBmb3IgY29uc3VtZXJzIHRvIHVzZS5cbi8vIEJlIHZlcnkgY2FyZWZ1bCBtYWtpbmcgYW55IHVwZGF0ZXMgdG8gdGhpcyBjb250cmFjdCB3aGljaCBicmVhayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgTUVTU0FHSU5HX1ZFUlNJT04gPSB7XG4gIG1ham9yOiAxLFxuICBtaW5vcjogMCxcbiAgZml4OiAwLFxufTtcbiIsImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9FbnVtcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVHlwZUNvbnZlcnRlciB7XG4gIHByaXZhdGUgc3RhdGljIGlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBQcmlvciB0byBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyBjb21lIHRvIHVzIGFzXG4gICAgLy8gJyVudWxsJScsICclYWxsJScsICcld2lsZGNhcmQlJywgJyVtaXNzaW5nJScuLi5cbiAgICAvLyBXaGlsZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIHRydWUgZm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29udmVyc2lvbixcbiAgICAvLyBpdCBpcyBhcyBjaGVhcCBhcyBwYXNzaW5nIGFyb3VuZCBhIHZlcnNpb24gYW5kIGNoZWNraW5nIHRoYXQuXG4gICAgLy8gKFNlZSBEYXRhVmFsdWVGb3JtYXR0ZXIuY3BwKVxuXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcubGVuZ3RoID4gMiAmJiB2YWx1ZUFzU3RyaW5nWzBdID09PSAnJScgJiYgdmFsdWVBc1N0cmluZ1t2YWx1ZUFzU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnJScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzcGVjaWFsVmFsdWVJbmRpY2F0b3IgPSAnJW51bGwlJztcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlQm9vbGVhbihib29sZWFuU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHtcbiAgICAvLyBib29sZWFuIHZhbHVlcyBjb21lIHRvIHVzIGFzICd0cnVlJ3wnZmFsc2UnXG4gICAgY29uc3Qgbm9ybWFsaXplZEJvb2xlYW46IHN0cmluZyA9IGJvb2xlYW5TdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZEJvb2xlYW4gIT09ICd0cnVlJyAmJiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ2ZhbHNlJyA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogbm9ybWFsaXplZEJvb2xlYW4gPT09ICd0cnVlJztcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VOdW1iZXIodmFsdWVBc1N0cmluZzogc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcih2YWx1ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZShkYXRlQXNTdHJpbmc6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBOb3RlIHRoYXQgd2l0aG91dCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDXG4gICAgLy8gSW5wdXQgb2YgMjAyMC0wMy0yNSBpcyBwcmludGVkIGFzOiBNYXIgMjQgMjAyMCAxNzowMDowMCBHTVQtMDcwMFxuICAgIC8vIFRoaXMgbWF0Y2hlcyBzdHlsZSB1c2VkIGluIGV4aXN0aW5nIGNvbnZlcnRGaWx0ZXJWYWx1ZVByZXNNb2RlbFxuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZGF0ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGVUaW1lKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIFdpdGggYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQy5cbiAgICAvLyBPdXIgZGF0ZSBmb3JtYXQgaXMgYWx3YXlzOiB5eXl5LW1tLWRkIGhoOm1tOnNzXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgSUUxMSBjYW4ndCBwYXJzZSB0aGF0IGZvcm1hdCBzbyB3ZSBhZGQgYSBUIGJldHdlZW4gdGhlIGRheSBhbmQgdGltZS5cbiAgICAvLyBXZSBhbHNvIGFkZCBhIFogc28gdGhhdCBpdCBpcyBVVEMuIChXaXRob3V0IHRoZSBaLCBzb21lIGJyb3dzZXJzIGFzc3VtZSBsb2NhbCwgYW5kIG90aGVycyBVVEMpXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0ZVN0cmluZzogc3RyaW5nID0gZGF0ZUFzU3RyaW5nLnJlcGxhY2UoJyAnLCAnVCcpLmNvbmNhdCgnWicpO1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZm9ybWF0dGVkRGF0ZVN0cmluZyk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xuICB9XG5cbiAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZXJnZSB0aGlzIGFuZCB0aGUgbWV0aG9kIEZpbHRlckNvbnZlcnRlcjo6Y29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsIGluIGFwaS1wbGF0Zm9ybS1qc1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyBpcyBib3RoIERhdGFEaWN0aW9uYXJ5IGFuZCBTaG93RGF0YVRhYmxlUHJlc01vZGVsIGNvbXBhdGlibGUuXG4gICAgLy8gSW4gdGhlIERhdGFEaWN0aW9uYXJ5LCB2YWx1ZUFzU3RyaW5nIGNhbiBiZSAnJW51bGwlJyBvciAnJW1pc3NpbmclJywgd2hpbGUgaW5cbiAgICAvLyBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCB3ZSBjYW4gZ2V0ICdudWxsJyBvciAnbWlzc2luZycsIG9yICclbnVsbCUnIGZvciBzdHJpbmcgc3BlY2lhbCB2YWx1ZXMuXG4gICAgLy8gRm9yIGVpdGhlciBvZiB0aGVzZSBjYXNlcywgd2UgcmV0dXJuIHNwZWNpYWxWYWx1ZUluZGljYXRvciAob3IgdGhlIG9yaWdpbmFsIHNwZWNpYWwgc3RyaW5nKS5cbiAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbHR5LCB0aGlzIGNvbnZlcnRlcjpcbiAgICAvLyAxLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgc3BlY2lhbCB2YWx1ZXNcbiAgICAvLyAyLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgZGF0ZVxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggdmFsdWVzIGNhbiBiZSB1bmRlZmluZWQsIHNvIHJlc3VsdCBpcyBhbHNvIHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZUFzU3RyaW5nID09PSB1bmRlZmluZWQgfHwgdmFsdWVBc1N0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NwZWNpYWwodmFsdWVBc1N0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJvb2xlYW4odmFsdWVBc1N0cmluZyk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgLy8gUmV0dXJuIHNwZWNpYWwgdmFsdWUgJyVudWxsJScgZm9yIGFueSBmYWlsdXJlIGluIHBhcnNpbmcuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgd2lsbCBnaXZlIHVzIHN0cmluZ3MgbGlrZSAnbnVsbCdcbiAgICAgICAgLy8gZm9yIHNwZWNpYWwgdmFsdWVzLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAvLyBGb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgd2lsbCBiZSBcIm51bGxcIiB3aGljaCB3aWxsIGZhaWwgdG8gcGFyc2UuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuICclbnVsbCUnLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWVBc1N0cmluZykgPT09IG51bGwgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlQXNTdHJpbmc7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJSdcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlVGltZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWVBc1N0cmluZztcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBjb252ZXJ0cyBmcm9tIG91ciAxLjIgQVBJIHRoYXQgcmV0dXJucyBzdHJpbmdzIGZvciBzcGVjaWFscywgYW5kIGRhdGVzIGFzIHN0cmluZ3MuXG4gICAgLy8gSXQgdGFrZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiAnJW51bGwlJyBhbmQgcmV0dXJucyBhIG51bGwuXG4gICAgLy8gRm9yIGRhdGVzLCBpdCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcuXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBzaG91bGQgYmUgdXNlZCB0byBidWlsZCBhIERhdGFWYWx1ZS5uYXRpdmVWYWx1ZSBmaWVsZC5cblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IGNhbiBiZSB1bmRlZmluZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG5hdGl2ZVZhbHVlIGlzIHRyZWF0ZWQgbGlrZSBhIHNwZWNpYWxcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBEYXRlIG9iamVjdCAob3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzIC4uLiB3ZSBhc3N1bWUgc3BlY2lhbClcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3BlY2lhbCh2YWx1ZSkgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3BhdGlhbDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGRpcmVjdGx5IHRvIG5hdGl2ZSB2YWx1ZSBmb3IgYWxsIHR5cGVzXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh0aGlzLmNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZSwgdHlwZSksIHR5cGUpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBFeHRlbnNpb25Db250ZXh0IHtcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgU2VydmVyID0gJ3NlcnZlcicsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgVmlld2luZyA9ICd2aWV3aW5nJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gQW5ub3RhdGVFbnVtIHtcbiAgTWFyayA9ICdtYXJrJyxcbiAgUG9pbnQgPSAncG9pbnQnLFxuICBBcmVhID0gJ2FyZWEnLFxufVxuXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcbiAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG5leHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgQmxhbmsgPSAnYmxhbmsnLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgUXVpY2tGaWx0ZXIgPSAncXVpY2stZmlsdGVyJyxcbiAgUGFyYW1ldGVyQ29udHJvbCA9ICdwYXJhbWV0ZXItY29udHJvbCcsXG4gIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICBMZWdlbmQgPSAnbGVnZW5kJyxcbiAgVGl0bGUgPSAndGl0bGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBJbWFnZSA9ICdpbWFnZScsXG4gIFdlYlBhZ2UgPSAnd2ViLXBhZ2UnLFxuICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbn1cblxuZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgSW50ID0gJ2ludCcsXG4gIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgQm9vbCA9ICdib29sJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgU3BhdGlhbCA9ICdzcGF0aWFsJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICBXaW5kb3cgPSAnd2luZG93JyxcbiAgTW9kYWwgPSAnbW9kYWwnLFxuICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG59XG5cbmV4cG9ydCBlbnVtIEVuY29kZWREYXRhVHlwZSB7XG4gIE51bWJlciA9ICdudW1iZXInLFxuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgQm9vbGVhbiA9ICdib29sZWFuJyxcbn1cblxuZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gIElOSVRJQUxJWkFUSU9OX0VSUk9SID0gJ2luaXRpYWxpemF0aW9uLWVycm9yJyxcbiAgSU5URVJOQUxfRVJST1IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICBNSVNTSU5HX0VOVU1fTUFQUElORyA9ICdtaXNzaW5nLWVudW0tbWFwcGluZycsXG4gIE1JU1NJTkdfUEFSQU1FVEVSID0gJ21pc3NpbmctcGFyYW1ldGVyJyxcbiAgUEVSTUlTU0lPTl9ERU5JRUQgPSAncGVybWlzc2lvbi1kZW5pZWQnLFxuICBQUkVTX01PREVMX1BBUlNJTkdfRVJST1IgPSAncHJlcy1tb2RlbC1wYXJzaW5nLWVycm9yJyxcbiAgVkVSU0lPTl9OT1RfQ09ORklHVVJFRCA9ICd2ZXJzaW9uLW5vdC1jb25maWd1cmVkJyxcbiAgVklTSUJJTElUWV9FUlJPUiA9ICd2aXNpYmlsaXR5LWVycm9yJyxcbiAgVU5LTk9XTl9WRVJCX0lEID0gJ3Vua25vd24tdmVyYi1pZCcsXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgU3VtID0gJ3N1bScsXG4gIEF2ZyA9ICdhdmcnLFxuICBNaW4gPSAnbWluJyxcbiAgTWF4ID0gJ21heCcsXG4gIFN0ZGV2ID0gJ3N0ZGV2JyxcbiAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gIFZhciA9ICd2YXInLFxuICBWYXJwID0gJ3ZhcnAnLFxuICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICBDb3VudCA9ICdjb3VudCcsXG4gIENvdW50ZCA9ICdjb3VudGQnLFxuICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgQXR0ciA9ICdhdHRyJyxcbiAgTm9uZSA9ICdub25lJyxcbiAgWWVhciA9ICd5ZWFyJyxcbiAgUXRyID0gJ3F0cicsXG4gIE1vbnRoID0gJ21vbnRoJyxcbiAgRGF5ID0gJ2RheScsXG4gIEhvdXIgPSAnaG91cicsXG4gIE1pbnV0ZSA9ICdtaW51dGUnLFxuICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgV2VlayA9ICd3ZWVrJyxcbiAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICBNZHkgPSAnbWR5JyxcbiAgRW5kID0gJ2VuZCcsXG4gIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICBRdWFydDEgPSAncXVhcnQxJyxcbiAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICBJbk91dCA9ICdpbi1vdXQnLFxuICBVc2VyID0gJ3VzZXInLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZFJvbGVUeXBlIHtcbiAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gIE1lYXN1cmUgPSAnbWVhc3VyZScsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbi8qKlxuICogIFRoZSBkaWZmZXJlbnQgdXBkYXRlIHR5cGVzIGZvciBhcHBseWluZyBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlclVwZGF0ZVR5cGUge1xuICBBZGQgPSAnYWRkJyxcbiAgQWxsID0gJ2FsbCcsXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG4gIFJlbW92ZSA9ICdyZW1vdmUnLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFR5cGUge1xuICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgU3RvcnkgPSAnc3RvcnknLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0Jyxcbn1cblxuZXhwb3J0IGVudW0gRG9tYWluUmVzdHJpY3Rpb25UeXBlIHtcbiAgQWxsID0gJ2FsbCcsXG4gIExpc3QgPSAnbGlzdCcsXG4gIFJhbmdlID0gJ3JhbmdlJyxcbn1cblxuZXhwb3J0IGVudW0gRGF0ZVN0ZXBQZXJpb2Qge1xuICBZZWFycyA9ICd5ZWFycycsXG4gIFF1YXJ0ZXJzID0gJ3F1YXJ0ZXJzJyxcbiAgTW9udGhzID0gJ21vbnRocycsXG4gIFdlZWtzID0gJ3dlZWtzJyxcbiAgRGF5cyA9ICdkYXlzJyxcbiAgSG91cnMgPSAnaG91cnMnLFxuICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICBTZWNvbmRzID0gJ3NlY29uZHMnLFxufVxuXG4vKipcbiAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZy5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gIE51bGxWYWx1ZXMgPSAnbnVsbHZhbHVlcycsXG4gIE5vbk51bGxWYWx1ZXMgPSAnbm9ubnVsbHZhbHVlcycsXG4gIEFsbFZhbHVlcyA9ICdhbGx2YWx1ZXMnLFxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGZpbHRlciBkb21haW5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyRG9tYWluVHlwZSB7XG4gIFJlbGV2YW50ID0gJ3JlbGV2YW50JyxcbiAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdGlvbiB0eXBlIGZvciBzZWxlY3QgbWFya3MgYXBpLlxuICovXG5leHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgUmVwbGFjZSA9ICdzZWxlY3QtcmVwbGFjZScsXG4gIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBzZWxlY3QgdHVwbGVzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0T3B0aW9ucyB7XG4gIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICBUb2dnbGUgPSAnc2VsZWN0LW9wdGlvbnMtdG9nZ2xlJyxcbiAgTWVudSA9ICdzZWxlY3Qtb3B0aW9ucy1tZW51JywgLy8gbm90IGltcGxlbWVudGVkIGluIHRoZSBleHRlcm5hbCBjb250cmFjdFxuICBSYW5nZSA9ICdzZWxlY3Qtb3B0aW9ucy1yYW5nZScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgU2VhcmNoID0gJ3NlbGVjdC1vcHRpb25zLXNlYXJjaCcsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3Rcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBpbmNsdWRlZCB2YWx1ZXMgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcyB7XG4gIEluY2x1ZGVOdWxsID0gJ2luY2x1ZGUtbnVsbCcsXG4gIEluY2x1ZGVOb25OdWxsID0gJ2luY2x1ZGUtbm9uLW51bGwnLFxuICBJbmNsdWRlQWxsID0gJ2luY2x1ZGUtYWxsJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIGEgaGllcmFyY2hpY2FsIGxldmVsIHNlbGVjdGlvbiBzdGF0ZS5cbiAqL1xuZXhwb3J0IGVudW0gSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gIEFsbFNlbGVjdGVkID0gJ2FsbC1zZWxlY3RlZCcsXG4gIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgU29tZVNlbGVjdGVkID0gJ3NvbWUtc2VsZWN0ZWQnLFxuICBVbmtub3duU2VsZWN0ZWQgPSAndW5rbm93bi1zZWxlY3RlZCcsXG59XG5cbi8qKlxuICogVHlwZSBvZiBtYXJrIGZvciBhIGdpdmVuIG1hcmtzIGNhcmQgaW4gYSB2aXouXG4gKi9cbmV4cG9ydCBlbnVtIE1hcmtUeXBlIHtcbiAgQmFyID0gJ2JhcicsXG4gIExpbmUgPSAnbGluZScsXG4gIEFyZWEgPSAnYXJlYScsXG4gIFNxdWFyZSA9ICdzcXVhcmUnLFxuICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBNYXAgPSAnbWFwJyxcbiAgUGllID0gJ3BpZScsXG4gIEdhbnR0QmFyID0gJ2dhbnR0LWJhcicsXG4gIFBvbHlnb24gPSAncG9seWdvbicsXG4gIEhlYXRtYXAgPSAnaGVhdG1hcCcsXG4gIFZpekV4dGVuc2lvbiA9ICd2aXotZXh0ZW5zaW9uJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGZpbHRlclxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgQ2F0ZWdvcmljYWwgPSAnY2F0ZWdvcmljYWwnLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZURhdGUnLFxuICBIaWVyYXJjaGljYWwgPSAnaGllcmFyY2hpY2FsJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBEYXRlUmFuZ2VUeXBlIG9mIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZVJhbmdlVHlwZSB7XG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGxhc3QgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0ID0gJ2xhc3QnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0TiA9ICdsYXN0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIG5leHQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0ID0gJ25leHQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0TiA9ICduZXh0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBDdXJyZW50ID0gJ2N1cnJlbnQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIGV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY3VycmVudCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIFRvRGF0ZSA9ICd0b0RhdGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsYXVuY2hpbmcgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICovXG5leHBvcnQgZW51bSBFeHRlbnNpb25EaWFsb2dSZXN1bHQge1xuICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgSW52YWxpZERvbWFpbiA9ICdpbnZhbGlkLWRvbWFpbicsXG4gIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG59XG5cbi8vIEVudW1lcmF0aW9uIGZvciBBcGlTaG93RGF0YSB0YWJsZSBpZCBzZW50aW5lbHMuXG5leHBvcnQgZW51bSBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwge1xuICAvLyBmaW5kIHRoZSBvbmUgbG9naWNhbCB0YWJsZSAtIHVzZWQgaW4gdmVyc2lvbiBjb21wYXRpYmlsaXR5IGNoZWNrIGZvciBnZXRVbmRlcmx5aW5nRGF0YVRhYmxlIGFuZCBnZXRMb2dpY2FsRGF0YVRhYmxlIGNvbW1hbmRzXG4gIFNpbmdsZVRhYmxlSWQgPSAnc2luZ2xlLXRhYmxlLWlkLXNlbnRpbmVsJyxcbiAgU2luZ2xlVGFibGVDYXB0aW9uID0gJ1NpbmdsZSB0YWJsZSBpZCBzZW50aW5lbCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBvcHRpbWl6ZSB0aGUgZ2V0U3VtbWFyeURhdGEvZ2V0VW5kZXJseWluZ1RhYmxlRGF0YSByZXN1bHRzXG4gKiBNYXBwZWQgZnJvbSBleHRlcm5hbCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvblxuICovXG5leHBvcnQgZW51bSBBcGlTaG93RGF0YVRhYmxlRm9ybWF0IHtcbiAgTmF0aXZlVmFsdWVzT25seSA9ICduYXRpdmUtdmFsdWVzLW9ubHknLFxuICBGb3JtYXR0ZWRWYWx1ZXNPbmx5ID0gJ2Zvcm1hdHRlZC12YWx1ZXMtb25seScsXG4gIE5hdGl2ZUFuZEZvcm1hdHRlZFZhbHVlcyA9ICduYXRpdmUtYW5kLWZvcm1hdHRlZC12YWx1ZXMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gZGVub3RlIHRoZSBzZWN0aW9ucyBvZiBmb3JtYXR0aW5nIHdpdGhpbiB0YWJsZWF1XG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIENsYXNzTmFtZUtleSB7XG4gIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgV29ya3NoZWV0ID0gJ3RhYmxlYXUtd29ya3NoZWV0JyxcbiAgVG9vbHRpcCA9ICd0YWJsZWF1LXRvb2x0aXAnLFxuICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICBEYXNoYm9hcmRUaXRsZSA9ICd0YWJsZWF1LWRhc2hib2FyZC10aXRsZScsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgcGFnZSBzaXplIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTaXplT3B0aW9uIHtcbiAgTGV0dGVyID0gJ2xldHRlcicsXG4gIExlZ2FsID0gJ2xlZ2FsJyxcbiAgTm90ZSA9ICdub3RlJyxcbiAgRm9saW8gPSAnZm9saW8nLFxuICBUYWJsb2lkID0gJ3RhYmxvaWQnLFxuICBMZWRnZXIgPSAnbGVkZ2VyJyxcbiAgU3RhdGVtZW50ID0gJ3N0YXRlbWVudCcsXG4gIEV4ZWN1dGl2ZSA9ICdleGVjdXRpdmUnLFxuICBBMyA9ICdhMycsXG4gIEE0ID0gJ2E0JyxcbiAgQTUgPSAnYTUnLFxuICBCNCA9ICdiNCcsXG4gIEI1ID0gJ2I1JyxcbiAgUXVhcnRvID0gJ3F1YXJ0bycsXG4gIFVuc3BlY2lmaWVkID0gJ3Vuc3BlY2lmaWVkJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIHNldCB0aGUgcGFnZSBvcmllbnRhdGlvbiBtb2RlIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VPcmllbnRhdGlvbiB7XG4gIFByaW50ZXIgPSAncHJpbnRlcicsXG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgc2NhbGUgbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBTY2FsZU1vZGUge1xuICBTY2FsZUF1dG8gPSAnYXV0bycsXG4gIFNjYWxlUGVyY2VudGFnZSA9ICdwZXJjZW50JyxcbiAgU2NhbGVGaXRQYWdlcyA9ICdmaXQtcGFnZXMnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgcGVyY2VudCB2YWx1ZXNcbiAqL1xuZXhwb3J0IGVudW0gUGFnZVNjYWxpbmdPcHRpb24ge1xuICBTY2FsZVBjdEF1dG8gPSAnYXV0bycsXG4gIFNjYWxlUGN0NDAwID0gJ3BjdDQwMCcsXG4gIFNjYWxlUGN0MjAwID0gJ3BjdDIwMCcsXG4gIFNjYWxlUGN0MTAwID0gJ3BjdDEwMCcsXG4gIFNjYWxlUGN0OTAgPSAncGN0OTAnLFxuICBTY2FsZVBjdDgwID0gJ3BjdDgwJyxcbiAgU2NhbGVQY3Q3NSA9ICdwY3Q3NScsXG4gIFNjYWxlUGN0NjAgPSAncGN0NjAnLFxuICBTY2FsZVBjdDUwID0gJ3BjdDUwJyxcbiAgU2NhbGVQY3QyNSA9ICdwY3QyNScsXG59XG5cbi8qKlxuICogVXNlZCBieSBzZXRGaXRBbmRTY2FsZVZhbHVlcyB0byBzY2FsZSBmaXQgcGFnZSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGVudW0gRml0UGFnZXMge1xuICBGaXRPbmVIaWdoID0gJ2ZpdDB4MScsXG4gIEZpdFR3b0hpZ2ggPSAnZml0MHgyJyxcbiAgRml0T25lV2lkZSA9ICdmaXQxeDAnLFxuICBGaXRUd29XaWRlID0gJ2ZpdDJ4MCcsXG59XG5cbi8qKlxuICogVXNlZCBieSBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmNcbiAqL1xuZXhwb3J0IGVudW0gRW5jb2RpbmdUeXBlIHtcbiAgQ29sb3IgPSAnY29sb3InLFxuICBTaXplID0gJ3NpemUnLFxuICBMYWJlbCA9ICdsYWJlbCcsXG4gIERldGFpbCA9ICdkZXRhaWwnLFxuICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICBTaGFwZSA9ICdzaGFwZScsXG4gIFBhdGggPSAncGF0aCcsXG4gIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgR2VvbWV0cnkgPSAnZ2VvbWV0cnknLFxuICBDdXN0b20gPSAnY3VzdG9tJyxcbn1cbiIsImV4cG9ydCBlbnVtIE5vdGlmaWNhdGlvbklkIHtcbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51Q2xpY2tlZCA9ICdjdXN0b20tbWFyay1jb250ZXh0LW1lbnUtY2xpY2tlZCcsXG4gIENvbnRleHRNZW51Q2xpY2sgPSAnY29udGV4dC1tZW51LWNsaWNrJyxcbiAgQ3VzdG9tVmlld1JlbW92ZWQgPSAnY3VzdG9tLXZpZXctcmVtb3ZlZCcsXG4gIEN1c3RvbVZpZXdTYXZlZCA9ICdjdXN0b20tdmlldy1zYXZlZCcsXG4gIEN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ2N1c3RvbS12aWV3LXNldC1kZWZhdWx0JyxcbiAgQ3VzdG9tVmlld3NMb2FkZWQgPSAnY3VzdG9tLXZpZXdzLWxvYWRlZCcsXG4gIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcbiAgRWRpdEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1idXR0b24tY2xpY2tlZCcsXG4gIEVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ2VkaXQtaW4tZGVza3RvcC1idXR0b24tY2xpY2tlZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSA9ICdleHRlbnNpb24tZGlhbG9nLXVwZGF0ZScsXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyLWNoYW5nZWQnLFxuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdC12aXotc2l6ZS1rbm93bicsXG4gIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyLWNoYW5nZWQnLFxuICBTZWxlY3RlZE1hcmtzQ2hhbmdlZCA9ICdzZWxlY3RlZC1tYXJrcy1jaGFuZ2VkJyxcbiAgU2V0dGluZ3NDaGFuZ2VkID0gJ3NldHRpbmdzLWNoYW5nZWQnLFxuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeS1kYXRhLWNoYW5nZWQnLFxuICBUZXN0Q29udmVyc2lvbk5vdGlmaWNhdGlvbiA9ICd0ZXN0LWNvbnZlcnNpb24tbm90aWZpY2F0aW9uJyxcbiAgVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICd0b29sYmFyLXN0YXRlLWNoYW5nZWQnLFxuICBWaXpJbnRlcmFjdGl2ZSA9ICd2aXotaW50ZXJhY3RpdmUnLFxuICBBc2tEYXRhSW50ZXJhY3RpdmUgPSAnYXNrLWRhdGEtaW50ZXJhY3RpdmUnLFxuICBXb3JrYm9va1JlYWR5VG9DbG9zZSA9ICd3b3JrYm9vay1yZWFkeS10by1jbG9zZScsXG4gIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgV29ya2Jvb2tQdWJsaXNoZWQgPSAnd29ya2Jvb2stcHVibGlzaGVkJyxcbiAgV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICd3b3JrYm9vay1wdWJsaXNoZWQtYXMnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwID0gJ2V4cG9ydC1jcm9zc3RhYi1zaGVldC1tYXAnLFxuICBFeHBvcnRGaWxlID0gJ2V4cG9ydC1maWxlJyxcbiAgRXhwb3J0T3JpZ2luVXJsID0gJ2V4cG9ydC1vcmlnaW4tdXJsJyxcbiAgRXhwb3J0UGRmT3B0aW9ucyA9ICdleHBvcnQtcGRmLW9wdGlvbnMnLFxuICBFeHRlbnNpb25Cb290c3RyYXBJbmZvID0gJ2V4dGVuc2lvbi1ib290c3RyYXAtaW5mbycsXG4gIEV4dGVuc2lvbkNvbnRleHRNZW51SWRzID0gJ2V4dGVuc2lvbi1jb250ZXh0LW1lbnUtaWRzJyxcbiAgRXh0ZW5zaW9uRGlhbG9nSCA9ICdleHRlbnNpb24tZGlhbG9nLWhlaWdodCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1BheWxvYWQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1wYXlsb2FkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0ID0gJ2V4dGVuc2lvbi1kaWFsb2ctcmVzdWx0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nU3R5bGUgPSAnZXh0ZW5zaW9uLWRpYWxvZy1zdHlsZScsXG4gIEV4dGVuc2lvbkRpYWxvZ1VybCA9ICdleHRlbnNpb24tZGlhbG9nLXVybCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1cgPSAnZXh0ZW5zaW9uLWRpYWxvZy13aWR0aCcsXG4gIEV4dGVuc2lvbkxvY2F0b3IgPSAnZXh0ZW5zaW9uLWxvY2F0b3InLFxuICBFeHRlbnNpb25TZXR0aW5nc0luZm8gPSAnZXh0ZW5zaW9uLXNldHRpbmdzLWluZm8nLFxuICBFeHRlbnNpb25ab25lSWQgPSAnZXh0ZW5zaW9uLXpvbmUtaWQnLFxuICBFeHRlcm5hbE1lbnVEZXNjcmlwdGlvbiA9ICdleHRlcm5hbC1tZW51LWRlc2NyaXB0aW9uJyxcbiAgRXh0ZXJuYWxNZW51SGVhZGVyID0gJ2V4dGVybmFsLW1lbnUtaGVhZGVyJyxcbiAgRXh0ZXJuYWxNZW51SXRlbURpc3BsYXlOYW1lID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1kaXNwbGF5LW5hbWUnLFxuICBFeHRlcm5hbE1lbnVJdGVtSWQgPSAnZXh0ZXJuYWwtbWVudS1pdGVtLWlkJyxcblxuICBGaWVsZCA9ICdmaWVsZCcsXG4gIEZpZWxkSWQgPSAnZmllbGQtaWQnLFxuICBGaWVsZE5hbWUgPSAnZmllbGQtbmFtZScsXG4gIEZpbHRlckxldmVscyA9ICdmaWx0ZXItbGV2ZWxzJyxcbiAgRmlsdGVyUmFuZ2VNYXggPSAnZmlsdGVyLXJhbmdlLW1heCcsXG4gIEZpbHRlclJhbmdlTWluID0gJ2ZpbHRlci1yYW5nZS1taW4nLFxuICBGaWx0ZXJSYW5nZU51bGxPcHRpb24gPSAnZmlsdGVyLXJhbmdlLW51bGwtb3B0aW9uJyxcbiAgRmlsdGVyVXBkYXRlVHlwZSA9ICdmaWx0ZXItdXBkYXRlLXR5cGUnLFxuICBGaWx0ZXJWYWx1ZXMgPSAnZmlsdGVyLXZhbHVlcycsXG4gIEZvbnROYW1lTGlzdEl0ZW1zID0gJ2ZvbnQtbmFtZS1saXN0LWl0ZW1zJyxcbiAgRm9ybWF0dGVkVGV4dCA9ICdmb3JtYXR0ZWQtdGV4dCcsXG4gIEZ1bmN0aW9uTmFtZSA9ICdmdW5jdGlvbi1uYW1lJyxcblxuICBIaWVyVmFsU2VsZWN0aW9uTW9kZWxzID0gJ2hpZXJhcmNoaWNhbFZhbHVlU2VsZWN0aW9uTW9kZWxzJyxcbiAgSGlnaGxpZ2h0ZWREYXRhID0gJ2hpZ2hsaWdodGVkLWRhdGEnLFxuICBIb3ZlclR1cGxlSW50ZXJhY3Rpb24gPSAnaG92ZXItdHVwbGUtaW50ZXJhY3Rpb24nLFxuXG4gIElnbm9yZUFsaWFzZXMgPSAnaWdub3JlLWFsaWFzZXMnLFxuICBJZ25vcmVTZWxlY3Rpb24gPSAnaWdub3JlLXNlbGVjdGlvbicsXG4gIEluY2x1ZGVBbGxDb2x1bW5zID0gJ2luY2x1ZGUtYWxsLWNvbHVtbnMnLFxuICBJbnZhbGlkQWdnRmllbGROYW1lID0gJ2ludmFsaWQtYWdnLWZpZWxkLW5hbWUnLFxuICBJbnZhbGlkRGF0ZXMgPSAnaW52YWxpZC1kYXRlcycsXG4gIEludmFsaWRGaWVsZENhcHRpb24gPSAnaW52YWxpZC1maWVsZC1jYXB0aW9uJyxcbiAgSW52YWxpZEZpZWxkcyA9ICdpbnZhbGlkLWZpZWxkcycsXG4gIEludmFsaWRWYWx1ZXMgPSAnaW52YWxpZC12YWx1ZXMnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXhIZWlnaHQgPSAnbWF4LWhlaWdodCcsXG4gIE1heFJvd3MgPSAnbWF4LXJvd3MnLFxuICBNYXhXaWR0aCA9ICdtYXgtd2lkdGgnLFxuICBNaW5IZWlnaHQgPSAnbWluLWhlaWdodCcsXG4gIE1pbldpZHRoID0gJ21pbi13aWR0aCcsXG5cbiAgUGFnZVJvd0NvdW50ID0gJ3BhZ2Utcm93LWNvdW50JyxcbiAgUGFyYW1ldGVyQ2FwdGlvbiA9ICdwYXJlbWV0ZXItY2FwdGlvbicsXG4gIFBhcmFtZXRlckVycm9yID0gJ3BhcmFtZXRlci1lcnJvcicsXG4gIFBhcmFtZXRlckZpZWxkTmFtZSA9ICdwYXJhbWV0ZXItZmllbGQtbmFtZScsXG4gIFBhcmFtZXRlckluZm8gPSAncGFyYW1ldGVyLWluZm8nLFxuICBQYXJhbWV0ZXJJbmZvcyA9ICdwYXJhbWV0ZXItaW5mb3MnLFxuICBQYXJhbWV0ZXJWYWx1ZSA9ICdwYXJhbWV0ZXItdmFsdWUnLFxuICBQZXJpb2RUeXBlID0gJ3BlcmlvZC10eXBlJyxcblxuICBRdWFudGl0YXRpdmVEb21haW4gPSAncXVhbnRpdGF0aXZlLWRtYWluJyxcbiAgUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVscyA9ICdxdWFudGF0aXZlUmFuZ2VTZWxlY3Rpb25Nb2RlbHMnLFxuXG4gIFJhbmdlTiA9ICdyYW5nZS1uJyxcbiAgUmVwbGF5U3BlZWQgPSAncmVwbGF5LXNwZWVkJyxcblxuICBTZWxlY3RlZERhdGEgPSAnc2VsZWN0ZWQtZGF0YScsXG4gIFNlbGVjdGVkU2hlZXROYW1lcyA9ICdzZWxlY3RlZC1zaGVldC1uYW1lcycsXG4gIFNlbGVjdGlvbiA9ICdzZWxlY3Rpb24nLFxuICBTZWxlY3Rpb25MaXN0ID0gJ3NlbGVjdGlvbi1saXN0JyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSA9ICdzZWxlY3Rpb25VcGRhdGVUeXBlJyxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24gPSAnc2VsZWN0LXR1cGxlcy1pbnRlcmFjdGlvbicsXG4gIFNlbmROb3RpZmljYXRpb25zID0gJ3NlbmQtbm90aWZpY2F0aW9ucycsXG4gIFNldHRpbmdzVmFsdWVzID0gJ3NldHRpbmdzLXZhbHVlcycsXG4gIFNoYXJlZEZpbHRlclNoZWV0cyA9ICdzaGFyZWQtZmlsdGVyLXNoZWV0cycsXG4gIFNoYXJlZEZpbHRlcnNJbmZvID0gJ3NoYXJlZC1maWx0ZXJzLWluZm8nLFxuICBTaGVldElkZW50aWZpZXIgPSAnc2hlZXQtaWRlbnRpZmllcicsXG4gIFNoZWV0TmFtZSA9ICdzaGVldC1uYW1lJyxcbiAgU2hlZXRQYXRoID0gJ3NoZWV0LXBhdGgnLFxuICBTaG91bGRSZWZyZXNoRFMgPSAnc2hvdWxkLXJlZnJlc2gtZHMnLFxuICBTaG93RGF0YVRhYmxlRm9ybWF0ID0gJ3Nob3ctZGF0YS10YWJsZS1mb3JtYXQnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb29sdGlwQ29udGV4dCA9ICd0b29sdGlwLWNvbnRleHQnLFxuICBUb29sdGlwVGV4dFJlcXVlc3QgPSAndG9vbHRpcC10ZXh0LXJlcXVlc3QnLFxuICBUb29sdGlwVGV4dCA9ICd0b29sdGlwLXRleHQnLFxuXG4gIFVuZGVybHlpbmdEYXRhVGFibGUgPSAndW5kZXJseWluZy1kYXRhLXRhYmxlJyxcbiAgVW5kZXJseWluZ1N1bW1hcnlEYXRhVGFibGUgPSAndW5kZXJseWluZy1zdW1tYXJ5LWRhdGEtdGFibGUnLFxuICBVcmwgPSAndXJsJyxcbiAgVXNlVGFiRGVsaW1pdGVycyA9ICd1c2UtdGFiLWRlbGltaXRlcnMnLFxuXG4gIFZpZXdEYXRhVGFibGVDYWNoZUlkID0gJ3ZpZXctZGF0YS10YWJsZS1jYWNoZS1pZCcsXG4gIFZpZXdEYXRhVGFibGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtaWQnLFxuICBWaXN1YWxJZCA9ICd2aXN1YWwtaWQnLFxuICBWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ3Zpc3VhbC1zcGVjaWZpY2F0aW9uJyxcbiAgVml6QVBJSW5wdXRKc29uID0gJ3ZpemFwaS1pbnB1dC1qc29uJyxcbiAgVml6QVBJU3RhdGVXaXRoRGF0YU1vZGVsID0gJ3ZpemFwaS1zdGF0ZS13aXRoLWRhdGEtbW9kZWwnLFxuICBWaXpBUElTdGF0ZVdhcm5pbmdNc2cgPSAndml6YXBpLXN0YXRlLXdhcm5pbmctbXNnJyxcbiAgVml6QVBJU1ZHID0gJ3ZpemFwaS1zdmcnLFxuXG4gIFdvcmtzaGVldE5hbWUgPSAnd29ya3NoZWV0LW5hbWUnLFxuICBXb3Jrc2hlZXRGaWx0ZXJzID0gJ3dvcmtzaGVldC1maWx0ZXJzJyxcblxuICBab25lSWRzVmlzaWJpbGl0eU1hcCA9ICd6b25lLWlkcy12aXNpYmlsaXR5LW1hcCcsXG59XG4iLCIvLyBEZWNsYXJlIHRoaXMga2V5IHR5cGUgYW5kIGV4cG9ydCB0aGUgTm90aWZpY2F0aW9uSWQgdG8gbWFrZSB0aGlzIGJlaGF2ZSBsaWtlIGEgc3RyaW5nIGVudW0uXG4vL1xuLy8gUExFQVNFIEtFRVAgSU4gQUxQSEFCRVRJQ0FMIE9SREVSLiBUaGlzIGhlbHBzIHdpdGggdmlzdWFsbHkgZmluZGluZyBlbnRyaWVzLCBrbm93aW5nIHdoZXJlIHRvIHB1dFxuLy8gbmV3IG9uZXMsIGFuZCBtZXJnZSBjb25mbGljdHMuXG5leHBvcnQgZW51bSBWZXJiSWQge1xuICBBY3RpdmF0ZU5leHRTdG9yeVBvaW50ID0gJ2FjdGl2YXRlLW5leHQtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1wcmV2aW91cy1zdG9yeS1wb2ludCcsXG4gIEFjdGl2YXRlU2hlZXQgPSAnYWN0aXZhdGVTaGVldCcsXG4gIEFjdGl2YXRlU3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1zdG9yeS1wb2ludCcsXG4gIEFwcGVuZEV4dGVybmFsTWVudUl0ZW0gPSAnYXBwZW5kLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIEFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXIgPSAnY2F0ZWdvcmljYWwtZmlsdGVyJyxcbiAgQXBwbHlSYW5nZUZpbHRlciA9ICdyYW5nZS1maWx0ZXInLFxuICBBcHBseVJlbGF0aXZlRGF0ZUZpbHRlciA9ICdhcHBseS1yZWxhdGl2ZS1kYXRlLUZpbHRlcicsXG4gIEF1dGhlbnRpY2F0ZSA9ICdhdXRoZW50aWNhdGUnLFxuXG4gIEJsb2NrRXh0ZW5zaW9uID0gJ2Jsb2NrLWV4dGVuc2lvbicsXG5cbiAgQ2hhbmdlUGFyYW1ldGVyVmFsdWUgPSAnY2hhbmdlLXBhcmFtZXRlci12YWx1ZScsXG4gIENoYW5nZVNoYXJlZEZpbHRlciA9ICdjaGFuZ2Utc2hhcmVkLWZpbHRlcicsXG4gIENsZWFyRmlsdGVyID0gJ2NsZWFyLWZpbHRlcicsXG4gIENsZWFyU2VsZWN0ZWRNYXJrcyA9ICdjbGVhci1zZWxlY3RlZC1tYXJrcycsXG4gIENsb3NlRGlhbG9nID0gJ2Nsb3NlLWRpYWxvZycsXG4gIENyZWF0ZUFubm90YXRpb24gPSAnY3JlYXRlLWFubm90YXRpb24nLFxuXG4gIERhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyID0gJ2Rhc2hib2FyZC1jYXRlZ29yaWNhbC1maWx0ZXInLFxuICBEaXNwbGF5RGlhbG9nID0gJ2Rpc3BsYXktZGlhbG9nJyxcbiAgRG93bmxvYWRXb3JrYm9vayA9ICdkb3dubG9hZC13b3JrYm9vaycsXG5cbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRSYW5nZURvbWFpbiA9ICdnZXQtcmFuZ2UtZG9tYWluJyxcbiAgR2V0U2VsZWN0ZWRNYXJrcyA9ICdnZXQtc2VsZWN0ZWQtbWFya3MnLFxuICBHZXRTaGFyZWRGaWx0ZXIgPSAnZ2V0LXNoYXJlZC1maWx0ZXInLFxuICBHZXRUb29sdGlwVGV4dCA9ICdnZXQtdG9vbHRpcC10ZXh0JyxcbiAgR2V0VW5kZXJseWluZ0RhdGEgPSAnZ2V0LXVuZGVybHlpbmctZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGEgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRVbmRlcmx5aW5nVGFibGVzID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlcycsXG5cbiAgSGllcmFyY2hpY2FsRmlsdGVyID0gJ2hpZXJhY2hpY2FsLWZpbHRlcicsXG5cbiAgSW5pdGlhbGl6ZUV4dGVuc2lvbiA9ICdpbml0aWFsaXplLWV4dGVuc2lvbicsXG5cbiAgTW92ZUFuZFJlc2l6ZVpvbmVzID0gJ21vdmUtYW5kLXJlc2l6ZS16b25lcycsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmV2ZXJ0U3RvcnlQb2ludCA9ICdyZXZlcnQtc3RvcnktcG9pbnQnLFxuICBSZXZlcnRXb3JrYm9vayA9ICdyZXZlcnQtd29ya2Jvb2snLFxuXG4gIFNhdmVFeHRlbnNpb25TZXR0aW5ncyA9ICdzYXZlLWV4dGVuc2lvbi1zZXR0aW5ncycsXG4gIFNhdmVXb3JrYm9va0FzQ3VzdG9tVmlldyA9ICdzYXZlLXdvcmtib29rLWFzLWN1c3RvbS12aWV3JyxcbiAgU2VsZWN0QnlWYWx1ZSA9ICdzZWxlY3QtYnktdmFsdWUnLFxuICBTZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0ID0gJ3NldC1hY3RpdmUtY3VzdG9tLXZpZXctYXMtZGVmYXVsdCcsXG4gIFNldEF1dG9VcGRhdGUgPSAnc2V0LWF1dG8tdXBkYXRlJyxcbiAgU2V0Q2xpY2tUaHJvdWdoID0gJ3NldC1jbGljay10aHJvdWdoJyxcbiAgU2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ3NldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgU2V0U2hlZXRTaXplID0gJ3NldC1zaGVldC1zaXplJyxcbiAgU2V0Wm9uZVZpc2liaWxpdHkgPSAnc2V0LXpvbmUtdmlzaWJpbGl0eScsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU2hvd0N1c3RvbVZpZXcgPSAnc2hvdy1jdXN0b20tdmlldycsXG5cbiAgVGVzdENvbnZlcnNpb25WZXJiID0gJ3Rlc3QtY29udmVyc2lvbi12ZXJiJyxcblxuICBVbmRvID0gJ3VuZG8nLFxuICBVcGRhdGVDdXN0b21WaWV3ID0gJ3VwZGF0ZS1jdXN0b20tdmlldycsXG5cbiAgVml6QVBJID0gJ3Zpei1hcGknLFxufVxuIiwiZXhwb3J0IGVudW0gQXNrRGF0YU9wdGlvbk5hbWVzIHtcbiAgdG9rZW4gPSAndG9rZW4nLFxuICBvcmlnaW4gPSAnb3JpZ2luJyxcbiAgc2hvd0VtYmVkID0gJ3Nob3dFbWJlZCcsXG4gIHNob3dQaW4gPSAnc2hvd1BpbicsXG4gIHNob3dTYXZlID0gJ3Nob3dTYXZlJyxcbiAgc2hvd1NoYXJlID0gJ3Nob3dTaGFyZScsXG4gIGRlYnVnID0gJzpqc2RlYnVnJyxcbiAgQXBpSUQgPSAnOmFwaUlEJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIEFza0RhdGFXZWJDb21wb25lbnQgPSAnOmFza0RhdGFXZWJDb21wb25lbnQnLFxufVxuIiwiZXhwb3J0IGVudW0gUHVsc2VPcHRpb25OYW1lcyB7XG4gIGVtYmVkID0gJ2VtYmVkJyxcbiAgdG9rZW4gPSAndG9rZW4nLFxuICBkaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlRXhwbG9yZUZpbHRlcicsXG4gIGxheW91dCA9ICdlbWJlZF9sYXlvdXQnLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgUHVsc2VXZWJDb21wb25lbnQgPSAnOnB1bHNlV2ViQ29tcG9uZW50Jyxcbn1cbiIsIi8qKlxuICogVGhlc2Ugc3RyaW5ncyB3ZXJlICptYW51YWxseSBjb3BpZWQqIGZyb20gdGhlIHNlcnZlcixcbiAqIHdvcmtncm91cC9zcmMvc2lsb3MvdGFibGVhdS1zZXJ2ZXIvbGlicmFyaWVzL3RhYi1jb250cm9sbGVyLXZpenFsL3NyYy9jb20vdGFibGVhdXNvZnR3YXJlL1xuICogY29udHJvbGxlci92aXpxbC9jb25zdGFudHMvUGFyYW1ldGVyS2V5cy5qYXZhI0w5XG4gKiBzaG91bGQgYmUgZXhwb3J0ZWQgaW5zdGVhZFxuICogcGFyYW1ldGVycyB0aGF0IHZpenFsIHdpbGwgYWNjZXB0IGluIGFuIGVtYmVkZGluZyBVUkxcbiAqKi9cbmVudW0gVnFsUGFyYW1ldGVyTmFtZXMge1xuICBPTkUgPSAnMScsXG4gIEFMRVJUUyA9ICc6YWxlcnRzJyxcbiAgQUxJQVMgPSAnYWxpYXMnLFxuICBBTExPV19ERUZFUlJFRF9CT09UU1RSQVAgPSAnOmFsbG93RGVmZXJyZWRCb290c3RyYXAnLFxuICBBTExPV19BVVRPR0VOX1dPUktTSEVFVF9QSE9ORV9MQVlPVVRTID0gJ2FsbG93QXV0b2dlbldvcmtzaGVldFBob25lTGF5b3V0cycsXG4gIEFQSV9JRCA9ICc6YXBpSUQnLFxuICBBUFAgPSAnOmFwcCcsXG4gIEFUVEFDSE1FTlQgPSAnYXR0YWNobWVudCcsXG4gIElTX0lQQURfQVBQID0gJ2FwcCcsXG4gIEFOSU1BVEVfVFJBTlNJVElPTiA9ICc6YW5pbWF0ZV90cmFuc2l0aW9uJyxcbiAgQVNDRU5ESU5HID0gJ2FzY2VuZGluZycsXG4gIEFVVEhFTlRJQ0FUSU9OID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQVRUUklCVVRFUyA9ICdhdHRyaWJ1dGVzJyxcbiAgQVVUSE9SSU5HX1NIRUVUID0gJzphdXRoU2hlZXQnLFxuICBBWElTID0gJ2F4aXMnLFxuICBCT09UU1RSQVBfV0hFTl9OT1RJRklFRCA9ICc6Ym9vdHN0cmFwV2hlbk5vdGlmaWVkJyxcbiAgQlJPV1NFUl9CQUNLX0JVVFRPTl9VTkRPID0gJzpicm93c2VyQmFja0J1dHRvblVuZG8nLFxuICBCUk9XU0VSX1JFTkRFUklOR19PTiA9ICdpc0Jyb3dzZXJSZW5kZXJpbmcnLFxuICBCUk9XU0VSX1JFTkRFUklOR19USFJFU0hPTEQgPSAnYnJvd3NlclJlbmRlcmluZ1RocmVzaG9sZCcsXG4gIENIQVJTRVQgPSAnY2hhcnNldCcsXG4gIENMSUVOVF9ESU1FTlNJT04gPSAnY2xpZW50RGltZW5zaW9uJyxcbiAgQ0xJRU5UX0lQID0gJ2NsaWVudF9pcCcsXG4gIENMSUVOVF9OVU0gPSAnY2xpZW50TnVtJyxcbiAgQ09MT05fRU1CRURERUQgPSAnOmVtYmVkZGVkJyxcbiAgQ09MT05fTU9CSUxFID0gJzptb2JpbGUnLFxuICBDT0xPTl9ERUVQX0xJTktJTkdfRElTQUJMRUQgPSAnOmRlZXBMaW5raW5nRGlzYWJsZWQnLFxuICBDT0xPTl9XQVRFUk1BUksgPSAnOndhdGVybWFyaycsXG4gIENPTU1FTlRTID0gJzpjb21tZW50cycsXG4gIENPTU1FTlRJTkdfRU5BQkxFRCA9ICc6Y29tbWVudGluZ0VuYWJsZWQnLFxuICBDT01NRU5USU5HX01FTlRJT05TX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdNZW50aW9ucycsXG4gIENPTk5FQ1RJT04gPSAnY29ubmVjdGlvbicsXG4gIENSRUFURURfQllfRkVBVFVSRSA9ICdjcmVhdGVkQnlGZWF0dXJlJyxcbiAgQ1JZUFRFRF9QQVNTV09SRCA9ICdjcnlwdGVkJyxcbiAgQ1NTREVCVUcgPSAnOmNzc2RlYnVnJyxcbiAgQ1NWID0gJ2NzdicsXG4gIENVU1RPTV9WSUVXUyA9ICc6Y3VzdG9tVmlld3MnLFxuICBDViA9ICc6Y3YnLFxuICBDVl9JRCA9ICdjdklkJyxcbiAgREFTSEJPQVJEX1BPUlRfU0laRSA9ICdkYXNoYm9hcmRQb3J0U2l6ZScsXG4gIERBVEFfREVUQUlMUyA9ICc6ZGF0YURldGFpbHMnLFxuICBEQVRBU09VUkNFID0gJ2RhdGFzb3VyY2UnLFxuICBERUJVRyA9ICc6ZGVidWcnLFxuICBERUxBWSA9ICc6ZGVsYXknLFxuICBERVBUSCA9ICdkZXB0aCcsXG4gIERFVklDRV9UWVBFID0gJzpkZXZpY2UnLFxuICBERVZJQ0VfUElYRUxfUkFUSU8gPSAnZGV2aWNlUGl4ZWxSYXRpbycsXG4gIERFVklDRV9QUkVWSUVXX01PREUgPSAnOmRldmljZXByZXZpZXdtb2RlJyxcbiAgRElNRU5TSU9OUyA9ICc6ZGltZW5zaW9ucycsXG4gIERJU0FCTEVfU0hBUkVEX1NFU1NJT05TID0gJzpkaXNhYmxlX3NoYXJlZF9zZXNzaW9ucycsXG4gIERJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTID0gJzpkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcycsXG4gIERJUkVDVElPTiA9ICdkaXJlY3Rpb24nLFxuICBESVNQTEFZX09WRVJMQVkgPSAnOmRpc3BsYXlfb3ZlcmxheScsXG4gIERJU1BMQVlfU0hBUkUgPSAnOmRpc3BsYXlfc2hhcmUnLFxuICBESVNQTEFZX1NQSU5ORVIgPSAnOmRpc3BsYXlfc3Bpbm5lcicsXG4gIERJU1BMQVlfU1RBVElDX0lNQUdFID0gJzpkaXNwbGF5X3N0YXRpY19pbWFnZScsXG4gIERJU1BMQVlfVEFCUyA9ICdkaXNwbGF5X3RhYnMnLFxuICBESVNQTEFZX1ZJRVdfQ09VTlQgPSAnOmRpc3BsYXlfY291bnQnLFxuICBJR05PUkVfU1RJQ0tZX1NFU1NJT04gPSAnOmlnbm9yZV9zdGlja3lfc2Vzc2lvbicsXG4gIElOQ1JFTUVOVF9WSUVXX0NPVU5UID0gJzppbmNyZW1lbnRfdmlld19jb3VudCcsXG4gIERPQ01PREUgPSAnZG9jbW9kZScsXG4gIERPTUFJTiA9ICdkb21haW4nLFxuICBET19XT1JLID0gJ2RvX3dvcmsnLFxuICBEWCA9ICdkeCcsXG4gIERZID0gJ2R5JyxcbiAgRURJVF9EQVRBX0FMRVJUID0gJzplZGl0RGF0YUFsZXJ0JyxcbiAgRU1CRUQgPSAnOmVtYmVkJyxcbiAgRU1CRURERUQgPSAnZW1iZWRkZWQnLFxuICBFTkNSWVBURUQgPSAnZW5jcnlwdGVkJyxcbiAgQVBJX0VYVEVSTkFMX1ZFUlNJT04gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFQSV9JTlRFUk5BTF9WRVJTSU9OID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBFWENMVURFID0gJ2V4Y2x1ZGUnLFxuICBFWFBPUlRfRk9STUFUID0gJzpleHBvcnRfZm9ybWF0JyxcbiAgRklFTEROQU1FID0gJ2ZpZWxkbmFtZScsXG4gIEZJRUxEX05BTUUgPSAnZmllbGRfbmFtZScsXG4gIEZJRUxEX1NFUCA9ICdmaWVsZF9zZXAnLFxuICBGSUxFID0gJ2ZpbGUnLFxuICBGSUxURVJfVElMRV9TSVpFID0gJ2ZpbHRlclRpbGVTaXplJyxcbiAgRk4gPSAnZm4nLFxuICBGT0NVUyA9ICdmb2N1cycsXG4gIEZPUkNFX0NBQ0hFID0gJ2ZvcmNlX2NhY2hlJyxcbiAgRk9STUFUID0gJ2Zvcm1hdCcsXG4gIEZPUk1BVF9EQVRBX1ZBTFVFX0xPQ0FMTFkgPSAnZm9ybWF0RGF0YVZhbHVlTG9jYWxseScsXG4gIEZST01fV0cgPSAnOmZyb21fd2cnLFxuICBHUkFQSFFMX0RBVEFCQVNFX0lEID0gJzpncmFwaFFMRGF0YWJhc2VJZCcsXG4gIEdSQVBIUUxfVEFCTEVfSUQgPSAnOmdyYXBoUUxUYWJsZUlkJyxcbiAgR1VJRCA9ICc6Z3VpZCcsXG4gIEggPSAnaCcsXG4gIEhJRERFTiA9ICdoaWRkZW4nLFxuICBISURFX0NMT1NFX0JVVFRPTiA9ICc6aGlkZUNsb3NlQnV0dG9uJyxcbiAgSElERV9FRElUX0JVVFRPTiA9ICc6aGlkZUVkaXRCdXR0b24nLFxuICBISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04gPSAnOmhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uJyxcbiAgSElHSF9EUEkgPSAnOmhpZ2hkcGknLFxuICBJTUFHRV9TSVpFX0xJTUlUID0gJ2ltYWdlU2l6ZUxpbWl0JyxcbiAgVFJBTlNQQVJFTlRfTElORV9NQVJLU19MSU1JVCA9ICd0cmFuc3BhcmVudExpbmVNYXJrTGltaXQnLFxuICBDTElFTlRfUkVOREVSX1BJWEVMX0xJTUlUID0gJ2NsaWVudFJlbmRlclBpeGVsTGltaXQnLFxuICBJTiA9ICdpbicsXG4gIElOU1RBTkNFX0lEID0gJzppaWQnLFxuICBJU19HVUVTVF9SRURJUkVDVF9GUk9NX1ZJWlBPUlRBTCA9ICc6aXNHdWVzdFJlZGlyZWN0RnJvbVZpenBvcnRhbCcsXG4gIElTX01BUktfQU5JTUFUSU9OX0VOQUJMRUQgPSAnaXNNYXJrQW5pbWF0aW9uRW5hYmxlZCcsXG4gIElTX1ZJWlBPUlRBTCA9ICc6aXNWaXpQb3J0YWwnLFxuICBJTlBVVF8gPSAnaW5wdXRfc3RyaW5nJyxcbiAgSlNERUJVRyA9ICc6anNkZWJ1ZycsXG4gIEpTT04gPSAnanNvbicsXG4gIEpTT05fT05MWSA9ICc6anNvbk9ubHknLFxuICBLRUVQRklMRSA9ICdrZWVwZmlsZScsXG4gIEtFWSA9ICdrZXknLFxuICBMQU5HVUFHRSA9ICdsYW5ndWFnZScsXG4gIExBTkdVQUdFX1JFUVVFU1RFRCA9ICc6bGFuZ3VhZ2UnLFxuICBMSU5LVEFSR0VUID0gJzpsaW5rdGFyZ2V0JyxcbiAgTE9BRF9PUkRFUl9JRCA9ICc6bG9hZE9yZGVySUQnLCAvLyB1c2VkIGZvciBQdWJsaWNcbiAgTE9BRF9ORVdFU1RfUkVWSVNJT04gPSAnOmxvYWROZXdlc3RSZXZpc2lvbicsXG4gIExPQ0FMX1BBVEhTID0gJzpsb2NhbFBhdGhzJyxcbiAgTE9DQUxFID0gJ2xvY2FsZScsXG4gIExPQ0FUSU9OX0lEID0gJ2xvY2F0aW9uaWQnLFxuICBMT0NBVElPTl9UWVBFID0gJ2xvY2F0aW9udHlwZScsXG4gIFdPUktCT09LX0xPQ0FMRSA9ICd3b3JrYm9va0xvY2FsZScsXG4gIE1BWFJPV1MgPSAnbWF4cm93cycsXG4gIE1BWF9BR0UgPSAnbWF4QWdlJyxcbiAgTUFYX1JPV1MgPSAnbWF4Um93cycsXG4gIE1FVEhPRCA9ICdtZXRob2QnLFxuICBNT0JJTEUgPSAnbW9iaWxlJyxcbiAgTU9ESUZJRVIgPSAnbW9kaWZpZXInLFxuICBOQU1FID0gJ25hbWUnLFxuICBOQVZfVFlQRSA9ICduYXZUeXBlJyxcbiAgTkFWX1NSQyA9ICduYXZTcmMnLFxuICBOT0FUVEFDSE1FTlQgPSAnbm8tYXR0YWNobWVudCcsXG4gIE5PX09WRVJXUklURSA9ICdub19vdmVyd3JpdGUnLFxuICBPUEVOX0FVVEhPUklOR19JTl9UT1BfV0lORE9XID0gJzpvcGVuQXV0aG9yaW5nSW5Ub3BXaW5kb3cnLFxuICBPUEVOSURfSEQgPSAnOm9wZW5pZF9oZCcsXG4gIE9QRU5JRF9MT0dJTl9ISU5UID0gJzpvcGVuaWRfbG9naW5faGludCcsXG4gIE9BVVRIUkVRVUVTVCA9ICdvYXV0aHJlcXVlc3QnLFxuICBPQVVUSF9DUkVERU5USUFMX0lEUyA9ICdvYXV0aF9jcmVkZW50aWFsX2lkcycsXG4gIE9GRkxJTkVfTU9ERSA9ICc6b2ZmbGluZW1vZGUnLFxuICBPUklHSU4gPSAnOm9yaWdpbicsXG4gIE9WRVJMQVkgPSAnOm92ZXJsYXknLFxuICBQID0gJ3AnLFxuICBQQVRIID0gJ3BhdGgnLFxuICBQQU5FX1JFU09MVkVSX1ggPSAncGFuZVJlc29sdmVyWCcsXG4gIFBBTkVfUkVTT0xWRVJfWSA9ICdwYW5lUmVzb2x2ZXJZJyxcbiAgUEFSQU0gPSAncGFyYW0nLFxuICBQQVJFTlRfSUQgPSAncGFyZW50X2lkJyxcbiAgUEFTU1dPUkQgPSAncGFzc3dvcmQnLFxuICBQQVRURVJOID0gJ3BhdHRlcm4nLFxuICBQSVhFTF9SQVRJTyA9ICc6cGl4ZWxyYXRpbycsXG4gIFBSRUZJWCA9ICc6cHJlZml4JyxcbiAgUFJFVklFVyA9ICc6cHJldmlldycsXG4gIFBSSU1BUllfQ09OVEVOVF9VUkwgPSAncHJpbWFyeV9jb250ZW50X3VybCcsXG4gIFBST0pFQ1QgPSAncHJvamVjdCcsXG4gIFBST1RPQ09MID0gJ3Byb3RvY29sJyxcbiAgUFNFVURPID0gJzpwc2V1ZG8nLFxuICBRVUVSWSA9ICdxdWVyeScsXG4gIFIgPSAncicsXG4gIFJBTkdFX1RZUEUgPSAncmFuZ2VfdHlwZScsXG4gIFJFQ09SRF9TRVAgPSAncmVjb3JkX3NlcCcsXG4gIFJFQ09SRF9DTElFTlRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9jbGllbnRfcGVyZm9ybWFuY2UnLFxuICBSRUNPUkRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9wZXJmb3JtYW5jZScsXG4gIFJFQ09WRVJfT0xEX1NFU1NJT05fSUQgPSAnOnJlY292ZXJfb2xkX3Nlc3Npb25faWQnLFxuICBSRUNPVkVSX1NFU1NJT05fU1RBVEVfVElDS0VUUyA9ICc6cmVjb3Zlcl9zZXNzaW9uX3N0YXRlX3RpY2tldHMnLFxuICBSRUZSRVNIID0gJzpyZWZyZXNoJyxcbiAgUkVGUkVTSFVOTU9ESUZJRUQgPSAnOnJlZnJlc2h1bm1vZGlmaWVkJyxcbiAgUkVHSU9OID0gJ3JlZ2lvbicsXG4gIFJFTE9BRF9PTl9DVVNUT01fVklFV19TQVZFID0gJzpyZWxvYWRPbkN1c3RvbVZpZXdTYXZlJyxcbiAgUkVOREVSID0gJzpyZW5kZXInLFxuICBSRU5ERVJfTUFQU19DTElFTlRfU0lERSA9ICdyZW5kZXJNYXBzQ2xpZW50U2lkZScsXG4gIFJFVFJZID0gJzpyZXRyeScsXG4gIFJFVVNFID0gJ3JldXNlJyxcbiAgUkVVU0VfRk9SRVZFUiA9ICdyZXVzZV9mb3JldmVyJyxcbiAgUkVWRVJUID0gJzpyZXZlcnQnLFxuICBTQVZFX0RCX1BBU1NXT1JEUyA9ICdzYXZlX2RiX3Bhc3N3b3JkcycsXG4gIFNFTEVDVF9YID0gJ3NlbGVjdF94JyxcbiAgU0VMRUNUX1kgPSAnc2VsZWN0X3knLFxuICBTRVNTSU9OX0ZFQVRVUkVfUFJFRklYID0gJzpmZl8nLFxuICBTRVNTSU9OX0ZMQUdTID0gJzpzZXNzaW9uX2ZlYXR1cmVfZmxhZ3MnLFxuICBTSEFSRV9CVVRUT04gPSAnc2hhcmVfYnV0dG9uJyxcbiAgU0hFRVRfSUQgPSAnc2hlZXRfaWQnLFxuICBTSEFSRUQgPSAnc2hhcmVkJyxcbiAgU0hPV0FMTCA9ICdzaG93YWxsJyxcbiAgU0hPV19BUFBfQkFOTkVSID0gJzpzaG93QXBwQmFubmVyJyxcbiAgU0hPV19BU0tfREFUQSA9ICc6c2hvd0Fza0RhdGEnLFxuICBTSE9XX1BBUkFNUyA9ICdzaG93UGFyYW1zJyxcbiAgU0hPV19TSEFSRV9PUFRJT05TID0gJzpzaG93U2hhcmVPcHRpb25zJyxcbiAgU0laRSA9ICc6c2l6ZScsXG4gIFNPVVJDRSA9ICdzb3VyY2UnLFxuICBTVEFURSA9ICdzdGF0ZScsXG4gIFNUSUNLWV9TRVNTSU9OX0tFWSA9ICdzdGlja3lTZXNzaW9uS2V5JyxcbiAgU1VCU0NSSVBUSU9OUyA9ICc6c3Vic2NyaXB0aW9ucycsXG4gIFNVTU1BUlkgPSAnc3VtbWFyeScsXG4gIFNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUiA9ICc6c3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yJyxcbiAgU1lOQ19TRVNTSU9OID0gJzpzeW5jX3Nlc3Npb24nLFxuICBTWU5DX1NFU1NJT05fU1RBVEUgPSAnc3luY19zZXNzaW9uX3N0YXRlJyxcbiAgVEFCUyA9ICc6dGFicycsXG4gIFRBUkdFVCA9ICd0YXJnZXQnLFxuICBUQVJHRVRfU0lURSA9ICd0YXJnZXRfc2l0ZScsXG4gIFRPT0xCQVIgPSAnOnRvb2xiYXInLFxuICBUT09MVElQID0gJzp0b29sdGlwJyxcbiAgVFMgPSAndHMnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0lEID0gJ3VuZGVybHlpbmdfdGFibGVfaWQnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0NBUFRJT04gPSAndW5kZXJseWluZ190YWJsZV9jYXB0aW9uJyxcbiAgVVBEQVRFX1RZUEUgPSAndXBkYXRlX3R5cGUnLFxuICBVU0VfR1VFU1QgPSAnOnVzZUd1ZXN0JyxcbiAgVVNFX0lOTElORV9JTUFHRVMgPSAndXNlX2lubGluZV9pbWFnZXMnLFxuICBVU0VSQUdFTlQgPSAndXNlcmFnZW50JyxcbiAgVVNFUk5BTUUgPSAndXNlcm5hbWUnLFxuICBWQUxVRSA9ICd2YWx1ZScsXG4gIFZFUkJPU0VfTU9ERSA9ICd2ZXJib3NlTW9kZScsXG4gIFZJRVdfSUQgPSAndmlld3NfaWQnLFxuICBWSVpfU05BUFNIT1RfSUQgPSAndml6X3NuYXBzaG90X2lkJyxcbiAgVlcgPSAnOnZ3JyxcbiAgVyA9ICd3JyxcbiAgV09SS1NIRUVUX1BPUlRfU0laRSA9ICd3b3Jrc2hlZXRQb3J0U2l6ZScsXG4gIFdBVEVSTUFSSyA9ICd3YXRlcm1hcmsnLFxuICBXQVRFUk1BUktfTUFSR0lOID0gJzp3YXRlcm1hcmtfbWFyZ2luJyxcbiAgV0IgPSAnOndiJyxcbiAgV0hJQ0ggPSAnd2hpY2gnLFxuICBYID0gJ3gnLFxuICBZID0gJ3knLFxuICBaSUQgPSAnemlkJyxcbiAgWk9ORV9JRCA9ICd6b25lX2lkJyxcbiAgS0VZQ0hBSU5fVkVSU0lPTiA9ICdrZXljaGFpbl92ZXJzaW9uJyxcbiAgREFUQVNPVVJDRV9JRCA9ICdkYXRhc291cmNlX2lkJyxcbiAgREFUQVNPVVJDRV9OQU1FID0gJ2RhdGFzb3VyY2VfbmFtZScsXG4gIExFTlNfSUQgPSAnbGVuc19pZCcsXG4gIFdJRFRIID0gJ3dpZHRoJyxcbiAgSEVJR0hUID0gJ2hlaWdodCcsXG5cbiAgLy8gRGVmYXVsdCBMYXlvdXQgcGFyYW1zXG4gIExBWU9VVF9WSUVXUyA9ICd2aWV3cycsXG4gIExBWU9VVF9NRU5VUyA9ICdtZW51cycsXG4gIExBWU9VVF9HRU9NRVRSWSA9ICdnZW9tZXRyeScsXG4gIExBWU9VVF9QQUdFUyA9ICdwYWdlcycsXG4gIExBWU9VVF9DQUNIRVVSTCA9ICdjYWNoZXVybCcsXG4gIExBWU9VVF9TSEVFVCA9ICdzaGVldCcsXG4gIExBWU9VVF9ERVBUSCA9ICdkZXB0aCcsXG59XG5cbi8qKlxuICogcGFyYW1ldGVycyB0aGF0IGFyZSBvbmx5IHJlbGV2YW50IHdoZW4gd29ya2luZyB3aXRoIFRhYmxlYXUgUHVibGljXG4gKiBtYXliZSBub3QgcmVhbGx5IG5lY2Vzc3J5IHRvIHNwbGl0IHRoZW0gb3V0XG4gKi9cbmVudW0gUHVibGljUGFyYW1ldGVyTmFtZXMge1xuICBTSE9XX1ZJWl9IT01FID0gJzpzaG93Vml6SG9tZScsXG4gIC8vIGRpc3BsYXkgdmlldyBjb3VudFxufVxuXG4vKipcbiAqIE1hcCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFzIHVzZWQgaW4gdGhlIHVybCB0byB3aGF0IHdlIGNhbGwgdGhlbSBwdWJsaWNseSBpbiB0aGUgZW1iZWRkaW5nIGxpYnJhcnkuXG4gKiBUaGUgb25seSBwYXJhbWV0ZXJzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSB0aGUgb25lcyB0aGF0IGdldCBzZW50IHRvIHZpenFsXG4gKiAgLSB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJmYWNlIGF0IGV4dGVybmFsLWNvbnRyYWN0OlZpekludGVyZmFjZXM6Vml6U2V0dGluZ3NcbiAqL1xuZXhwb3J0IGVudW0gVml6T3B0aW9uTmFtZXMge1xuICAvLyBwdWJsaWNOYW1lID0gaW50ZXJuYWxTdHJpbmdWYWx1ZVxuICBTaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuU0laRSxcbiAgRW1iZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5FTUJFRCxcbiAgQXBpSW50ZXJuYWxWZXJzaW9uID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0lOVEVSTkFMX1ZFUlNJT04sXG4gIEFwaUV4dGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9FWFRFUk5BTF9WRVJTSU9OLFxuICBTaG93Vml6SG9tZSA9IFB1YmxpY1BhcmFtZXRlck5hbWVzLlNIT1dfVklaX0hPTUUsXG4gIEpzZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBCb290c3RyYXBXaGVuTm90aWZpZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5CT09UU1RSQVBfV0hFTl9OT1RJRklFRCxcbiAgTmF2VHlwZSA9IFZxbFBhcmFtZXRlck5hbWVzLk5BVl9UWVBFLFxuICBOYXZTcmMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfU1JDLFxuICBkZWJ1ZyA9IFZxbFBhcmFtZXRlck5hbWVzLkpTREVCVUcsXG4gIEFwaUlEID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0lELFxuXG4gIGRpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gVnFsUGFyYW1ldGVyTmFtZXMuRElTQUJMRV9VUkxfQUNUSU9OU19QT1BVUFMsXG4gIGhpZGVUYWJzID0gVnFsUGFyYW1ldGVyTmFtZXMuVEFCUyxcbiAgdG9vbGJhciA9IFZxbFBhcmFtZXRlck5hbWVzLlRPT0xCQVIsXG4gIGRldmljZSA9IFZxbFBhcmFtZXRlck5hbWVzLkRFVklDRV9UWVBFLFxuICBpbnN0YW5jZUlkVG9DbG9uZSA9IFZxbFBhcmFtZXRlck5hbWVzLklOU1RBTkNFX0lELFxuICB0b3VjaE9wdGltaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuTU9CSUxFLFxuICBoaWRlRWRpdEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9CVVRUT04sXG4gIGhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OLFxuICBzdXBwcmVzc0RlZmF1bHRFZGl0QmVoYXZpb3IgPSBWcWxQYXJhbWV0ZXJOYW1lcy5TVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IsXG4gIGhpZGVDbG9zZUJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfQ0xPU0VfQlVUVE9OLFxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmltcG9ydCB7IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL0Nyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgaXNDb21tYW5kTWVzc2FnZSxcbiAgaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBpc0hhbmRzaGFrZU1lc3NhZ2UsXG4gIGlzSW5pdE1lc3NhZ2UsXG4gIGlzTWVzc2FnZSxcbiAgaXNOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL01lc3NhZ2VUeXBlQ2hlY2tzJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlSGFuZGxlcixcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIsXG4gIEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyLFxuICBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlTGlzdGVuZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IE1lc3NlbmdlciB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vKipcbiAqIFRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGlzIHRoZSBwcmltYXJ5IGV4cG9ydCBmcm9tIHRoZSBhcGktbWVzc2FnaW5nIG1vZHVsZS4gQW4gaW5zdGFuY2Ugb2ZcbiAqIHRoaXMgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZCBvbiBib3RoIHNpZGVzIG9mIGEgZnJhbWUgYm91bmRhcnkgdG8gZmFjaWxpdGF0ZSBjb21tdW5pY2F0aW9uXG4gKiBpbiBib3RoIGRpcmVjdGlvbnMgYmV0d2VlbiB0aGUgZnJhbWVzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYm90aCB0aGUgZGlzcGF0Y2hlciBhbmQgdGhlIGxpc3RlbmVyXG4gKiBwb3J0aW9ucywgYnV0IGRvZXNuJ3QgcmVxdWlyZSBjYWxsZXJzIHRvIGNhcmUgYWJvdXQgYm90aC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVNZXNzZW5nZXIgaW1wbGVtZW50cyBNZXNzZW5nZXIge1xuICBwcml2YXRlIHVucmVnaXN0ZXJGdW5jdGlvbj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZE1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lTWVzc2VuZ2VyLiBJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgYXMgYSBNZXNzYWdlTGlzdGVuZXIsXG4gICAqIGJlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZyBhbmQgcmVnaXN0ZXIgbWVzc2FnZSBoYW5kbGVycy5cbiAgICogQHBhcmFtIHRoaXNXaW5kb3cgVGhlIHdpbmRvdyBvYmplY3Qgd2hpY2ggdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgbGl2ZXMuIEFuIG9uTWVzc2FnZSBsaXN0ZW5lciB3aWxsIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3ddIE9wdGlvbmFsIG90aGVyV2luZG93IHdoaWNoIG1lc3NhZ2VzIHdpbGwgYmUgcG9zdGVkIHRvLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiBkZWZpbmVkLCBpbmNvbWluZyBtZXNzYWdlcyBtdXN0IG9yaWdpbmF0ZSBmcm9tIG90aGVyV2luZG93IHRvIGJlIHBhc3NlZCBvblxuICAgKiBAcGFyYW0gW290aGVyV2luZG93T3JpZ2luXSBUaGUgdGFyZ2V0IG9yaWdpbiB3aGljaCBvdGhlcldpbmRvdyBtdXN0IGhhdmUgaW4gb3JkZXIgdG8gcmVjZWl2ZSBkaXNwYXRjaGVkIG1lc3NhZ2VzLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgc2VudCBhcyB0aGUgdGFyZ2V0T3JpZ2luIG9mIGEgcG9zdE1lc3NhZ2VcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvcG9zdE1lc3NhZ2UpXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSB0aGlzV2luZG93OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3c/OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3dPcmlnaW4/OiBzdHJpbmcpIHtcbiAgICAvLyBNYWtlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZ1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZUxpc3RlbmVyIEltcGxlbWVudGF0aW9uXG5cbiAgcHVibGljIHN0YXJ0TGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgYXJlIGxpc3RlbmluZywgaWYgbm90LCBob29rIHVwIGEgbWVzc2FnZSBsaXN0ZW5lclxuICAgIGlmICghdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IGJvdW5kSGFuZGxlciA9IHRoaXMub25NZXNzYWdlUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudGhpc1dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gKCkgPT4gdGhpcy50aGlzV2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdG9wTGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIFN0b3AgbGlzdGVuaW5nIGlmIHdlIGhhdmUgc3RhcnRlZCBsaXN0ZW5pbmdcbiAgICBpZiAodGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKCk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0SW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0SGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvLy8vLyBNZXNzYWdlRGlzcGF0Y2hlciBJbXBsZW1lbnRhdGlvblxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXBpVmVyc2lvbiBhcGktaW50ZXJuYWwtY29udHJhY3QtanMgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIGNyb3NzRnJhbWVWZXJzaW9uIGNyb3NzZnJhbWUgbWVzc2FnaW5nIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBvcHRpb25zIGFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXQgaW5pdGlhbGl6YXRpb24gKGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mXG4gICAqICAgICAgICAgICAgICAgIGV4dGVybmFsIGJlaW5nIHVzZWQgZm9yIGV4YW1wbGUpXG4gICAqL1xuICBwdWJsaWMgcHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShcbiAgICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gICk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBjcm9zc0ZyYW1lVmVyc2lvbixcbiAgICAgIGFwaVZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZE1lc3NhZ2UodmVyYklkOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgICAgdmVyYklkOiB2ZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShjb21tYW5kR3VpZDogc3RyaW5nLCBkYXRhOiBNb2RlbCB8IHVuZGVmaW5lZCwgZXJyb3I6IE1vZGVsIHwgdW5kZWZpbmVkKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICAgIGNvbW1hbmRHdWlkOiBjb21tYW5kR3VpZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgLy8gc3RyaW5naWZ5IGVycm9yIG9iamVjdCB0byByZW1vdmUgdW5zZXJpYWxpemFibGUgZmllbGRzIGxpa2UgZnVuY3Rpb25zIGFuZCBwcmV2ZW50IHNlcmlhbGl6YXRpb24gZXJyb3JzXG4gICAgICBtZXNzYWdlLmVycm9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVOb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZCwgZGF0YTogTW9kZWwpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLFxuICAgICAgbm90aWZpY2F0aW9uSWQ6IG5vdGlmaWNhdGlvbklkLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUFja01lc3NhZ2UoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkFjayxcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBwZW5kaW5nIG1lc3NhZ2UgZm9yIHNlbmRpbmcgYW5kIHJldHVybnMgdGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICpcbiAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBiZSBzZW50IHRvIHRoaXMub3RoZXJXaW5kb3dcbiAgICogQHJldHVybnMgVGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgcHJlcGFyZU1lc3NhZ2UobXNnOiBNZXNzYWdlKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBpZiAoIXRoaXMub3RoZXJXaW5kb3cgfHwgIXRoaXMub3RoZXJXaW5kb3dPcmlnaW4pIHtcbiAgICAgIHRocm93ICdPdGhlciB3aW5kb3cgbm90IGluaXRpYWxpemVkLCBjYW5ub3QgZGlzcGF0Y2ggbWVzc2FnZXMnO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXBhcmVkTWVzc2FnZSA9IG5ldyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlKG1zZywgdGhpcy5vdGhlcldpbmRvdywgdGhpcy5vdGhlcldpbmRvd09yaWdpbik7XG4gICAgcmV0dXJuIHByZXBhcmVkTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuIERvZXMgc29tZSB2YWxpZGF0aW9uIG9mIHRoZSBtZXNzYWdlLCBhbmQgdGhlblxuICAgKiBjYWxscyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGhhbmRsZXIgaWYgb25lIGlzIGRlZmluZWRcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBpbmNvbWluZyBNZXNzYWdlRXZlbnRcbiAgICovXG4gIHByaXZhdGUgb25NZXNzYWdlUmVjZWl2ZWQoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gb3RoZXJXaW5kb3cgZGVmaW5lZCwgbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGlzIGNvbWluZyBmcm9tIHRoZXJlXG4gICAgaWYgKHRoaXMub3RoZXJXaW5kb3cgJiYgZXZlbnQuc291cmNlICE9PSB0aGlzLm90aGVyV2luZG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG8gc29tZSB2YWxpZGF0aW9uIG9uIGV2ZW50LmRhdGEgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhIHJlYWwgbWVzc2FnZVxuICAgIGlmICghZXZlbnQuZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhO1xuICAgIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIG1lc3NhZ2UgdHlwZSwgdmFsaWRhdGUgdGhlIG1lc3NhZ2UsIGFuZCBjYWxsIGFuIGFwcHJvcHJpYXRlIGhhbmRlciBpZiBvbmUgZXhpc3RzXG4gICAgc3dpdGNoIChtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZToge1xuICAgICAgICBpZiAoIWlzSW5pdE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZToge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmQ6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb246IHtcbiAgICAgICAgaWYgKCFpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5IYW5kc2hha2U6IHtcbiAgICAgICAgaWYgKCFpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIEp1c3QgaWdub3JlIHRoaXMgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHR5cGVcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3cob3RoZXJXaW5kb3c6IFdpbmRvdyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3cgPSBvdGhlcldpbmRvdztcbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvd09yaWdpbihvcmlnaW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4gPSBvcmlnaW47XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJlcGFyZWRNZXNzYWdlIGludGVyZmFjZSB1c2VkIHRvIHBvc3QgbWVzc2FnZXMgYmV0d2VlblxuICogdHdvIGZyYW1lcyB1c2luZyB3aW5kb3cucG9zdE1lc3NhZ2VcbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgaW1wbGVtZW50cyBQcmVwYXJlZE1lc3NhZ2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLlxuICAgKiBAcGFyYW0gX21lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudFxuICAgKiBAcGFyYW0gX3RhcmdldCBUaGUgdGFyZ2V0IHdpbmRvdyB3aGVyZSB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnRcbiAgICogQHBhcmFtIF9vcmlnaW4gVGhlIHRhcmdldE9yaWdpbiB3aGVyZSB0aGlzIG1lc3NhZ2UgY2FuIGJlIHJlY2VpdmVkXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWVzc2FnZTogTWVzc2FnZSwgcHJpdmF0ZSBfdGFyZ2V0OiBXaW5kb3csIHByaXZhdGUgX29yaWdpbjogc3RyaW5nKSB7fVxuXG4gIHB1YmxpYyBnZXQgbWVzc2FnZUd1aWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZS5tc2dHdWlkO1xuICB9XG5cbiAgcHVibGljIHNlbmQoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICB0aGlzLl90YXJnZXQucG9zdE1lc3NhZ2UodGhpcy5fbWVzc2FnZSwgdGhpcy5fb3JpZ2luKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlL1ZlcnNpb25OdW1iZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcblxuY29uc3QgZXhwZWN0ZWRFbXB0eU5vdGlmaWNhdGlvbnMgPSBuZXcgU2V0KFtcbiAgTm90aWZpY2F0aW9uSWQuRWRpdEJ1dHRvbkNsaWNrZWQsXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va1B1Ymxpc2hlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tSZWFkeVRvQ2xvc2UsXG4gIE5vdGlmaWNhdGlvbklkLlJlYWR5VG9SZWNlaXZlQXV0aFRva2VuLFxuXSk7XG5cbi8qIHRzbGludDpkaXNhYmxlIG5vLWFueSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWVzc2FnZShkYXRhOiBNZXNzYWdlIHwgYW55KTogZGF0YSBpcyBNZXNzYWdlIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGRhdGEgYXMgTWVzc2FnZTtcbiAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLm1zZ0d1aWQgfHwgIW1lc3NhZ2UubXNnVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQobWVzc2FnZS5tc2dHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbWVzc2FnZS5tc2dUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2VUeXBlczogQXJyYXk8c3RyaW5nPiA9IFtcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLFxuICAgIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICBNZXNzYWdlVHlwZS5IYW5kc2hha2UsXG4gIF07XG5cbiAgaWYgKG1lc3NhZ2VUeXBlcy5pbmRleE9mKG1lc3NhZ2UubXNnVHlwZSkgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnNpb24odmVyc2lvbk51bWJlcjogVmVyc2lvbk51bWJlciB8IGFueSk6IHZlcnNpb25OdW1iZXIgaXMgVmVyc2lvbk51bWJlciB7XG4gIGlmICghdmVyc2lvbk51bWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHYgPSB2ZXJzaW9uTnVtYmVyIGFzIFZlcnNpb25OdW1iZXI7XG5cbiAgaWYgKHR5cGVvZiB2ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygdi5maXggIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1pbm9yICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5tYWpvciAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5pdE1lc3NhZ2UobWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEluaXRpYWxpemVNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpbml0TWVzc2FnZSA9IG1lc3NhZ2UgYXMgSW5pdGlhbGl6ZU1lc3NhZ2U7XG4gIGlmIChpbml0TWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5hcGlWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3JNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlO1xuICBpZiAoY3JNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQoY3JNZXNzYWdlLmNvbW1hbmRHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY3JNZXNzYWdlLmRhdGEgJiYgIWNyTWVzc2FnZS5lcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZE1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmRNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kTWVzc2FnZTtcbiAgaWYgKGNvbW1hbmRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS52ZXJiSWQgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnZlcmJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBOb3RpZmljYXRpb25NZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0gbWVzc2FnZSBhcyBOb3RpZmljYXRpb25NZXNzYWdlO1xuICBpZiAobm90aWZpY2F0aW9uTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2UuZGF0YSAmJiAhZXhwZWN0ZWRFbXB0eU5vdGlmaWNhdGlvbnMuaGFzKG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkIHx8IHR5cGVvZiBub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEhhbmRzaGFrZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRzaGFrZU1lc3NhZ2UgPSBtZXNzYWdlIGFzIEhhbmRzaGFrZU1lc3NhZ2U7XG4gIGlmIChoYW5kc2hha2VNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkhhbmRzaGFrZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBOb3RpZmljYXRpb25JZCwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuXG4vKipcbiAqIEVudW0gZGVmaW5pbmcgdGhlIDQgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzIHdlIGhhdmUgZGVmaW5lZFxuICovXG5leHBvcnQgZW51bSBNZXNzYWdlVHlwZSB7XG4gIEluaXRpYWxpemUgPSAnaW5pdGlhbGl6ZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24nLFxuICBDb21tYW5kID0gJ2NvbW1hbmQnLFxuICBDb21tYW5kUmVzcG9uc2UgPSAnY29tbWFuZC1yZXNwb25zZScsXG4gIEhhbmRzaGFrZSA9ICd2LWhhbmRzaGFrZScsXG4gIEFjayA9ICd2LWFjaycsXG59XG5cbi8qKlxuICogVGhlIE1lc3NhZ2UgaW50ZXJmYWNlIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIHRoZSBvdGhlclxuICogbWVzc2FnZSB0eXBlIGludGVyZmFjZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlXG4gICAqL1xuICBtc2dHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnVHlwZTogTWVzc2FnZVR5cGU7XG59XG5cbi8qKlxuICogVGhlIGluaXRpYWxpemUgbWVzc2FnZSBpcyB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHNlbnRcbiAqIGZyb20gdGhlIGphdmFzY3JpcHQgdG8gc2V0IHVwIGNvbW11bmljYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6ZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcGkgd2hpY2ggdGhlIHNlbmRlciB3YW50cyB0byB1c2VcbiAgICovXG4gIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoaXMgbWVzc2FnaW5nIGNvbnRyYWN0IHRvIGJlIHVzZWQuIEZvciBub3csIHRoZXJlXG4gICAqIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHZlcnNpb24gYnV0IHNlbmRpbmcgdGhpcyBhbG9uZyBzaG91bGQgaGVscFxuICAgKiBpZiB3ZSBuZWVkIHRvIGFkZCBhIG5ldyB2ZXJzaW9uIGluIGEgZnV0dXJlIHJlbGVhc2VcbiAgICovXG4gIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IHRoZSB0aW1lIG9mIGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gYSBub3RpZmljYXRpb24gb2NjdXJzIGZyb20gdGhlIHByZXNsYXllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBmb3IgdGhpcyB0eXBlIG9mIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgbm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB3aGljaCBjYW1lIGFsb25nIHdpdGggdGhlIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgZGF0YTogTW9kZWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBjYWxsaW5nIGFuIGludGVybmFsIGNvbnRyYWN0IGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBjb21tYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZFxuICAgKi9cbiAgdmVyYklkOiBWZXJiSWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZFxuICAgKi9cbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7XG59XG5cbi8qKlxuICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBDb21tYW5kTWVzc2FnZSB3aXRoIHRoZVxuICogcmVzdWx0IG9mIHRoYXQgY29tbWFuZHMgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEd1aWQgb2YgdGhlIENvbW1hbmRNZXNzYWdlIHdoaWNoIHRoaXMgaXMgaW4gcmVzcG9uc2UgdG9cbiAgICovXG4gIGNvbW1hbmRHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZXR1cm5lZCBmcm9tIHRoZSBjb21tYW5kLCB0aGlzIHdpbGwgYmUgZGVmaW5lZFxuICAgKiBhbmQgY29udGFpbiB0aGUgZXJyb3JcbiAgICovXG4gIGVycm9yPzogTW9kZWw7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBjb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGNvbW1hbmQgcmVzdWx0XG4gICAqL1xuICBkYXRhPzogTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZHNoYWtlTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogSW50ZXJuYWwgQVBJIGNvbnRyYWN0IHZlcnNpb25cbiAgICovXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgaW50ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyYjogdmVyYiBhcyBWZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIGFzIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhlIG9ubHlcbiAqIG1vZGUgaXQgc3VwcG9ydHMgaXMgZXh0ZXJuYWwncyB2ZXJzaW9uIDw9IHBsYXRmb3JtJ3MgdmVyc2lvbi4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIHVwZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIGRvd25ncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LiBTaW1pbGFybHkgZm9yIG5vdGlmaWNhdGlvbnMsIGl0IGNhblxuICogZG93bmdyYWRlIHRob3NlIG9uIHRoZSB3YXkgZnJvbSBwbGF0Zm9ybSB0byBleHRlcm5hbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1WZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApOiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIge1xuICAgIHJldHVybiBuZXcgdGhpcyhcbiAgICAgIGV4dGVybmFsVmVyc2lvbi5tYWpvcixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbi5tYWpvcixcbiAgICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybU1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2V4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbiA+IHRoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IGJldHdlZW4gZXh0ZXJuYWwgdmVyc2lvbiAke3RoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9ufSBhbmQgJHt0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgdXBncmFkZWQgPSB7IHZlcmI6IHZlcmIsIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQudmVyYiwgdXBncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIERvd25ncmFkZSB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gZXhlY3V0ZVJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlELCBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyB9IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGxocy5taW5vciA8IHJocy5taW5vcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGhzLm1ham9yID09PSByaHMubWFqb3IgJiYgbGhzLm1pbm9yID09PSByaHMubWlub3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHtcbiAgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTtcbn1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IE5vdGlmaWNhdGlvbk1pbm9yRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0ge1xuICAxOiB7XG4gICAgOTogW10sXG4gICAgMTA6IFtEb3duZ3JhZGVGbGlwYm9hcmRab25lSURdLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMsXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlVXBncmFkZXMsXG4gICAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24gPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBjb25zdCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpKTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGV4dGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoaXMgY29udmVydGVyXG4gKiBzdXBwb3J0cyBleHRlcm5hbCdzIHZlcnNpb24obWlub3IpID49IHBsYXRmb3JtJ3MgdmVyc2lvbihtaW5vcikuIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byBkb3duZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIHVwZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gZG93bmdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZCBpcyBleGVjdXRlZFxuICAgKiBAcGFyYW0gX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHVwZ3JhZGUgbm90ZmljYXRpb25zIHRvIHBlcmZvcm0gb24gZXZlbnRzXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3IgPiB0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxWZXJzaW9uLm1ham9yfVxuICAgICAgYW5kICR7dGhpcy5fcGxhdGZvcm1WZXJzaW9uLm1ham9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSBkb3duZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkLnZlcmIsIGRvd25ncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgdXBncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVOb3RpZmljYXRpb24gb2YgdGhpcy5fdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlTm90aWZpY2F0aW9uKHVwZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgR2V0TWF4aW11bU1pbm9ySW5kZXgsIE1ham9yTWlub3JUcmFuc2xhdG9ycywgVmVyc2lvbkVxdWFsVG8gfSBmcm9tICcuLi9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNFeHRlcm5hbCBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQge1xuICBEb3duZ3JhZGVMb2dpY2FsVGFibGVEYXRhQXN5bmMsXG4gIERvd25ncmFkZVVuZGVybHlpbmdUYWJsZURhdGFBc3luYyxcbiAgVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zLFxuICBVcGdyYWRlRGF0YVRhYmxlVHlwZXMsXG59IGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gICAgMTM6IFtEb3duZ3JhZGVVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMsIERvd25ncmFkZUxvZ2ljYWxUYWJsZURhdGFBc3luY10sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW1VwZ3JhZGVEYXRhVGFibGVUeXBlc10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICAgIDI5OiBbVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zXSwgLy8gMjAyMS4xIHdhcyByZWxlYXNlZCB3aXRoIDEuMjkuIFVwZ3JhZGUgZnJvbSAxLjI5IGluIHRoZSBbMV1bMjldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCJpbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwsXG4gIERhdGFIZWFkZXIsXG4gIERhdGFUYWJsZSxcbiAgRGF0YVR5cGVDb252ZXJ0ZXIsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEludGVybmFsVGFibGVhdUVycm9yLFxuICBOb3RpZmljYXRpb24sXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbn0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgbmV3ZXIgdmVyc2lvbiBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb25cbiAqICBUaGUgdmVyYiBhbmQgcGFyYW1ldGVycyBwcm92aWRlIGEgY29udGV4dCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlUmV0dXJuID0gKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiBFeGVjdXRlUmVzcG9uc2U7XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byB1cGdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgVXBncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyAxLjIgLT4gMS4wIFRyYW5zbGF0aW9uc1xuLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBpbXBvcnQgZnJvbSB0aGUgVjEgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4vLyBpbXBvcnQgKiBhcyBWMSBmcm9tICdAdGFibGVhdS1hcGktaW50ZXJuYWwtY29udHJhY3QtanNfdjEnO1xuXG4vKipcbiAqIFByaW9yIHRvIDIwMTkuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuOSksIERhdGFWYWx1ZS52YWx1ZSB3ZXJlIGFsbCBzdHJpbmdzLlxuICogR28gdGhyb3VnaCBhbGwgRGF0YVZhbHVlIG9iamVjdHMuIElmIHdlIGhhdmUgYSBzdHJpbmcsIGJ1dCB0aGUgdHlwZSBzaG91bGQgbm90IGJlIGEgc3RyaW5nLFxuICogY29udmVydCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLiBUaGUgdHlwZSBvZiBEYXRhVmFsdWUudmFsdWUgaXMgJ2FueScgaW4gdGhlIGNvbnRyYWN0LCBzb1xuICogdGhpcyBjaGFuZ2UgZG9lc24ndCBuZWVkIGFueSB1cGRhdGVzIHRvIGNsYXNzZXMgb3IgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVcGdyYWRlRGF0YVRhYmxlVHlwZXMoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoIWV4ZWN1dGVSZXNwb25zZSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCBvbGRVbmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAob2xkVW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2xkVW5kZXJseWluZ0RhdGFUYWJsZS5pc1N1bW1hcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnZlcnREYXRhVmFsdWVzKG9sZFVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSk7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IG9sZFNlbGVjdGVkTWFya3NUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICBpZiAob2xkU2VsZWN0ZWRNYXJrc1RhYmxlLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhKSkge1xuICAgIG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhLmZvckVhY2goKG1hcmtzVGFibGUpID0+IHtcbiAgICAgIGNvbnZlcnREYXRhVmFsdWVzKG1hcmtzVGFibGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vKipcbiAqIFByaW9yIHRvIDIwMjAuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuMTMgYW5kIG9sZGVyKSwgd29ya3NoZWV0LmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXRVbmRlcmx5aW5nRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlVW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gIH07XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMC4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4xMyBhbmQgb2xkZXIpLCBkYXRhc291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXREYXRhU291cmNlRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlTG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhVmFsdWVzKHRhYmxlOiBEYXRhVGFibGUpOiB2b2lkIHtcbiAgLy8gZGF0YVRhYmxlIGlzIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IG9mIGRhdGEuIEZpcnN0IGluZGV4IGlzIHRoZSByb3csIHNlY29uZCBpcyB0aGUgY29sdW1uLlxuICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCB8fCB0YWJsZS5kYXRhVGFibGUgPT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheSh0YWJsZS5kYXRhVGFibGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFibGUuZGF0YVRhYmxlLmZvckVhY2goKHJvdykgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChkYXRhVmFsdWUsIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFWYWx1ZS52YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBkYXRhVmFsdWUudmFsdWUgPSBEYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWUsIHRhYmxlLmhlYWRlcnNbY29sdW1uSW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIFRvRG86IFRGUzEwNjkwMjcgUmVmYWN0b3IgaW5wdXQgdmVyYnMgJiBwYXJhbWV0ZXJzIGluIGFwaS1pbnRlcm5hbC1jb250cmFjdCBVcGdyYWRlL0Rvd25ncmFkZSBmcmFtZXdvcmtcbmZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiB2b2lkIHtcbiAgaWYgKHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdICE9PSBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2dpY2FsIHRhYmxlIGlkIHBhc3NlZCB0byAke3ZlcmJ9LmApIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMS4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4yOSBhbmQgYmVsb3cpLCBnZXRTdW1tYXJ5RGF0YUFzeW5jIGRpZCBub3Qgc3VwcG9ydCBtYXhSb3dzLFxuICogYW5kIGFueSBnZXQuLi5EYXRhQXN5bmMgZGlkIG5vdCBzdXBwb3J0IGNvbHVtbnNUb0luY2x1ZGVCeUlkLlxuICogVHJpbSByZXN1bHQgdG8gbWF4Um93cyBpZiBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgZ2V0U3VtbWFyeURhdGFBc3luY1xuICogVHJpbSBjb2x1bW5zIHRvIGNvbHVtbnNUb0luY2x1ZGUgaWYgaW5jbHVkZWQgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBnZXQuLi5EYXRhQXN5bmNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVwZ3JhZGVEYXRhVGFibGVSb3dzQW5kQ29sdW1ucyhcbiAgZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsXG4gIHZlcmI6IFZlcmJJZCxcbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMsXG4pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoaXNHZXRTdW1tYXJ5RGF0YVZlcmIodmVyYikgJiYgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSkge1xuICAgIGV4ZWN1dGVSZXNwb25zZSA9IGFkanVzdERhdGFSb3dMZW5ndGgoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLk1heFJvd3NdIGFzIG51bWJlcik7XG4gIH1cblxuICBpZiAoaXNHZXRUYWJsZURhdGFWZXJiKHZlcmIpICYmIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdKSB7XG4gICAgZXhlY3V0ZVJlc3BvbnNlID0gYWRqdXN0RGF0YUNvbHVtbnMoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSBhcyBzdHJpbmdbXSk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc0dldFN1bW1hcnlEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGE7XG59XG5cbmZ1bmN0aW9uIGlzR2V0VGFibGVEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhIHx8XG4gICAgdmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEgfHxcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU291cmNlRGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YVxuICApO1xufVxuXG5mdW5jdGlvbiBhZGp1c3REYXRhUm93TGVuZ3RoKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBtYXhSb3dzOiBudW1iZXIpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBpZiAobWF4Um93cyA+IDAgJiYgbWF4Um93cyA8IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUubGVuZ3RoKSB7XG4gICAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZS5sZW5ndGggPSBtYXhSb3dzO1xuICB9XG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGFkanVzdERhdGFDb2x1bW5zKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBjb2x1bW5zVG9JbmNsdWRlOiBzdHJpbmdbXSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIGlmIChjb2x1bW5zVG9JbmNsdWRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICAvLyB2ZXJpZnkgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgVW5kZXJseWluZ0RhdGFUYWJsZVxuICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycykpIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgLy8gMS4gZmlsdGVyIHRoZSBoZWFkZXJzIHRvIG9ubHkgY29sdW1uc1RvSW5jbHVkZVxuICAvLyAyLiB1c2UgdGhlIG5ldyBoZWFkZXJzIHRvIGZpbHRlciBhbGwgcm93c1xuICAvLyAzLiB1cGRhdGUgdGhlIGluZGljZXMgaW4gb3VyIG5ldyBoZWFkZXJzXG4gIGNvbnN0IG5ld0hlYWRlcnM6IERhdGFIZWFkZXJbXSA9IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5oZWFkZXJzLmZpbHRlcigoaGVhZGVyLCBpbmRleCkgPT5cbiAgICBjb2x1bW5zVG9JbmNsdWRlLmZpbmQoKG5hbWUpID0+IG5hbWUgPT09IGhlYWRlci5maWVsZE5hbWUpLFxuICApO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlW2luZGV4XSA9IHJvdy5maWx0ZXIoXG4gICAgICAodmFsdWUsIHZhbHVlSW5kZXgpID0+IG5ld0hlYWRlcnMuZmluZEluZGV4KChoZWFkZXIpID0+IGhlYWRlci5pbmRleCA9PT0gdmFsdWVJbmRleCkgIT09IC0xLFxuICAgICk7XG4gIH0pO1xuICBsZXQgbmV3SW5kZXggPSAwO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycyA9IG5ld0hlYWRlcnMubWFwKChoZWFkZXIpID0+IHtcbiAgICBoZWFkZXIuaW5kZXggPSBuZXdJbmRleCsrO1xuICAgIHJldHVybiBoZWFkZXI7XG4gIH0pO1xuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uTW9kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc01vZGUsIEV4dGVybmFsRXh0ZW5zaW9uc01vZGU+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZyxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNvbHVtblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENvbHVtblR5cGUsIEV4dGVybmFsQ29sdW1uVHlwZT4oe1xuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuQ29udGludW91c106IEV4dGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuRGlzY3JldGVdOiBFeHRlcm5hbENvbHVtblR5cGUuRGlzY3JldGUsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxDb2x1bW5UeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3Npc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDFdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3MsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZFJvbGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZFJvbGVUeXBlLCBFeHRlcm5hbEZpZWxkUm9sZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb24sXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmUsXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxTaGVldFR5cGUsIEV4dGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0ludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEV4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFUeXBlLCBFeHRlcm5hbERhdGFUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YVR5cGUuQm9vbF06IEV4dGVybmFsRGF0YVR5cGUuQm9vbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVUaW1lXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlVGltZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5GbG9hdF06IEV4dGVybmFsRGF0YVR5cGUuRmxvYXQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuSW50XTogRXh0ZXJuYWxEYXRhVHlwZS5JbnQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3BhdGlhbF06IEV4dGVybmFsRGF0YVR5cGUuU3BhdGlhbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBhbGxvd2FibGVWYWx1ZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZSwgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuQWxsXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5MaXN0XTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuUmFuZ2VdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVJhbmdlVHlwZSwgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBlcnJvckNvZGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEVycm9yQ29kZXMsIEV4dGVybmFsRXJyb3JDb2Rlcz4oXG4gICAge1xuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTklUSUFMSVpBVElPTl9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX0VOVU1fTUFQUElOR106IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX1BBUkFNRVRFUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QUkVTX01PREVMX1BBUlNJTkdfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVU5LTk9XTl9WRVJCX0lEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZJU0lCSUxJVFlfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuVmlzaWJpbGl0eUVycm9yLFxuICAgIH0sXG4gICAgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJUeXBlLCBFeHRlcm5hbEZpbHRlclR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmFuZ2VdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGVdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjbGFzc05hbWVLZXkgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENsYXNzTmFtZUtleSwgRXh0ZXJuYWxDbGFzc05hbWVLZXk+KHtcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXBdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgLy8gVGVtcG9yYXJ5IHVudGlsIHdlIGZpeCAxMzE3MjY2IC0gUGxhdGZvcm0gaGFzbid0IGJlZW4gdXBkYXRlZCBjdXJyZW50bHkgYmVjYXVzZSBuZWFyIGJyYW5jaCBpcyBjbG9zZWRcbiAgICBbJ2Rhc2hib2FyZC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbJ3N0b3J5LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgWyd0b29sdGlwJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgWyd3b3Jrc2hlZXQnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFsnd29ya3NoZWV0LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgPSBuZXcgRW51bUNvbnZlcnRlcjxcbiAgICBJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gICAgRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlXG4gID4oe1xuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Ob25lU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuU29tZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlVua25vd25TZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYW5ub3RhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEFubm90YXRpb25UeXBlLCBFeHRlcm5hbEFubm90YXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYV06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrXTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrLFxuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLlBvaW50XTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBtYXJrVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsTWFya1R5cGUsIEV4dGVybmFsTWFya1R5cGU+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+LCByZWdpc3RyeUlkOiBudW1iZXIpOiBTaGVldEltcGwge1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SWR4ID0gLTE7XG5cbiAgICBjb25zdCBwdWJsaXNoZWRTaGVldEluZm8gPSBTaGVldFV0aWxzLmdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShjb250YWluZWRTaGVldEluZm8ubmFtZSwgc2hlZXRJbmZvcyk7XG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRTaXplID0gU2hlZXRVdGlscy5jcmVhdGVBdXRvbWF0aWNTaXplKCk7XG4gICAgY29uc3QgaXNDb250YWluZWRTaGVldEhpZGRlbiA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0VXJsID0gcHVibGlzaGVkU2hlZXRJbmZvID8gcHVibGlzaGVkU2hlZXRJbmZvLnVybCA6ICcnO1xuICAgIC8vIENvbnRhaW5lZCBzaGVldHMgYXJlbid0IGFjdGl2ZSAtIHRoZSBjb250YWluaW5nIHNoZWV0IGlzIGFjdGl2ZS5cbiAgICBjb25zdCBjb250YWluZWRTaGVldEFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsXG4gICAgICBTaGVldFV0aWxzLmdldFNoZWV0VHlwZUVudW0oY29udGFpbmVkU2hlZXRJbmZvLnNoZWV0VHlwZSksXG4gICAgICBjb250YWluZWRTaGVldFNpemUsXG4gICAgICBjb250YWluZWRTaGVldElkeCxcbiAgICAgIGNvbnRhaW5lZFNoZWV0QWN0aXZlLFxuICAgICAgaXNDb250YWluZWRTaGVldEhpZGRlbixcbiAgICAgIGNvbnRhaW5lZFNoZWV0VXJsLFxuICAgICk7XG5cbiAgICBsZXQgc2hlZXRJbXBsOiBTaGVldEltcGw7XG4gICAgc3dpdGNoIChjb250YWluZWRTaGVldEluZm9JbXBsLnNoZWV0VHlwZSkge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0OiB7XG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCByZWdpc3RyeUlkLCB2aXpJZCwgbnVsbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkOiB7XG4gICAgICAgIGNvbnN0IHNoZWV0UGF0aDogU2hlZXRQYXRoID0ge1xuICAgICAgICAgIHNoZWV0TmFtZTogY29udGFpbmVkU2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIGlzRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNoZWV0SW1wbCA9IG5ldyBEYXNoYm9hcmRJbXBsKGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwsIGNvbnRhaW5lZFNoZWV0SW5mby5kYXNoYm9hcmRab25lcywgc2hlZXRQYXRoLCByZWdpc3RyeUlkLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoZWV0SW1wbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlQb2ludEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NhcHRpb246IHN0cmluZyxcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FjdGl2ZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cGRhdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5SW1wbDogU3RvcnlJbXBsLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIHNldCBjYXB0aW9uKGNhcHRpb246IHN0cmluZykge1xuICAgIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgc2V0IGluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9pbmRleCA9IGluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FjdGl2ZSA9IGlzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCB1cGRhdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKGlzVXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3VwZGF0ZWQgPSBpc1VwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeUltcGw7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXb3JrYm9va0ltcGwge31cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlNZW51VHlwZSxcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgVG9vbHRpcENvbnRleHQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLCBWaXN1YWxJZCwgV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVmlzdWFsTW9kZWxTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5RmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuUmFuZ2VGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmlsdGVyT3B0aW9ucywgJ2ZpbHRlck9wdGlvbnMnKTtcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlck51bGxPcHRpb24+KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbiwgRmlsdGVyTnVsbE9wdGlvbiwgJ0ZpbHRlck51bGxPcHRpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVJhbmdlUGFyYW1UeXBlKGZpbHRlck9wdGlvbnMubWluLCBmaWx0ZXJPcHRpb25zLm1heCk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSYW5nZUZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4gfCBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbHMsXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZXMsICd2YWx1ZXMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykgJiYgIXZhbHVlcy5sZXZlbHMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheSBvciBjb250YWluIGEgbGV2ZWxzIGtleScsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhckZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxQZXJpb2RUeXBlPihvcHRpb25zLnBlcmlvZFR5cGUsIFBlcmlvZFR5cGUsICdQZXJpb2RUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXRlUmFuZ2VUeXBlPihvcHRpb25zLnJhbmdlVHlwZSwgRGF0ZVJhbmdlVHlwZSwgJ0RhdGVSYW5nZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhdGFTb3VyY2VzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvOiBXb3Jrc2hlZXREYXRhU291cmNlSW5mbyA9IGRhdGFTY2hlbWEud29ya3NoZWV0RGF0YVNjaGVtYU1hcFt0aGlzLm5hbWVdO1xuXG4gICAgICBjb25zdCBkYXRhU291cmNlczogQXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4gPSBbXTtcblxuICAgICAgLy8gRmlyc3QsIGFkZCB0aGUgcHJpbWFyeSBkYXRhc291cmNlLiAgQnkgY29udmVudGlvbiwgaXQgY29tZXMgZmlyc3QgaW4gdGhlIHJldHVybmVkIGFycmF5LlxuICAgICAgY29uc3QgcHJpbWFyeUlkOiBzdHJpbmcgPSB3b3Jrc2hlZXREYXRhU291cmNlSW5mby5wcmltYXJ5RGF0YVNvdXJjZTtcbiAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1twcmltYXJ5SWRdKSk7XG5cbiAgICAgIC8vIFRoZW4sIGxvb3AgdGhyb3VnaCBhbnkgc2Vjb25kYXJ5IGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBmb3IgKGNvbnN0IHNlY29uZGFyeUlkIG9mIHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnJlZmVyZW5jZWREYXRhU291cmNlTGlzdCkge1xuICAgICAgICBpZiAoc2Vjb25kYXJ5SWQgIT09IHByaW1hcnlJZCkge1xuICAgICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1tzZWNvbmRhcnlJZF0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmlsdGVyc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTZWxlY3RlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5TdW1tYXJ5LFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSwgLy8gaW5jbHVkZUFsbENvbHVtbnMgKGNhbiBiZSBvdmVycmlkZGVuIGJ5IGNvbHVtbnNUb0luY2x1ZGVCeUlkKVxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuVW5kZXJseWluZyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHRoaXMudmlzdWFsSWQpLnRoZW48QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4oKGxvZ2ljYWxUYWJsZUluZm9zKSA9PiB7XG4gICAgICByZXR1cm4gbG9naWNhbFRhYmxlSW5mb3MubWFwKChsb2dpY2FsVGFibGVJbmZvKSA9PiBuZXcgTG9naWNhbFRhYmxlKGxvZ2ljYWxUYWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhclNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5SWRBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIobWFyaywgJ21hcmsnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYW5ub3RhdGVNYXJrQXN5bmModGhpcy52aXN1YWxJZCwgbWFyaywgYW5ub3RhdGlvblRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBbm5vdGF0aW9uc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKSB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhbm5vdGF0aW9uLCAnYW5ub3RhdGlvbicpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVBbm5vdGF0aW9uQXN5bmModGhpcy52aXN1YWxJZCwgYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgY29uZmlnOiBDb250ZXh0TWVudU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBlbmRDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBjb25maWcpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbmFtZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVIZWFkZXIsIG1lbnVEZXNjcmlwdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGhvdmVyVHVwbGVBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuaG92ZXJUdXBsZUFzeW5jKHRoaXMudmlzdWFsSWQsIGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBzZWxlY3RUdXBsZXNBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0VHVwbGVzQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkOiBudW1iZXIpOiBQcm9taXNlPFN0cmluZz4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBnZXRUb29sdGlwVGV4dEFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRUb29sdGlwVGV4dEFzeW5jKHRoaXMudmlzdWFsSWQsIHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgICAgIGBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFjY2Vzc2liaWxpdHlTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eSk7XG4gICAgcmV0dXJuIHNlcnZpY2UubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNvdXJjZUluZm86IERhdGFTb3VyY2VJbmZvKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZUltcGwgPSBuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZUluZm8sIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlBY3RpdmVTaGVldCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVXb3Jrc2hlZXQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQoKTtcbiAgICBjb25zdCBpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLmlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpO1xuXG4gICAgaWYgKCFpc1Jvb3RBbmRBY3RpdmVXb3Jrc2hlZXQgJiYgIWlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkICYmICFpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsICYmIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgJiYgdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsICE9PSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBsb2dpY2FsIHRhYmxlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgTG9naWNhbFRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuTG9naWNhbFRhYmxlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ2ljYWxUYWJsZTogTG9naWNhbFRhYmxlSW5mbykge31cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuY2FwdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0LCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCBpbXBsZW1lbnRzIFRvb2x0aXBUZXh0UmVxdWVzdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLCBwdWJsaWMgdHVwbGVJZDogbnVtYmVyKSB7fVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUsIEZpbHRlckRvbWFpblR5cGUsIEZpbHRlclR5cGUsIFBlcmlvZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9saWIvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF93b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcHJvdGVjdGVkIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJUeXBlKCk6IEZpbHRlclR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmllbGRBc3luYyh0aGlzLl9maWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+KTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhcHBseVRvV29ya3NoZWV0cywgJ2FwcGx5VG9Xb3Jrc2hlZXRzJyk7XG4gICAgY29uc3QgdW5pcXVlV29ya3NoZWV0cyA9IG5ldyBTZXQoYXBwbHlUb1dvcmtzaGVldHMpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZE5hbWUsIHRoaXMuX2ZpZWxkSWQsIEFycmF5LmZyb20odW5pcXVlV29ya3NoZWV0cykpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0V4Y2x1ZGVNb2RlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ/OiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4Y2x1ZGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0V4Y2x1ZGVNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGlmICghZG9tYWluVHlwZSkge1xuICAgICAgZG9tYWluVHlwZSA9IEZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQ7XG4gICAgfVxuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJEb21haW5UeXBlPihkb21haW5UeXBlLCBGaWx0ZXJEb21haW5UeXBlLCAnRmlsdGVyRG9tYWluVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWU6IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfaGllcmFyY2hpY2FsUGF0aDogc3RyaW5nLCBwcml2YXRlIF9sZXZlbDogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoaWNhbFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2hpY2FsUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsIGltcGxlbWVudHMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmFtZTogc3RyaW5nLCBwcml2YXRlIF9sZXZlbFNlbGVjdGlvblN0YXRlOiBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbFNlbGVjdGlvblN0YXRlKCk6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbFNlbGVjdGlvblN0YXRlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9kaW1lbnNpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaGllcmFyY2h5Q2FwdGlvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgX251bWJlck9mTGV2ZWxzOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4sXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0FsbFNlbGVjdGVkOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBDb250cmFjdC5GaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGltZW5zaW9uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaW1lbnNpb25OYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWVyYXJjaHlDYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZXJhcmNoeUNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IG51bWJlck9mTGV2ZWxzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbERldGFpbHMoKTogQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNBbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBwbGllZFZhbHVlcygpOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGllZFZhbHVlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2luY2x1ZGVOdWxsVmFsdWVzOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5jbHVkZU51bGxWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVOdWxsVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRSYW5nZURvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hbmNob3JEYXRlOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfcGVyaW9kVHlwZTogUGVyaW9kVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZVR5cGU6IERhdGVSYW5nZVR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VOOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFuY2hvckRhdGUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVyaW9kVHlwZSgpOiBQZXJpb2RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyaW9kVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VUeXBlKCk6IERhdGVSYW5nZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmdlTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZU47XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LCBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhbmdlRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4KCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCBNYXJrVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVGFibGUge1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2RhdGE6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+LFxuICAgIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgcHJpdmF0ZSBfdG90YWxSb3dDb3VudDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2lzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNTdW1tYXJ5RGF0YTogYm9vbGVhbixcbiAgICBwcml2YXRlIF9tYXJrc0luZm8/OiBBcnJheTxNYXJrSW5mbz4sXG4gICkge1xuICAgIHRoaXMuX25hbWUgPSBfaXNTdW1tYXJ5RGF0YSA/ICdTdW1tYXJ5IERhdGEgVGFibGUnIDogJ1VuZGVybHlpbmcgRGF0YSBUYWJsZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8Q29udHJhY3QuQ29sdW1uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hcmtzSW5mbygpOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tYXJrc0luZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvdGFsUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxSb3dDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNUb3RhbFJvd0NvdW50TGltaXRlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNUb3RhbFJvd0NvdW50TGltaXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTdW1tYXJ5RGF0YSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdW1tYXJ5RGF0YTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFya0luZm8gaW1wbGVtZW50cyBDb250cmFjdC5NYXJrSW5mbyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF90eXBlOiBNYXJrVHlwZSwgcHJpdmF0ZSBfY29sb3I6IHN0cmluZywgcHJpdmF0ZSBfdHVwbGVJZD86IG51bWJlcikge31cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogTWFya1R5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHVwbGVJZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90dXBsZUlkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW4gaW1wbGVtZW50cyBDb250cmFjdC5Db2x1bW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZmllbGROYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgX2RhdGFUeXBlOiBEYXRhVHlwZSxcbiAgICBwcml2YXRlIF9pc1JlZmVyZW5jZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1JlZmVyZW5jZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVmZXJlbmNlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gIC8qIHRzbGludDpkaXNhYmxlOm5vLWFueSAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWU6IGFueSwgcHJpdmF0ZSBfbmF0aXZlVmFsdWU6IGFueSwgcHJpdmF0ZSBfZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmcpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmF0aXZlVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlZFZhbHVlO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVhZGVyIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlUmVhZGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaWQ6IHN0cmluZywgcHJvdGVjdGVkIF90b3RhbFJvd0NvdW50OiBudW1iZXIsIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlQ291bnQgPSBNYXRoLmNlaWwoX3RvdGFsUm93Q291bnQgLyBfcGFnZVJvd0NvdW50KTtcbiAgfVxuICBwcm90ZWN0ZWQgX3BhZ2VDb3VudDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZShwYWdlTnVtYmVyLCAwLCB0aGlzLl9wYWdlQ291bnQpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYWdlQXN5bmModGhpcy5faWQsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsUGFnZXNBc3luYyhtYXhSb3dzPzogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBmaXJzdFBhZ2U6IENvbnRyYWN0LkRhdGFUYWJsZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKDApO1xuICAgIG1heFJvd3MgPSBtYXhSb3dzIHx8IHRoaXMudG90YWxSb3dDb3VudDtcbiAgICBjb25zdCByb3dzUmVxdWVzdGVkID0gTWF0aC5taW4obWF4Um93cywgdGhpcy50b3RhbFJvd0NvdW50KTtcbiAgICBjb25zdCBwYWdlc1JlcXVlc3RlZCA9IE1hdGguY2VpbChyb3dzUmVxdWVzdGVkIC8gdGhpcy5fcGFnZVJvd0NvdW50KTtcblxuICAgIC8vIEZldGNoIHVwIHRvIDQwMCBwYWdlcywgd2l0aCBhIGRlZmF1bHQgb2YgMTAsMDAwIHBhZ2VSb3dDb3VudCB0aGF0IGdpdmVzIHVzIDQsMDAwLDAwMCByb3dzXG4gICAgY29uc3QgcGFnZXNUb0ZldGNoID0gTWF0aC5taW4ocGFnZXNSZXF1ZXN0ZWQsIDQwMCk7XG4gICAgY29uc3QgaXNEYXRhTGltaXRlZCA9IHBhZ2VzVG9GZXRjaCA8IHBhZ2VzUmVxdWVzdGVkO1xuICAgIGxldCByZW1haW5pbmdEYXRhOiBBcnJheTxBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+Pj4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhZ2VzVG9GZXRjaDsgaSsrKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoaSk7XG4gICAgICByZW1haW5pbmdEYXRhLnB1c2gocGFnZS5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgZnVsbERhdGEgPSBmaXJzdFBhZ2UuZGF0YS5jb25jYXQoLi4ucmVtYWluaW5nRGF0YSk7XG4gICAgLy8gVGhpcyBzbGljZXMgdGhlIGFycmF5IG9ubHkgaWYgbWF4Um93cyBoYXMgYmVlbiBzZXQgYW5kIGlzIGxlc3MgdGhhbiB0b3RhbFJvd0NvdW50XG4gICAgZnVsbERhdGEubGVuZ3RoID0gcm93c1JlcXVlc3RlZDtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmaXJzdFBhZ2UubmFtZSxcbiAgICAgIGRhdGE6IGZ1bGxEYXRhLFxuICAgICAgY29sdW1uczogZmlyc3RQYWdlLmNvbHVtbnMsXG4gICAgICB0b3RhbFJvd0NvdW50OiBpc0RhdGFMaW1pdGVkID8gcGFnZXNUb0ZldGNoICogdGhpcy5fcGFnZVJvd0NvdW50IDogcm93c1JlcXVlc3RlZCxcbiAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGlzRGF0YUxpbWl0ZWQsXG4gICAgICBpc1N1bW1hcnlEYXRhOiBmaXJzdFBhZ2UuaXNTdW1tYXJ5RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVsZWFzZUFzeW5jKHRoaXMuX2lkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcENvbnRleHQgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSG92ZXJUdXBsZUludGVyYWN0aW9uLCBTZWxlY3RPcHRpb25zLCBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG5cbi8qKlxuICogUmFuZ2UgYmFzZWQgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgbWluVmFsdWU6IHN0cmluZztcbiAgcHVibGljIG1heFZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBpbmNsdWRlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuLyoqXG4gKiBUdXBsZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0aW9uVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgb2JqZWN0SWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGNsYXNzIHRvIHBvcHVsYXRlIGFsbCB0aGUgc2VsZWN0aW9uIG1vZGVscyB3aGVuIHBhcnNpbmcgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gIHB1YmxpYyBoaWVyTW9kZWxBcnI6IEFycmF5PEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgZGltTW9kZWxBcnI6IEFycmF5PERpbWVuc2lvblNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgcXVhbnRNb2RlbEFycjogQXJyYXk8UmFuZ2VTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbjogVHVwbGVTZWxlY3Rpb25Nb2RlbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgIHB1YmxpYyBzZWxlY3RPcHRpb25zOiBTZWxlY3RPcHRpb25zLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0LFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCBpbXBsZW1lbnRzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIHB1YmxpYyBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4sXG4gICkge31cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb2ludCBpbXBsZW1lbnRzIENvbnRyYWN0LlBvaW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6IG51bWJlciwgcHJpdmF0ZSBfeTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl94O1xuICB9XG5cbiAgcHVibGljIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3k7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGVudW0gR2V0RGF0YVR5cGUge1xuICBTdW1tYXJ5ID0gJ3N1bW1hcnknLFxuICBVbmRlcmx5aW5nID0gJ3VuZGVybHlpbmcnLFxufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGltcGxlbWVudGluZyB0aGUgbG9naWMgZm9yIHZhcmlvdXMgZ2V0RGF0YSBjYWxsc1xuICpcbiAqIEBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2VcbiAqIEBleHRlbmRzIHtBcGlTZXJ2aWNlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaW1pdCBvZiByb3dzIGZvciBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jXG4gICAqL1xuICBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge0dldERhdGFUeXBlfSBnZXRUeXBlICBUaGUgdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgb3Igbm90IGFsaWFzZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgb3Igbm90IHNlbGVjdGlvbiBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj59ICBEYXRhIHRhYmxlIHJlYWRlciB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgZGF0YVxuICAgKi9cbiAgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgICovXG4gIGdldFNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgICovXG4gIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICovXG4gIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKiBAcGFyYW0gcGFnZU51bWJlciAgVGhlIHBhZ2UgbnVtYmVyICh6ZXJvLWJhc2VkKS5cbiAgICogQHBhcmFtIHBhZ2VTaXplICAgIFRoZSBwYWdlIHNpemUgb2YgdGhlIG93bmluZyBEYXRhVGFibGVSZWFkZXJcbiAgICogQHJldHVybnMgICAgICAgICAgIEEgRGF0YVRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBwYWdlLiBUaGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSBsZXNzIHRoYW4gcmVxdWVzdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEuXG4gICAqL1xuICBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKi9cbiAgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIFZlcnNpb25OdW1iZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5ub3RhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRXhwb3J0U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1Zpc3VhbE1vZGVsU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVml6U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVml6U2VydmljZUltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1pvbmVTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyLCBwbGF0Zm9ybVZlcnNpb24/OiBWZXJzaW9uTnVtYmVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbmltYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBEYXRhU291cmNlU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCwgcGxhdGZvcm1WZXJzaW9uKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHBvcnRTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBHZXREYXRhU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRmlsdGVyU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgTm90aWZpY2F0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgUGFyYW1ldGVyc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNlbGVjdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFubm90YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBab25lU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2l6ZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFZpc3VhbE1vZGVsU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVml6U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQmFzZSBpbnRlcmZhY2UgZm9yIGFuIGFwaSBzZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYW1lIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3Rpb24gb2Ygc2VydmljZSBuYW1lIHdoaWNoIHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgYXBpLXNoYXJlZCBwcm9qZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFNlcnZpY2VOYW1lcyB7XG4gIEFjY2Vzc2liaWxpdHkgPSAnYWNjZXNzaWJpbGl0eScsXG4gIEF1dGhlbnRpY2F0aW9uID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQ2xpZW50SW5mbyA9ICdjbGllbnQtaW5mby1zZXJ2aWNlJyxcbiAgRGF0YVNvdXJjZVNlcnZpY2UgPSAnZGF0YS1zb3VyY2Utc2VydmljZScsXG4gIEdldERhdGEgPSAnZ2V0LWRhdGEtc2VydmljZScsXG4gIEZpbHRlciA9ICdmaWx0ZXItc2VydmljZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24tc2VydmljZScsXG4gIFBhcmFtZXRlcnMgPSAncGFyYW1ldGVycy1zZXJ2aWNlJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbi1zZXJ2aWNlJyxcbiAgQW5ub3RhdGlvbiA9ICdhbm5vdGF0aW9uLXNlcnZpY2UnLFxuICBab25lID0gJ3pvbmUtc2VydmljZScsXG4gIEFuaW1hdGlvbiA9ICdhbmltYXRpb24tc2VydmljZScsXG4gIFZpeiA9ICd2aXotc2VydmljZScsXG4gIEV4dGVybmFsQ29udGV4dE1lbnUgPSAnZXh0ZXJuYWwtY29udGV4dC1tZW51LXNlcnZpY2UnLFxuICBJbml0aWFsaXphdGlvbiA9ICdpbml0aWFsaXphdGlvbi1zZXJ2aWNlJyxcbiAgU3RvcnlBY3RpdmF0aW9uID0gJ3N0b3J5LWFjdGl2YXRpb24tc2VydmljZScsXG4gIFNpemUgPSAnc2l6ZS1zZXJ2aWNlJyxcbiAgRXhwb3J0ID0gJ2V4cG9ydC1zZXJ2aWNlJyxcbiAgVmlzdWFsTW9kZWwgPSAndmlzdWFsLW1vZGVsLXNlcnZpY2UnLFxufVxuXG4vKipcbiAqIERvIHNvbWUgZ2xvYmFsIGRlY2xhcmF0aW9ucyBzbyB3ZSBjYW4gY3JlYXRlIGEgc2luZ2xldG9uIG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5OiB7IFtyZWdpc3RyeUlkOiBudW1iZXJdOiBTZXJ2aWNlUmVnaXN0cnkgfTtcbiAgfVxufVxuXG53aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCB7fTtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgaW50byB0aGUgc2VydmljZSByZWdpc3RyeS4gQW55IGV4aXN0aW5nIG9uZSB3aWxsXG4gICAqIGJlIG92ZXJ3cml0dGVuLiB0aGUgc2VydmljZSBpcyByZWdpc3RlcmVkIHVuZGVyIHNlcnZpY2Uuc2VydmljZU5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlIFRoZSBzZXJ2aXZlIHRvIHJlZ2lzdGVyXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlcmUgaXMgbm90IGFcbiAgICogc2VydmljZSByZWdpc3RlcmVkIHVuZGVyIHRoYXQgbmFtZSwgdGhyb3dzIGFuZCBlcnJvclxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgcmVxdWVzdGVkIHNlcnZpY2VcbiAgICovXG4gIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUO1xufVxuXG5jbGFzcyBTZXJ2aWNlUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfc2VydmljZXM6IHsgW3NlcnZpY2VOYW1lOiBzdHJpbmddOiBBcGlTZXJ2aWNlIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlLnNlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fc2VydmljZXMuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7c2VydmljZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2VOYW1lXSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2VcbiAqIG9mIHRoZSBBcGlTZXJ2aWNlUmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeUlkLlxuICpcbiAqIEV4dGVuc2lvbnMgYnkgZGVzaWduIGRvbid0IG5lZWQgdG8gc3RvcmUvYWNjZXNzIG11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcy4gVGhlaXIgc2luZ2xlIGluc3RhbmNlIG9mIFNlcnZpY2VSZWdpc3RyeSBpc1xuICogc3RvcmVkL2FjY2VzcyB3aXRoIHJlZ2lzdHJ5SWQgPSAwLlxuICpcbiAqIFdoZXJlYXMgRW1iZWRkaW5nIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHdoaWNoIFNlcnZpY2VSZWdpc3RyeSB0byB1c2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdml6emVzIGVtYmVkZGVkLlxuICogQW4gZXhhbXBsZSBvZiBob3cgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB3aWxsIGxvb2sgd2hlbiB0aGVyZSBhcmUgdHdvIHZpenplczogeyAwIDogU2VydmljZVJlZ2lzdHJ5LCAxIDogU2VydmljZVJlZ2lzdHJ5fVxuICogd2hlcmUgcmVnaXN0cnkgSUQgb2YgMCAmIDEgcmVmZXJzIHRvIHZpeidzIGludGVybmFsIGlkZW50aWZpZXIgKHdoaWNoIGlzIGdlbmVyYXRlZCBieSBWaXpNYW5hZ2VyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VSZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQocmVnaXN0cnlJZDogbnVtYmVyKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwgIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShyZWdpc3RyeUlkLCBuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgc2V0cyB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnlJZC4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2UocmVnaXN0cnlJZDogbnVtYmVyLCBzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdID0gc2VydmljZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSB0byBhdm9pZCBhbnlvbmUgY29uc3RydWN0aW5nIHRoaXNcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvQWNjZXNzaWJpbGl0eU1vZGVscyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgbGV0IHRvb2x0aXBUZXh0UmVxdWVzdCA9IG5ldyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCh2aXN1YWxJZCwgdHVwbGVJZCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VG9vbHRpcFRleHRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVG9vbHRpcFRleHRSZXF1ZXN0XTogdG9vbHRpcFRleHRSZXF1ZXN0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRUb29sdGlwVGV4dCwgcGFyYW1ldGVycykudGhlbjxTdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBsYXlTcGVlZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5pbWF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFuaW1hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBc3luYyhyZXBsYXlTcGVlZDogUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF06IDEuMCxcbiAgICB9O1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxSZXBsYXlTcGVlZFR5cGU+KHJlcGxheVNwZWVkLCBSZXBsYXlTcGVlZFR5cGUsICdSZXBsYXlTcGVlZFR5cGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRSZXBsYXlTcGVlZFR5cGUuY29udmVydChyZXBsYXlTcGVlZCk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZXBsYXlBbmltYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBbm5vdGF0ZUVudW0sIEFubm90YXRpb24sIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciwgVHVwbGVTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFubm90YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYW5ub3RhdGUgYSBtYXJrIG9uIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gbWFya1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblRleHRcbiAgICovXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VNYXJrU2VsZWN0aW9uSWRzKFttYXJrXSk7XG4gICAgY29uc3QgZHVtbXlUYXJnZXRQb2ludCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IGZvcm1hdHRlZFRleHQgPSBgPGZvcm1hdHRlZC10ZXh0PjxydW4+JHthbm5vdGF0aW9uVGV4dH08L3J1bj48L2Zvcm1hdHRlZC10ZXh0PmA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYW5ub3RhdGVNYXJrQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuQW5ub3RhdGVFbnVtXTogQW5ub3RhdGVFbnVtLk1hcmssXG4gICAgICBbUGFyYW1ldGVySWQuVGFyZ2V0UG9pbnRdOiBkdW1teVRhcmdldFBvaW50LFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Gb3JtYXR0ZWRUZXh0XTogZm9ybWF0dGVkVGV4dCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNyZWF0ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbm5vdGF0aW9ucyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEFubm90YXRpb24+Pn1cbiAgICovXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QW5ub3RhdGlvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFubm90YXRpb25zLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zTGlzdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxBbm5vdGF0aW9uPjtcbiAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25GaWx0ZXJNYXAoYW5ub3RhdGlvbnNMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmVtb3ZlIGFuIGFubm90YXRpb24gZnJvbSBhIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgYW5ub3RhdGlvbjogQ29udHJhY3QuQW5ub3RhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhbYW5ub3RhdGlvbl0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUFubm90YXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25MaXN0XTogW3NlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbl0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVBbm5vdGF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlTWFya1NlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmsudHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCAmJiB0dXBsZUlkID4gMCkge1xuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCB0dXBsZUlkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhhbm5vdGF0aW9uczogQXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBhbm5vdGF0aW9uLmFubm90YXRpb25JZDtcbiAgICAgIGlmIChhbm5vdGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uSWQgIT09IG51bGwgJiYgYW5ub3RhdGlvbklkID49IDApIHtcbiAgICAgICAgaWRzLnB1c2goYW5ub3RhdGlvbklkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSBhbm5vdGF0aW9uIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIGFubm90YXRpb25JZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBhbm5vdGF0aW9uIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ2Fubm90YXRpb25zJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtYXAgQW5ub3RhdGlvbiB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICogQHJldHVybnMge0Fubm90YXRpb259XG4gICAqL1xuICBwcml2YXRlIG1hcEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbik6IENvbnRyYWN0LkFubm90YXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uSFRNTDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVGV4dCxcbiAgICAgIGFubm90YXRpb25JZDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uSWQsXG4gICAgICBhbm5vdGF0aW9uVGV4dDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uUGxhaW5UZXh0LFxuICAgICAgYW5ub3RhdGlvblR5cGU6IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbm5vdGF0aW9uVHlwZS5jb252ZXJ0KGFubm90YXRpb24uYW5ub3RhdGVFbnVtKSxcbiAgICAgIHR1cGxlSWQ6IGFubm90YXRpb24udHVwbGVJZCEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIEFubm90YXRpb25zIHRvIE1hcmsgQW5ub3RhdGlvbnMsIGFuZCBtYXAgdGhlbSB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxBbm5vdGF0aW9uPn1cbiAgICovXG4gIHByaXZhdGUgYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj4pOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkluZm9zID0gYW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiB0aGlzLm1hcEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuXG4gICAgcmV0dXJuIGFubm90YXRpb25JbmZvcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbywgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQ2xpZW50SW5mb1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQ2xpZW50SW5mb1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldENsaWVudEluZm9Bc3luYygpOiBQcm9taXNlPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEVtYmVkZGluZ0NsaWVudEluZm87XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENsaWVudEluZm9Bc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFbWJlZGRpbmdCb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudEluZm8gPSByZXNwb25zZS5yZXN1bHQgYXMgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbztcbiAgICAgIHJldHVybiBjbGllbnRJbmZvO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9GaWVsZEltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNvbnN0IFNFTlRJTkVMX0xPR0lDQUxfVEFCTEVfSU5GTzogTG9naWNhbFRhYmxlSW5mbyA9IHtcbiAgaWQ6IEludGVybmFsQ29udHJhY3QuQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsLlNpbmdsZVRhYmxlSWQsXG4gIGNhcHRpb246IEludGVybmFsQ29udHJhY3QuQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsLlNpbmdsZVRhYmxlQ2FwdGlvbixcbn07XG5cbi8vIFRoZSBtaW5pbXVtIHBsYXRmb3JtIHZlcnNpb24gd2hlbiBPYmplY3QgTW9kZWwgd2FzIHN1cHBvcnRlZFxuY29uc3QgcGxhdGZvcm1WZXJzaW9uT2JqZWN0TW9kZWxTdXBwb3J0ID0geyBtYWpvcjogMSwgbWlub3I6IDIwLCBmaXg6IDEgfTtcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIERhdGFTb3VyY2VTZXJ2aWNlIHtcbiAgLy8gU2luY2UgT2JqZWN0IE1vZGVsIGlzIHN1cHBvcnRlZCBzaW5jZSBUYWJsZWF1IDIwMjAuMiwgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIHRoZVxuICAvLyBwbGF0Zm9ybSB2ZXJzaW9uIHdoZW4gT00gd2FzIHN1cHBvcnRlZC4gT25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIFRhYmxlYXUgdmVyc2lvbnMgPD0gMjAyMC4xLCBhbGwgYWRkaXRpb25hbFxuICAvLyBjb2RlIGluIGhlcmUgZm9yIE9iamVjdCBNb2RlbCBjYW4gYmUgcmVtb3ZlZC5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBJbnRlcm5hbENvbnRyYWN0LlZlcnNpb25OdW1iZXIgPSBwbGF0Zm9ybVZlcnNpb25PYmplY3RNb2RlbFN1cHBvcnQsXG4gICkge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVmcmVzaEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy8gT24gc2VydmVyOiBOb3QgcGFzc2luZyB0aGUgZGF0YXNvdXJjZSBpZCB3aWxsIHJlZnJlc2ggYWxsIGRhdGFzb3VyY2VzLlxuICAgIGlmIChkYXRhU291cmNlSWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXSA9IGRhdGFTb3VyY2VJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IGpvaW5QYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWN0aXZlVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWN0aXZlVGFibGVzLCBqb2luUGFyYW1ldGVycykudGhlbjxBcnJheTxUYWJsZUluZm8+Pigoam9pblJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUluZm9zID0gam9pblJlc3BvbnNlLnJlc3VsdCBhcyBUYWJsZUluZm9zO1xuXG4gICAgICAvLyBnZXRBY3RpdmVUYWJsZXMgaXMgdW5zdXBwb3J0ZWQgZm9yIGN1YmVzIGFuZCBHQS4gV2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uIHR5cGUgcHJvcGVydHlcbiAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHRoZSBwbGF0Zm9ybSAoaW50ZW50aW9uYWxseSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYXMgbmV3IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCkuXG4gICAgICAvLyBJbnN0ZWFkLGp1c3QgY2hlY2sgaWYgYW55IHRhYmxlcyBhcmUgcmV0dXJuZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3IgYW55IG5vbi10YWJsZSBiYXNlZCBkYXRhc291cmNlLlxuICAgICAgaWYgKHRhYmxlSW5mb3MudGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRNZXRob2RGb3JEYXRhU291cmNlVHlwZSwgYGdldEFjdGl2ZVRhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGZvcjogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZUluZm9zLnRhYmxlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbGxEYXRhU291cmNlc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFsbERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzLCBwYXJhbXMpLnRoZW48Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uU3VtbWFyaWVzID0gcmVzcG9uc2UucmVzdWx0IGFzIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblN1bW1hcmllcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKGdsb2JhbGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmllbGRBbmREYXRhU291cmNlO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWVsZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlXSBhcyBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2U7XG4gICAgICBjb25zdCBmaWVsZCA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5GaWVsZF0gYXMgRmllbGQ7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmllbGQoZmllbGQsIHRoaXMuY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBpZiAoIXRoaXMuaXNPYmplY3RNb2RlbFN1cHBvcnRlZEJ5UGxhdGZvcm0oKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIHNlbnRpbmVsIElEIGNhbiBiZSBwYXNzZWQgdG8gZGF0YXNvdXJjZS5nZXRMb2dpY2FsVGFibGVEYXRhLlxuICAgICAgICogT25jZSB0aGUgZGVza3RvcCBpcyB1cGdyYWRlZCB0byBhIHZlcnNpb24gdGhhdCBzdXBwb3J0cyBvYmplY3QgbW9kZWwsXG4gICAgICAgKiB0aGUgc2VudGluZWwgSUQgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSB1cGdyYWRlZCB0YWJsZS5cbiAgICAgICAqICovXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNvbHZlKSA9PiByZXNvbHZlKFtTRU5USU5FTF9MT0dJQ0FMX1RBQkxFX0lORk9dKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGlmICghdGhpcy5pc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgc2VudGluZWwgSUQgY2FuIGJlIHBhc3NlZCB0byB3b3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YS5cbiAgICAgICAqIE9uY2UgdGhlIGRlc2t0b3AgaXMgdXBncmFkZWQgdG8gYSB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgb2JqZWN0IG1vZGVsLFxuICAgICAgICogdGhlIHNlbnRpbmVsIElEIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgdXBncmFkZWQgdGFibGUuXG4gICAgICAgKiAqL1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPXSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmllbGQoZmllbGQ6IEludGVybmFsQ29udHJhY3QuRmllbGQsIGRhdGFTb3VyY2U6IENvbnRyYWN0LkRhdGFTb3VyY2UpOiBDb250cmFjdC5GaWVsZCB7XG4gICAgcmV0dXJuIG5ldyBGaWVsZChuZXcgRmllbGRJbXBsKGZpZWxkLCBkYXRhU291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRhU291cmNlKGRhdGFTb3VyY2U6IEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZSwgdGhpcy5fcmVnaXN0cnlJZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwbGF0Zm9ybVZlcnNpb25Ob09iamVjdE1vZGVsU3VwcG9ydCA9IHsgbWFqb3I6IDEsIG1pbm9yOiAxMywgZml4OiAwIH07XG4gICAgcmV0dXJuIEludGVybmFsQ29udHJhY3QuVmVyc2lvbkxlc3NUaGFuKHBsYXRmb3JtVmVyc2lvbk5vT2JqZWN0TW9kZWxTdXBwb3J0LCB0aGlzLl9wbGF0Zm9ybVZlcnNpb24pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCxcbiAgRXhwb3J0RmlsZSxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFNoZWV0VHlwZSBhcyBFeHRlcm5hbFNoZWV0VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRXhwb3J0SGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0V4cG9ydEhlbHBlcnMnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4uL0V4cG9ydFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHBvcnRTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRXhwb3J0O1xuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYyhjdXJyZW50U2hlZXRUeXBlOiBFeHRlcm5hbFNoZWV0VHlwZSk6IFByb21pc2U8RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXJyZW50U2hlZXRUeXBlXTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNoZWV0VHlwZS5jb252ZXJ0KGN1cnJlbnRTaGVldFR5cGUpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEV4cG9ydENyb3NzdGFiU2hlZXRNYXA+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydENyb3NzdGFiU2hlZXRNYXA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydENyb3NzdGFiQXN5bmMoXG4gICAgc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gICAgZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlLFxuICApOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVXb3Jrc2hlZXROYW1lcywgc2hlZXROYW1lKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENyb3NzdGFiRmlsZUZvcm1hdD4oZm9ybWF0LCBDcm9zc3RhYkZpbGVGb3JtYXQsICdDcm9zc3RhYkZpbGVGb3JtYXQnKTtcblxuICAgIC8vIFRoZSBwcmVzIGxheWVyIGNvbW1hbmQgZm9yIGV4cG9ydGluZyBDcm9zc3RhYiB1c2VzIFNpbXBsZVNoZWV0SWRlbnRpZmllcnMgaW5zdGVhZCBvZiBzaGVldCBuYW1lcy5cbiAgICAvLyBUaGUgZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaSBjdXJyZW50IGRvZXMgbm90IHN0b3JlIHJlZmVyZW5jZXMgdG8gdGhlIFNpbXBsZVNoZWV0SWRlbnRpZmllcnMgb2YgaXRzIHNoZWV0c1xuICAgIC8vIHNvIHdlIGNhbGwgYSBwcmVzIGxheWVyIGNvbW1hbmQgdGhhdCBnaXZlcyB1cyB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVyIGZvciBlYWNoIHNoZWV0IG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZVxuICAgIC8vIGV4cG9ydCBDcm9zc3RhYiBkaWFsb2cgcG9wdXAuXG4gICAgY29uc3Qgc2hlZXROYW1lVG9JZE1hcCA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGUpO1xuICAgIGlmICghc2hlZXROYW1lVG9JZE1hcFtzaGVldE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ21pc3Npbmcgc2hlZXQgZG9jIGlkIGZyb20gc2hlZXRNYXAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0Q3Jvc3N0YWJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXRJZGVudGlmaWVyXTogc2hlZXROYW1lVG9JZE1hcFtzaGVldE5hbWVdLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbmROb3RpZmljYXRpb25zXTogdHJ1ZSwgLy8gc2VuZCBub3RpZmljYXRpb24gb24gcHJlcyBsYXllciB0aGF0IHRyaWdnZXJzIGZpbGUgZG93bmxvYWRcbiAgICB9O1xuXG4gICAgLy8gcHJlcyBsYXllciBjb21tYW5kIGludm9rZWQgZGVwZW5kcyBvbiB0aGUgY3Jvc3N0YWIgZmlsZSBmb3JtYXRcbiAgICBsZXQgdmVyYjtcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiQ3N2RG93bmxvYWQ7XG4gICAgICAgIC8vIENTViBvbmx5IHBhcmFtZXRlcjogc2VlIGJyb3dzZXItY2xpZW50cy9leHBvcnQtY3Jvc3N0YWItb3B0aW9ucy1kaWFsb2cgcmVwb1xuICAgICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlVzZVRhYkRlbGltaXRlcnNdID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbDpcbiAgICAgICAgdmVyYiA9IFZlcmJJZC5FeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICd1bnN1cHBvcnRlZCBDcm9zc3RhYiBmaWxlIGZvcm1hdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkNyb3NzdGFiQ3JlYXRpb25FcnJvciwgJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnQuJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnREYXRhQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIC8vIFJlbW92ZSBhbnkgZHVwbGljYXRlcyBmcm9tIHRoZSBpbnB1dCBhcnJheVxuICAgIGNvbnN0IGNvbHVtbnNBc1NldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQpO1xuICAgIGNvbnN0IGNvbHVtbnNUb0luY2x1ZGVCeUlkID0gQXJyYXkuZnJvbShjb2x1bW5zQXNTZXQpO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnREYXRhRG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydERhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogb3B0aW9ucy5pZ25vcmVBbGlhc2VzID8/IGZhbHNlLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogY29sdW1uc1RvSW5jbHVkZUJ5SWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPHZvaWQ+KCgpID0+IHt9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkRhdGFDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydFBvd2VyUG9pbnRBc3luYyhzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQpOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lc0ZvclBERkFuZFBQVChzaGVldE5hbWVzLCBleHBvcnRTY2VuYXJpb3MpO1xuXG4gICAgLy8gTm90ZTogdGhlIEV4cG9ydE9yaWdpblVybCBwYXJhbSBpcyBsaXN0ZWQgYXMgb3B0aW9uYWwgZm9yIHRoZSBwcmVzIGxheWVyIGNvbW1hbmQgd2UgYXJlIGludm9raW5nOyBob3dldmVyLFxuICAgIC8vIHJlY2VudCBjaGFuZ2VzIHdlcmUgbWFkZSB0aGF0IGVuZm9yY2VkIHRoZSB1c2Ugb2YgdGhlIGVtcHR5IHN0cmluZyB3aGVuIGludm9raW5nIHRoaXMgY29tbWFuZCB3aXRoIG5vIEV4cG9ydE9yaWdpblVybC5cbiAgICAvLyBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wb3dlcnBvaW50LW9wdGlvbnMtZGlhbG9nIHJlcG8uXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnRQb3dlcnBvaW50RG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydFBvd2VyUG9pbnRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0T3JpZ2luVXJsXTogJycsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0ZWRTaGVldE5hbWVzXTogc2hlZXROYW1lcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5Qb3dlclBvaW50Q3JlYXRpb25FcnJvcixcbiAgICAgICAgICAnQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIHRoZSBQb3dlclBvaW50IGZpbGUuJyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydFBERkFzeW5jKFxuICAgIHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gICAgZXhwb3J0U2NlbmFyaW9zOiBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICApOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RXhwb3J0UERGT3B0aW9ucyhleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICBjb25zdCBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk7XG4gICAgRXhwb3J0SGVscGVycy51cGRhdGVJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIHNoZWV0TmFtZXMpO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnRQZGZEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UERGQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4cG9ydFBkZk9wdGlvbnNdOiBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuUERGQ3JlYXRpb25FcnJvciwgJ1VuYWJsZSB0byBjcmVhdGUgUERGIGJlY2F1c2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcuIFRyeSBhZ2Fpbi4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydFBERk9wdGlvbnNBc3luYygpOiBQcm9taXNlPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RXhwb3J0UGRmT3B0aW9ucztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RXhwb3J0UGRmT3B0aW9uc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFwaU1lbnVUeXBlLCBDb250ZXh0TWVudU9wdGlvbnMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIGFwcGVuZENvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBlbmRFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBlbmRDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZV06IGNvbmZpZy5kaXNwbGF5TmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBuZXdNZW51SXRlbUlkID0gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIHJldHVybiBuZXdNZW51SXRlbUlkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbW92ZUV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeGVjdXRlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZW5hbWVFeHRlcm5hbE1lbnU7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbmFtZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SGVhZGVyXTogbWVudUhlYWRlcixcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVEZXNjcmlwdGlvbl06IG1lbnVEZXNjcmlwdGlvbixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRmlsdGVyVHlwZSwgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBJbnRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsRG9tYWluLFxuICBDYXRlZ29yaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsRGF0YVZhbHVlLFxuICBIaWVyYXJjaGljYWxGaWx0ZXIsXG4gIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsLFxuICBSYW5nZURvbWFpbixcbiAgUmFuZ2VGaWx0ZXIsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlcixcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL0ZpbHRlck1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEZpbHRlclNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5GaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5RmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID1cbiAgICAgIGZpbHRlck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSYW5nZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSYW5nZUZpbHRlckFzeW5jJyxcbiAgICB9O1xuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5taW4gIT09IG51bGwpIHtcbiAgICAgIGxldCBtaW46IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWluID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbiA9IGZpbHRlck9wdGlvbnMubWluO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1pbl0gPSBtaW47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5tYXggIT09IG51bGwpIHtcbiAgICAgIGxldCBtYXg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWF4ID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9IGZpbHRlck9wdGlvbnMubWF4O1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1heF0gPSBtYXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIG51bGwgb3B0aW9uIGlzIHVzZWQgd2l0aCBtaW4rbWF4IGZvciAnaW5jbHVkZS1yYW5nZScgb3IgJ2luY2x1ZGUtcmFuZ2Utb3ItbnVsbCdcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTnVsbE9wdGlvbl0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIubnVsbE9wdGlvbnMuY29udmVydChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihyZXNwb25zZS5yZXN1bHQgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG5cbiAgICBjb25zdCBoaWVyYXJjaGljYWxMZXZlbHMgPSAodmFsdWVzIGFzIENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscykubGV2ZWxzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGllcmFyY2hpY2FsTGV2ZWxzKSAmJiBoaWVyYXJjaGljYWxMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJMZXZlbHNdID0gaGllcmFyY2hpY2FsTGV2ZWxzO1xuICAgIH0gZWxzZSBpZiAoKHZhbHVlcyBhcyBBcnJheTxTdHJpbmc+KS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBzZXJ2ZXIgY29tbWFuZCBleHBlY3RzIGVtcHR5IGxpc3QgZm9yIGNsZWFyaW5nIHRoZSBmaWx0ZXJcbiAgICAgIC8vIGl0IGFsc28gZXhwZWN0cyBlaXRoZXJzIEZpbHRlckxldmVscyBvciBGaWx0ZXJWYWx1ZXMgdG8gYmUgc2V0XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID0gZmlsdGVyT3B0aW9ucyAmJiAhIWZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2xlYXJGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3Bvc25lKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucykge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QZXJpb2RUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5wZXJpb2RUeXBlLmNvbnZlcnQob3B0aW9ucy5wZXJpb2RUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRhdGVSYW5nZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChvcHRpb25zLnJhbmdlVHlwZSk7XG4gICAgaWYgKG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLkxhc3ROIHx8IG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLk5leHROKSB7XG4gICAgICBpZiAob3B0aW9ucy5yYW5nZU4gPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnJhbmdlTiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIEVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMsXG4gICAgICAgICAgJ01pc3NpbmcgcmFuZ2VOIGZpZWxkIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIExBU1ROIG9yIE5FWFROLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJhbmdlTl0gPSBvcHRpb25zLnJhbmdlTjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbmNob3JEYXRlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hbmNob3JEYXRlICE9PSBudWxsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkFuY2hvckRhdGVdID0gdGhpcy5jb252ZXJ0QW5jaG9yRGF0ZShvcHRpb25zLmFuY2hvckRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmlsdGVycztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RmlsdGVyc0FzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0Q2F0ZWdvcmljYWxEb21haW47XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENhdGVnb3JpY2FsRG9tYWluQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRG9tYWluVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyRG9tYWluVHlwZS5jb252ZXJ0KGRvbWFpblR5cGUpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJhbmdlRG9tYWluQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcsIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRSYW5nZURvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UmFuZ2VEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlJhbmdlRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXREYXNoYm9hcmRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5EYXNoYm9hcmRDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYycpO1xuICAgIGNvbnN0IHdvcmtzaGVldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHM/Lm1hcCgod29ya3NoZWV0SW5mbzogSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbCkgPT4ge1xuICAgICAgaWYgKHdvcmtzaGVldEluZm8uaXNTZWxlY3RlZCkge1xuICAgICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldEluZm8ud29ya3NoZWV0TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdvcmtzaGVldE5hbWVzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBhcHBseVRvV29ya3NoZWV0czogQXJyYXk8c3RyaW5nPixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luY0ludGVybmFsJyk7XG4gICAgaWYgKCFzaGFyZWRGaWx0ZXJNb2RlbCB8fCAhc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdUaGlzIGZpbHRlciBkb2VzIG5vdCBhcHBseSB0byBtdWx0aXBsZSB3b3Jrc2hlZXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dlZFdvcmtzaGVldHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGFjdGl2ZVdvcmtzaGVldCA9ICcnO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHMuZm9yRWFjaCgod29ya3NoZWV0KSA9PiB7XG4gICAgICAvLyBHZXQgYWN0aXZlIHdvcmtzaGVldFxuICAgICAgaWYgKHdvcmtzaGVldC5pc0FjdGl2ZSkge1xuICAgICAgICBhY3RpdmVXb3Jrc2hlZXQgPSB3b3Jrc2hlZXQud29ya3NoZWV0TmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gUG9wdWxhdGUgYWxsb3dlZCB3b3Jrc2hlZXRzXG4gICAgICBpZiAod29ya3NoZWV0LmlzU2VsZWN0ZWQgfHwgd29ya3NoZWV0LmlzRW5hYmxlZCkge1xuICAgICAgICBhbGxvd2VkV29ya3NoZWV0cy5wdXNoKHdvcmtzaGVldC53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhY3RpdmVXb3Jrc2hlZXQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ05vIGFjdGl2ZSB3b3Jrc2hlZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwcGx5VG9Xb3Jrc2hlZXRzLmluY2x1ZGVzKGFjdGl2ZVdvcmtzaGVldCkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthY3RpdmVXb3Jrc2hlZXR9IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFwcGxpZWQgd29ya3NoZWV0c2ApO1xuICAgIH1cblxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzLmZvckVhY2goKHNoZWV0KSA9PiB7XG4gICAgICAvLyBjaGVjayBpZiBpdCdzIHByZXNlbnQgd2l0aGluIGNvbXBhdGlibGUgc2hlZXRzXG4gICAgICBpZiAoIWFsbG93ZWRXb3Jrc2hlZXRzLmluY2x1ZGVzKHNoZWV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFRoZSBmaWVsZCAke2ZpZWxkTmFtZX0gaXNuJ3QgYXBwbGljYWJsZSB0byB0aGUgd29ya3NoZWV0ICR7c2hlZXR9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkNoYW5nZVNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9ICdzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hhcmVkRmlsdGVyU2hlZXRzXSA9IGFwcGx5VG9Xb3Jrc2hlZXRzO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZ1tdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBhcHBseVRvV29ya3NoZWV0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgcHJpdmF0ZSBleGVjdXRlR2V0QXBwbGllZFdvcmtzaGVldHMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRTaGFyZWRGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV0gPSB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZEZpbHRlck1vZGVsID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgICByZXR1cm4gc2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREb21haW5GaWx0ZXJzKGRvbWFpbkZpbHRlcnM6IEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPik6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4ge1xuICAgIGNvbnN0IGZpbHRlcnM6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4gPSBbXTtcbiAgICBkb21haW5GaWx0ZXJzLmZvckVhY2goKGRvbWFpbkZpbHRlcikgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBDYXRlZ29yaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuSGllcmFyY2hpY2FsOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRIaWVyYXJjaGljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIaWVyYXJjaGljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJhbmdlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydFJhbmdlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmFuZ2UgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZToge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmVsYXRpdmUgRGF0ZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcik6IENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGR2KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNFeGNsdWRlLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyKTogQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGhpZXJhcmNoaWNhbERhdGFWYWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxEYXRhVmFsdWUoXG4gICAgICAgIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShoaWVyYXJjaGljYWxEYXRhVmFsdWUudmFsdWUpLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUuaGllcmFyY2hpY2FsUGF0aCxcbiAgICAgICAgaGllcmFyY2hpY2FsRGF0YVZhbHVlLmxldmVsLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxldmVsRGV0YWlsczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWw+ID0gZG9tYWluRmlsdGVyLmxldmVsSW5mby5tYXAoKGFMZXZlbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxMZXZlbERldGFpbChcbiAgICAgICAgYUxldmVsLm5hbWUsXG4gICAgICAgIEludGVybmFsRW51bUNvbnZlcnRlci5oaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLmNvbnZlcnQoYUxldmVsLmxldmVsU2VsZWN0aW9uU3RhdGUpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgSGllcmFyY2hpY2FsRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgZG9tYWluRmlsdGVyLmRpbWVuc2lvbk5hbWUsXG4gICAgICBkb21haW5GaWx0ZXIuaGllcmFyY2h5Q2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5sZXZlbHMsXG4gICAgICBsZXZlbERldGFpbHMsXG4gICAgICBhcHBsaWVkVmFsdWVzLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJhbmdlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcik6IENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgICBjb25zdCBtaW5WYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5taW4pO1xuICAgIGNvbnN0IG1heFZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1heCk7XG4gICAgcmV0dXJuIG5ldyBSYW5nZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIpOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICAgIGNvbnN0IGFuY2hvckRhdGVWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5hbmNob3JEYXRlKTtcbiAgICByZXR1cm4gbmV3IFJlbGF0aXZlRGF0ZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYW5jaG9yRGF0ZVZhbHVlLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQoZG9tYWluRmlsdGVyLnBlcmlvZFR5cGUpLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChkb21haW5GaWx0ZXIucmFuZ2VUeXBlKSxcbiAgICAgIGRvbWFpbkZpbHRlci5yYW5nZU4sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT4gPSBkb21haW4udmFsdWVzLm1hcCgoZG9tYWluRHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRHYpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxEb21haW4odmFsdWVzLCBkb21haW5UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJhbmdlRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5SYW5nZURvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LlJhbmdlRG9tYWluIHtcbiAgICBjb25zdCBtaW46IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWluKTtcbiAgICBjb25zdCBtYXg6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRG9tYWluKG1pbiwgbWF4LCBkb21haW5UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEFuY2hvckRhdGUoYW5jaG9yRGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgLy8gQ29udmVydHMgYSBEYXRlIG9iamVjdCBpbnRvIGEgc3RyaW5nIGZvcm1hdCB0aGF0IHRoZSBzZXJ2ZXIgZXhwZWN0cyBmb3IgZGF0ZS90aW1lIHZhbHVlcy5cbiAgICAvLyBJZiBhbmNob3JEYXRlIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgRGF0ZSBvYmplY3QsIGFueSBvZiB0aGVzZSB3b3VsZCBiZSBOYU4uXG4gICAgY29uc3QgeWVhciA9IGFuY2hvckRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IGFuY2hvckRhdGUuZ2V0VVRDTW9udGgoKSArIDE7XG4gICAgY29uc3QgZGF5ID0gYW5jaG9yRGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGggPSBhbmNob3JEYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgY29uc3QgbW0gPSBhbmNob3JEYXRlLmdldFVUQ01pbnV0ZXMoKTtcbiAgICBjb25zdCBzZWMgPSBhbmNob3JEYXRlLmdldFVUQ1NlY29uZHMoKTtcblxuICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkgfHwgaXNOYU4oZGF5KSB8fCBpc05hTihoaCkgfHwgaXNOYU4obW0pIHx8IGlzTmFOKHNlYykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkRGF0ZVBhcmFtZXRlciwgJ0ludmFsaWQgZGF0ZSBwYXJhbWV0ZXI6IGFuY2hvckRhdGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtoaH06JHttbX06JHtzZWN9YDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3Ioc2VydmVyUG06IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuUGFyYW1ldGVyRXJyb3JdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEZpbHRlckZpZWxkTmFtZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRDYXB0aW9uXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEZpbHRlckZpZWxkVmFsdWUsIHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkQWdnRmllbGROYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRBZ2dyZWdhdGlvbkZpZWxkTmFtZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkQWdnRmllbGROYW1lXSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ1NlcnZlciBFcnJvcicpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCxcbiAgRGF0YVRhYmxlIGFzIERhdGFUYWJsZUludGVybmFsQ29udHJhY3QsXG4gIERhdGFUYWJsZVJlYWRlciBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0LFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSGlnaGxpZ2h0ZWRNYXJrc1RhYmxlLFxuICBQYXJhbWV0ZXJJZCxcbiAgU2VsZWN0ZWRNYXJrc1RhYmxlLFxuICBVbmRlcmx5aW5nRGF0YVRhYmxlLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBDb2x1bW4sIERhdGFUYWJsZSwgTWFya0luZm8gfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVGFibGVSZWFkZXIgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YVRhYmxlUmVhZGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBHZXREYXRhU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBHZXREYXRhU2VydmljZSB7XG4gIC8vIFRoZSBleHRlbnNpb24vZW1iZWRkaW5nIGluc3RhbmNlIHVzZXMgdGhlIHNhbWUgY2FjaGUgZm9yIGFsbCBEYXRhVGFibGVSZWFkZXJzLlxuICBwcml2YXRlIHZpZXdEYXRhVGFibGVDYWNoZUlkOiBzdHJpbmcgPSB1dWlkdjQoKTtcblxuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5HZXREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldE1heFJvd0xpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDEwMDAwO1xuICB9XG5cbiAgcHVibGljIGdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmlld0RhdGFUYWJsZUNhY2hlSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldExpbWl0ZWRNYXhSb3dzKHJlcXVlc3RlZFJvd3M6IG51bWJlciwgcm93Q291bnRMaW1pdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmVxdWVzdGVkUm93cyA+IDAgJiYgcmVxdWVzdGVkUm93cyA8IHJvd0NvdW50TGltaXQgPyByZXF1ZXN0ZWRSb3dzIDogcm93Q291bnRMaW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSkgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgcmVzcG9uc2VEYXRhLmlzU3VtbWFyeSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlBhZ2VSb3dDb3VudF06IHBhZ2VSb3dDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhO1xuICAgICAgY29uc3QgY29sdW1ucyA9IGRhdGFUYWJsZS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0U2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0SGlnaGxpZ2h0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBwYWdlUm93Q291bnQgPSB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKHBhZ2VSb3dDb3VudCwgdGhpcy5nZXRNYXhSb3dMaW1pdCgpKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDEpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcGFnZVJvd0NvdW50ID0gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhwYWdlUm93Q291bnQsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSk7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZVJlYWRlcj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlUmVhZGVySW50ZXJuYWxDb250cmFjdDtcblxuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWFkZXIocmVzcG9uc2VEYXRhLmlkLCByZXNwb25zZURhdGEudG90YWxSb3dDb3VudCwgcGFnZVJvd0NvdW50LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN1bW1hcnlUYWJsZUlkID0gJyc7XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyh0YWJsZUlkOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhZ2VBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUlkXTogdGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhUm93SW5kZXhdOiBwYWdlTnVtYmVyICogcGFnZVNpemUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFUYWJsZVJlYWRlclBhZ2UsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+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+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdG9yeVBvaW50TW9kZWw7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQsIFZpc3VhbFNwZWNpZmljYXRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVmlzdWFsTW9kZWxTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFZpc3VhbFNwZWNpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgVmlzdWFsU3BlY2lmaWNhdGlvbjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vVml6U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYyksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlZpekFQSSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU2hlZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Td2l0Y2hUb1NoZWV0TmFtZV06IG5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFjdGl2YXRlU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbVZpZXdzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDdXN0b21WaWV3SW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VzdG9tVmlld3NBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1c3RvbVZpZXdzLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3cyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxDdXN0b21WaWV3TW9kZWw+O1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdzLm1hcCgoY3VzdG9tVmlldzogQ3VzdG9tVmlld01vZGVsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lPzogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2hvd0N1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSB8fCAnJywgLy8gYSBmYWxzZXkgdmFsdWUgbWVhbnMgXCJzaG93IG9yaWdpbmFsIHZpZXdcIlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TaG93Q3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbCB8IHVuZGVmaW5lZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3Py5sdWlkID8gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUN1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICAvLyBDdXN0b21WaWV3SXNEZWZhdWx0IGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyLCBidXQgb3VyIEFQSSBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byBhbGxvdyBpdCB0byBiZSBzcGVjaWZpZWQgeWV0LlxuICAgIC8vIFdlIHNob3VsZCBhZGQgYSAnZGVmYXVsdCcgcGFyYW1ldGVyIHRvIHRoZSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NhdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzRGVmYXVsdF06IGZhbHNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdJbXBsKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdMdWlkXTogY3VzdG9tVmlldy5sdWlkLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlldy5uYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBjdXN0b21WaWV3LmlzRGVmYXVsdCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNQdWJsaWNdOiBjdXN0b21WaWV3LnNoYXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVXBkYXRlQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNyY0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1cnJlbnRTcmNBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1cnJlbnRTcmMsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogc3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0VmlzaWJpbGl0eUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdOiB7fSxcbiAgICB9O1xuXG4gICAgLy8gem9uZVZpc2liaWxpdHlNYXAgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYSBNYXAgLSBjb252ZXJ0IGl0IHRvIGEgTWFwXG4gICAgY29uc3QgcGFyYW1ldGVyQXNNYXAgPSBQYXJhbS5jb252ZXJ0UGFyYW1ldGVyVG9NYXAoem9uZVZpc2liaWxpdHlNYXAsICd6b25lVmlzaWJpbGl0eU1hcCcpO1xuXG4gICAgcGFyYW1ldGVyQXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXAsIE51bWJlci5wYXJzZUludChrZXksIDEwKSk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlPih2YWx1ZSwgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsICdEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZScpO1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF1ba2V5XSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRWaXNpYmlsaXR5VHlwZS5jb252ZXJ0KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFpvbmVWaXNpYmlsaXR5LCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3RdOiBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgICB9O1xuXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkuZm9yRWFjaCgoZGFzaGJvYXJkT2JqZWN0OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXAsIGRhc2hib2FyZE9iamVjdC5kYXNoYm9hcmRPYmplY3RJRCk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5V2lkdGhBbmRIZWlnaHRPZkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZShkYXNoYm9hcmRPYmplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZUFuZFJlc2l6ZVpvbmVzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRhYmxlIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZVN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZVN1bW1hcnkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFibGVJbmZvOiBUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY29ubmVjdGlvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXN0b21TUUwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmN1c3RvbVNRTDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqIFRoaXMgYWxsb3dzIHVzIHRvIHByb3ZpZGUgYSBmaWVsZCB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBtb3JlIGVhc2lseSBwcm9ncmFtbWF0aWNhbGx5IHJlc3BvbmRcbiAqIHRvIGVycm9yIHNjZW5hcmlvcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlYXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgJHtfZXJyb3JDb2RlfTogJHttZXNzYWdlfWApO1xuXG4gICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIC8vIEVycm9yIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgcHJvcGVydGx5IHdoZW4gY29tcGlsaW5nIHRvIEVTNSwgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2VcbiAgICAvLyB0aGUgcHJvdG8gY2hhaW4gdG8gYmUgYnVpbHQgY29ycmVjdGx5LiAgU2VlIHRoZSBnaXRodWIgbGluayBhYm92ZSBmb3IgZGV0YWlscy5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVGFibGVhdUVycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yQ29kZSgpOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcyB8IFNoYXJlZEVycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSksXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlRmlsdGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRmlsdGVycyBhbHJlYWR5IGhhdmUgbmF0aXZlIHR5cGUgaW4gdmFsdWUsIGp1c3QgdXNlIHRoYXQgZm9yIG5hdGl2ZVZhbHVlIGFsc29cbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZVRhYmxlRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIERhdGFUYWJsZXMgY29udGFpbiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgZGF0ZSBhcyBzdHJpbmcgfCAnJW51bGwlXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBjb252ZXJ0cyBkYXRlcyBhcyBzdHJpbmcgdG8gZGF0ZXMsIGFuZCBhbnkgc3BlY2lhbCB0byBudWxsXG4gICAgLy8gKGJvb2xlYW4sIG51bWJlcnMsIHN0cmluZ3MgYXJlIHBhc3NlZCB0aHJvdWdoKVxuICAgIC8vIEJlY2F1c2Ugb2YgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gLSB3ZSBjYW4gaGF2ZSB1bmRlZmluZWQgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IHRoYW4gYW55IHNwZWNpYWxcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgZGF0YVR5cGUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUsXG4gICAgKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBBIFByb21pc2Ugd3JhcHBlciBjbGFzcyBhbGxvd2luZyBmb3IgcmVzb2x2aW5nL3JlamVjdGluZyB0aGUgUHJvbWlzZSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGl0cyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgRGVmZXJyZWRcbiAqIEB0ZW1wbGF0ZSBUUmVzb2x2ZSBUaGUgdHlwZSB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2UuXG4gKiBAdGVtcGxhdGUgVFJlamVjdCBUaGUgdHlwZSB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZS4gRGVmYXVsdHMgdG8gYW55LlxuICogQGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM0NjM3NDM2XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdCA9IGFueT4ge1xuICBwcml2YXRlIF9wcm9taXNlOiBQcm9taXNlPFRSZXNvbHZlPjtcbiAgcHJpdmF0ZSBfcmVzb2x2ZTogKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPikgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfcmVqZWN0OiAocmVhc29uPzogVFJlamVjdCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEZWZlcnJlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZTxUUmVzb2x2ZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgUHJvbWlzZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtQcm9taXNlPFRSZXNvbHZlPn1cbiAgICovXG4gIGdldCBwcm9taXNlKCk6IFByb21pc2U8VFJlc29sdmU+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgd3JhcHBlZCBQcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0geyhUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPil9IHJlc3BvbnNlIFRoZSBhcmd1bWVudCB0byBiZSByZXNvbHZlZCBieSB0aGUgUHJvbWlzZS5cbiAgICogQHJldHVybnMgeyp9ICB7dm9pZH1cbiAgICovXG4gIHJlc29sdmUocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZXNvbHZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb2x2ZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtUUmVqZWN0fSBbcmVhc29uXSBUaGUgcmVhc29uIHdoeSB0aGUgUHJvbWlzZSByZWplY3RlZC5cbiAgICogQHJldHVybnMgeyp9ICB7dm9pZH1cbiAgICovXG4gIHJlamVjdChyZWFzb24/OiBUUmVqZWN0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZWplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWplY3QocmVhc29uKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IDMwMDAwO1xuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgY29udmVydHMgZnJvbSBhIHNvdXJjZSBlbnVtIHZhbHVlIHRvIGRlc3RpbmF0aW9uIGVudW1cbiAqIHZhbHVlIGdpdmVuIGEgbWFwcGluZyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aGVuIGNvbnN0cnVjdGVkLlxuICpcbiAqIE5vdGU6IFRoaXMgZXhhY3Qgc2FtZSBjbGFzcyBpcyBkZWZpbmVkIGluIGFwaS1jb3JlLiAgR2l2ZW4gaXRzIHNtYWxsXG4gKiBuYXR1cmUsIGl0IGlzIG5vdCB3b3J0aCBoYXZpbmcgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHRvIHNoYXJlIHRoaXMgYmV0d2VlblxuICogYXBpLWNvcmUgYW5kIGFwaS1zaGFyZWQuICBJZiBtb3JlIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSBpcyBhZGRlZCB0aGF0IGlzIHVzZWQgYnkgYXBpLWNvcmVcbiAqIGFuZCBhcGktc2hhcmVkIGJ1dCBoYXMgbm8gb3RoZXIgZGVwZW5kZWNpZXMsIGEgdXRpbHRpdHkgcHJvamVjdCBtaWdodCBiZSBtZXJpdGVkLFxuICogYW5kIHRoaXMgY2xhc3MgY291bGQgYmUgbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnVtQ29udmVydGVyPFRTb3VyY2VUeXBlIGV4dGVuZHMgc3RyaW5nLCBURGVzdGluYXRpb25UeXBlPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tYXBwaW5nczogeyBbZW51bVZhbDogc3RyaW5nXTogVERlc3RpbmF0aW9uVHlwZSB9LCBwcml2YXRlIF9kZWZhdWx0VmFsPzogVERlc3RpbmF0aW9uVHlwZSkge31cblxuICBwdWJsaWMgY29udmVydChlbnVtVmFsOiBUU291cmNlVHlwZSwgdGhyb3dJZk1pc3Npbmc6IFNob3VsZFRocm93ID0gU2hvdWxkVGhyb3cuWWVzKTogVERlc3RpbmF0aW9uVHlwZSB7XG4gICAgaWYgKHRoaXMuX21hcHBpbmdzLmhhc093blByb3BlcnR5KGVudW1WYWwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwcGluZ3NbZW51bVZhbCBhcyBzdHJpbmddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZhdWx0VmFsICE9PSB1bmRlZmluZWQgJiYgdGhyb3dJZk1pc3NpbmcgIT09IFNob3VsZFRocm93Llllcykge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWw7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBFbnVtIE1hcHBpbmcgbm90IGZvdW5kIGZvcjogJHtlbnVtVmFsfWApO1xuICB9XG59XG5cbmV4cG9ydCBlbnVtIFNob3VsZFRocm93IHtcbiAgWWVzID0gJ3llcycsXG4gIE5vID0gJ25vJyxcbn1cbiIsImltcG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi4vSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4vUGFyYW0nO1xuXG5pbnRlcmZhY2UgRW51bUxpa2Uge1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBjb21tb24gZXJyb3JzIHRocm91Z2hvdXQgdGhlIGV4dGVybmFsXG4gKiBwcm9qZWN0cyAoYXBpLXNoYXJlZCwgZXh0ZW5zaW9ucy1hcGksIGV0Yy4pLiAgSXQgaGFzIHNvbWUgZHVwbGljYXRpb24gd2l0aFxuICogdGhlIEVycm9ySGVscGVycyBjbGFzcyBpbiBhcGktY29yZSwgYnV0IGlzIHNlcGFyYXRlIGR1ZSB0byB0aGUgbmVlZCB0byB0aHJvd1xuICogYW4gZXh0ZXJuYWwgVGFibGVhdUVycm9yIHZzLiBhbiBJbnRlcm5hbFRhYmxlYXVFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVycm9ySGVscGVycyB7XG4gIC8qKlxuICAgKiBUaHJvd3Mgd2l0aCBjb2RlIEludGVybmFsRXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcGlOYW1lIG5hbWUgb2YgYXBpIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXBpTm90SW1wbGVtZW50ZWQoYXBpTmFtZTogc3RyaW5nKTogVGFibGVhdUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FwaU5hbWV9IEFQSSBub3QgeWV0IGltcGxlbWVudGVkLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBpbnRlcm5hbCBlcnJvciBpZiBhcmd1bWVudCBpcyBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5SW50ZXJuYWxWYWx1ZShhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3I6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyKGFyZ3VtZW50VmFsdWU6IGFueSwgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBub3QgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgKiBGb3Igb2JqZWN0cywgaXQganVzdCB0ZXN0cyB0aGF0IGl0IGlzIGFuIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBleHBlY3RlZCByZXN1bHQgb2YgdHlwZW9mXG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyVHlwZShhcmd1bWVudFZhbHVlOiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRWYWx1ZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaGFzIGludmFsaWQgdHlwZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIGVtcHR5IHN0cmluZywgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVN0cmluZ1BhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBzdHJpbmcsIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGFyZ3VtZW50VmFsdWUgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW10ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhlbnVtVHlwZSkuZm9yRWFjaCgoZW51bUtleSkgPT4ge1xuICAgICAgaWYgKGVudW1UeXBlW2VudW1LZXldID09PSBlbnVtVmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IGFueSwgbWF4OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIW1pbiAmJiAhbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgYXQgbGVhc3Qgb25lIG9mIG1pbiBvciBtYXggaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG1pbiAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1pbikgJiYgIVBhcmFtLmlzVHlwZURhdGUobWluKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1pbi4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWF4ICYmICFQYXJhbS5pc1R5cGVOdW1iZXIobWF4KSAmJiAhUGFyYW0uaXNUeXBlRGF0ZShtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIG9ubHkgRGF0ZSBhbmQgbnVtYmVyIGFyZSBhbGxvd2VkIGZvciBwYXJhbWV0ZXIgbWF4LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtaW4gJiYgbWF4ICYmIHR5cGVvZiBtaW4gIT09IHR5cGVvZiBtYXgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgcGFyYW1ldGVycyBtaW4gYW5kIG1heCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZS4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgem9uZUlkIGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZFpvbmVNYXAgQSBtYXAgb2Ygem9uZUlkJ3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGFzaGJvYXJkIG9iamVjdC5cbiAgICogQHBhcmFtIHpvbmVJRCBab25lSWQgdG8gYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+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+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdjM1IGZyb20gJy4vdjM1LmpzJztcbmltcG9ydCBtZDUgZnJvbSAnLi9tZDUuanMnO1xudmFyIHYzID0gdjM1KCd2MycsIDB4MzAsIG1kNSk7XG5leHBvcnQgZGVmYXVsdCB2MzsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgc2hhMSBmcm9tICcuL3NoYTEuanMnO1xudmFyIHY1ID0gdjM1KCd2NScsIDB4NTAsIHNoYTEpO1xuZXhwb3J0IGRlZmF1bHQgdjU7IiwiaW1wb3J0IFJFR0VYIGZyb20gJy4vcmVnZXguanMnO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZSh1dWlkKSB7XG4gIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgJiYgUkVHRVgudGVzdCh1dWlkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGU7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZmluZCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZnJvbSc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbWFwJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlcic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL3BhcnNlLWZsb2F0JztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtaW50JztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvZW50cmllcyc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL3Byb21pc2UnO1xuLy8gRHVlIHRvIHRoZSB3YXkgd2UgY29uZmlndXJlZCB3ZWJwYWNrLCB3ZSBzaG91bGQgYmUgZXhwb3J0aW5nIHRoaW5ncyB3aGljaCB3aWxsIGJlIHVuZGVyXG4vLyBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQgXCJ0YWJsZWF1XCIuIEV4cG9ydCBldmVyeXRoaW5nIHdlIHdhbnQgdG8gYmUgdmlzaWJsZSB1bmRlciB0YWJsZWF1XG4vLyBmcm9tIHRoaXMgZmlsZS5cbmltcG9ydCB7IEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuXG5kZWNsYXJlIGxldCBWRVJTSU9OX0lTX0FMUEhBOiBib29sZWFuO1xuY29uc3QgaXNBbHBoYTogYm9vbGVhbiA9IHR5cGVvZiBWRVJTSU9OX0lTX0FMUEhBICE9PSAndW5kZWZpbmVkJyA/IFZFUlNJT05fSVNfQUxQSEEgOiBmYWxzZTtcblxuZGVjbGFyZSBsZXQgQVBJX1ZFUlNJT05fTlVNQkVSOiBzdHJpbmc7XG5BcGlWZXJzaW9uLlNldFZlcnNpb25OdW1iZXIodHlwZW9mIEFQSV9WRVJTSU9OX05VTUJFUiAhPT0gJ3VuZGVmaW5lZCcgPyBBUElfVkVSU0lPTl9OVU1CRVIgOiAnMC4wLjAnLCBpc0FscGhhKTtcblxuY29uc3QgZXh0ZW5zaW9uSW1wbCA9IG5ldyBFeHRlbnNpb25zSW1wbCgpO1xuZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSBuZXcgRXh0ZW5zaW9ucyhleHRlbnNpb25JbXBsKTtcblxuLy8gRXhwb3J0IEVudW1zXG4vLyBUaGVzZSBzaG93IHVwIHVuZGVyIHRoZSB0YWJsZWF1IG9iamVjdC4gSS5lLiB0YWJsZWF1LkV4dGVuc2lvbkNvbnRleHQuU2VydmVyXG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlck9wdGlvbnMsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/lib/tableau.extensions.1.12.1.min.js b/lib/tableau.extensions.1.12.1.min.js new file mode 100644 index 00000000..a31e85ba --- /dev/null +++ b/lib/tableau.extensions.1.12.1.min.js @@ -0,0 +1,2 @@ +(()=>{var e={3e3:(e,t,r)=>{r(5092);var n=r(7880);e.exports=n("Array","find")},8315:(e,t,r)=>{r(8504),r(5684);var n=r(340);e.exports=n.Array.from},80:(e,t,r)=>{r(3924),r(472),r(7912),r(8504);var n=r(340);e.exports=n.Map},5668:(e,t,r)=>{r(1300);var n=r(340);e.exports=n.Number.isInteger},5816:(e,t,r)=>{r(3656);var n=r(340);e.exports=n.Number.isNaN},3680:(e,t,r)=>{r(6544);var n=r(340);e.exports=n.Number.parseFloat},9308:(e,t,r)=>{r(7972);var n=r(340);e.exports=n.Number.parseInt},8824:(e,t,r)=>{r(6368);var n=r(340);e.exports=n.Object.assign},8512:(e,t,r)=>{r(8292);var n=r(340);e.exports=n.Object.entries},9232:(e,t,r)=>{r(920);var n=r(340);e.exports=n.Object.setPrototypeOf},9336:(e,t,r)=>{r(6140),r(3924),r(7912),r(7448),r(3936),r(5428),r(1517),r(8504);var n=r(340);e.exports=n.Promise},1381:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a function")}},6372:(e,t,r)=>{var n=r(1600),i=r(5220),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a constructor")}},4040:(e,t,r)=>{var n=r(1600),i=r(984),o=n.String,a=n.TypeError;e.exports=function(e){if("object"==typeof e||i(e))return e;throw a("Can't set "+o(e)+" as a prototype")}},5868:(e,t,r)=>{var n=r(3668),i=r(124),o=r(7072),a=n("unscopables"),s=Array.prototype;null==s[a]&&o.f(s,a,{configurable:!0,value:i(null)}),e.exports=function(e){s[a][e]=!0}},2932:(e,t,r)=>{var n=r(1600),i=r(2408),o=n.TypeError;e.exports=function(e,t){if(i(t,e))return e;throw o("Incorrect invocation")}},3736:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.String,a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not an object")}},8208:(e,t,r)=>{"use strict";var n=r(1600),i=r(5616),o=r(3032),a=r(3848),s=r(3140),u=r(4064),l=r(5220),c=r(9183),p=r(4135),d=r(4944),f=r(8132),y=n.Array;e.exports=function(e){var t=a(e),r=l(this),n=arguments.length,h=n>1?arguments[1]:void 0,m=void 0!==h;m&&(h=i(h,n>2?arguments[2]:void 0));var g,v,b,I,S,_,T=f(t),P=0;if(!T||this==y&&u(T))for(g=c(t),v=r?new this(g):y(g);g>P;P++)_=m?h(t[P],P):t[P],p(v,P,_);else for(S=(I=d(t,T)).next,v=r?new this:[];!(b=o(S,I)).done;P++)_=m?s(I,h,[b.value,P],!0):b.value,p(v,P,_);return v.length=P,v}},6024:(e,t,r)=>{var n=r(3068),i=r(7920),o=r(9183),a=function(e){return function(t,r,a){var s,u=n(t),l=o(u),c=i(a,l);if(e&&r!=r){for(;l>c;)if((s=u[c++])!=s)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===r)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},9560:(e,t,r)=>{var n=r(5616),i=r(604),o=r(3188),a=r(3848),s=r(9183),u=r(1220),l=i([].push),c=function(e){var t=1==e,r=2==e,i=3==e,c=4==e,p=6==e,d=7==e,f=5==e||p;return function(y,h,m,g){for(var v,b,I=a(y),S=o(I),_=n(h,m),T=s(S),P=0,A=g||u,E=t?A(y,T):r||d?A(y,0):void 0;T>P;P++)if((f||P in S)&&(b=_(v=S[P],P,I),e))if(t)E[P]=b;else if(b)switch(e){case 3:return!0;case 5:return v;case 6:return P;case 2:l(E,v)}else switch(e){case 4:return!1;case 7:l(E,v)}return p?-1:i||c?c:E}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},6100:(e,t,r)=>{var n=r(604);e.exports=n([].slice)},4096:(e,t,r)=>{var n=r(1600),i=r(5240),o=r(5220),a=r(9952),s=r(3668)("species"),u=n.Array;e.exports=function(e){var t;return i(e)&&(t=e.constructor,(o(t)&&(t===u||i(t.prototype))||a(t)&&null===(t=t[s]))&&(t=void 0)),void 0===t?u:t}},1220:(e,t,r)=>{var n=r(4096);e.exports=function(e,t){return new(n(e))(0===t?0:t)}},3140:(e,t,r)=>{var n=r(3736),i=r(1792);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){i(e,"throw",t)}}},6344:(e,t,r)=>{var n=r(3668)("iterator"),i=!1;try{var o=0,a={next:function(){return{done:!!o++}},return:function(){i=!0}};a[n]=function(){return this},Array.from(a,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var r=!1;try{var o={};o[n]=function(){return{next:function(){return{done:r=!0}}}},e(o)}catch(e){}return r}},4108:(e,t,r)=>{var n=r(604),i=n({}.toString),o=n("".slice);e.exports=function(e){return o(i(e),8,-1)}},1248:(e,t,r)=>{var n=r(1600),i=r(7796),o=r(984),a=r(4108),s=r(3668)("toStringTag"),u=n.Object,l="Arguments"==a(function(){return arguments}());e.exports=i?a:function(e){var t,r,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=u(e),s))?r:l?a(t):"Object"==(n=a(t))&&o(t.callee)?"Arguments":n}},5032:(e,t,r)=>{var n=r(604),i=r(6100),o=n("".replace),a=n("".split),s=n([].join),u=String(Error("zxcasd").stack),l=/\n\s*at [^:]*:[^\n]*/,c=l.test(u),p=/@[^\n]*\n/.test(u)&&!/zxcasd/.test(u);e.exports=function(e,t){if("string"!=typeof e)return e;if(c)for(;t--;)e=o(e,l,"");else if(p)return s(i(a(e,"\n"),t),"\n");return e}},9920:(e,t,r)=>{"use strict";var n=r(7072).f,i=r(124),o=r(7431),a=r(5616),s=r(2932),u=r(9928),l=r(2648),c=r(9688),p=r(2828),d=r(8756).fastKey,f=r(7932),y=f.set,h=f.getterFor;e.exports={getConstructor:function(e,t,r,l){var c=e((function(e,n){s(e,f),y(e,{type:t,index:i(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=n&&u(n,e[l],{that:e,AS_ENTRIES:r})})),f=c.prototype,m=h(t),g=function(e,t,r){var n,i,o=m(e),a=v(e,t);return a?a.value=r:(o.last=a={index:i=d(t,!0),key:t,value:r,previous:n=o.last,next:void 0,removed:!1},o.first||(o.first=a),n&&(n.next=a),p?o.size++:e.size++,"F"!==i&&(o.index[i]=a)),e},v=function(e,t){var r,n=m(e),i=d(t);if("F"!==i)return n.index[i];for(r=n.first;r;r=r.next)if(r.key==t)return r};return o(f,{clear:function(){for(var e=m(this),t=e.index,r=e.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete t[r.index],r=r.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,r=m(t),n=v(t,e);if(n){var i=n.next,o=n.previous;delete r.index[n.index],n.removed=!0,o&&(o.next=i),i&&(i.previous=o),r.first==n&&(r.first=i),r.last==n&&(r.last=o),p?r.size--:t.size--}return!!n},forEach:function(e){for(var t,r=m(this),n=a(e,arguments.length>1?arguments[1]:void 0);t=t?t.next:r.first;)for(n(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!v(this,e)}}),o(f,r?{get:function(e){var t=v(this,e);return t&&t.value},set:function(e,t){return g(this,0===e?0:e,t)}}:{add:function(e){return g(this,e=0===e?0:e,e)}}),p&&n(f,"size",{get:function(){return m(this).size}}),c},setStrong:function(e,t,r){var n=t+" Iterator",i=h(t),o=h(n);l(e,t,(function(e,t){y(this,{type:n,target:e,state:i(e),kind:t,last:void 0})}),(function(){for(var e=o(this),t=e.kind,r=e.last;r&&r.removed;)r=r.previous;return e.target&&(e.last=r=r?r.next:e.state.first)?"keys"==t?{value:r.key,done:!1}:"values"==t?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),r?"entries":"values",!r,!0),c(t)}}},6064:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(604),a=r(4232),s=r(5028),u=r(8756),l=r(9928),c=r(2932),p=r(984),d=r(9952),f=r(7004),y=r(6344),h=r(9540),m=r(7692);e.exports=function(e,t,r){var g=-1!==e.indexOf("Map"),v=-1!==e.indexOf("Weak"),b=g?"set":"add",I=i[e],S=I&&I.prototype,_=I,T={},P=function(e){var t=o(S[e]);s(S,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return v&&!d(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:function(e,r){return t(this,0===e?0:e,r),this})};if(a(e,!p(I)||!(v||S.forEach&&!f((function(){(new I).entries().next()})))))_=r.getConstructor(t,e,g,b),u.enable();else if(a(e,!0)){var A=new _,E=A[b](v?{}:-0,1)!=A,w=f((function(){A.has(1)})),O=y((function(e){new I(e)})),D=!v&&f((function(){for(var e=new I,t=5;t--;)e[b](t,t);return!e.has(-0)}));O||((_=t((function(e,t){c(e,S);var r=m(new I,e,_);return null!=t&&l(t,r[b],{that:r,AS_ENTRIES:g}),r}))).prototype=S,S.constructor=_),(w||D)&&(P("delete"),P("has"),g&&P("get")),(D||E)&&P(b),v&&S.clear&&delete S.clear}return T[e]=_,n({global:!0,forced:_!=I},T),h(_,e),v||r.setStrong(_,e,g),_}},4640:(e,t,r)=>{var n=r(9180),i=r(4092),o=r(2920),a=r(7072);e.exports=function(e,t){for(var r=i(t),s=a.f,u=o.f,l=0;l{var n=r(7004);e.exports=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},9292:(e,t,r)=>{"use strict";var n=r(804).IteratorPrototype,i=r(124),o=r(364),a=r(9540),s=r(2204),u=function(){return this};e.exports=function(e,t,r){var l=t+" Iterator";return e.prototype=i(n,{next:o(1,r)}),a(e,l,!1,!0),s[l]=u,e}},4768:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(364);e.exports=n?function(e,t,r){return i.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},364:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},4135:(e,t,r)=>{"use strict";var n=r(4061),i=r(7072),o=r(364);e.exports=function(e,t,r){var a=n(t);a in e?i.f(e,a,o(0,r)):e[a]=r}},2648:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(7408),a=r(8492),s=r(984),u=r(9292),l=r(6232),c=r(3440),p=r(9540),d=r(4768),f=r(5028),y=r(3668),h=r(2204),m=r(804),g=a.PROPER,v=a.CONFIGURABLE,b=m.IteratorPrototype,I=m.BUGGY_SAFARI_ITERATORS,S=y("iterator"),_="keys",T="values",P="entries",A=function(){return this};e.exports=function(e,t,r,a,y,m,E){u(r,t,a);var w,O,D,x=function(e){if(e===y&&k)return k;if(!I&&e in N)return N[e];switch(e){case _:case T:case P:return function(){return new r(this,e)}}return function(){return new r(this)}},F=t+" Iterator",C=!1,N=e.prototype,M=N[S]||N["@@iterator"]||y&&N[y],k=!I&&M||x(y),R="Array"==t&&N.entries||M;if(R&&(w=l(R.call(new e)))!==Object.prototype&&w.next&&(o||l(w)===b||(c?c(w,b):s(w[S])||f(w,S,A)),p(w,F,!0,!0),o&&(h[F]=A)),g&&y==T&&M&&M.name!==T&&(!o&&v?d(N,"name",T):(C=!0,k=function(){return i(M,this)})),y)if(O={values:x(T),keys:m?k:x(_),entries:x(P)},E)for(D in O)(I||C||!(D in N))&&f(N,D,O[D]);else n({target:t,proto:!0,forced:I||C},O);return o&&!E||N[S]===k||f(N,S,k,{name:y}),h[t]=k,O}},2828:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},7300:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},4532:e=>{e.exports="object"==typeof window},264:(e,t,r)=>{var n=r(5316),i=r(1600);e.exports=/ipad|iphone|ipod/i.test(n)&&void 0!==i.Pebble},1588:(e,t,r)=>{var n=r(5316);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},3640:(e,t,r)=>{var n=r(4108),i=r(1600);e.exports="process"==n(i.process)},7888:(e,t,r)=>{var n=r(5316);e.exports=/web0s(?!.*chrome)/i.test(n)},5316:(e,t,r)=>{var n=r(6532);e.exports=n("navigator","userAgent")||""},2592:(e,t,r)=>{var n,i,o=r(1600),a=r(5316),s=o.process,u=o.Deno,l=s&&s.versions||u&&u.version,c=l&&l.v8;c&&(i=(n=c.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!i&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(i=+n[1]),e.exports=i},7880:(e,t,r)=>{var n=r(1600),i=r(604);e.exports=function(e,t){return i(n[e].prototype[t])}},8675:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},4464:(e,t,r)=>{var n=r(7004),i=r(364);e.exports=!n((function(){var e=Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",i(1,7)),7!==e.stack)}))},7248:(e,t,r)=>{var n=r(1600),i=r(2920).f,o=r(4768),a=r(5028),s=r(2984),u=r(4640),l=r(4232);e.exports=function(e,t){var r,c,p,d,f,y=e.target,h=e.global,m=e.stat;if(r=h?n:m?n[y]||s(y,{}):(n[y]||{}).prototype)for(c in t){if(d=t[c],p=e.noTargetGet?(f=i(r,c))&&f.value:r[c],!l(h?c:y+(m?".":"#")+c,e.forced)&&void 0!==p){if(typeof d==typeof p)continue;u(d,p)}(e.sham||p&&p.sham)&&o(d,"sham",!0),a(r,c,d,e)}}},7004:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},1748:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},9756:e=>{var t=Function.prototype,r=t.apply,n=t.bind,i=t.call;e.exports="object"==typeof Reflect&&Reflect.apply||(n?i.bind(r):function(){return i.apply(r,arguments)})},5616:(e,t,r)=>{var n=r(604),i=r(1381),o=n(n.bind);e.exports=function(e,t){return i(e),void 0===t?e:o?o(e,t):function(){return e.apply(t,arguments)}}},3032:e=>{var t=Function.prototype.call;e.exports=t.bind?t.bind(t):function(){return t.apply(t,arguments)}},8492:(e,t,r)=>{var n=r(2828),i=r(9180),o=Function.prototype,a=n&&Object.getOwnPropertyDescriptor,s=i(o,"name"),u=s&&"something"===function(){}.name,l=s&&(!n||n&&a(o,"name").configurable);e.exports={EXISTS:s,PROPER:u,CONFIGURABLE:l}},604:e=>{var t=Function.prototype,r=t.bind,n=t.call,i=r&&r.bind(n);e.exports=r?function(e){return e&&i(n,e)}:function(e){return e&&function(){return n.apply(e,arguments)}}},6532:(e,t,r)=>{var n=r(1600),i=r(984);e.exports=function(e,t){return arguments.length<2?(r=n[e],i(r)?r:void 0):n[e]&&n[e][t];var r}},8132:(e,t,r)=>{var n=r(1248),i=r(8808),o=r(2204),a=r(3668)("iterator");e.exports=function(e){if(null!=e)return i(e,a)||i(e,"@@iterator")||o[n(e)]}},4944:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(1381),a=r(3736),s=r(1532),u=r(8132),l=n.TypeError;e.exports=function(e,t){var r=arguments.length<2?u(e):t;if(o(r))return a(i(r,e));throw l(s(e)+" is not iterable")}},8808:(e,t,r)=>{var n=r(1381);e.exports=function(e,t){var r=e[t];return null==r?void 0:n(r)}},1600:(e,t,r)=>{var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof r.g&&r.g)||function(){return this}()||Function("return this")()},9180:(e,t,r)=>{var n=r(604),i=r(3848),o=n({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return o(i(e),t)}},6632:e=>{e.exports={}},5651:(e,t,r)=>{var n=r(1600);e.exports=function(e,t){var r=n.console;r&&r.error&&(1==arguments.length?r.error(e):r.error(e,t))}},2960:(e,t,r)=>{var n=r(6532);e.exports=n("document","documentElement")},2339:(e,t,r)=>{var n=r(2828),i=r(7004),o=r(7300);e.exports=!n&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},3188:(e,t,r)=>{var n=r(1600),i=r(604),o=r(7004),a=r(4108),s=n.Object,u=i("".split);e.exports=o((function(){return!s("z").propertyIsEnumerable(0)}))?function(e){return"String"==a(e)?u(e,""):s(e)}:s},7692:(e,t,r)=>{var n=r(984),i=r(9952),o=r(3440);e.exports=function(e,t,r){var a,s;return o&&n(a=t.constructor)&&a!==r&&i(s=a.prototype)&&s!==r.prototype&&o(e,s),e}},1727:(e,t,r)=>{var n=r(604),i=r(984),o=r(6376),a=n(Function.toString);i(o.inspectSource)||(o.inspectSource=function(e){return a(e)}),e.exports=o.inspectSource},7660:(e,t,r)=>{var n=r(9952),i=r(4768);e.exports=function(e,t){n(t)&&"cause"in t&&i(e,"cause",t.cause)}},8756:(e,t,r)=>{var n=r(7248),i=r(604),o=r(6632),a=r(9952),s=r(9180),u=r(7072).f,l=r(4880),c=r(7316),p=r(6536),d=r(1748),f=!1,y=p("meta"),h=0,m=Object.isExtensible||function(){return!0},g=function(e){u(e,y,{value:{objectID:"O"+h++,weakData:{}}})},v=e.exports={enable:function(){v.enable=function(){},f=!0;var e=l.f,t=i([].splice),r={};r[y]=1,e(r).length&&(l.f=function(r){for(var n=e(r),i=0,o=n.length;i{var n,i,o,a=r(8736),s=r(1600),u=r(604),l=r(9952),c=r(4768),p=r(9180),d=r(6376),f=r(280),y=r(6632),h="Object already initialized",m=s.TypeError,g=s.WeakMap;if(a||d.state){var v=d.state||(d.state=new g),b=u(v.get),I=u(v.has),S=u(v.set);n=function(e,t){if(I(v,e))throw new m(h);return t.facade=e,S(v,e,t),t},i=function(e){return b(v,e)||{}},o=function(e){return I(v,e)}}else{var _=f("state");y[_]=!0,n=function(e,t){if(p(e,_))throw new m(h);return t.facade=e,c(e,_,t),t},i=function(e){return p(e,_)?e[_]:{}},o=function(e){return p(e,_)}}e.exports={set:n,get:i,has:o,enforce:function(e){return o(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!l(t)||(r=i(t)).type!==e)throw m("Incompatible receiver, "+e+" required");return r}}}},4064:(e,t,r)=>{var n=r(3668),i=r(2204),o=n("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||a[o]===e)}},5240:(e,t,r)=>{var n=r(4108);e.exports=Array.isArray||function(e){return"Array"==n(e)}},984:e=>{e.exports=function(e){return"function"==typeof e}},5220:(e,t,r)=>{var n=r(604),i=r(7004),o=r(984),a=r(1248),s=r(6532),u=r(1727),l=function(){},c=[],p=s("Reflect","construct"),d=/^\s*(?:class|function)\b/,f=n(d.exec),y=!d.exec(l),h=function(e){if(!o(e))return!1;try{return p(l,c,e),!0}catch(e){return!1}};e.exports=!p||i((function(){var e;return h(h.call)||!h(Object)||!h((function(){e=!0}))||e}))?function(e){if(!o(e))return!1;switch(a(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return y||!!f(d,u(e))}:h},4232:(e,t,r)=>{var n=r(7004),i=r(984),o=/#|\.prototype\./,a=function(e,t){var r=u[s(e)];return r==c||r!=l&&(i(t)?n(t):!!t)},s=a.normalize=function(e){return String(e).replace(o,".").toLowerCase()},u=a.data={},l=a.NATIVE="N",c=a.POLYFILL="P";e.exports=a},992:(e,t,r)=>{var n=r(9952),i=Math.floor;e.exports=Number.isInteger||function(e){return!n(e)&&isFinite(e)&&i(e)===e}},9952:(e,t,r)=>{var n=r(984);e.exports=function(e){return"object"==typeof e?null!==e:n(e)}},7408:e=>{e.exports=!1},1836:(e,t,r)=>{var n=r(1600),i=r(6532),o=r(984),a=r(2408),s=r(7216),u=n.Object;e.exports=s?function(e){return"symbol"==typeof e}:function(e){var t=i("Symbol");return o(t)&&a(t.prototype,u(e))}},9928:(e,t,r)=>{var n=r(1600),i=r(5616),o=r(3032),a=r(3736),s=r(1532),u=r(4064),l=r(9183),c=r(2408),p=r(4944),d=r(8132),f=r(1792),y=n.TypeError,h=function(e,t){this.stopped=e,this.result=t},m=h.prototype;e.exports=function(e,t,r){var n,g,v,b,I,S,_,T=r&&r.that,P=!(!r||!r.AS_ENTRIES),A=!(!r||!r.IS_ITERATOR),E=!(!r||!r.INTERRUPTED),w=i(t,T),O=function(e){return n&&f(n,"normal",e),new h(!0,e)},D=function(e){return P?(a(e),E?w(e[0],e[1],O):w(e[0],e[1])):E?w(e,O):w(e)};if(A)n=e;else{if(!(g=d(e)))throw y(s(e)+" is not iterable");if(u(g)){for(v=0,b=l(e);b>v;v++)if((I=D(e[v]))&&c(m,I))return I;return new h(!1)}n=p(e,g)}for(S=n.next;!(_=o(S,n)).done;){try{I=D(_.value)}catch(e){f(n,"throw",e)}if("object"==typeof I&&I&&c(m,I))return I}return new h(!1)}},1792:(e,t,r)=>{var n=r(3032),i=r(3736),o=r(8808);e.exports=function(e,t,r){var a,s;i(e);try{if(!(a=o(e,"return"))){if("throw"===t)throw r;return r}a=n(a,e)}catch(e){s=!0,a=e}if("throw"===t)throw r;if(s)throw a;return i(a),r}},804:(e,t,r)=>{"use strict";var n,i,o,a=r(7004),s=r(984),u=r(124),l=r(6232),c=r(5028),p=r(3668),d=r(7408),f=p("iterator"),y=!1;[].keys&&("next"in(o=[].keys())?(i=l(l(o)))!==Object.prototype&&(n=i):y=!0),null==n||a((function(){var e={};return n[f].call(e)!==e}))?n={}:d&&(n=u(n)),s(n[f])||c(n,f,(function(){return this})),e.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:y}},2204:e=>{e.exports={}},9183:(e,t,r)=>{var n=r(1868);e.exports=function(e){return n(e.length)}},3104:(e,t,r)=>{var n,i,o,a,s,u,l,c,p=r(1600),d=r(5616),f=r(2920).f,y=r(5952).set,h=r(1588),m=r(264),g=r(7888),v=r(3640),b=p.MutationObserver||p.WebKitMutationObserver,I=p.document,S=p.process,_=p.Promise,T=f(p,"queueMicrotask"),P=T&&T.value;P||(n=function(){var e,t;for(v&&(e=S.domain)&&e.exit();i;){t=i.fn,i=i.next;try{t()}catch(e){throw i?a():o=void 0,e}}o=void 0,e&&e.enter()},h||v||g||!b||!I?!m&&_&&_.resolve?((l=_.resolve(void 0)).constructor=_,c=d(l.then,l),a=function(){c(n)}):v?a=function(){S.nextTick(n)}:(y=d(y,p),a=function(){y(n)}):(s=!0,u=I.createTextNode(""),new b(n).observe(u,{characterData:!0}),a=function(){u.data=s=!s})),e.exports=P||function(e){var t={fn:e,next:void 0};o&&(o.next=t),i||(i=t,a()),o=t}},3459:(e,t,r)=>{var n=r(1600);e.exports=n.Promise},3880:(e,t,r)=>{var n=r(2592),i=r(7004);e.exports=!!Object.getOwnPropertySymbols&&!i((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},8736:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1727),a=n.WeakMap;e.exports=i(a)&&/native code/.test(o(a))},8071:(e,t,r)=>{"use strict";var n=r(1381),i=function(e){var t,r;this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n})),this.resolve=n(t),this.reject=n(r)};e.exports.f=function(e){return new i(e)}},5744:(e,t,r)=>{var n=r(748);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:n(e)}},6016:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=o("".charAt),c=n.parseFloat,p=n.Symbol,d=p&&p.iterator,f=1/c(u+"-0")!=-1/0||d&&!i((function(){c(Object(d))}));e.exports=f?function(e){var t=s(a(e)),r=c(t);return 0===r&&"-"==l(t,0)?-0:r}:c},6556:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=n.parseInt,c=n.Symbol,p=c&&c.iterator,d=/^[+-]?0x/i,f=o(d.exec),y=8!==l(u+"08")||22!==l(u+"0x16")||p&&!i((function(){l(Object(p))}));e.exports=y?function(e,t){var r=s(a(e));return l(r,t>>>0||(f(d,r)?16:10))}:l},6984:(e,t,r)=>{"use strict";var n=r(2828),i=r(604),o=r(3032),a=r(7004),s=r(9880),u=r(2128),l=r(5988),c=r(3848),p=r(3188),d=Object.assign,f=Object.defineProperty,y=i([].concat);e.exports=!d||a((function(){if(n&&1!==d({b:1},d(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach((function(e){t[e]=e})),7!=d({},e)[r]||s(d({},t)).join("")!=i}))?function(e,t){for(var r=c(e),i=arguments.length,a=1,d=u.f,f=l.f;i>a;)for(var h,m=p(arguments[a++]),g=d?y(s(m),d(m)):s(m),v=g.length,b=0;v>b;)h=g[b++],n&&!o(f,m,h)||(r[h]=m[h]);return r}:d},124:(e,t,r)=>{var n,i=r(3736),o=r(1904),a=r(8675),s=r(6632),u=r(2960),l=r(7300),c=r(280),p="prototype",d="script",f=c("IE_PROTO"),y=function(){},h=function(e){return"<"+d+">"+e+""},m=function(e){e.write(h("")),e.close();var t=e.parentWindow.Object;return e=null,t},g=function(){try{n=new ActiveXObject("htmlfile")}catch(e){}var e,t,r;g="undefined"!=typeof document?document.domain&&n?m(n):(t=l("iframe"),r="java"+d+":",t.style.display="none",u.appendChild(t),t.src=String(r),(e=t.contentWindow.document).open(),e.write(h("document.F=Object")),e.close(),e.F):m(n);for(var i=a.length;i--;)delete g[p][a[i]];return g()};s[f]=!0,e.exports=Object.create||function(e,t){var r;return null!==e?(y[p]=i(e),r=new y,y[p]=null,r[f]=e):r=g(),void 0===t?r:o(r,t)}},1904:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(3736),a=r(3068),s=r(9880);e.exports=n?Object.defineProperties:function(e,t){o(e);for(var r,n=a(t),u=s(t),l=u.length,c=0;l>c;)i.f(e,r=u[c++],n[r]);return e}},7072:(e,t,r)=>{var n=r(1600),i=r(2828),o=r(2339),a=r(3736),s=r(4061),u=n.TypeError,l=Object.defineProperty;t.f=i?l:function(e,t,r){if(a(e),t=s(t),a(r),o)try{return l(e,t,r)}catch(e){}if("get"in r||"set"in r)throw u("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},2920:(e,t,r)=>{var n=r(2828),i=r(3032),o=r(5988),a=r(364),s=r(3068),u=r(4061),l=r(9180),c=r(2339),p=Object.getOwnPropertyDescriptor;t.f=n?p:function(e,t){if(e=s(e),t=u(t),c)try{return p(e,t)}catch(e){}if(l(e,t))return a(!i(o.f,e,t),e[t])}},7316:(e,t,r)=>{var n=r(4108),i=r(3068),o=r(4880).f,a=r(6100),s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&"Window"==n(e)?function(e){try{return o(e)}catch(e){return a(s)}}(e):o(i(e))}},4880:(e,t,r)=>{var n=r(9912),i=r(8675).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,i)}},2128:(e,t)=>{t.f=Object.getOwnPropertySymbols},6232:(e,t,r)=>{var n=r(1600),i=r(9180),o=r(984),a=r(3848),s=r(280),u=r(1040),l=s("IE_PROTO"),c=n.Object,p=c.prototype;e.exports=u?c.getPrototypeOf:function(e){var t=a(e);if(i(t,l))return t[l];var r=t.constructor;return o(r)&&t instanceof r?r.prototype:t instanceof c?p:null}},2408:(e,t,r)=>{var n=r(604);e.exports=n({}.isPrototypeOf)},9912:(e,t,r)=>{var n=r(604),i=r(9180),o=r(3068),a=r(6024).indexOf,s=r(6632),u=n([].push);e.exports=function(e,t){var r,n=o(e),l=0,c=[];for(r in n)!i(s,r)&&i(n,r)&&u(c,r);for(;t.length>l;)i(n,r=t[l++])&&(~a(c,r)||u(c,r));return c}},9880:(e,t,r)=>{var n=r(9912),i=r(8675);e.exports=Object.keys||function(e){return n(e,i)}},5988:(e,t)=>{"use strict";var r={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,i=n&&!r.call({1:2},1);t.f=i?function(e){var t=n(this,e);return!!t&&t.enumerable}:r},3440:(e,t,r)=>{var n=r(604),i=r(3736),o=r(4040);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,r={};try{(e=n(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(r,[]),t=r instanceof Array}catch(e){}return function(r,n){return i(r),o(n),t?e(r,n):r.__proto__=n,r}}():void 0)},5556:(e,t,r)=>{var n=r(2828),i=r(604),o=r(9880),a=r(3068),s=i(r(5988).f),u=i([].push),l=function(e){return function(t){for(var r,i=a(t),l=o(i),c=l.length,p=0,d=[];c>p;)r=l[p++],n&&!s(i,r)||u(d,e?[r,i[r]]:i[r]);return d}};e.exports={entries:l(!0),values:l(!1)}},2816:(e,t,r)=>{"use strict";var n=r(7796),i=r(1248);e.exports=n?{}.toString:function(){return"[object "+i(this)+"]"}},7540:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(984),a=r(9952),s=n.TypeError;e.exports=function(e,t){var r,n;if("string"===t&&o(r=e.toString)&&!a(n=i(r,e)))return n;if(o(r=e.valueOf)&&!a(n=i(r,e)))return n;if("string"!==t&&o(r=e.toString)&&!a(n=i(r,e)))return n;throw s("Can't convert object to primitive value")}},4092:(e,t,r)=>{var n=r(6532),i=r(604),o=r(4880),a=r(2128),s=r(3736),u=i([].concat);e.exports=n("Reflect","ownKeys")||function(e){var t=o.f(s(e)),r=a.f;return r?u(t,r(e)):t}},340:(e,t,r)=>{var n=r(1600);e.exports=n},2699:e=>{e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},9467:(e,t,r)=>{var n=r(3736),i=r(9952),o=r(8071);e.exports=function(e,t){if(n(e),i(t)&&t.constructor===e)return t;var r=o.f(e);return(0,r.resolve)(t),r.promise}},7431:(e,t,r)=>{var n=r(5028);e.exports=function(e,t,r){for(var i in t)n(e,i,t[i],r);return e}},5028:(e,t,r)=>{var n=r(1600),i=r(984),o=r(9180),a=r(4768),s=r(2984),u=r(1727),l=r(7932),c=r(8492).CONFIGURABLE,p=l.get,d=l.enforce,f=String(String).split("String");(e.exports=function(e,t,r,u){var l,p=!!u&&!!u.unsafe,y=!!u&&!!u.enumerable,h=!!u&&!!u.noTargetGet,m=u&&void 0!==u.name?u.name:t;i(r)&&("Symbol("===String(m).slice(0,7)&&(m="["+String(m).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!o(r,"name")||c&&r.name!==m)&&a(r,"name",m),(l=d(r)).source||(l.source=f.join("string"==typeof m?m:""))),e!==n?(p?!h&&e[t]&&(y=!0):delete e[t],y?e[t]=r:a(e,t,r)):y?e[t]=r:s(t,r)})(Function.prototype,"toString",(function(){return i(this)&&p(this).source||u(this)}))},1840:(e,t,r)=>{var n=r(1600).TypeError;e.exports=function(e){if(null==e)throw n("Can't call method on "+e);return e}},2984:(e,t,r)=>{var n=r(1600),i=Object.defineProperty;e.exports=function(e,t){try{i(n,e,{value:t,configurable:!0,writable:!0})}catch(r){n[e]=t}return t}},9688:(e,t,r)=>{"use strict";var n=r(6532),i=r(7072),o=r(3668),a=r(2828),s=o("species");e.exports=function(e){var t=n(e),r=i.f;a&&t&&!t[s]&&r(t,s,{configurable:!0,get:function(){return this}})}},9540:(e,t,r)=>{var n=r(7072).f,i=r(9180),o=r(3668)("toStringTag");e.exports=function(e,t,r){e&&!i(e=r?e:e.prototype,o)&&n(e,o,{configurable:!0,value:t})}},280:(e,t,r)=>{var n=r(4624),i=r(6536),o=n("keys");e.exports=function(e){return o[e]||(o[e]=i(e))}},6376:(e,t,r)=>{var n=r(1600),i=r(2984),o="__core-js_shared__",a=n[o]||i(o,{});e.exports=a},4624:(e,t,r)=>{var n=r(7408),i=r(6376);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.19.0",mode:n?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},7171:(e,t,r)=>{var n=r(3736),i=r(6372),o=r(3668)("species");e.exports=function(e,t){var r,a=n(e).constructor;return void 0===a||null==(r=n(a)[o])?t:i(r)}},5160:(e,t,r)=>{var n=r(604),i=r(9824),o=r(748),a=r(1840),s=n("".charAt),u=n("".charCodeAt),l=n("".slice),c=function(e){return function(t,r){var n,c,p=o(a(t)),d=i(r),f=p.length;return d<0||d>=f?e?"":void 0:(n=u(p,d))<55296||n>56319||d+1===f||(c=u(p,d+1))<56320||c>57343?e?s(p,d):n:e?l(p,d,d+2):c-56320+(n-55296<<10)+65536}};e.exports={codeAt:c(!1),charAt:c(!0)}},1688:(e,t,r)=>{var n=r(604),i=r(1840),o=r(748),a=r(5320),s=n("".replace),u="["+a+"]",l=RegExp("^"+u+u+"*"),c=RegExp(u+u+"*$"),p=function(e){return function(t){var r=o(i(t));return 1&e&&(r=s(r,l,"")),2&e&&(r=s(r,c,"")),r}};e.exports={start:p(1),end:p(2),trim:p(3)}},5952:(e,t,r)=>{var n,i,o,a,s=r(1600),u=r(9756),l=r(5616),c=r(984),p=r(9180),d=r(7004),f=r(2960),y=r(6100),h=r(7300),m=r(1588),g=r(3640),v=s.setImmediate,b=s.clearImmediate,I=s.process,S=s.Dispatch,_=s.Function,T=s.MessageChannel,P=s.String,A=0,E={},w="onreadystatechange";try{n=s.location}catch(e){}var O=function(e){if(p(E,e)){var t=E[e];delete E[e],t()}},D=function(e){return function(){O(e)}},x=function(e){O(e.data)},F=function(e){s.postMessage(P(e),n.protocol+"//"+n.host)};v&&b||(v=function(e){var t=y(arguments,1);return E[++A]=function(){u(c(e)?e:_(e),void 0,t)},i(A),A},b=function(e){delete E[e]},g?i=function(e){I.nextTick(D(e))}:S&&S.now?i=function(e){S.now(D(e))}:T&&!m?(a=(o=new T).port2,o.port1.onmessage=x,i=l(a.postMessage,a)):s.addEventListener&&c(s.postMessage)&&!s.importScripts&&n&&"file:"!==n.protocol&&!d(F)?(i=F,s.addEventListener("message",x,!1)):i=w in h("script")?function(e){f.appendChild(h("script"))[w]=function(){f.removeChild(this),O(e)}}:function(e){setTimeout(D(e),0)}),e.exports={set:v,clear:b}},7920:(e,t,r)=>{var n=r(9824),i=Math.max,o=Math.min;e.exports=function(e,t){var r=n(e);return r<0?i(r+t,0):o(r,t)}},3068:(e,t,r)=>{var n=r(3188),i=r(1840);e.exports=function(e){return n(i(e))}},9824:e=>{var t=Math.ceil,r=Math.floor;e.exports=function(e){var n=+e;return n!=n||0===n?0:(n>0?r:t)(n)}},1868:(e,t,r)=>{var n=r(9824),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},3848:(e,t,r)=>{var n=r(1600),i=r(1840),o=n.Object;e.exports=function(e){return o(i(e))}},2312:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(9952),a=r(1836),s=r(8808),u=r(7540),l=r(3668),c=n.TypeError,p=l("toPrimitive");e.exports=function(e,t){if(!o(e)||a(e))return e;var r,n=s(e,p);if(n){if(void 0===t&&(t="default"),r=i(n,e,t),!o(r)||a(r))return r;throw c("Can't convert object to primitive value")}return void 0===t&&(t="number"),u(e,t)}},4061:(e,t,r)=>{var n=r(2312),i=r(1836);e.exports=function(e){var t=n(e,"string");return i(t)?t:t+""}},7796:(e,t,r)=>{var n={};n[r(3668)("toStringTag")]="z",e.exports="[object z]"===String(n)},748:(e,t,r)=>{var n=r(1600),i=r(1248),o=n.String;e.exports=function(e){if("Symbol"===i(e))throw TypeError("Cannot convert a Symbol value to a string");return o(e)}},1532:(e,t,r)=>{var n=r(1600).String;e.exports=function(e){try{return n(e)}catch(e){return"Object"}}},6536:(e,t,r)=>{var n=r(604),i=0,o=Math.random(),a=n(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++i+o,36)}},7216:(e,t,r)=>{var n=r(3880);e.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3668:(e,t,r)=>{var n=r(1600),i=r(4624),o=r(9180),a=r(6536),s=r(3880),u=r(7216),l=i("wks"),c=n.Symbol,p=c&&c.for,d=u?c:c&&c.withoutSetter||a;e.exports=function(e){if(!o(l,e)||!s&&"string"!=typeof l[e]){var t="Symbol."+e;s&&o(c,e)?l[e]=c[e]:l[e]=u&&p?p(t):d(t)}return l[e]}},5320:e=>{e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},6140:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(2408),a=r(6232),s=r(3440),u=r(4640),l=r(124),c=r(4768),p=r(364),d=r(5032),f=r(7660),y=r(9928),h=r(5744),m=r(4464),g=i.Error,v=[].push,b=function(e,t){var r=o(I,this)?this:l(I),n=arguments.length>2?arguments[2]:void 0;s&&(r=s(new g(void 0),a(r))),c(r,"message",h(t,"")),m&&c(r,"stack",d(r.stack,1)),f(r,n);var i=[];return y(e,v,{that:i}),c(r,"errors",i),r};s?s(b,g):u(b,g);var I=b.prototype=l(g.prototype,{constructor:p(1,b),message:p(1,""),name:p(1,"AggregateError")});n({global:!0},{AggregateError:b})},5092:(e,t,r)=>{"use strict";var n=r(7248),i=r(9560).find,o=r(5868),a="find",s=!0;a in[]&&Array(1)[a]((function(){s=!1})),n({target:"Array",proto:!0,forced:s},{find:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),o(a)},5684:(e,t,r)=>{var n=r(7248),i=r(8208);n({target:"Array",stat:!0,forced:!r(6344)((function(e){Array.from(e)}))},{from:i})},3924:(e,t,r)=>{"use strict";var n=r(3068),i=r(5868),o=r(2204),a=r(7932),s=r(2648),u="Array Iterator",l=a.set,c=a.getterFor(u);e.exports=s(Array,"Array",(function(e,t){l(this,{type:u,target:n(e),index:0,kind:t})}),(function(){var e=c(this),t=e.target,r=e.kind,n=e.index++;return!t||n>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==r?{value:n,done:!1}:"values"==r?{value:t[n],done:!1}:{value:[n,t[n]],done:!1}}),"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},472:(e,t,r)=>{"use strict";r(6064)("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r(9920))},1300:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isInteger:r(992)})},3656:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},6544:(e,t,r)=>{var n=r(7248),i=r(6016);n({target:"Number",stat:!0,forced:Number.parseFloat!=i},{parseFloat:i})},7972:(e,t,r)=>{var n=r(7248),i=r(6556);n({target:"Number",stat:!0,forced:Number.parseInt!=i},{parseInt:i})},6368:(e,t,r)=>{var n=r(7248),i=r(6984);n({target:"Object",stat:!0,forced:Object.assign!==i},{assign:i})},8292:(e,t,r)=>{var n=r(7248),i=r(5556).entries;n({target:"Object",stat:!0},{entries:function(e){return i(e)}})},920:(e,t,r)=>{r(7248)({target:"Object",stat:!0},{setPrototypeOf:r(3440)})},7912:(e,t,r)=>{var n=r(7796),i=r(5028),o=r(2816);n||i(Object.prototype,"toString",o,{unsafe:!0})},3936:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(1381),a=r(8071),s=r(2699),u=r(9928);n({target:"Promise",stat:!0},{allSettled:function(e){var t=this,r=a.f(t),n=r.resolve,l=r.reject,c=s((function(){var r=o(t.resolve),a=[],s=0,l=1;u(e,(function(e){var o=s++,u=!1;l++,i(r,t,e).then((function(e){u||(u=!0,a[o]={status:"fulfilled",value:e},--l||n(a))}),(function(e){u||(u=!0,a[o]={status:"rejected",reason:e},--l||n(a))}))})),--l||n(a)}));return c.error&&l(c.value),r.promise}})},5428:(e,t,r)=>{"use strict";var n=r(7248),i=r(1381),o=r(6532),a=r(3032),s=r(8071),u=r(2699),l=r(9928),c="No one promise resolved";n({target:"Promise",stat:!0},{any:function(e){var t=this,r=o("AggregateError"),n=s.f(t),p=n.resolve,d=n.reject,f=u((function(){var n=i(t.resolve),o=[],s=0,u=1,f=!1;l(e,(function(e){var i=s++,l=!1;u++,a(n,t,e).then((function(e){l||f||(f=!0,p(e))}),(function(e){l||f||(l=!0,o[i]=e,--u||d(new r(o,c)))}))})),--u||d(new r(o,c))}));return f.error&&d(f.value),n.promise}})},1517:(e,t,r)=>{"use strict";var n=r(7248),i=r(7408),o=r(3459),a=r(7004),s=r(6532),u=r(984),l=r(7171),c=r(9467),p=r(5028);if(n({target:"Promise",proto:!0,real:!0,forced:!!o&&a((function(){o.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=l(this,s("Promise")),r=u(e);return this.then(r?function(r){return c(t,e()).then((function(){return r}))}:e,r?function(r){return c(t,e()).then((function(){throw r}))}:e)}}),!i&&u(o)){var d=s("Promise").prototype.finally;o.prototype.finally!==d&&p(o.prototype,"finally",d,{unsafe:!0})}},7448:(e,t,r)=>{"use strict";var n,i,o,a,s=r(7248),u=r(7408),l=r(1600),c=r(6532),p=r(3032),d=r(3459),f=r(5028),y=r(7431),h=r(3440),m=r(9540),g=r(9688),v=r(1381),b=r(984),I=r(9952),S=r(2932),_=r(1727),T=r(9928),P=r(6344),A=r(7171),E=r(5952).set,w=r(3104),O=r(9467),D=r(5651),x=r(8071),F=r(2699),C=r(7932),N=r(4232),M=r(3668),k=r(4532),R=r(3640),V=r(2592),j=M("species"),z="Promise",L=C.get,U=C.set,B=C.getterFor(z),H=d&&d.prototype,W=d,G=H,Y=l.TypeError,q=l.document,K=l.process,Q=x.f,Z=Q,X=!!(q&&q.createEvent&&l.dispatchEvent),J=b(l.PromiseRejectionEvent),$="unhandledrejection",ee=!1,te=N(z,(function(){var e=_(W),t=e!==String(W);if(!t&&66===V)return!0;if(u&&!G.finally)return!0;if(V>=51&&/native code/.test(e))return!1;var r=new W((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(r.constructor={})[j]=n,!(ee=r.then((function(){}))instanceof n)||!t&&k&&!J})),re=te||!P((function(e){W.all(e).catch((function(){}))})),ne=function(e){var t;return!(!I(e)||!b(t=e.then))&&t},ie=function(e,t){if(!e.notified){e.notified=!0;var r=e.reactions;w((function(){for(var n=e.value,i=1==e.state,o=0;r.length>o;){var a,s,u,l=r[o++],c=i?l.ok:l.fail,d=l.resolve,f=l.reject,y=l.domain;try{c?(i||(2===e.rejection&&ue(e),e.rejection=1),!0===c?a=n:(y&&y.enter(),a=c(n),y&&(y.exit(),u=!0)),a===l.promise?f(Y("Promise-chain cycle")):(s=ne(a))?p(s,a,d,f):d(a)):f(n)}catch(e){y&&!u&&y.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},oe=function(e,t,r){var n,i;X?((n=q.createEvent("Event")).promise=t,n.reason=r,n.initEvent(e,!1,!0),l.dispatchEvent(n)):n={promise:t,reason:r},!J&&(i=l["on"+e])?i(n):e===$&&D("Unhandled promise rejection",r)},ae=function(e){p(E,l,(function(){var t,r=e.facade,n=e.value;if(se(e)&&(t=F((function(){R?K.emit("unhandledRejection",n,r):oe($,r,n)})),e.rejection=R||se(e)?2:1,t.error))throw t.value}))},se=function(e){return 1!==e.rejection&&!e.parent},ue=function(e){p(E,l,(function(){var t=e.facade;R?K.emit("rejectionHandled",t):oe("rejectionhandled",t,e.value)}))},le=function(e,t,r){return function(n){e(t,n,r)}},ce=function(e,t,r){e.done||(e.done=!0,r&&(e=r),e.value=t,e.state=2,ie(e,!0))},pe=function(e,t,r){if(!e.done){e.done=!0,r&&(e=r);try{if(e.facade===t)throw Y("Promise can't be resolved itself");var n=ne(t);n?w((function(){var r={done:!1};try{p(n,t,le(pe,r,e),le(ce,r,e))}catch(t){ce(r,t,e)}})):(e.value=t,e.state=1,ie(e,!1))}catch(t){ce({done:!1},t,e)}}};if(te&&(G=(W=function(e){S(this,G),v(e),p(n,this);var t=L(this);try{e(le(pe,t),le(ce,t))}catch(e){ce(t,e)}}).prototype,(n=function(e){U(this,{type:z,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=y(G,{then:function(e,t){var r=B(this),n=r.reactions,i=Q(A(this,W));return i.ok=!b(e)||e,i.fail=b(t)&&t,i.domain=R?K.domain:void 0,r.parent=!0,n[n.length]=i,0!=r.state&&ie(r,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new n,t=L(e);this.promise=e,this.resolve=le(pe,t),this.reject=le(ce,t)},x.f=Q=function(e){return e===W||e===o?new i(e):Z(e)},!u&&b(d)&&H!==Object.prototype)){a=H.then,ee||(f(H,"then",(function(e,t){var r=this;return new W((function(e,t){p(a,r,e,t)})).then(e,t)}),{unsafe:!0}),f(H,"catch",G.catch,{unsafe:!0}));try{delete H.constructor}catch(e){}h&&h(H,G)}s({global:!0,wrap:!0,forced:te},{Promise:W}),m(W,z,!1,!0),g(z),o=c(z),s({target:z,stat:!0,forced:te},{reject:function(e){var t=Q(this);return p(t.reject,void 0,e),t.promise}}),s({target:z,stat:!0,forced:u||te},{resolve:function(e){return O(u&&this===o?W:this,e)}}),s({target:z,stat:!0,forced:re},{all:function(e){var t=this,r=Q(t),n=r.resolve,i=r.reject,o=F((function(){var r=v(t.resolve),o=[],a=0,s=1;T(e,(function(e){var u=a++,l=!1;s++,p(r,t,e).then((function(e){l||(l=!0,o[u]=e,--s||n(o))}),i)})),--s||n(o)}));return o.error&&i(o.value),r.promise},race:function(e){var t=this,r=Q(t),n=r.reject,i=F((function(){var i=v(t.resolve);T(e,(function(e){p(i,t,e).then(r.resolve,n)}))}));return i.error&&n(i.value),r.promise}})},8504:(e,t,r)=>{"use strict";var n=r(5160).charAt,i=r(748),o=r(7932),a=r(2648),s="String Iterator",u=o.set,l=o.getterFor(s);a(String,"String",(function(e){u(this,{type:s,string:i(e),index:0})}),(function(){var e,t=l(this),r=t.string,i=t.index;return i>=r.length?{value:void 0,done:!0}:(e=n(r,i),t.index+=e.length,{value:e,done:!1})}))},1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._type=e}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),e}();t.TableauEvent=r},3248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t)||this;return n._sheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"sheet",{get:function(){return this._sheet},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.TableauSheetEvent=o},4144:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n._worksheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),t}(r(3248).TableauSheetEvent);t.TableauWorksheetEvent=o},4164:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=function(e){function t(t){var r=e.call(this,o.TableauEventType.WorkbookFormattingChanged)||this;return r._formatting=t,r}return i(t,e),Object.defineProperty(t.prototype,"formatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.WorkbookFormattingChangedEvent=a},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=n}return Object.defineProperty(e.prototype,"userId",{get:function(){return this._userId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteId",{get:function(){return this._siteId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteNamespace",{get:function(){return this._siteNamespace},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookId",{get:function(){return this._workbookId},enumerable:!0,configurable:!0}),e}();t.ConnectedServer=r},5920:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(5136),a=r(1468),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t.prototype.getAllDataSourcesAsync=function(){var e=this;return o.ApiServiceRegistry.get(a.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((function(t){var r=t,n=[];return Object.values(r.dataSources).forEach((function(t){n.push(e.createDataSourceFromInfo(t))})),n}))},t.prototype.createDataSourceFromInfo=function(e){var t=new o.DataSourceImpl(e,a.ExtensionsRegistryId),r=new o.DataSource(t);return t.initializeWithPublicInterfaces(r),r},t}(o.WorkbookImpl);t.ExtensionWorkbookImpl=s},976:function(e,t,r){"use strict";var n=this&&this.__spreadArrays||function(){for(var e=0,t=0,r=arguments.length;t0;)r.deleteRule(r.cssRules.length-1);e.formattingSheets.map((function(e){t.applyFormattingSheetToStyleSheet(e,r)}))}},e.prototype.applyFormattingSheetToStyleSheet=function(e,t){var r="",n=e.cssProperties;n.fontFamily&&(r+="font-family: "+n.fontFamily.toString()+"; "),n.fontSize&&(r+="font-size: "+n.fontSize.toString()+"; "),n.fontWeight&&(r+="font-weight: "+n.fontWeight.toString()+"; "),n.fontStyle&&(r+="font-style: "+n.fontStyle.toString()+"; "),n.textDecoration&&(r+="text-decoration: "+n.textDecoration.toString()+"; "),n.color&&(r+="color: "+n.color+"; ");var i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)},e.prototype.initializeWorkbookFormattingChangedEventCallback=function(e){var t=this;a.ApiServiceRegistry.get(m.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(r){r&&(t.initializeTableauFonts(e,r),t.applyAllFormatting(r))}))},e.prototype.initializeTableauFonts=function(e,t){var r,i=this,a=n(g.SupportedBentonSansFontFaces,S.SupportedTableauFontFaces);if(t.formattingSheets.forEach((function(e){e.cssProperties.fontFamily&&a.push(e.cssProperties.fontFamily)})),a.length>0){var s=((r={})[o.ParameterId.FontNameListItems]=a,r);e.execute(o.VerbId.GetFonts,s).then((function(e){i.loadFonts(e.result)})).catch()}},e.prototype.loadFonts=function(e){var t=this;e.forEach((function(e){S.SupportedTableauFontFaces.includes(e.fontName)?t.loadTableauFonts(e):g.SupportedBentonSansFontFaces.includes(e.fontName)?t.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))},e.prototype.initializeDashboardContent=function(e,t){var r=new a.SheetInfoImpl(e.name,i.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),n=new a.DashboardImpl(r,e.zones,t,m.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(n);return new c.DashboardContent(o)},e.prototype.initializeWorksheetContent=function(e){var t=new a.SheetInfoImpl(e.visualId.worksheet,i.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new a.WorksheetImpl(t,m.ExtensionsRegistryId,e.visualId,null,null),n=new l.Worksheet(r);return new y.WorksheetContent(n)},e.prototype.initializeSettings=function(e){var t=new I.SettingsImpl(e);return new d.Settings(t)},e.prototype.initializeContextMenuCallbacks=function(e){a.ApiServiceRegistry.get(m.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.ContextMenuClick,(function(){return!0}),(function(t){if(e){if(!e[t.id])throw new a.TableauError(i.ErrorCodes.InternalError,"Received unexpected context menu Id from event: "+t.id);e[t.id]()}}))},e.prototype.loadTableauFonts=function(e){switch(e.fontName){case S.TableauBookFontFaceName:document.fonts.add(new FontFace(S.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauLightFontFaceName:document.fonts.add(new FontFace(S.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauRegularFontFaceName:document.fonts.add(new FontFace(S.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(S.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case S.TableauBoldFontFaceName:document.fonts.add(new FontFace(S.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case S.TableauMediumFontFaceName:document.fonts.add(new FontFace(S.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e.prototype.loadBentonSansFonts=function(e){switch(e.fontName){case g.BentonSansBookFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case g.BentonSansLightFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case g.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case g.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case g.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case g.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e}();t.ExtensionsImpl=T},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((function(e){e(n.INTERNAL_CONTRACT_VERSION).execute(n.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(7112),l=r(1468),c=function(e){function t(t){var r=e.call(this,o.TableauEventType.SettingsChanged)||this;return r._newSettings=t,r}return i(t,e),Object.defineProperty(t.prototype,"newSettings",{get:function(){return this._newSettings},enumerable:!0,configurable:!0}),t}(u.TableauEvent),p=function(){function e(e){this._saveInProgress=!1,this.initializeSettings(e)}return e.prototype.erase=function(e){s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)},e.prototype.get=function(e){return s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]},e.prototype.getAll=function(){return Object.assign({},this._currentSettings)},Object.defineProperty(e.prototype,"isModified",{get:function(){return this._isModified},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){var e=this;return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((function(t){return e._saveInProgress=!1,e._isModified=!1,void 0===e._currentSettings?e._currentSettings=t:Object.assign(e._currentSettings,t),t}),(function(t){return e._saveInProgress=!1,Promise.reject(t)}))):Promise.resolve(this._currentSettings)},e.prototype.set=function(e,t){s.ErrorHelpers.verifyStringParameter(e,"key"),s.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0},e.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.SettingsChanged);return e.registerHandler(a.NotificationId.SettingsChanged,(function(){return!0}),(function(e){t._currentSettings=e.newSettings,n.triggerEvent((function(){return new c(e.newSettings)}))})),r.push(n),r},e.prototype.initializeSettings=function(e){s.ErrorHelpers.verifyParameter(e,"settingsInfo"),s.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1},e.prototype.verifySettingsAreUnlocked=function(){if(this._saveInProgress)throw new s.TableauError(o.ErrorCodes.SettingSaveInProgress,e.ASYNC_SAVE_IN_PROGRESS)},e.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed.",e}();t.SettingsImpl=p},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(7419),o=r(3448),a=r(5136),s=r(1468),u=function(){function e(){}return e.prototype.displayDialogAsync=function(e,t,r){var u=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService"),l=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("notification-service");return new Promise((function(s,c){u.displayDialogAsync(e,t||"",r).then((function(){var e=l.registerHandler(o.NotificationId.ExtensionDialogUpdate,(function(){return!0}),(function(t){if(t.isCloseEvent){if(void 0===t.closePayload)throw new a.TableauError(n.ErrorCodes.InternalError,"closePayload is undefined");s(t.closePayload)}else c(new a.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((function(e){c(e)}))}))},e.prototype.closeDialog=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService").closeDialog(e)},e}();t.UIImpl=u},4252:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(6416),l=r(4164),c=r(1468),p=r(3192),d=r(6132),f=r(5548),y=function(e){function t(t){var r=e.call(this,t)||this;return r._dashboardImpl=t,t.initializeWithPublicInterfaces(),r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"worksheets",{get:function(){return this._dashboardImpl.worksheetsImpl.map((function(e){return new f.Worksheet(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._dashboardImpl.objects.map((function(e){return new p.DashboardObject(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._dashboardImpl.activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._dashboardImpl.activeDashboardName},enumerable:!0,configurable:!0}),t.prototype.setZoneVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.setDashboardObjectVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.getDashboardObjectById=function(e){var t=this._dashboardImpl.getDashboardObjectById(e);return t&&new p.DashboardObject(t)},t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(c.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.DashboardLayoutChanged);e.registerHandler(a.NotificationId.DashboardLayoutChanged,(function(){return!0}),(function(e){var r=t._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);n.triggerEvent((function(){return new u.DashboardLayoutChangedEvent(r)}))})),r.push(n);var i=new s.SingleEventManagerImpl(o.TableauEventType.WorkbookFormattingChanged);return e.registerHandler(a.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(e){i.triggerEvent((function(){return new l.WorkbookFormattingChangedEvent(e)}))})),r.push(i),r},t.prototype.moveAndResizeDashboardObjectsAsync=function(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)},t.prototype.replayAnimationAsync=function(e){return this._dashboardImpl.replayAnimationAsync(e)},t.prototype.getFiltersAsync=function(){return this._dashboardImpl.getFiltersAsync()},t.prototype.applyFilterAsync=function(e,t,r,n){return this._dashboardImpl.applyFilterAsync(e,t,r,n)},t}(d.Sheet);t.Dashboard=y},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4252),i=r(5548),o=function(){function e(e){this._dashboardObjectImpl=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return new n.Dashboard(this._dashboardObjectImpl.dashboardImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._dashboardObjectImpl.type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._dashboardObjectImpl.position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._dashboardObjectImpl.size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheet",{get:function(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._dashboardObjectImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._dashboardObjectImpl.isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._dashboardObjectImpl.isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dashboardObjectImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._dashboardObjectImpl.fieldId},enumerable:!0,configurable:!0}),e}();t.DashboardObject=o},4592:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(864),l=r(1468),c=function(e){function t(t,r){var n=e.call(this)||this;return n.parameterImpl=t,n.initializeEvents(r).forEach((function(e){return n.addNewEventType(e)})),n}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this.parameterImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentValue",{get:function(){return this.parameterImpl.currentValue},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dataType",{get:function(){return this.parameterImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"allowableValues",{get:function(){return this.parameterImpl.allowableValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this.parameterImpl.id},enumerable:!0,configurable:!0}),t.prototype.changeValueAsync=function(e){return this.parameterImpl.changeValueAsync(e)},t.prototype.initializeEvents=function(e){var t=this;s.ErrorHelpers.verifyInternalValue(e,"sheet");var r,n=new Array;try{r=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return n}var i=new s.SingleEventManagerImpl(o.TableauEventType.ParameterChanged);return r.registerHandler(a.NotificationId.ParameterChanged,(function(e){return e===t.parameterImpl.id}),(function(t){i.triggerEvent((function(){return new u.ParameterChangedEvent(t,e)}))})),n.push(i),n},t}(s.EventListenerManager);t.Parameter=c},6132:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(5136),s=r(4592),u=function(e){function t(t){var r=e.call(this)||this;return r._sheetImpl=t,r}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this._sheetImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"sheetType",{get:function(){return this._sheetImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new a.TableauError(o.EmbeddingErrorCodes.ImplementationError,"Size not implemented")},enumerable:!0,configurable:!0}),t.prototype.isValidSize=function(e){var t=e;return void 0!==t.width&&void 0!==t.height},t.prototype.findParameterAsync=function(e){var t=this;return this._sheetImpl.findParameterAsync(e).then((function(e){return new Promise(e?function(r){return r(new s.Parameter(e,t))}:function(e){return e(void 0)})}))},t.prototype.getParametersAsync=function(){var e=this;return this._sheetImpl.getParametersAsync().then((function(t){return t.map((function(t){return new s.Parameter(t,e)}))}))},t}(a.EventListenerManager);t.Sheet=u},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._workbookImpl=e}return e.prototype.getAllDataSourcesAsync=function(){return this._workbookImpl.getAllDataSourcesAsync()},e}();t.Workbook=r},5548:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(5136),l=r(1672),c=r(5572),p=r(3464),d=r(1468),f=r(4252),y=function(e){function t(t){var r=e.call(this,t)||this;return r._worksheetImpl=t,r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){if(null==this._worksheetImpl.parentDashboard)throw new u.TableauError(o.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new f.Dashboard(this._worksheetImpl.parentDashboard)},enumerable:!0,configurable:!0}),t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=u.ApiServiceRegistry.get(d.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new u.SingleEventManagerImpl(a.TableauEventType.MarkSelectionChanged);e.registerHandler(s.NotificationId.SelectedMarksChanged,(function(e){var r=e;return t.visualIdsAreEqual(r,t._worksheetImpl.visualId)}),(function(){return n.triggerEvent((function(){return new c.MarksSelectedEvent(t)}))}));var i=new u.SingleEventManagerImpl(a.TableauEventType.FilterChanged);e.registerHandler(s.NotificationId.FilterChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){i.triggerEvent((function(){return new l.FilterChangedEvent(t,e.fieldName,e.fieldId)}))}));var o=new u.SingleEventManagerImpl(a.TableauEventType.SummaryDataChanged);return e.registerHandler(s.NotificationId.SummaryDataChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){o.triggerEvent((function(){return new p.SummaryDataChangedEvent(t)}))})),r.push(n),r.push(i),r.push(o),r},t.prototype.applyFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyFilterAsync(e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,n)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)},t.prototype.clearFilterAsync=function(e){return this._worksheetImpl.clearFilterAsync(e)},t.prototype.getDataSourcesAsync=function(){return this._worksheetImpl.getDataSourcesAsync()},t.prototype.getFiltersAsync=function(){return this._worksheetImpl.getFiltersAsync()},t.prototype.getSelectedMarksAsync=function(){return this._worksheetImpl.getSelectedMarksAsync()},t.prototype.getHighlightedMarksAsync=function(){return this._worksheetImpl.getHighlightedMarksAsync()},t.prototype.getSummaryDataAsync=function(e){return this._worksheetImpl.getSummaryDataAsync(e)},t.prototype.getSummaryDataReaderAsync=function(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)},t.prototype.getSummaryColumnsInfoAsync=function(){return this._worksheetImpl.getSummaryColumnsInfoAsync()},t.prototype.getUnderlyingDataAsync=function(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)},t.prototype.getUnderlyingTablesAsync=function(){return this._worksheetImpl.getUnderlyingTablesAsync()},t.prototype.getUnderlyingTableDataAsync=function(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)},t.prototype.getUnderlyingTableDataReaderAsync=function(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)},t.prototype.getVisualSpecificationAsync=function(){return this._worksheetImpl.getVisualSpecificationAsync()},t.prototype.clearSelectedMarksAsync=function(){return this._worksheetImpl.clearSelectedMarksAsync()},t.prototype.selectMarksByIDAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.selectMarksByValueAsync=function(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)},t.prototype.selectMarksByIdAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.annotateMarkAsync=function(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)},t.prototype.getAnnotationsAsync=function(){return this._worksheetImpl.getAnnotationsAsync()},t.prototype.removeAnnotationAsync=function(e){return this._worksheetImpl.removeAnnotationAsync(e)},t.prototype.hoverTupleAsync=function(e,t,r){return void 0===r&&(r=!0),this._worksheetImpl.hoverTupleAsync(e,t,r)},t.prototype.selectTuplesAsync=function(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)},t.prototype.getTooltipTextAsync=function(e){return this._worksheetImpl.getTooltipTextAsync(e)},t.prototype.leaveMarkNavigationAsync=function(){return this._worksheetImpl.leaveMarkNavigationAsync()},t.prototype.visualIdsAreEqual=function(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID},t}(r(6132).Sheet);t.Worksheet=y},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dashboard=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return this._dashboard},enumerable:!0,configurable:!0}),e}();t.DashboardContent=r},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(8396),o=r(8012),a=function(){function e(e){this._apiVersion=n.ApiVersion.Instance&&n.ApiVersion.Instance.formattedValue,this._context=n.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=o.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=n.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}return Object.defineProperty(e.prototype,"apiVersion",{get:function(){return this._apiVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this._context},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookFormatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"language",{get:function(){return this._language},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"country",{get:function(){return this._country},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"locale",{get:function(){return this._locale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mode",{get:function(){return this._mode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"operatingSystem",{get:function(){return this._operatingSystem},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tableauVersion",{get:function(){return this._tableauVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"uniqueUserId",{get:function(){return this._uniqueUserId},enumerable:!0,configurable:!0}),e}();t.Environment=a},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.extensionImpl=e,this.extensionImpl=e}return Object.defineProperty(e.prototype,"dashboardContent",{get:function(){return this.extensionImpl.dashboardContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetContent",{get:function(){return this.extensionImpl.worksheetContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"environment",{get:function(){return this.extensionImpl.environment},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"settings",{get:function(){return this.extensionImpl.settings},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ui",{get:function(){return this.extensionImpl.ui},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbook",{get:function(){return this.extensionImpl.workbook},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dashboardObjectId",{get:function(){return this.extensionImpl.extensionZoneId},enumerable:!0,configurable:!0}),e.prototype.initializeAsync=function(e){return this.extensionImpl.initializeAsync(!1,e).then()},e.prototype.initializeDialogAsync=function(){return this.extensionImpl.initializeAsync(!0)},e.prototype.createVizImageAsync=function(e){return this.extensionImpl.createVizImageAsync(e)},e.prototype.setClickThroughAsync=function(e){return this.extensionImpl.setClickThroughAsync(e)},e}();t.Extensions=r},652:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var r=e.call(this)||this;return r._settingsImpl=t,r._settingsImpl.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),t.prototype.erase=function(e){this._settingsImpl.erase(e)},t.prototype.get=function(e){return this._settingsImpl.get(e)},t.prototype.getAll=function(){return this._settingsImpl.getAll()},Object.defineProperty(t.prototype,"isModified",{get:function(){return this._settingsImpl.isModified},enumerable:!0,configurable:!0}),t.prototype.saveAsync=function(){return this._settingsImpl.saveAsync()},t.prototype.set=function(e,t){this._settingsImpl.set(e,t)},t}(r(5136).EventListenerManager);t.Settings=o},1964:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._impl=e}return e.prototype.displayDialogAsync=function(e,t,r){return this._impl.displayDialogAsync(e,t,r)},e.prototype.closeDialog=function(e){this._impl.closeDialog(e)},e}();t.UI=r},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(){}return e.convertToWorkbookFormatting=function(e){return e?{formattingSheets:e.formattingSheets.map((function(e){return{classNameKey:n.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:{fontFamily:e.cssProperties.fontFamily,fontSize:e.cssProperties.fontSize,fontWeight:e.cssProperties.fontWeight,fontStyle:e.cssProperties.fontStyle,textDecoration:e.cssProperties.textDecoration,color:e.cssProperties.color}}}))}:void 0},e}();t.WorkbookFormattingEnvUtil=i},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._worksheet=e}return Object.defineProperty(e.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),e}();t.WorksheetContent=r},6336:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"InitializationService"},enumerable:!0,configurable:!0}),t.prototype.initializeDashboardExtensionsAsync=function(e,t){var r,n=((r={})[o.ParameterId.FunctionName]="initializeDashboardExtensionsAsync",r[o.ParameterId.ExtensionContextMenuIds]=t,r[o.ParameterId.IsExtensionDialog]=e,r);return this.execute(o.VerbId.InitializeExtension,n).then((function(e){return e.result}))},t}(r(5136).ServiceImplBase);t.InitializationServiceImpl=a},5432:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"SettingsService"},enumerable:!0,configurable:!0}),t.prototype.saveSettingsAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="saveSettingsAsync",t[a.ParameterId.SettingsValues]=e,t);return this.execute(a.VerbId.SaveExtensionSettings,r).then((function(e){var t=e.result;if(!t||!t.settingsValues)throw new s.TableauError(o.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))},t}(s.ServiceImplBase);t.SettingsServiceImpl=u},752:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=o.DialogStyle.Window,l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"UIService"},enumerable:!0,configurable:!0}),t.prototype.displayDialogAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="displayDialogAsync",n[a.ParameterId.ExtensionDialogUrl]=e,n[a.ParameterId.ExtensionDialogPayload]=t,n),l=r&&r.height?r.height:400,c=r&&r.width?r.width:600,p=r&&r.dialogStyle?r.dialogStyle:u;if(l<=0||c<=0)throw new s.TableauError(o.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return i[a.ParameterId.ExtensionDialogH]=l,i[a.ParameterId.ExtensionDialogW]=c,s.ErrorHelpers.verifyEnumValue(p,o.DialogStyle,"DialogStyle"),i[a.ParameterId.ExtensionDialogStyle]=s.ExternalToInternalEnumMappings.dialogStyles.convert(p),this.execute(a.VerbId.DisplayDialog,i).then((function(e){switch(e.result){case a.ExtensionDialogResult.DialogAlreadyOpen:throw new s.TableauError(o.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case a.ExtensionDialogResult.InvalidDomain:throw new s.TableauError(o.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))},t.prototype.closeDialog=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="closeDialog",t);return e&&(r[a.ParameterId.ExtensionDialogPayload]=e),this.execute(a.VerbId.CloseDialog,r).then((function(){}))},t.prototype.setClickThroughAsync=function(e,t){var r;if(s.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new s.TableauError(o.ErrorCodes.InternalError,"Extension Id is invalid.");var n=((r={})[a.ParameterId.ExtensionZoneId]=t,r[a.ParameterId.ClickThroughEnabled]=e,r);return this.execute(a.VerbId.SetClickThrough,n).then((function(){}))},t}(s.ServiceImplBase);t.UIServiceImpl=l},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(6336),o=r(5432),a=r(752),s=r(1468);t.registerAllExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new o.SettingsServiceImpl(e,s.ExtensionsRegistryId)),n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new a.UIServiceImpl(e,s.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,s.ExtensionsRegistryId))}},1468:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.PulseLayout=i.PulseLayout,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,n(r(828)),n(r(3432)),n(r(1480)),n(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4744);t.ErrorCodes=n.ErrorCodes,t.ExtensionContext=n.ExtensionContext,t.ExtensionMode=n.ExtensionMode,t.TableauEventType=n.TableauEventType,t.VizImageEncodingType=n.VizImageEncodingType,t.VizImagePaletteType=n.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=n.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=n.VizImageSizeSettingType,t.VizImageSortDirectionType=n.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(268)),n(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,y,h;Object.defineProperty(t,"__esModule",{value:!0}),(h=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",h.Excel="xlsx",(y=t.DeviceType||(t.DeviceType={})).Default="default",y.Desktop="desktop",y.Tablet="tablet",y.Phone="phone",(f=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",f.BrowserNotCapable="browser-not-capable",f.DownloadWorkbookNotAllowed="download-workbook-not-allowed",f.FilterCannotBePerformed="filter-cannot-be-performed",f.IndexOutOfRange="index-out-of-range",f.InternalError="internal-error",f.InvalidCustomViewName="invalid-custom-view-name",f.InvalidDateParameter="invalid-date-parameter",f.invalidFilterFieldNameOrValue="invalid-filter-field-name",f.InvalidParameter="invalid-parameter",f.InvalidSize="invalid-size",f.InvalidSheetType="invalid-sheet-type",f.InvalidSizeBehavior="invalid-size-behavior",f.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",f.InvalidUrl="invalid-url",f.MissingMaxSize="missing-max-size",f.MissingMinSize="missing-min-size",f.MissingMinMaxSize="missing-min-max-size",f.MissingParameter="missing-parameter",f.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",f.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",f.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",f.NotActiveSheet="not-active-sheet",f.NullOrEmptyParameter="null-or-empty-parameter",f.SheetNotInWorkbook="sheet-not-in-workbook",f.StaleDataReference="stale-data-reference",f.UnknownAuthError="unknown-auth-error",f.UnsupportedEventName="unsupported-event-name",f.VizAlreadyInManager="viz-already-in-manager",f.ImplementationError="wrong-implementation",f.NotImplemented="not-implemented",f.EventInitializationError="event-initialization-error",f.IncompatibleVersionError="incompatible-version-error",f.UnknownDialogType="unknown-dialog-type",f.FilterMissingOrNotImplemented="filter-missing-not-implemented",f.StoryPointIdMismatch="storypoint-id-mismatch",(d=t.FileFormats||(t.FileFormats={})).PDF="pdf",d.PNG="png",(p=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",p.Landscape="landscape",(c=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",c.Legal="legal",c.Note="note",c.Folio="folio",c.Tabloid="tabloid",c.Ledger="ledger",c.Statement="statement",c.Executive="executive",c.A3="A3",c.A4="A4",c.A5="A5",c.B4="B4",c.B5="B5",c.Quarto="quarto",c.Unspecified="unspecified",(l=t.PrintScaling||(t.PrintScaling={})).Automatic="automatic",l.Perc25="25%",l.Perc50="50%",l.Perc60="60%",l.Perc75="75%",l.Perc80="80%",l.Perc90="90%",l.Perc100="100%",l.Perc200="200%",l.Perc400="400%",l.AtMost1PageHigh="at-most-1-page-high",l.AtMost2PagesHigh="at-most-2-pages-high",l.AtMost1PageWide="at-most-1-page-wide",l.AtMost2PagesWide="at-most-2-pages-wide",(u=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",u.Axes="axes",u.Filters="filters",u.Sorts="sorts",u.Shelves="shelves",(s=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",s.AskData="askData",s.CustomViews="customViews",s.DataDetails="dataDetails",s.Share="share",s.Subscribe="subscribe",(a=t.Toolbar||(t.Toolbar={})).Top="top",a.Bottom="bottom",a.Hidden="hidden",(o=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",o.Exactly="exactly",o.Range="range",o.AtLeast="atleast",o.AtMost="atmost",(i=t.PulseLayout||(t.PulseLayout={})).Default="default",i.Card="card",i.Ban="ban",(n=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",n.CustomViewRemoved="customviewremoved",n.CustomViewSaved="customviewsaved",n.CustomViewSetDefault="customviewsetdefault",n.EditButtonClicked="editbuttonclicked",n.EditInDesktopButtonClicked="editindesktopbuttonclicked",n.FilterChanged="filterchanged",n.FirstVizSizeKnown="firstvizsizeknown",n.FirstInteractive="firstinteractive",n.CustomMarkContextMenuEvent="custommarkcontextmenu",n.MarkSelectionChanged="markselectionchanged",n.ParameterChanged="parameterchanged",n.ToolbarStateChanged="toolbarstatechanged",n.WorkbookReadyToClose="workbookreadytoclose",n.WorkbookPublished="workbookpublished",n.WorkbookPublishedAs="workbookpublishedas",n.UrlAction="urlaction",n.TabSwitched="tabswitched",n.StoryPointSwitched="storypointswitched",n.VizLoadError="vizloaderror",n.IframeSrcUpdated="iframesrcupdated",n.SummaryDataChanged="summarydatachanged",n.ReadyToReceiveAuthToken="readytoreceiveauthtoken",(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;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter",r.Layout="layout"},3432:(e,t)=>{"use strict";var r,n,i,o,a;Object.defineProperty(t,"__esModule",{value:!0}),(a=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",a.HideEditInDesktopButton="hide-edit-in-desktop-button",a.SuppressDefaultEditBehavior="suppress-default-edit-behavior",a.DisableVersionCheck="disable-version-check",a.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",a.OnFirstVizSizeKnown="onFirstVizSizeKnown",a.OnFirstInteractive="onFirstInteractive",(o=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",o.HideTabs="hide-tabs",o.Toolbar="toolbar",o.InstanceIdToClone="instance-id-to-clone",o.Device="device",o.HideEditButton="hide-edit-button",o.OnEditButtonClicked="onEditButtonClicked",o.OnFilterChanged="onFilterChanged",o.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",o.OnMarkSelectionChanged="onMarkSelectionChanged",o.OnParameterChanged="onParameterChanged",o.OnToolbarStateChanged="onToolbarStateChanged",o.OnUrlAction="onUrlAction",o.OnTabSwitched="onTabSwitched",o.OnCustomViewLoaded="onCustomViewLoaded",o.OnCustomViewRemoved="onCustomViewRemoved",o.OnCustomViewSaved="onCustomViewSaved",o.OnCustomViewSetDefault="onCustomViewSetDefault",o.OnStoryPointSwitched="onStoryPointSwitched",o.OnSummaryDataChanged="onSummaryDataChanged",o.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(n=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",n.VizParameter="viz-parameter",n.CustomParameter="custom-parameter",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,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",(t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){var t,r,n,i,o,a,s,u,l;(l=e.ErrorCodes||(e.ErrorCodes={})).APINotInitialized="api-not-initialized",l.VisibilityError="visibility-error",l.DialogAlreadyOpen="dialog-already-open",l.DialogClosedByUser="dialog-closed-by-user",l.InternalError="internal-error",l.InvalidDomainDialog="invalid-dialog-domain",l.InvalidParameter="invalid-parameter",l.MissingFilter="missing-filter",l.MissingParameter="missing-parameter",l.ServerError="server-error",l.SettingSaveInProgress="setting-save-in-progress",l.UnsupportedEventName="unsupported-event-name",l.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type",(u=e.ExtensionContext||(e.ExtensionContext={})).Desktop="desktop",u.Server="server",(s=e.ExtensionMode||(e.ExtensionMode={})).Authoring="authoring",s.Viewing="viewing",(a=e.TableauEventType||(e.TableauEventType={})).FilterChanged="filter-changed",a.MarkSelectionChanged="mark-selection-changed",a.SummaryDataChanged="summary-data-changed",a.ParameterChanged="parameter-changed",a.SettingsChanged="settings-changed",a.DashboardLayoutChanged="dashboard-layout-changed",a.WorkbookFormattingChanged="workbook-formatting-changed",(o=e.VizImageEncodingType||(e.VizImageEncodingType={})).Discrete="discrete",o.Continuous="continuous",(i=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})).Ascending="ascending",i.Descending="descending",(n=e.VizImagePaletteType||(e.VizImagePaletteType={})).CustomDiverging="custom-diverging",n.CustomSequential="custom-sequential",(r=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})).Fixed="fixed",r.Manual="manual",(t=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={})).Right="right",t.Left="left",t.Center="center"}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:function(e){"use strict";var t,r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var n=r(808);t.AnalyticsObjectType=n.AnalyticsObjectType,t.AnnotationType=n.AnnotationType,t.ClassNameKey=n.ClassNameKey,t.ColumnType=n.ColumnType,t.DashboardLayoutChange=n.DashboardLayoutChange,t.DashboardObjectType=n.DashboardObjectType,t.DashboardObjectVisibilityType=n.DashboardObjectVisibilityType,t.DataType=n.DataType,t.DateRangeType=n.DateRangeType,t.DialogStyle=n.DialogStyle,t.EncodingType=n.EncodingType,t.FieldAggregationType=n.FieldAggregationType,t.FieldRoleType=n.FieldRoleType,t.FilterDomainType=n.FilterDomainType,t.FilterNullOption=n.FilterNullOption,t.FilterType=n.FilterType,t.FilterUpdateType=n.FilterUpdateType,t.HierarchicalLevelSelectionState=n.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=n.IncludeDataValuesOption,t.MarkType=n.MarkType,t.ParameterValueType=n.ParameterValueType,t.PeriodType=n.PeriodType,t.QuickTableCalcType=n.QuickTableCalcType,t.ReplaySpeedType=n.ReplaySpeedType,t.SelectOptions=n.SelectOptions,t.SelectionUpdateType=n.SelectionUpdateType,t.SheetType=n.SheetType,t.SortDirection=n.SortDirection,t.TrendLineModelType=n.TrendLineModelType,t.ZoneVisibilityType=n.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),r(5668),r(5816),r(8824);var i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,n(r(6716)),n(r(1080)),n(r(5824)),n(r(4547)),n(r(2400)),n(r(2496)),n(r(2472)),n(r(552)),n(r(3256)),n(r(7204)),n(r(3760)),n(r(4528)),n(r(3388)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1080),i=function(){function e(){}return e.isSpecial=function(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]},e.parseBoolean=function(e){var t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t},e.parseNumber=function(e){var t=Number(e);return isNaN(t)?this.specialValueIndicator:t},e.parseDate=function(e){var t=new Date(e);return Number.isNaN(t.getTime())?null:t},e.parseDateTime=function(e){var t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r},e.convertValueAsStringToValue=function(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case n.DataType.Bool:return this.parseBoolean(e);case n.DataType.Int:case n.DataType.Float:return this.parseNumber(e);case n.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case n.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case n.DataType.Spatial:case n.DataType.String:default:return e}}},e.convertValueToNativeValue=function(e,t){if(null==e)return null;switch(t){case n.DataType.Bool:case n.DataType.Int:case n.DataType.Float:return"string"==typeof e?null:e;case n.DataType.Date:return this.parseDate(e);case n.DataType.DateTime:return this.parseDateTime(e);case n.DataType.String:return this.isSpecial(e)?null:e;case n.DataType.Spatial:default:return e}},e.convertStringValueToNativeValue=function(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)},e.specialValueIndicator="%null%",e}();t.DataTypeConverter=i},1080:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,y,h,m,g,v,b,I,S,_,T,P,A,E,w,O,D,x,F,C,N,M;Object.defineProperty(t,"__esModule",{value:!0}),(M=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",M.Server="server",M.Unknown="unknown",(N=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",N.Viewing="viewing",N.Unknown="unknown",(C=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",C.Point="point",C.Area="area",(F=t.ColumnType||(t.ColumnType={})).Discrete="discrete",F.Continuous="continuous",F.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",(D=t.DataType||(t.DataType={})).String="string",D.Int="int",D.Float="float",D.Bool="bool",D.Date="date",D.DateTime="date-time",D.Spatial="spatial",D.Unknown="unknown",(O=t.DialogStyle||(t.DialogStyle={})).Window="window",O.Modal="modal",O.Modeless="modeless",(w=t.EncodedDataType||(t.EncodedDataType={})).Number="number",w.String="string",w.Date="date",w.Boolean="boolean",(E=t.ErrorCodes||(t.ErrorCodes={})).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",(A=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",A.Avg="avg",A.Min="min",A.Max="max",A.Stdev="stdev",A.Stdevp="stdevp",A.Var="var",A.Varp="varp",A.Collect="collect",A.Count="count",A.Countd="countd",A.Median="median",A.Attr="attr",A.None="none",A.Year="year",A.Qtr="qtr",A.Month="month",A.Day="day",A.Hour="hour",A.Minute="minute",A.Second="second",A.Week="week",A.Weekday="weekday",A.MonthYear="month-year",A.Mdy="mdy",A.End="end",A.TruncYear="trunc-year",A.TruncQtr="trunc-qtr",A.TruncMonth="trunc-month",A.TruncWeek="trunc-week",A.TruncDay="trunc-day",A.TruncHour="trunc-hour",A.TruncMinute="trunc-minute",A.TruncSecond="trunc-second",A.Quart1="quart1",A.Quart3="quart3",A.Skewness="skewness",A.Kurtosis="kurtosis",A.InOut="in-out",A.User="user",(P=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",P.Measure="measure",P.Unknown="unknown",(T=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",T.All="all",T.Replace="replace",T.Remove="remove",(_=t.SheetType||(t.SheetType={})).Dashboard="dashboard",_.Story="story",_.Worksheet="worksheet",(S=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",S.List="list",S.Range="range",(I=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",I.Quarters="quarters",I.Months="months",I.Weeks="weeks",I.Days="days",I.Hours="hours",I.Minutes="minutes",I.Seconds="seconds",(b=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",b.NonNullValues="nonnullvalues",b.AllValues="allvalues",(v=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",v.Database="database",(g=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",g.Add="select-add",g.Remove="select-remove",(m=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",m.Toggle="select-options-toggle",m.Menu="select-options-menu",m.Range="select-options-range",m.Search="select-options-search",(h=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",h.IncludeNonNull="include-non-null",h.IncludeAll="include-all",(y=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",y.NoneSelected="none-selected",y.SomeSelected="some-selected",y.UnknownSelected="unknown-selected",(f=t.MarkType||(t.MarkType={})).Bar="bar",f.Line="line",f.Area="area",f.Square="square",f.Circle="circle",f.Shape="shape",f.Text="text",f.Map="map",f.Pie="pie",f.GanttBar="gantt-bar",f.Polygon="polygon",f.Heatmap="heatmap",f.VizExtension="viz-extension",(d=t.FilterType||(t.FilterType={})).Categorical="categorical",d.Range="range",d.RelativeDate="relativeDate",d.Hierarchical="hierarchical",(p=t.DateRangeType||(t.DateRangeType={})).Last="last",p.LastN="lastN",p.Next="next",p.NextN="nextN",p.Current="current",p.ToDate="toDate",(c=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",c.InvalidDomain="invalid-domain",c.Success="success",(l=t.ApiShowDataTableSentinel||(t.ApiShowDataTableSentinel={})).SingleTableId="single-table-id-sentinel",l.SingleTableCaption="Single table id sentinel",(u=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",u.FormattedValuesOnly="formatted-values-only",u.NativeAndFormattedValues="native-and-formatted-values",(s=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",s.Legal="legal",s.Note="note",s.Folio="folio",s.Tabloid="tabloid",s.Ledger="ledger",s.Statement="statement",s.Executive="executive",s.A3="a3",s.A4="a4",s.A5="a5",s.B4="b4",s.B5="b5",s.Quarto="quarto",s.Unspecified="unspecified",(a=t.PageOrientation||(t.PageOrientation={})).Printer="printer",a.Portrait="portrait",a.Landscape="landscape",(o=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",o.ScalePercentage="percent",o.ScaleFitPages="fit-pages",(i=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",i.ScalePct400="pct400",i.ScalePct200="pct200",i.ScalePct100="pct100",i.ScalePct90="pct90",i.ScalePct80="pct80",i.ScalePct75="pct75",i.ScalePct60="pct60",i.ScalePct50="pct50",i.ScalePct25="pct25",(n=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",n.FitTwoHigh="fit0x2",n.FitOneWide="fit1x0",n.FitTwoWide="fit2x0",(r=t.EncodingType||(t.EncodingType={})).Color="color",r.Size="size",r.Label="label",r.Detail="detail",r.Tooltip="tooltip",r.Shape="shape",r.Path="path",r.Angle="angle",r.Geometry="geometry",r.Custom="custom"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.ParameterChanged="parameter-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.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.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",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.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.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.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.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.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.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.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.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",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.ClearFilter="clear-filter",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.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.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetTooltipText="get-tooltip-text",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.MoveAndResizeZones="move-and-resize-zones",r.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.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.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,n,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(n||(n={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(3448),o=r(1680),a=r(4020),s=r(7204),u=function(){function e(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}return e.prototype.startListening=function(){var e=this;if(!this.unregisterFunction){var t=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",t,!0),this.unregisterFunction=function(){return e.thisWindow.removeEventListener("message",t,!0)}}},e.prototype.stopListening=function(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)},e.prototype.setInitializeMessageHandler=function(e){this.initializeMessageHandler=e},e.prototype.setCommandResponseMessageHandler=function(e){this.commandResponseMessageHandler=e},e.prototype.setCommandMessageHandler=function(e){this.commandMessageHandler=e},e.prototype.setNotificationMessageHandler=function(e){this.notificationMessageHandler=e},e.prototype.setHandshakeMessageHandler=function(e){this.handshakeMessageHandler=e},e.prototype.prepareInitializationMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)},e.prototype.prepareCommandMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)},e.prototype.prepareCommandResponseMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)},e.prototype.prepareNotificationMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)},e.prototype.prepareAckMessage=function(){var e={msgGuid:n.raw(),msgType:s.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)},e.prototype.prepareMessage=function(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new o.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)},e.prototype.onMessageReceived=function(e){if((!this.otherWindow||e.source===this.otherWindow)&&e.data){var t=e.data;if(a.isMessage(t))switch(t.msgType){case s.MessageType.Initialize:if(!a.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case s.MessageType.CommandResponse:if(!a.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case s.MessageType.Command:if(!a.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case s.MessageType.Notification:if(!a.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case s.MessageType.Handshake:if(!a.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}},e.prototype.setOtherWindow=function(e){this.otherWindow=e},e.prototype.setOtherWindowOrigin=function(e){this.otherWindowOrigin=e},e}();t.CrossFrameMessenger=u},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r){this._message=e,this._target=t,this._origin=r}return Object.defineProperty(e.prototype,"messageGuid",{get:function(){return this._message.msgGuid},enumerable:!0,configurable:!0}),e.prototype.send=function(){return this._target.postMessage(this._message,this._origin),this},e}();t.CrossFramePreparedMessage=r},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(5824),o=r(7204),a=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function s(e){if(!e)return!1;var t=e;return!(!(t&&t.msgGuid&&t.msgType)||!n.isGuid(t.msgGuid)||"string"!=typeof t.msgType||[o.MessageType.Command,o.MessageType.CommandResponse,o.MessageType.Initialize,o.MessageType.Notification,o.MessageType.Handshake].indexOf(t.msgType)<0)}function u(e){if(!e)return!1;var t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=s,t.isVersion=u,t.isInitMessage=function(e){if(!s(e))return!1;var t=e;return!!(t.msgType===o.MessageType.Initialize&&t.apiVersion&&u(t.apiVersion)&&t.crossFrameVersion&&u(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.CommandResponse||!n.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Notification||!t.data&&!a.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!s(e)&&e.msgType===o.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},9220:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.upgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.downgradeExecuteReturn=function(e){return e},e.prototype.downgradeNotification=function(e){return e},e}();t.IdentityVersionConverter=r},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=n,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error("Cannot convert between external version "+this._externalMajorVersion+" and "+this._platformMajorVersion)}return e.fromData=function(e,t,r,n,i){return new this(e.major,t.major,r,n,i)},e.prototype.upgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._upgradeExecuteTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(9220),i=r(2320),o=r(720);function a(e,t){return e.major===t.major&&e.minor===t.minor}function s(e,t,r,o,s){var l=e.major,c=e.minor,p=t.major;if(l>p)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+p);if(a(e,t))return new n.IdentityVersionConverter;var d=u(l,p,c,r),f=u(l,p,c,o),y=u(l,p,c,s);return f.reverse(),y.reverse(),i.StackingVersionConverter.fromData(e,t,d,f,y)}function u(e,t,r,n){for(var i=[],o=e;o<=t;o++)if(o in n)for(var a=o===e?r:0,s=l(Object.keys(n[o])),u=a;u<=s;u++)u in n[o]&&i.push.apply(i,n[o][u]);return i}function l(e){return e.map((function(e){return Number(e)})).reduce((function(e,t){return e>t?e:t}))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5824);t.DowngradeWorksheetNames=function(e){var t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((function(e){e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===n.NotificationId.SelectedMarksChanged){var t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.downgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.upgradeExecuteReturn=function(e,t,r){return e},e.prototype.upgradeNotification=function(e){return e},e}();t.ExternalIdentityVersionConverter=r},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=n,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error("Cannot convert between external version "+this._externalVersion.major+"\n and "+this._platformVersion.major)}return e.prototype.downgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._downgradeExecuteCallTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3760),i=r(4528),o=r(5768),a=r(2088);function s(e,t,r,a,s){var l=e.major,c=t.major,p=t.minor;if(l>c)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+c);if(l{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);function i(e){void 0!==e&&void 0!==e.dataTable&&Array.isArray(e.dataTable)&&e.dataTable.forEach((function(t){t.forEach((function(t,r){var i=t.value;null!==i&&(t.value=n.DataTypeConverter.convertValueAsStringToValue(i,e.headers[r].dataType))}))}))}function o(e,t){if(t[n.ParameterId.LogicalTableId]!==n.ApiShowDataTableSentinel.SingleTableId)throw new Error("Invalid logical table id passed to "+e+".")}t.UpgradeDataTableTypes=function(e,t,r){if(!e)return e;var n=e.result;if(void 0!==n.data&&void 0!==n.isSummary)return i(n.data),e;var o=e.result;return void 0!==o.data&&Array.isArray(o.data)?(o.data.forEach((function(e){i(e)})),e):e},t.DowngradeUnderlyingTableDataAsync=function(e,t){return e===n.VerbId.GetUnderlyingTableData&&(o(e,t),e=n.VerbId.GetUnderlyingData),{verb:e,parameters:t}},t.DowngradeLogicalTableDataAsync=function(e,t){return e===n.VerbId.GetLogicalTableData&&(o(e,t),e=n.VerbId.GetDataSourceData),{verb:e,parameters:t}},t.UpgradeDataTableRowsAndColumns=function(e,t,r){return function(e){return e===n.VerbId.GetDataSummaryData}(t)&&r[n.ParameterId.MaxRows]&&(e=function(e,t){var r=e.result;return r.data&&Array.isArray(r.data.dataTable)?(t>0&&t{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,n(r(5184));var o=r(8540);t.CrossFrameDispatcher=o.CrossFrameDispatcher;var a=r(8340);t.DataSource=a.DataSource;var s=r(1044);t.ExternalToInternalEnumMappings=s.ExternalToInternalEnumMappings;var u=r(6557);t.InternalToExternalEnumMappings=u.InternalToExternalEnumMappings;var l=r(2680);t.EventListenerManager=l.EventListenerManager;var c=r(1072);t.Field=c.Field;var p=r(2520);t.CustomViewImpl=p.CustomViewImpl;var d=r(1940);t.DashboardImpl=d.DashboardImpl;var f=r(6488);t.DashboardObjectImpl=f.DashboardObjectImpl;var y=r(2180);t.DataSourceImpl=y.DataSourceImpl;var h=r(8552);t.ParameterImpl=h.ParameterImpl;var m=r(8332);t.SheetImpl=m.SheetImpl;var g=r(1116);t.SheetInfoImpl=g.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var b=r(6804);t.StoryImpl=b.StoryImpl;var I=r(2608);t.StoryPointImpl=I.StoryPointImpl;var S=r(6068);t.StoryPointInfoImpl=S.StoryPointInfoImpl;var _=r(3044);t.WorkbookImpl=_.WorkbookImpl;var T=r(6500);t.WorksheetImpl=T.WorksheetImpl;var P=r(3987);t.Point=P.Point,n(r(8672)),n(r(3008));var A=r(1832);t.ClientInfoServiceImpl=A.ClientInfoServiceImpl;var E=r(1288);t.NotificationServiceImpl=E.NotificationServiceImpl;var w=r(6428);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var O=r(1776);t.ServiceImplBase=O.ServiceImplBase;var D=r(4109);t.SizeServiceImpl=D.SizeServiceImpl;var x=r(2248);t.StoryActivationServiceImpl=x.StoryActivationServiceImpl;var F=r(6664);t.TableauError=F.TableauError;var C=r(1724);t.Deferred=C.Deferred;var N=r(7480);t.ErrorHelpers=N.ErrorHelpers;var M=r(5044);t.ExportHelpers=M.ExportHelpers;var k=r(2780);t.SheetUtils=k.SheetUtils;var R=r(1576);t.VersionNumber=R.VersionNumber;var V=r(8648);t.VersionedExternalApiDispatcher=V.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1576),i=function(){function e(){}return Object.defineProperty(e,"Instance",{get:function(){return e._instance},enumerable:!0,configurable:!0}),e.SetVersionNumber=function(t,r){e._instance=new n.VersionNumber(t,r)},e}();t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._connectionInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._connectionInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._connectionInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"serverURI",{get:function(){return this._connectionInfo.serverURI},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._connectionInfo.type},enumerable:!0,configurable:!0}),e}();t.ConnectionSummary=r},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise((function(o,a){var s;(s=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener)||a("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");var u=new n.CrossFrameMessenger(e,s,"*"),l=u.prepareInitializationMessage(t,n.MESSAGING_VERSION,r);u.setCommandResponseMessageHandler((function(e){e.commandGuid===l.messageGuid&&o((function(){return new i.CrossFrameDispatcher(u)}))})),u.startListening(),l.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}return e.prototype.execute=function(e,t){var r=this,n=this._messenger.prepareCommandMessage(e,t),i=new Promise((function(e,t){r._pendingPromises[n.messageGuid]={resolve:e,reject:t}}));return n.send(),i},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e.prototype.onCommandResponse=function(e){if(!(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)){var t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}},e.prototype.onNotification=function(e){for(var t=0,r=this._notificationHandlers;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dataSourceImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._dataSourceImpl.fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceImpl.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceImpl.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceImpl.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceImpl.publishedUrl()},e.prototype.refreshAsync=function(){return this._dataSourceImpl.refreshAsync()},e.prototype.getActiveTablesAsync=function(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()},e.prototype.getConnectionSummariesAsync=function(){return this._dataSourceImpl.getConnectionSummariesAsync()},e.prototype.getUnderlyingDataAsync=function(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)},e.prototype.getLogicalTablesAsync=function(){return this._dataSourceImpl.getLogicalTablesAsync()},e.prototype.getLogicalTableDataAsync=function(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)},e}();t.DataSource=r},1044:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d;Object.defineProperty(t,"__esModule",{value:!0});var f=r(7419),y=r(3448),h=r(5520),m=function(){function e(){}return e.filterDomainType=new h.EnumConverter(((n={})[f.FilterDomainType.Relevant]=y.FilterDomainType.Relevant,n[f.FilterDomainType.Database]=y.FilterDomainType.Database,n)),e.nullOptions=new h.EnumConverter(((i={})[f.FilterNullOption.AllValues]=y.FilterNullOption.AllValues,i[f.FilterNullOption.NonNullValues]=y.FilterNullOption.NonNullValues,i[f.FilterNullOption.NullValues]=y.FilterNullOption.NullValues,i)),e.filterUpdateType=new h.EnumConverter(((o={})[f.FilterUpdateType.Add]=y.FilterUpdateType.Add,o[f.FilterUpdateType.All]=y.FilterUpdateType.All,o[f.FilterUpdateType.Remove]=y.FilterUpdateType.Remove,o[f.FilterUpdateType.Replace]=y.FilterUpdateType.Replace,o)),e.setVisibilityType=new h.EnumConverter(((a={})[f.ZoneVisibilityType.Show]=!0,a[f.ZoneVisibilityType.Hide]=!1,a)),e.setReplaySpeedType=new h.EnumConverter(((s={})[f.ReplaySpeedType.Slow]=2,s[f.ReplaySpeedType.Normal]=1,s[f.ReplaySpeedType.Fast]=.5,s)),e.sheetType=new h.EnumConverter(((u={})[f.SheetType.Dashboard]=y.SheetType.Dashboard,u[f.SheetType.Worksheet]=y.SheetType.Worksheet,u[f.SheetType.Story]=y.SheetType.Story,u)),e.showDataTableFormatType=new h.EnumConverter(((l={})[f.IncludeDataValuesOption.AllValues]=y.ApiShowDataTableFormat.NativeAndFormattedValues,l[f.IncludeDataValuesOption.OnlyNativeValues]=y.ApiShowDataTableFormat.NativeValuesOnly,l[f.IncludeDataValuesOption.OnlyFormattedValues]=y.ApiShowDataTableFormat.FormattedValuesOnly,l)),e.periodType=new h.EnumConverter(((c={})[f.PeriodType.Years]=y.DateStepPeriod.Years,c[f.PeriodType.Quarters]=y.DateStepPeriod.Quarters,c[f.PeriodType.Months]=y.DateStepPeriod.Months,c[f.PeriodType.Weeks]=y.DateStepPeriod.Weeks,c[f.PeriodType.Days]=y.DateStepPeriod.Days,c[f.PeriodType.Hours]=y.DateStepPeriod.Hours,c[f.PeriodType.Minutes]=y.DateStepPeriod.Minutes,c[f.PeriodType.Seconds]=y.DateStepPeriod.Seconds,c)),e.dateRangeType=new h.EnumConverter(((p={})[f.DateRangeType.Last]=y.DateRangeType.Last,p[f.DateRangeType.LastN]=y.DateRangeType.LastN,p[f.DateRangeType.Next]=y.DateRangeType.Next,p[f.DateRangeType.NextN]=y.DateRangeType.NextN,p[f.DateRangeType.Current]=y.DateRangeType.Current,p[f.DateRangeType.ToDate]=y.DateRangeType.ToDate,p)),e.dialogStyles=new h.EnumConverter(((d={})[f.DialogStyle.Window]=y.DialogStyle.Window,d[f.DialogStyle.Modal]=y.DialogStyle.Modal,d[f.DialogStyle.Modeless]=y.DialogStyle.Modeless,d)),e}();t.ExternalToInternalEnumMappings=m},6557:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d,f,y,h,m,g,v,b,I;Object.defineProperty(t,"__esModule",{value:!0});var S=r(7419),_=r(3448),T=r(5520),P=function(){function e(){}return e.extensionContext=new T.EnumConverter(((n={})[_.ExtensionContext.Desktop]=S.ExtensionContext.Desktop,n[_.ExtensionContext.Server]=S.ExtensionContext.Server,n)),e.extensionMode=new T.EnumConverter(((i={})[_.ExtensionMode.Authoring]=S.ExtensionMode.Authoring,i[_.ExtensionMode.Viewing]=S.ExtensionMode.Viewing,i)),e.columnType=new T.EnumConverter(((o={})[_.ColumnType.Continuous]=S.ColumnType.Continuous,o[_.ColumnType.Discrete]=S.ColumnType.Discrete,o[_.ColumnType.Unknown]=S.ColumnType.Unknown,o)),e.fieldAggregationType=new T.EnumConverter(((a={})[_.FieldAggregationType.Attr]=S.FieldAggregationType.Attr,a[_.FieldAggregationType.Avg]=S.FieldAggregationType.Avg,a[_.FieldAggregationType.Collect]=S.FieldAggregationType.Collect,a[_.FieldAggregationType.Count]=S.FieldAggregationType.Count,a[_.FieldAggregationType.Countd]=S.FieldAggregationType.Countd,a[_.FieldAggregationType.Day]=S.FieldAggregationType.Day,a[_.FieldAggregationType.End]=S.FieldAggregationType.End,a[_.FieldAggregationType.Hour]=S.FieldAggregationType.Hour,a[_.FieldAggregationType.InOut]=S.FieldAggregationType.InOut,a[_.FieldAggregationType.Kurtosis]=S.FieldAggregationType.Kurtosis,a[_.FieldAggregationType.Max]=S.FieldAggregationType.Max,a[_.FieldAggregationType.Mdy]=S.FieldAggregationType.Mdy,a[_.FieldAggregationType.Median]=S.FieldAggregationType.Median,a[_.FieldAggregationType.Min]=S.FieldAggregationType.Min,a[_.FieldAggregationType.Minute]=S.FieldAggregationType.Minute,a[_.FieldAggregationType.MonthYear]=S.FieldAggregationType.MonthYear,a[_.FieldAggregationType.None]=S.FieldAggregationType.None,a[_.FieldAggregationType.Qtr]=S.FieldAggregationType.Qtr,a[_.FieldAggregationType.Quart1]=S.FieldAggregationType.Quart1,a[_.FieldAggregationType.Quart3]=S.FieldAggregationType.Quart3,a[_.FieldAggregationType.Second]=S.FieldAggregationType.Second,a[_.FieldAggregationType.Skewness]=S.FieldAggregationType.Skewness,a[_.FieldAggregationType.Stdev]=S.FieldAggregationType.Stdev,a[_.FieldAggregationType.Stdevp]=S.FieldAggregationType.Stdevp,a[_.FieldAggregationType.Sum]=S.FieldAggregationType.Sum,a[_.FieldAggregationType.TruncDay]=S.FieldAggregationType.TruncDay,a[_.FieldAggregationType.TruncHour]=S.FieldAggregationType.TruncHour,a[_.FieldAggregationType.TruncMinute]=S.FieldAggregationType.TruncMinute,a[_.FieldAggregationType.TruncMonth]=S.FieldAggregationType.TruncMonth,a[_.FieldAggregationType.TruncQtr]=S.FieldAggregationType.TruncQtr,a[_.FieldAggregationType.TruncSecond]=S.FieldAggregationType.TruncSecond,a[_.FieldAggregationType.TruncWeek]=S.FieldAggregationType.TruncWeek,a[_.FieldAggregationType.TruncYear]=S.FieldAggregationType.TruncYear,a[_.FieldAggregationType.User]=S.FieldAggregationType.User,a[_.FieldAggregationType.Var]=S.FieldAggregationType.Var,a[_.FieldAggregationType.Varp]=S.FieldAggregationType.Varp,a[_.FieldAggregationType.Week]=S.FieldAggregationType.Week,a[_.FieldAggregationType.Weekday]=S.FieldAggregationType.Weekday,a[_.FieldAggregationType.Year]=S.FieldAggregationType.Year,a)),e.fieldRoleType=new T.EnumConverter(((s={})[_.FieldRoleType.Dimension]=S.FieldRoleType.Dimension,s[_.FieldRoleType.Measure]=S.FieldRoleType.Measure,s[_.FieldRoleType.Unknown]=S.FieldRoleType.Unknown,s)),e.sheetType=new T.EnumConverter(((u={})[_.SheetType.Dashboard]=S.SheetType.Dashboard,u[_.SheetType.Story]=S.SheetType.Story,u[_.SheetType.Worksheet]=S.SheetType.Worksheet,u)),e.dashboardObjectType=new T.EnumConverter(((l={})[_.DashboardObjectType.Extension]=S.DashboardObjectType.Extension,l[_.DashboardObjectType.Blank]=S.DashboardObjectType.Blank,l[_.DashboardObjectType.Image]=S.DashboardObjectType.Image,l[_.DashboardObjectType.Legend]=S.DashboardObjectType.Legend,l[_.DashboardObjectType.PageFilter]=S.DashboardObjectType.PageFilter,l[_.DashboardObjectType.ParameterControl]=S.DashboardObjectType.ParameterControl,l[_.DashboardObjectType.QuickFilter]=S.DashboardObjectType.QuickFilter,l[_.DashboardObjectType.Text]=S.DashboardObjectType.Text,l[_.DashboardObjectType.Title]=S.DashboardObjectType.Title,l[_.DashboardObjectType.WebPage]=S.DashboardObjectType.WebPage,l[_.DashboardObjectType.Worksheet]=S.DashboardObjectType.Worksheet,l)),e.dataType=new T.EnumConverter(((c={})[_.DataType.Bool]=S.DataType.Bool,c[_.DataType.Date]=S.DataType.Date,c[_.DataType.DateTime]=S.DataType.DateTime,c[_.DataType.Float]=S.DataType.Float,c[_.DataType.Int]=S.DataType.Int,c[_.DataType.Spatial]=S.DataType.Spatial,c[_.DataType.String]=S.DataType.String,c)),e.filterUpdateType=new T.EnumConverter(((p={})[_.FilterUpdateType.Add]=S.FilterUpdateType.Add,p[_.FilterUpdateType.All]=S.FilterUpdateType.All,p[_.FilterUpdateType.Remove]=S.FilterUpdateType.Remove,p[_.FilterUpdateType.Replace]=S.FilterUpdateType.Replace,p)),e.allowableValues=new T.EnumConverter(((d={})[_.DomainRestrictionType.All]=S.ParameterValueType.All,d[_.DomainRestrictionType.List]=S.ParameterValueType.List,d[_.DomainRestrictionType.Range]=S.ParameterValueType.Range,d)),e.dateStepPeriod=new T.EnumConverter(((f={})[_.DateStepPeriod.Years]=S.PeriodType.Years,f[_.DateStepPeriod.Quarters]=S.PeriodType.Quarters,f[_.DateStepPeriod.Months]=S.PeriodType.Months,f[_.DateStepPeriod.Weeks]=S.PeriodType.Weeks,f[_.DateStepPeriod.Days]=S.PeriodType.Days,f[_.DateStepPeriod.Hours]=S.PeriodType.Hours,f[_.DateStepPeriod.Minutes]=S.PeriodType.Minutes,f[_.DateStepPeriod.Seconds]=S.PeriodType.Seconds,f)),e.dateRangeType=new T.EnumConverter(((y={})[_.DateRangeType.Current]=S.DateRangeType.Current,y[_.DateRangeType.Last]=S.DateRangeType.Last,y[_.DateRangeType.LastN]=S.DateRangeType.LastN,y[_.DateRangeType.Next]=S.DateRangeType.Next,y[_.DateRangeType.NextN]=S.DateRangeType.NextN,y[_.DateRangeType.ToDate]=S.DateRangeType.ToDate,y)),e.errorCode=new T.EnumConverter(((h={})[_.ErrorCodes.INITIALIZATION_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.INTERNAL_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.MISSING_ENUM_MAPPING]=S.ErrorCodes.InternalError,h[_.ErrorCodes.MISSING_PARAMETER]=S.ErrorCodes.InternalError,h[_.ErrorCodes.PERMISSION_DENIED]=S.ErrorCodes.InternalError,h[_.ErrorCodes.PRES_MODEL_PARSING_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.UNKNOWN_VERB_ID]=S.ErrorCodes.InternalError,h[_.ErrorCodes.VERSION_NOT_CONFIGURED]=S.ErrorCodes.APINotInitialized,h[_.ErrorCodes.VISIBILITY_ERROR]=S.ErrorCodes.VisibilityError,h),S.ErrorCodes.InternalError),e.filterType=new T.EnumConverter(((m={})[_.FilterType.Categorical]=S.FilterType.Categorical,m[_.FilterType.Range]=S.FilterType.Range,m[_.FilterType.RelativeDate]=S.FilterType.RelativeDate,m[_.FilterType.Hierarchical]=S.FilterType.Hierarchical,m)),e.classNameKey=new T.EnumConverter(((g={})["tableau-dashboard-title"]=S.ClassNameKey.DashboardTitle,g["tableau-story-title"]=S.ClassNameKey.StoryTitle,g["tableau-tooltip"]=S.ClassNameKey.Tooltip,g["tableau-worksheet"]=S.ClassNameKey.Worksheet,g["tableau-worksheet-title"]=S.ClassNameKey.WorksheetTitle,g["dashboard-title"]=S.ClassNameKey.DashboardTitle,g["story-title"]=S.ClassNameKey.StoryTitle,g.tooltip=S.ClassNameKey.Tooltip,g.worksheet=S.ClassNameKey.Worksheet,g["worksheet-title"]=S.ClassNameKey.WorksheetTitle,g)),e.hierarchicalLevelSelectionState=new T.EnumConverter(((v={})[_.HierarchicalLevelSelectionState.AllSelected]=S.HierarchicalLevelSelectionState.AllSelected,v[_.HierarchicalLevelSelectionState.NoneSelected]=S.HierarchicalLevelSelectionState.NoneSelected,v[_.HierarchicalLevelSelectionState.SomeSelected]=S.HierarchicalLevelSelectionState.SomeSelected,v[_.HierarchicalLevelSelectionState.UnknownSelected]=S.HierarchicalLevelSelectionState.UnknownSelected,v)),e.annotationType=new T.EnumConverter(((b={})[_.AnnotateEnum.Area]=S.AnnotationType.Area,b[_.AnnotateEnum.Mark]=S.AnnotationType.Mark,b[_.AnnotateEnum.Point]=S.AnnotationType.Point,b)),e.markType=new T.EnumConverter(((I={})[_.MarkType.Area]=S.MarkType.Area,I[_.MarkType.Bar]=S.MarkType.Bar,I[_.MarkType.Circle]=S.MarkType.Circle,I[_.MarkType.GanttBar]=S.MarkType.GanttBar,I[_.MarkType.Heatmap]=S.MarkType.Heatmap,I[_.MarkType.Line]=S.MarkType.Line,I[_.MarkType.Map]=S.MarkType.Map,I[_.MarkType.Pie]=S.MarkType.Pie,I[_.MarkType.Polygon]=S.MarkType.Polygon,I[_.MarkType.Shape]=S.MarkType.Shape,I[_.MarkType.Square]=S.MarkType.Square,I[_.MarkType.Text]=S.MarkType.Text,I[_.MarkType.VizExtension]=S.MarkType.VizExtension,I)),e}();t.InternalToExternalEnumMappings=P},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(){this._eventListenerManagers={}}return e.prototype.addEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot add event, unsupported event type: "+e);return this._eventListenerManagers[e].addEventListener(t)},e.prototype.removeEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot remove event, unsupported event type: "+e);return this._eventListenerManagers[e].removeEventListener(t)},e.prototype.addNewEventType=function(e){this._eventListenerManagers[e.eventType]=e},e}();t.EventListenerManager=o},1072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._fieldImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldImpl.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._fieldImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return this._fieldImpl.aggregation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){return this._fieldImpl.dataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return this._fieldImpl.role},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){return this._fieldImpl.columnType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldImpl.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldImpl.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldImpl.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGeospatial",{get:function(){return this._fieldImpl.isGeospatial},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldImpl.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldImpl.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.Field=r},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}return Object.defineProperty(e.prototype,"luid",{get:function(){return this._luid},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared},set:function(e){this._shared=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isDefault",{get:function(){return this._isDefault},set:function(e){this._isDefault=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ownerName",{get:function(){return this._ownerName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){return n.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)},e}();t.CustomViewImpl=i},1940:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(6557),l=r(3987),c=r(3008),p=r(6664),d=r(7480),f=r(6488),y=r(8332),h=r(1116),m=r(6500),g=function(e){function t(t,r,n,i,o,a){void 0===a&&(a=0);var s=e.call(this,t,i)||this;return s._zones=r,s._sheetPath=n,s._parentStoryPointImpl=o,s._activeDashboardObjectId=a,s}return i(t,e),Object.defineProperty(t.prototype,"worksheetsImpl",{get:function(){return this._worksheetsImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._objects},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._sheetPath.sheetName},enumerable:!0,configurable:!0}),t.prototype.initializeWithPublicInterfaces=function(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(var e=0,t=this._zones;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o,a,s,u,l){this._dashboardImpl=e,this._type=t,this._position=r,this._size=n,this._worksheetImpl=i,this._name=o,this._isFloating=a,this._isVisible=s,this._id=u,this._fieldId=l}return Object.defineProperty(e.prototype,"dashboardImpl",{get:function(){return this._dashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetImpl",{get:function(){return this._worksheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),e}();t.DashboardObjectImpl=r},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(716),o=r(1072),a=r(624),s=r(3008),u=r(7603),l=r(7480),c=r(5288),p=function(){function e(e,t){var r=this;this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((function(e){var t=new c.FieldImpl(e,r);return new o.Field(t)}))}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceInfo.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceInfo.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceInfo.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceInfo.publishedUrl},e.prototype.getMaxPageRowLimit=function(){return 1e4},e.prototype.refreshAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)},e.prototype.getConnectionSummariesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new i.ConnectionSummary(e)}))}))},e.prototype.getActiveTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new u.TableSummary(e)}))}))},e.prototype.getUnderlyingDataAsync=function(e){return e=e||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataAsync=function(e,t){return t=t||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return r=r||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.initializeWithPublicInterfaces=function(e){l.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((function(t){var r=new c.FieldImpl(t,e);return new o.Field(r)}))},e.prototype.getLogicalTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((function(e){return e.map((function(e){return new a.LogicalTable(e)}))}))},e}();t.DataSourceImpl=p},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6557),a=function(){function e(e,t){this._fieldInfo=e,this._parentDataSource=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldInfo.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){var e;return null!=(e=this._fieldInfo.dataType)?e:n.DataType.Unknown},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return o.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return o.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){var e=this._fieldInfo.columnType||i.ColumnType.Unknown;return o.InternalToExternalEnumMappings.columnType.convert(e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldInfo.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldInfo.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldInfo.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGeospatial",{get:function(){return this._fieldInfo.isGeospatial},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldInfo.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldInfo.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.FieldImpl=a},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6557),o=r(3008),a=r(8052),s=r(7480),u=r(1172),l=function(){function e(e,t){this._registryId=t,this.setParameterInfo(e)}return Object.defineProperty(e.prototype,"name",{get:function(){return this._parameterInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentValue",{get:function(){return a.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._globalFieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allowableValues",{get:function(){return this._allowableValues},enumerable:!0,configurable:!0}),e.prototype.changeValueAsync=function(e){var t=this;s.ErrorHelpers.verifyParameter(e,"newValue");var r=u.Param.serializeParameterValue(e);return o.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,r).then((function(e){return t.setParameterInfo(e),t.currentValue}))},e.prototype.setParameterInfo=function(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;var t,r,o,s,u,l=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);l===n.ParameterValueType.List?t=(e.allowableValues||[]).map((function(t){return a.DataValueFactory.MakeParameterDataValue(t,e.dataType)})):l===n.ParameterValueType.Range&&(r=e.minValue&&a.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&a.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),s=e.stepSize,u=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:l,allowableValues:t,minValue:r,maxValue:o,stepSize:s,dateStepPeriod:u}},e}();t.ParameterImpl=l},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3008),o=r(6664),a=r(7480),s=r(1172),u=r(2780),l=function(){function e(e,t){this._sheetInfoImpl=e,this._registryId=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._sheetInfoImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetInfoImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return this._sheetInfoImpl.sheetPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._sheetInfoImpl.sheetSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hidden",{get:function(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"active not implemented")},set:function(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"index not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"url not implemented")},enumerable:!0,configurable:!0}),e.prototype.getSheetSize=function(){if(!u.SheetUtils.isValidSheetSize(this.size))throw new o.TableauError(n.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size},e.prototype.findParameterAsync=function(e){return a.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)},e.prototype.getParametersAsync=function(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)},e.prototype.changeSizeAsync=function(e){var t=this,r=new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw r;var a=this.normalizeSheetSize(e),s=a.behavior===n.SheetSizeBehavior.Automatic;if(!s&&!a.minSize&&!a.maxSize)throw r;if(!s&&this.sheetType===n.SheetType.Worksheet)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===a.behavior)return Promise.resolve(e);var l=this.processNewSize(a);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,l).then((function(){return i.ApiServiceRegistry.get(t._registryId).getService("client-info-service").getClientInfoAsync().then((function(e){var r=e.publishedSheets.find((function(e){return e.name===t.name}));if(!r)throw new o.TableauError(n.SharedErrorCodes.InternalError,"Can't find sheet with name "+t.name);var i=u.SheetUtils.getSheetSizeFromSizeConstraints(r.sizeConstraint);return t._sheetInfoImpl.sheetSize=i,i}))}))},e.prototype.normalizeSheetSize=function(t){var r=t.behavior;return a.ErrorHelpers.verifyEnumValue(r,n.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:r,minSize:e.parseDimensions(t.minSize),maxSize:e.parseDimensions(t.maxSize)}},e.prototype.processNewSize=function(e){var t,r,i,a,u=e.behavior,l=e.minSize,c=e.maxSize,p=!s.Param.isNullOrUndefined(null===(t=l)||void 0===t?void 0:t.width),d=!s.Param.isNullOrUndefined(null===(r=l)||void 0===r?void 0:r.height),f=!s.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),y=!s.Param.isNullOrUndefined(null===(a=c)||void 0===a?void 0:a.height),h=p&&d,m=f&&y;switch(u){case n.SheetSizeBehavior.Automatic:return{behavior:u};case n.SheetSizeBehavior.AtMost:if(!c||!m)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");if((v={width:c.width,height:c.height}).width<0||v.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,maxSize:v};case n.SheetSizeBehavior.AtLeast:if(!l||!h)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");if((g={width:l.width,height:l.height}).width<0||g.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,minSize:g};case n.SheetSizeBehavior.Range:if(!(l&&c&&h&&m))throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");var g={width:l.width,height:l.height},v={width:c.width,height:c.height};if(g.width<0||g.height<0||v.width<0||v.height<0||g.width>v.width||g.height>v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:u,minSize:g,maxSize:v};case n.SheetSizeBehavior.Exactly:if(l&&c){if(h&&m){if(g={width:l.width,height:l.height},v={width:c.width,height:c.height},g.width!==v.width||g.height!==v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:u,minSize:g,maxSize:v}}if(h)return{behavior:u,minSize:g={width:l.width,height:l.height},maxSize:g};if(m)return{behavior:u,minSize:v={width:c.width,height:c.height},maxSize:v}}throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new o.TableauError(n.SharedErrorCodes.InternalError,"Unsupported sheet size behavior: "+u)}},e.parseDimensions=function(e){var t={width:void 0,height:void 0};if(!e)return t;var r=s.Param.tryParseNumber(e.width),n=r.success,i=r.parsed,o=s.Param.tryParseNumber(e.height),a=o.success,u=o.parsed;return n&&a?{width:i,height:u}:n?{width:i}:a?{height:u}:t},e}();t.SheetImpl=l},1116:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e,t,r,n,i,o,a){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=n,this._isActive=i,this._isHidden=o,this._url=a}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetSize",{get:function(){return this._sheetSize},set:function(e){this._sheetSize=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return{sheetName:this.name,isDashboard:this.sheetType===n.SheetType.Dashboard}},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isActive",{get:function(){return this._isActive},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{set:function(e){this._isActive=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e}();t.SheetInfoImpl=i},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._eventType=e,this._handlers=[]}return Object.defineProperty(e.prototype,"eventType",{get:function(){return this._eventType},enumerable:!0,configurable:!0}),e.prototype.addEventListener=function(e){var t=this;return this._handlers.push(e),function(){return t.removeEventListener(e)}},e.prototype.removeEventListener=function(e){var t=this._handlers.length;return this._handlers=this._handlers.filter((function(t){return t!==e})),t>this._handlers.length},e.prototype.triggerEvent=function(e){for(var t=0,r=this._handlers;t=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);var t=this._deferred.getNewPromiseOrThrowIfBusy();return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t},t.prototype.revertStoryPointAsync=function(e){var t=this;if(u.ErrorHelpers.verifyParameter(e,"index"),u.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((function(e){return t.updateStoryInfo(e.index,e),new d.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,t)}))},t.prototype.clearPendingPromises=function(){this._deferred&&this._deferred.reject("All pending promises cleared")},t}(c.SheetImpl);t.StoryImpl=f},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(2780),a=r(1940),s=r(1116),u=r(6500),l=function(){function e(e,t,r,n){this._storyPointInfoImpl=e,n&&(this._containedSheetImpl=this.createContainedSheet(n,t,r))}return Object.defineProperty(e.prototype,"index",{get:function(){return this._storyPointInfoImpl.index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._storyPointInfoImpl.caption},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._storyPointInfoImpl.active},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._storyPointInfoImpl.updated},set:function(e){this._storyPointInfoImpl.updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._storyPointInfoImpl.parentStory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containedSheet",{get:function(){return this._containedSheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointInfoImpl.storyPointId},enumerable:!0,configurable:!0}),e.prototype.createContainedSheet=function(e,t,r){var l,c=o.SheetUtils.getPublishedSheetInfoByName(e.name,t),p=o.SheetUtils.createAutomaticSize(),d=void 0===c,f=c?c.url:"",y=new s.SheetInfoImpl(e.name,o.SheetUtils.getSheetTypeEnum(e.sheetType),p,-1,!1,d,f);switch(y.sheetType){case n.SheetType.Worksheet:var h={worksheet:y.name};l=new u.WorksheetImpl(y,r,h,null,this);break;case n.SheetType.Dashboard:var m={sheetName:y.name,isDashboard:!0};l=new a.DashboardImpl(y,e.dashboardZones,m,r,this);break;default:throw new i.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return l},e}();t.StoryPointImpl=l},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._caption=e,this._index=t,this._storyPointId=r,this._active=n,this._updated=i,this._parentStoryImpl=o}return Object.defineProperty(e.prototype,"caption",{get:function(){return this._caption},set:function(e){this._caption=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},set:function(e){this._index=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._active},set:function(e){this._active=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._updated},set:function(e){this._updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._parentStoryImpl},enumerable:!0,configurable:!0}),e}();t.StoryPointInfoImpl=r},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WorkbookImpl=function(){}},6500:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(8340),u=r(624),l=r(3483),c=r(3008),p=r(6664),d=r(7480),f=r(2180),y=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r)||this;return a._visualId=n,a._parentDashboardImpl=i,a._parentStoryPointImpl=o,a}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){return this._parentDashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"visualId",{get:function(){return this._visualId},enumerable:!0,configurable:!0}),t.prototype.getMaxPageRowLimit=function(){return 1e4},t.prototype.applyFilterAsync=function(e,t,r,n){return d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?d.ErrorHelpers.verifyEnumValue(t.nullOption,a.FilterNullOption,"FilterNullOption"):d.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){if(d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"values"),d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new p.TableauError(a.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)},t.prototype.clearFilterAsync=function(e){return d.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return d.ErrorHelpers.verifyStringParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"options"),d.ErrorHelpers.verifyEnumValue(t.periodType,a.PeriodType,"PeriodType"),d.ErrorHelpers.verifyEnumValue(t.rangeType,a.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)},t.prototype.getDataSourcesAsync=function(){var e=this;return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((function(t){var r=t,n=r.worksheetDataSchemaMap[e.name],i=[],o=n.primaryDataSource;i.push(e.createDataSourceFromInfo(r.dataSources[o]));for(var a=0,s=n.referencedDataSourceList;a{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._logicalTable=e}return Object.defineProperty(e.prototype,"id",{get:function(){return this._logicalTable.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._logicalTable.caption},enumerable:!0,configurable:!0}),e}();t.LogicalTable=r},5064:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.TooltipTextRequestModel=function(e,t){this.visualIdPresModel=e,this.tupleId=t}},6296:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3008),s=r(7480),u=function(){function e(e,t,r,n,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=n,this._registryId=i}return Object.defineProperty(e.prototype,"worksheetName",{get:function(){return this._worksheetName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"filterType",{get:function(){return this._filterType},enumerable:!0,configurable:!0}),e.prototype.getFieldAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)},e.prototype.getAppliedWorksheetsAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)},e.prototype.setAppliedWorksheetsAsync=function(e){s.ErrorHelpers.verifyParameter(e,"applyToWorksheets");var t=new Set(e);return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))},e}();t.Filter=u;var l=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._appliedValues=a,l._isExcludeMode=s,l._isAllSelected=u,l}return i(t,e),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isExcludeMode",{get:function(){return this._isExcludeMode},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.CategoricalFilter=l;var c=function(){function e(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hierarchicalPath",{get:function(){return this._hierarchicalPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"level",{get:function(){return this._level},enumerable:!0,configurable:!0}),e}();t.HierarchicalDataValue=c;var p=function(){function e(e,t){this._name=e,this._levelSelectionState=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"levelSelectionState",{get:function(){return this._levelSelectionState},enumerable:!0,configurable:!0}),e}();t.HierarchicalLevelDetail=p;var d=function(e){function t(t,r,n,i,o,a,s,u,l,c,p){var d=e.call(this,t,r,i,n,o)||this;return d._dimensionName=a,d._hierarchyCaption=s,d._numberOfLevels=u,d._levelDetails=l,d._appliedValues=c,d._isAllSelected=p,d}return i(t,e),t.prototype.getDomainAsync=function(e){throw new Error("Method not implemented.")},Object.defineProperty(t.prototype,"dimensionName",{get:function(){return this._dimensionName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hierarchyCaption",{get:function(){return this._hierarchyCaption},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"numberOfLevels",{get:function(){return this._numberOfLevels},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"levelDetails",{get:function(){return this._levelDetails},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),t}(u);t.HierarchicalFilter=d;var f=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._min=a,l._max=s,l._includeNullValues=u,l}return i(t,e),Object.defineProperty(t.prototype,"minValue",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"maxValue",{get:function(){return this._max},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"includeNullValues",{get:function(){return this._includeNullValues},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){var t=a.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.RangeFilter=f;var y=function(e){function t(t,r,n,i,o,a,s,u,l){var c=e.call(this,t,r,i,n,o)||this;return c._anchorDate=a,c._periodType=s,c._rangeType=u,c._rangeN=l,c}return i(t,e),Object.defineProperty(t.prototype,"anchorDate",{get:function(){return this._anchorDate},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"periodType",{get:function(){return this._periodType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeType",{get:function(){return this._rangeType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeN",{get:function(){return this._rangeN},enumerable:!0,configurable:!0}),t}(u);t.RelativeDateFilter=y;var h=function(){function e(e,t){this._values=e,this._domainType=t}return Object.defineProperty(e.prototype,"values",{get:function(){return this._values},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),e}();t.CategoricalDomain=h;var m=function(){function e(e,t,r){this._min=e,this._max=t,this._domainType=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"min",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"max",{get:function(){return this._max},enumerable:!0,configurable:!0}),e}();t.RangeDomain=m},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=n,this._isSummaryData=i,this._marksInfo=o,this._name=i?"Summary Data Table":"Underlying Data Table"}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columns",{get:function(){return this._columns},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"marksInfo",{get:function(){return this._marksInfo},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"totalRowCount",{get:function(){return this._totalRowCount},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isTotalRowCountLimited",{get:function(){return this._isTotalRowCountLimited},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isSummaryData",{get:function(){return this._isSummaryData},enumerable:!0,configurable:!0}),e}();t.DataTable=r;var n=function(){function e(e,t,r){this._type=e,this._color=t,this._tupleId=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"color",{get:function(){return this._color},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tupleId",{get:function(){return this._tupleId},enumerable:!0,configurable:!0}),e}();t.MarkInfo=n;var i=function(){function e(e,t,r,n,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=n,this._index=i}return Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isReferenced",{get:function(){return this._isReferenced},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),e}();t.Column=i;var o=function(){function e(e,t,r){this._value=e,this._nativeValue=t,this._formattedValue=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeValue",{get:function(){return this._nativeValue},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this._formattedValue},enumerable:!0,configurable:!0}),e}();t.DataValue=o},7968:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},i=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._x=e,this._y=t}return Object.defineProperty(e.prototype,"x",{get:function(){return this._x},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"y",{get:function(){return this._y},enumerable:!0,configurable:!0}),e}();t.Point=r},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3008),i=r(3964),o=r(8028),a=r(1384),s=r(9196),u=r(4924),l=r(3851),c=r(8864),p=r(7712),d=r(1288),f=r(7260),y=r(8784),h=r(4109),m=r(6096),g=r(744),v=r(8856);t.registerAllSharedServices=function(e,t,r){n.ApiServiceRegistry.get(t).registerService(new o.AnimationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new s.DataSourceServiceImpl(e,t,r)),n.ApiServiceRegistry.get(t).registerService(new u.ExportServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new p.GetDataServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new c.FilterServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new d.NotificationServiceImpl(e)),n.ApiServiceRegistry.get(t).registerService(new f.ParametersServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new y.SelectionServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new a.AnnotationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new v.ZoneServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new h.SizeServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new m.VisualModelServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new g.VizServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new l.ExternalContextMenuServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664);window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{};var o=function(){function e(){this._services={}}return e.prototype.registerService=function(e){this._services[e.serviceName]=e},e.prototype.getService=function(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.InternalError,"Service not registered: "+e);return this._services[e]},e}(),a=function(){function e(){}return e.get=function(t){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[t]||e.setInstance(t,new o),!window.__tableauApiServiceRegistry[t])throw new i.TableauError(n.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[t]},e.setInstance=function(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t},e.clearRegistry=function(){window.__tableauApiServiceRegistry={}},e}();t.ApiServiceRegistry=a},3964:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(5064),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"accessibility"},enumerable:!0,configurable:!0}),t.prototype.getTooltipTextAsync=function(e,t){var r,n=new a.TooltipTextRequestModel(e,t),i=((r={})[o.ParameterId.FunctionName]="getTooltipTextAsync",r[o.ParameterId.TooltipTextRequest]=n,r);return this.execute(o.VerbId.GetTooltipText,i).then((function(e){return e.result}))},t.prototype.leaveMarkNavigationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="leaveMarkNavigationAsync",t[o.ParameterId.VisualId]=e,t);return this.execute(o.VerbId.RaiseLeaveMarkNavNotification,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AccessibilityServiceImpl=s},8028:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"animation-service"},enumerable:!0,configurable:!0}),t.prototype.replayAsync=function(e){var t,r=((t={})[a.ParameterId.ReplaySpeed]=1,t);return u.ErrorHelpers.verifyEnumValue(e,o.ReplaySpeedType,"ReplaySpeedType"),r[a.ParameterId.ReplaySpeed]=s.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(a.VerbId.ReplayAnimation,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AnimationServiceImpl=l},1384:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6557),u=r(7104),l=r(6664),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"annotation-service"},enumerable:!0,configurable:!0}),t.prototype.annotateMarkAsync=function(e,t,r){var n,i=this.parseMarkSelectionIds([t]),o=""+r+"",s=((n={})[a.ParameterId.FunctionName]="annotateMarkAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.AnnotateEnum]=a.AnnotateEnum.Mark,n[a.ParameterId.TargetPoint]={x:0,y:0},n[a.ParameterId.SelectionList]=[i.selection],n[a.ParameterId.FormattedText]=o,n);return this.execute(a.VerbId.CreateAnnotation,s).then((function(e){}))},t.prototype.getAnnotationsAsync=function(e){var t,r=this,n=((t={})[a.ParameterId.FunctionName]="getAnnotationsAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.GetAnnotations,n).then((function(e){var t=e.result;return r.annotationFilterMap(t)}))},t.prototype.removeAnnotationAsync=function(e,t){var r,n=this.parseAnnotationSelectionIds([t]),i=((r={})[a.ParameterId.FunctionName]="removeAnnotationAsync",r[a.ParameterId.VisualId]=e,r[a.ParameterId.SelectionList]=[n.selection],r);return this.execute(a.VerbId.RemoveAnnotation,i).then((function(e){}))},t.prototype.parseMarkSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.tupleId;if(!(null!=r&&r>0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="tuples",n.objectIds=t,r.selection=n}return r},t.prototype.parseAnnotationSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.annotationId;if(!(null!=r&&r>=0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="annotations",n.objectIds=t,r.selection=n}return r},t.prototype.mapAnnotation=function(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:s.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}},t.prototype.annotationFilterMap=function(e){var t=this;return e.map((function(e){return t.mapAnnotation(e)}))},t}(r(1776).ServiceImplBase);t.AnnotationServiceImpl=c},1832:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"client-info-service"},enumerable:!0,configurable:!0}),t.prototype.getClientInfoAsync=function(){var e,t=o.VerbId.GetEmbeddingClientInfo,r=((e={})[o.ParameterId.FunctionName]="getClientInfoAsync",e);return this.execute(t,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.ClientInfoServiceImpl=a},9196:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(3448),u=r(8340),l=r(1072),c=r(2180),p=r(5288),d=r(6664),f=r(1776);t.SENTINEL_LOGICAL_TABLE_INFO={id:a.ApiShowDataTableSentinel.SingleTableId,caption:a.ApiShowDataTableSentinel.SingleTableCaption};var y={major:1,minor:20,fix:1},h=function(e){function r(t,r,n){void 0===n&&(n=y);var i=e.call(this,t,r)||this;return i._platformVersion=n,i}return i(r,e),Object.defineProperty(r.prototype,"serviceName",{get:function(){return"data-source-service"},enumerable:!0,configurable:!0}),r.prototype.refreshAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="refreshAsync",t[s.ParameterId.DeltaTimeMs]=0,t[s.ParameterId.ShouldRefreshDS]=!0,t);return e&&(r[s.ParameterId.DataSourceId]=e),this.execute(s.VerbId.RefreshDataSource,r).then((function(e){}))},r.prototype.getActiveTablesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getActiveTablesAsync",t[s.ParameterId.DataSourceId]=e,t);return this.execute(s.VerbId.GetActiveTables,r).then((function(t){var r=t.result;if(0===r.tables.length)throw new d.TableauError(o.ErrorCodes.UnsupportedMethodForDataSourceType,"getActiveTables is not supported for: "+e);return r.tables}))},r.prototype.getDataSourcesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getDataSourcesAsync",t[s.ParameterId.VisualId]=e,t);return this.execute(s.VerbId.GetDataSources,r).then((function(e){return e.result}))},r.prototype.getAllDataSourcesAsync=function(){var e,t=((e={})[s.ParameterId.FunctionName]="getAllDataSourcesAsync",e);return this.execute(s.VerbId.GetAllDataSources,t).then((function(e){return e.result}))},r.prototype.getConnectionSummariesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getConnectionSummariesAsync",t[s.ParameterId.DataSourceId]=e,t);return this.execute(s.VerbId.GetConnectionDescriptionSummaries,r).then((function(e){return e.result}))},r.prototype.getFieldAsync=function(e){var t,r=this,n=s.VerbId.GetFieldAndDataSource,i=((t={})[s.ParameterId.FunctionName]="getFieldAsync",t[s.ParameterId.FieldId]=e,t);return this.execute(n,i).then((function(e){var t=e.result[s.ParameterId.DataSource],n=e.result[s.ParameterId.Field];return r.convertField(n,r.convertDataSource(t))}))},r.prototype.getLogicalTablesAsync=function(e){var r;if(!this.isObjectModelSupportedByPlatform())return new Promise((function(e){return e([t.SENTINEL_LOGICAL_TABLE_INFO])}));var n=((r={})[s.ParameterId.FunctionName]="getLogicalTablesAsync",r[s.ParameterId.DataSourceId]=e,r);return this.execute(s.VerbId.GetLogicalTables,n).then((function(e){return e.result}))},r.prototype.getUnderlyingTablesAsync=function(e){var r;if(!this.isObjectModelSupportedByPlatform())return new Promise((function(e){return e([t.SENTINEL_LOGICAL_TABLE_INFO])}));var n=((r={})[s.ParameterId.FunctionName]="getUnderlyingTablesAsync",r[s.ParameterId.VisualId]=e,r);return this.execute(s.VerbId.GetUnderlyingTables,n).then((function(e){return e.result}))},r.prototype.convertField=function(e,t){return new l.Field(new p.FieldImpl(e,t))},r.prototype.convertDataSource=function(e){return new u.DataSource(new c.DataSourceImpl(e,this._registryId))},r.prototype.isObjectModelSupportedByPlatform=function(){return a.VersionLessThan({major:1,minor:13,fix:0},this._platformVersion)},r}(f.ServiceImplBase);t.DataSourceServiceImpl=h},4924:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},a=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?s[l.ParameterId.FilterLevels]=u:r.length>0?s[l.ParameterId.FilterValues]=r:s[l.ParameterId.FilterLevels]=[],s[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(n),s[l.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(a,s).then((function(e){return t}))},t.prototype.clearFilterAsync=function(e,t){var r,n=l.VerbId.ClearFilter,i=((r={})[l.ParameterId.FunctionName]="clearFilterAsync",r);return i[l.ParameterId.VisualId]=e,i[l.ParameterId.FieldName]=t,this.execute(n,i).then((function(e){return t}))},t.prototype.applyRelativeDateFilterAsync=function(e,t,r){var n,i=l.VerbId.ApplyRelativeDateFilter,o=((n={})[l.ParameterId.FunctionName]="applyRelativeDateFilterAsync",n);if(o[l.ParameterId.VisualId]=e,o[l.ParameterId.FieldName]=t,o[l.ParameterId.PeriodType]=p.ExternalToInternalEnumMappings.periodType.convert(r.periodType),o[l.ParameterId.DateRangeType]=p.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===s.DateRangeType.LastN||r.rangeType===s.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new c.TableauError(s.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");o[l.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(o[l.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(i,o).then((function(e){return e.result}))},t.prototype.getFiltersAsync=function(e){var t,r=this,n=l.VerbId.GetFilters,i=((t={})[l.ParameterId.FunctionName]="getFiltersAsync",t);return i[l.ParameterId.VisualId]=e,this.execute(n,i).then((function(e){var t=e.result;return r.convertDomainFilters(t)}))},t.prototype.getCategoricalDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetCategoricalDomain,a=((n={})[l.ParameterId.FunctionName]="getCategoricalDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertCategoricalDomain(t,r)}))},t.prototype.getRangeDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetRangeDomain,a=((n={})[l.ParameterId.FunctionName]="getRangeDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertRangeDomain(t,r)}))},t.prototype.getDashboardFiltersAsync=function(){var e,t=this,r=l.VerbId.GetDashboardFilters,n=((e={})[l.ParameterId.FunctionName]="getDashboardFiltersAsync",e);return this.execute(r,n).then((function(e){var r=e.result;return t.convertDomainFilters(r)}))},t.prototype.applyDashboardFilterAsync=function(e,t,r,n){var i,o=l.VerbId.DashboardCategoricalFilter,a=((i={})[l.ParameterId.FunctionName]="applyDashboardFilterAsync",i);return a[l.ParameterId.FieldName]=e,a[l.ParameterId.FilterValues]=t,a[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(r),a[l.ParameterId.IsExcludeMode]=n&&!!n.isExcludeMode,this.execute(o,a).then((function(e){return e.result}))},t.prototype.getAppliedWorksheetsAsync=function(e,t){var r;return o(this,void 0,void 0,(function(){var n,i;return a(this,(function(o){switch(o.label){case 0:return[4,this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync")];case 1:return n=o.sent(),i=[],null===(r=n.worksheets)||void 0===r||r.map((function(e){e.isSelected&&i.push(e.worksheetName)})),[2,i]}}))}))},t.prototype.setAppliedWorksheetsAsync=function(e,t,r,n){return o(this,void 0,void 0,(function(){var i,o,u,p,d;return a(this,(function(a){switch(a.label){case 0:return[4,this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal")];case 1:if(!(i=a.sent())||!i.worksheets)throw new c.TableauError(s.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");if(o=[],u="",i.worksheets.forEach((function(e){e.isActive&&(u=e.worksheetName),(e.isSelected||e.isEnabled)&&o.push(e.worksheetName)})),""===u)throw new c.TableauError(s.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(u))throw new c.TableauError(s.SharedErrorCodes.InternalError,u+" must be included in the applied worksheets");return n.forEach((function(e){if(!o.includes(e))throw new c.TableauError(s.SharedErrorCodes.InternalError,"The field "+t+" isn't applicable to the worksheet "+e)})),p=l.VerbId.ChangeSharedFilter,(d={})[l.ParameterId.FunctionName]="setAppliedWorksheetsAsync",d[l.ParameterId.VisualId]={worksheet:e},d[l.ParameterId.FieldId]=r,d[l.ParameterId.SharedFilterSheets]=n,[2,this.execute(p,d).then((function(e){return n}))]}}))}))},t.prototype.executeGetAppliedWorksheets=function(e,t,r){var n=l.VerbId.GetSharedFilter,i={};return i[l.ParameterId.FunctionName]=r,i[l.ParameterId.VisualId]={worksheet:e},i[l.ParameterId.FieldId]=t,this.execute(n,i).then((function(e){return e.result}))},t.prototype.convertDomainFilters=function(e){var t=this,r=[];return e.forEach((function(e){switch(e.filterType){case l.FilterType.Categorical:if(!(n=e))throw new Error("Invalid Categorical Filter");r.push(t.convertCategoricalFilter(n));break;case l.FilterType.Hierarchical:if(!(n=e))throw new Error("Invalid Hierarchical Filter");r.push(t.convertHierarchicalFilter(n));break;case l.FilterType.Range:if(!(n=e))throw new Error("Invalid Range Filter");r.push(t.convertRangeFilter(n));break;case l.FilterType.RelativeDate:var n;if(!(n=e))throw new Error("Invalid Relative Date Filter");r.push(t.convertRelativeDateFilter(n))}})),r},t.prototype.convertCategoricalFilter=function(e){var t=e.values.map((function(e){return y.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)},t.prototype.convertHierarchicalFilter=function(e){var t=e.values.map((function(e){return new f.HierarchicalDataValue(y.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level)})),r=e.levelInfo.map((function(e){return new f.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))}));return new f.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)},t.prototype.convertRangeFilter=function(e){var t=y.DataValueFactory.MakeFilterDataValue(e.min),r=y.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Range,this._registryId,t,r,e.includeNullValues)},t.prototype.convertRelativeDateFilter=function(e){var t=y.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new f.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)},t.prototype.convertCategoricalDomain=function(e,t){var r=e.values.map((function(e){return y.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalDomain(r,t)},t.prototype.convertRangeDomain=function(e,t){var r=y.DataValueFactory.MakeFilterDataValue(e.min),n=y.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeDomain(r,n,t)},t.prototype.convertAnchorDate=function(e){var t=e.getUTCFullYear(),r=e.getUTCMonth()+1,n=e.getUTCDate(),i=e.getUTCHours(),o=e.getUTCMinutes(),a=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(n)||isNaN(i)||isNaN(o)||isNaN(a))throw new c.TableauError(s.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return t+"-"+r+"-"+n+" "+i+":"+o+":"+a},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[u.ParameterId.ParameterError]){if(e[u.ParameterId.InvalidFieldCaption])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldName,e[u.ParameterId.InvalidFieldCaption]);if(e[u.ParameterId.InvalidValues])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldValue,e[u.ParameterId.InvalidValues]);if(e[u.ParameterId.InvalidAggFieldName])throw new c.TableauError(s.SharedErrorCodes.InvalidAggregationFieldName,e[u.ParameterId.InvalidAggFieldName]);throw new c.TableauError(s.SharedErrorCodes.ServerError,"Server Error")}},t}(r(1776).ServiceImplBase);t.FilterServiceImpl=m},7712:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6680),u=r(5136),l=r(1044),c=r(5068),p=r(7968),d=r(8052),f=r(3483),y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.viewDataTableCacheId=s.v4(),t}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"get-data-service"},enumerable:!0,configurable:!0}),t.prototype.getMaxRowLimit=function(){return 1e4},t.prototype.getViewDataTableCacheId=function(){return this.viewDataTableCacheId},t.prototype.getLimitedMaxRows=function(e,t){return e>0&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._filterFn=e,this._callbackFn=t}return e.prototype.onNotification=function(e){this._filterFn(e)&&this._callbackFn(e)},e}();t.Registration=r;var n=function(){function e(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}return e.prototype.registerHandler=function(e,t,n){var i=this,o=this._handlers[e]||new Array,a=new r(t,n);return o.push(a),this._handlers[e]=o,function(){return i.removeRegistration(e,a)}},e.prototype.hasHandlersForNotificationType=function(e){return this._handlers.hasOwnProperty(e)},e.prototype.onNotification=function(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((function(t){return t.onNotification(e.data)}))},e.prototype.removeRegistration=function(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((function(e){return e!==t})))},e}();t.NotificationServiceImplBase=n},7260:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(8552),u=r(6664),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"parameters-service"},enumerable:!0,configurable:!0}),t.prototype.getParametersForSheetAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",t[a.ParameterId.SheetPath]=e,t);return this.getParametersAsync(r)},t.prototype.getAllParametersAsync=function(){var e,t=((e={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",e);return this.getParametersAsync(t)},t.prototype.getParametersAsync=function(e){var t=this;return this.execute(a.VerbId.GetParametersForSheet,e).then((function(e){return e.result.map((function(e){return new s.ParameterImpl(e,t._registryId)}))}))},t.prototype.changeParameterValueAsync=function(e,t){var r,n=((r={})[a.ParameterId.FunctionName]="changeParameterValueAsync",r[a.ParameterId.ParameterFieldName]=e,r[a.ParameterId.ParameterValue]=t,r);return this.execute(a.VerbId.ChangeParameterValue,n).then((function(e){return e.result}))},t.prototype.findParameterByNameAsync=function(e){return this.findParameterAsync(e,void 0)},t.prototype.findParameterByGlobalFieldNameAsync=function(e){return this.findParameterAsync(void 0,e)},t.prototype.findParameterAsync=function(e,t){var r,n=this,i=((r={})[a.ParameterId.FunctionName]="findParameterAsync",r);if(void 0!==e)i[a.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");i[a.ParameterId.ParameterFieldName]=t}return this.execute(a.VerbId.FindParameter,i).then((function(e){if("fieldName"in e.result){var t=e.result;return new s.ParameterImpl(t,n._registryId)}}))},t}(r(1776).ServiceImplBase);t.ParametersServiceImpl=l},8784:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(7104),u=r(6664),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"selection-service"},enumerable:!0,configurable:!0}),t.prototype.clearSelectedMarksAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="clearSelectedMarksAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.ClearSelectedMarks,r).then((function(e){}))},t.prototype.selectMarksByValueAsync=function(e,t,r){var n,i=this;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");var s=this.validateSelectionUpdateType(r),l=this.parseSelectionMarks(t),c=((n={})[a.ParameterId.FunctionName]="selectMarksByValueAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=s,n);return l.hierModelArr&&l.hierModelArr.length&&(c[a.ParameterId.HierValSelectionModels]=l.hierModelArr),l.quantModelArr&&l.quantModelArr.length&&(c[a.ParameterId.QuantRangeSelectionModels]=l.quantModelArr),l.dimModelArr&&l.dimModelArr.length&&(c[a.ParameterId.DimValSelectionModels]=l.dimModelArr),this.execute(a.VerbId.SelectByValue,c).then((function(e){i.apiFilterHandlerCheckForCommandError(e.result)}))},t.prototype.hoverTupleAsync=function(e,t,r,n){var i,o=new s.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,n),u=((i={})[a.ParameterId.FunctionName]="hoverTupleAsync",i[a.ParameterId.HoverTupleInteraction]=o,i);return this.execute(a.VerbId.RaiseHoverTupleNotification,u).then((function(e){}))},t.prototype.selectTuplesAsync=function(e,t,r,n){var i,o=new s.SelectTuplesInteractionModel(e,t,r,n),u=((i={})[a.ParameterId.FunctionName]="selectTuplesAsync",i[a.ParameterId.SelectTuplesInteraction]=o,i);return this.execute(a.VerbId.RaiseSelectTuplesNotification,u).then((function(e){}))},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[a.ParameterId.ParameterError]){if(e[a.ParameterId.InvalidFields])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionFieldName,e[a.ParameterId.InvalidFields]);if(e[a.ParameterId.InvalidValues])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionValue,e[a.ParameterId.InvalidValues]);if(e[a.ParameterId.InvalidDates])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionDate,e[a.ParameterId.InvalidDates])}},t.prototype.selectMarksByIdAsync=function(e,t,r){var n;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");var i=this.validateSelectionUpdateType(r),s=this.parseSelectionIds(t),l=((n={})[a.ParameterId.FunctionName]="selectMarksByIdAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=i,n[a.ParameterId.Selection]=s.selection,n);return this.execute(a.VerbId.SelectByValue,l).then((function(e){}))},t.prototype.parseSelectionIds=function(e){for(var t=[],r=new s.SelectionModelsContainer,n=0;n0?e:0},t}(r(1776).ServiceImplBase);t.SelectionServiceImpl=c},1776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(6557),i=r(6664),o=r(5520),a=function(){function e(e,t){this._dispatcher=e,this._registryId=t}return e.prototype.execute=function(e,t){return this._dispatcher.execute(e,t).catch((function(e){var t=e,r=n.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,o.ShouldThrow.No);throw new i.TableauError(r,t.message)}))},e}();t.ServiceImplBase=a},4109:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"size-service"},enumerable:!0,configurable:!0}),t.prototype.changeSizeAsync=function(e,t){var r,n,i,a,s,u=((r={})[o.ParameterId.FunctionName]="changeSizeAsync",r[o.ParameterId.SheetName]=e,r[o.ParameterId.MinHeight]=(null===(n=t.minSize)||void 0===n?void 0:n.height)||0,r[o.ParameterId.MinWidth]=(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,r[o.ParameterId.MaxHeight]=(null===(a=t.maxSize)||void 0===a?void 0:a.height)||0,r[o.ParameterId.MaxWidth]=(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0,r);return this.execute(o.VerbId.SetSheetSize,u).then((function(e){}))},t}(r(1776).ServiceImplBase);t.SizeServiceImpl=a},2248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"story-activation-service"},enumerable:!0,configurable:!0}),t.prototype.activateNextStoryPointAsync=function(){var e,t=o.VerbId.ActivateNextStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activateNextStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activatePreviousStoryPointAsync=function(){var e,t=o.VerbId.ActivatePreviousStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activatePreviousStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activateStoryPointAsync=function(e){var t,r=o.VerbId.ActivateStoryPoint,n=((t={})[o.ParameterId.FunctionName]="activateStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){}))},t.prototype.revertStoryPointAsync=function(e){var t,r=o.VerbId.RevertStoryPoint,n=((t={})[o.ParameterId.FunctionName]="revertStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.StoryActivationServiceImpl=a},6096:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"visual-model-service"},enumerable:!0,configurable:!0}),t.prototype.getVisualSpecificationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="getVisualSpecificationAsync",t[o.ParameterId.WorksheetName]=e.worksheet,t);return this.execute(o.VerbId.GetVisualSpecification,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VisualModelServiceImpl=a},744:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(2520),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"viz-service"},enumerable:!0,configurable:!0}),t.prototype.createVizImageAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="createVizImageAsync",t[o.ParameterId.VizAPIInputJson]=JSON.stringify(e),t);return this.execute(o.VerbId.VizAPI,r).then((function(e){return e.result}))},t.prototype.activateSheetAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="activateSheetAsync",t[o.ParameterId.SwitchToSheetName]=e,t);return this.execute(o.VerbId.ActivateSheet,r).then((function(){}))},t.prototype.getCustomViewsAsync=function(){var e,t=this,r=((e={})[o.ParameterId.FunctionName]="getCustomViewsAsync",e);return this.execute(o.VerbId.GetCustomViews,r).then((function(e){return e.result.map((function(e){return new a.CustomViewImpl(e,t._registryId)}))}))},t.prototype.showCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="showCustomViewAsync",t[o.ParameterId.CustomViewName]=e||"",t);return this.execute(o.VerbId.ShowCustomView,n).then((function(e){var t,n=e.result;return(null===(t=n)||void 0===t?void 0:t.luid)?new a.CustomViewImpl(n,r._registryId):void 0}))},t.prototype.removeCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="removeCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t);return this.execute(o.VerbId.RemoveCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.saveCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t[o.ParameterId.CustomViewIsDefault]=!1,t);return this.execute(o.VerbId.SaveWorkbookAsCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.setActiveCustomViewAsDefaultAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="setActiveCustomViewAsDefaultAsync",e);return this.execute(o.VerbId.SetActiveCustomViewAsDefault,t).then((function(){}))},t.prototype.saveAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveAsync",t[o.ParameterId.CustomViewLuid]=e.luid,t[o.ParameterId.CustomViewName]=e.name,t[o.ParameterId.CustomViewIsDefault]=e.isDefault,t[o.ParameterId.CustomViewIsPublic]=e.shared,t);return this.execute(o.VerbId.UpdateCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.getCurrentSrcAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="getCurrentSrcAsync",e);return this.execute(o.VerbId.GetCurrentSrc,t).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VizServiceImpl=s},8856:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"zone-service"},enumerable:!0,configurable:!0}),t.prototype.setVisibilityAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="setVisibilityAsync",n[a.ParameterId.Dashboard]=e,n[a.ParameterId.ZoneIdsVisibilityMap]={},n);return l.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach((function(e,r){u.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),u.ErrorHelpers.verifyEnumValue(e,o.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),i[a.ParameterId.ZoneIdsVisibilityMap][r]=s.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(a.VerbId.SetZoneVisibility,i).then((function(e){}))},t.prototype.moveAndResizeAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.Dashboard]=e,n[a.ParameterId.DashboardObjectPositionAndSizeUpdateList]=r,n);return r.forEach((function(e){u.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),u.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(a.VerbId.MoveAndResizeZones,i).then((function(e){}))},t}(r(1776).ServiceImplBase);t.ZoneServiceImpl=c},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._tableInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._tableInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._tableInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"connectionId",{get:function(){return this._tableInfo.connectionId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"customSQL",{get:function(){return this._tableInfo.customSQL},enumerable:!0,configurable:!0}),e}();t.TableSummary=r},6664:function(e,t){"use strict";var r,n=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},r(e,t)},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0});var i=function(e){function t(r,n){var i=e.call(this,r+": "+n)||this;return i._errorCode=r,Object.setPrototypeOf(i,t.prototype),i}return n(t,e),Object.defineProperty(t.prototype,"errorCode",{get:function(){return this._errorCode},enumerable:!0,configurable:!0}),t}(Error);t.TableauError=i},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(5068),o=function(){function e(){}return e.MakeParameterDataValue=function(e,t){return new i.DataValue(e.value,n.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue)},e.MakeFilterDataValue=function(e){return new i.DataValue(e.value,e.value,e.formattedValue)},e.MakeTableDataValue=function(e,t){return new i.DataValue(e.value,void 0!==e.value?n.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)},e}();t.DataValueFactory=o},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){var e=this;this._promise=new Promise((function(t,r){e._resolve=t,e._reject=r}))}return Object.defineProperty(e.prototype,"promise",{get:function(){return this._promise},enumerable:!0,configurable:!0}),e.prototype.resolve=function(e){this._resolve&&this._resolve(e)},e.prototype.reject=function(e){this._reject&&this._reject(e)},e}();t.Deferred=r,t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(7419),o=r(6664),a=function(){function e(e,t){this._mappings=e,this._defaultVal=t}return e.prototype.convert=function(e,t){if(void 0===t&&(t=n.Yes),this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new o.TableauError(i.ErrorCodes.InternalError,"Enum Mapping not found for: "+e)},e}();t.EnumConverter=a,function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1172),a=function(){function e(){}return e.apiNotImplemented=function(e){return new i.TableauError(n.SharedErrorCodes.InternalError,e+" API not yet implemented.")},e.verifyInternalValue=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InternalError,e+" is invalid value for: "+t)},e.verifyParameter=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for parameter: "+t)},e.verifyParameterType=function(e,t,r){if(typeof e!==t)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" has invalid type for parameter: "+r+".")},e.verifyStringParameter=function(e,t){if(null==e||""===e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for paramter: "+t)},e.verifyEnumValue=function(e,t,r){var o=!1;if(Object.keys(t).forEach((function(r){t[r]===e.toString()&&(o=!0)})),!o)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for enum: "+r+".")},e.verifyRange=function(e,t,r){if(!(t<=e&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(7419),o=r(6664),a=function(){function e(){}return e.updateInternalExportPDFOptions=function(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)},e.updateExportLayoutOptions=function(e,t){var r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=n.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=n.PageOrientation.Portrait;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=n.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=n.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=n.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=n.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=n.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=n.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=n.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=n.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=n.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=n.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=n.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=n.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=n.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=n.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=n.PageSizeOption.Unspecified;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,n.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,n.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,n.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,n.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct90);break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}},e.updateSheetOptions=function(e,t){for(var r=e.exportLayoutOptions,n=0,i=e.sheetOptions;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(7480),a=function(){function e(){}return e.serializeDateForPlatform=function(e){return e.getUTCFullYear()+"-"+(e.getUTCMonth()+1)+"-"+e.getUTCDate()+" "+e.getUTCHours()+":"+e.getUTCMinutes()+":"+e.getUTCSeconds()},e.serializeBooleanForPlatform=function(e){return e?"true":"false"},e.serializeNumberForPlatform=function(e){return e.toString(10)},e.isTypeNumber=function(e){return"number"==typeof e||e instanceof Number},e.isTypeDate=function(e){return e instanceof Date},e.isTypeString=function(e){return"string"==typeof e||e instanceof String},e.isTypeBool=function(e){return"boolean"==typeof e||e instanceof Boolean},e.isNullOrUndefined=function(e){return null==e},e.serializeParameterValue=function(t){if(e.isTypeNumber(t))return e.serializeNumberForPlatform(t);if(e.isTypeDate(t))return e.serializeDateForPlatform(t);if(e.isTypeBool(t))return e.serializeBooleanForPlatform(t);if(e.isTypeString(t))return t;throw new i.TableauError(n.ErrorCodes.InternalError,"Unexpected invalid value for: "+t)},e.convertParameterToMap=function(e,t){if(o.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(n.ErrorCodes.InvalidParameter,"Expecting object or Map for: "+t+".");return e instanceof Map?e:new Map(Object.entries(e))},e.tryParseNumber=function(t){if(e.isNullOrUndefined(t))return{success:!1};if(e.isTypeNumber(t))return{parsed:t,success:!0};var r=t.toString();if("NaN"===r)return{parsed:NaN,success:!0};var n=parseFloat(r);return isNaN(n)?{success:!1}:{parsed:n,success:!0}},e}();t.Param=a},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6664),a=function(){function e(){}return e.getSheetSizeFromSizeConstraints=function(e){var t=e.minWidth,r=e.minHeight,i=e.maxWidth,o=e.maxHeight;if(0===r&&0===t)return 0===o&&0===i?{behavior:n.SheetSizeBehavior.Automatic}:{behavior:n.SheetSizeBehavior.AtMost,maxSize:{width:i,height:o}};if(0===o&&0===i)return{behavior:n.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(o===r&&i===t&&t>0)return{behavior:n.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};var a=0===t&&0===i;return{behavior:n.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:a?2147483647:i,height:o}}},e.createAutomaticSize=function(){return{behavior:n.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}},e.getPublishedSheetInfoByName=function(e,t){return t.find((function(t){return t.name===e}))},e.getSheetTypeEnum=function(e){var t;switch(e){case i.SheetType.Worksheet:t=n.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=n.SheetType.Dashboard;break;case i.SheetType.Story:t=n.SheetType.Story;break;default:throw new o.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return t},e.isValidSheetSize=function(e){return void 0!==e.behavior},e}();t.SheetUtils=a},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1724),a=function(){function e(e){void 0===e&&(e=o.UnregisterTimeoutInMilliseconds),this._timeoutInMilliseconds=e}return e.prototype.getNewPromiseOrThrowIfBusy=function(){var e=this;if(this._deferred)throw new i.TableauError(n.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new o.Deferred,this._timeoutId=setTimeout((function(){var t=new i.TableauError(n.SharedErrorCodes.Timeout,"Api failed to complete in "+e._timeoutInMilliseconds/1e3+" seconds");e.reject(t)}),this._timeoutInMilliseconds),this._deferred.promise},e.prototype.resolve=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)},e.prototype.reject=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)},e}();t.ShortLivedDeferred=a},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(e,t){var r=e.split("-");this.build=this.getBuildNumber(r[1]);var o=(e=r[0]).split(".").map((function(e){return parseInt(e,10)}));if(3!==o.length)throw new i.TableauError(n.ErrorCodes.InternalError,"Invalid version number: "+e);this.major=o[0],this.minor=o[1],this.fix=o[2],this.isAlpha=t}return e.prototype.getBuildNumber=function(e){if(!e)return-1;var t=e.split(".");return t[1]?parseInt(t[1],10):-1},Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullFormattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix+"-pre."+this.build},enumerable:!0,configurable:!0}),e}();t.VersionNumber=o},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=function(){function e(e,t){var r=this;this._apiDelegateDispatcher=e,this._versionConverter=n.CreateExternalCompatibleVersionConverter(n.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((function(e){if(0!==r._notificationHandlers.length){var t=r._versionConverter.upgradeNotification(e);r._notificationHandlers.forEach((function(e){e(t)}))}}))}return e.needsVersionConverter=function(e){return n.VersionLessThan(e,n.INTERNAL_CONTRACT_VERSION)},e.prototype.execute=function(e,t){var r=this;try{var n=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(n.verb,n.parameters).then((function(n){return r._versionConverter.upgradeExecuteReturn(n,e,t)}))}catch(e){return Promise.reject(e)}},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e}();t.VersionedExternalApiDispatcher=i},6680:(e,t,r)=>{"use strict";var n;r.r(t),r.d(t,{NIL:()=>x,parse:()=>m,stringify:()=>c,v1:()=>h,v3:()=>A,v4:()=>E,v5:()=>D,validate:()=>s,version:()=>F});var i=new Uint8Array(16);function o(){if(!n&&!(n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(i)}const a=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,s=function(e){return"string"==typeof e&&a.test(e)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e[t+4]]+u[e[t+5]]+"-"+u[e[t+6]]+u[e[t+7]]+"-"+u[e[t+8]]+u[e[t+9]]+"-"+u[e[t+10]]+u[e[t+11]]+u[e[t+12]]+u[e[t+13]]+u[e[t+14]]+u[e[t+15]]).toLowerCase();if(!s(r))throw TypeError("Stringified UUID is invalid");return r};var p,d,f=0,y=0;const h=function(e,t,r){var n=t&&r||0,i=t||new Array(16),a=(e=e||{}).node||p,s=void 0!==e.clockseq?e.clockseq:d;if(null==a||null==s){var u=e.random||(e.rng||o)();null==a&&(a=p=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==s&&(s=d=16383&(u[6]<<8|u[7]))}var l=void 0!==e.msecs?e.msecs:Date.now(),h=void 0!==e.nsecs?e.nsecs:y+1,m=l-f+(h-y)/1e4;if(m<0&&void 0===e.clockseq&&(s=s+1&16383),(m<0||l>f)&&void 0===e.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");f=l,y=h,d=s;var g=(1e4*(268435455&(l+=122192928e5))+h)%4294967296;i[n++]=g>>>24&255,i[n++]=g>>>16&255,i[n++]=g>>>8&255,i[n++]=255&g;var v=l/4294967296*1e4&268435455;i[n++]=v>>>8&255,i[n++]=255&v,i[n++]=v>>>24&15|16,i[n++]=v>>>16&255,i[n++]=s>>>8|128,i[n++]=255&s;for(var b=0;b<6;++b)i[n+b]=a[b];return t||c(i)},m=function(e){if(!s(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function g(e,t,r){function n(e,n,i,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function b(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function I(e,t,r,n,i,o){return b((a=b(b(t,e),b(n,o)))<<(s=i)|a>>>32-s,r);var a,s}function S(e,t,r,n,i,o,a){return I(t&r|~t&n,e,t,i,o,a)}function _(e,t,r,n,i,o,a){return I(t&n|r&~n,e,t,i,o,a)}function T(e,t,r,n,i,o,a){return I(t^r^n,e,t,i,o,a)}function P(e,t,r,n,i,o,a){return I(r^(t|~n),e,t,i,o,a)}const A=g("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,a=parseInt(n.charAt(o>>>4&15)+n.charAt(15&o),16);t.push(a)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[n/8])<>>32-t}const D=g("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var n=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;b=v,v=g,g=O(m,30)>>>0,m=h,h=_}r[0]=r[0]+h>>>0,r[1]=r[1]+m>>>0,r[2]=r[2]+g>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+b>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),x="00000000-0000-0000-0000-000000000000",F=function(e){if(!s(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":162,"fix":0}')}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,r),o.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";var e=n;Object.defineProperty(e,"__esModule",{value:!0});var t=r(5136);r(3e3),r(8315),r(80),r(5668),r(5816),r(3680),r(9308),r(8824),r(8512),r(9232),r(9336);var i=r(976),o=r(5408),a="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.12.1-pre.1",a);var s=new i.ExtensionsImpl;e.extensions=new o.Extensions(s);var u=r(7419);e.AnalyticsObjectType=u.AnalyticsObjectType,e.AnnotationType=u.AnnotationType,e.ClassNameKey=u.ClassNameKey,e.ColumnType=u.ColumnType,e.DashboardLayoutChange=u.DashboardLayoutChange,e.DashboardObjectType=u.DashboardObjectType,e.DashboardObjectVisibilityType=u.DashboardObjectVisibilityType,e.DataType=u.DataType,e.DateRangeType=u.DateRangeType,e.DialogStyle=u.DialogStyle,e.EncodingType=u.EncodingType,e.ErrorCodes=u.ErrorCodes,e.ExtensionContext=u.ExtensionContext,e.ExtensionMode=u.ExtensionMode,e.FieldAggregationType=u.FieldAggregationType,e.FieldRoleType=u.FieldRoleType,e.FilterDomainType=u.FilterDomainType,e.FilterNullOption=u.FilterNullOption,e.FilterType=u.FilterType,e.FilterUpdateType=u.FilterUpdateType,e.HierarchicalLevelSelectionState=u.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=u.IncludeDataValuesOption,e.MarkType=u.MarkType,e.ParameterValueType=u.ParameterValueType,e.PeriodType=u.PeriodType,e.QuickTableCalcType=u.QuickTableCalcType,e.ReplaySpeedType=u.ReplaySpeedType,e.SelectOptions=u.SelectOptions,e.SelectionUpdateType=u.SelectionUpdateType,e.SheetType=u.SheetType,e.SortDirection=u.SortDirection,e.TableauEventType=u.TableauEventType,e.TrendLineModelType=u.TrendLineModelType,e.VizImageEncodingType=u.VizImageEncodingType,e.VizImagePaletteType=u.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=u.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=u.VizImageSizeSettingType,e.VizImageSortDirectionType=u.VizImageSortDirectionType,e.ZoneVisibilityType=u.ZoneVisibilityType})(),window.tableau=n})(); +//# sourceMappingURL=tableau.extensions.1.12.1-pre.1.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 daddde15..caa419fd 100644 --- a/lib/tableau.extensions.1.latest.js +++ b/lib/tableau.extensions.1.latest.js @@ -12562,8 +12562,10 @@ var DashboardImpl = /** @class */ (function (_super) { // updating zones and reinitializing instance variables this._zones = newZones; this._activeDashboardObjectId = newActiveZoneId; - this._sheetPath.sheetName = newActiveDashboardName; - this._sheetInfoImpl.name = newActiveDashboardName; + if (newActiveDashboardName) { + this._sheetPath.sheetName = newActiveDashboardName; + this._sheetInfoImpl.name = newActiveDashboardName; + } this.initializeWithPublicInterfaces(); // getting new dashboard objects var newDashboardObjects = this._objects; @@ -12611,7 +12613,7 @@ var DashboardImpl = /** @class */ (function (_super) { } } // Checking if switched to another dashboard - if (oldActiveDashboardName !== newActiveDashboardName) { + if (newActiveDashboardName && oldActiveDashboardName !== newActiveDashboardName) { this.addChange(0, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.DashboardChanged); } return zoneChanges; @@ -20085,7 +20087,7 @@ __webpack_require__(/*! core-js/es/promise */ "../../node_modules/core-js/es/pro var ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); var Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "./lib/src/ExtensionsApi/Namespaces/Extensions.js"); var isAlpha = typeof VERSION_IS_ALPHA !== 'undefined' ? VERSION_IS_ALPHA : false; -api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.12.0-pre.16" : 0, isAlpha); +api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.12.1-pre.1" : 0, isAlpha); var extensionImpl = new ExtensionsImpl_1.ExtensionsImpl(); exports.extensions = new Extensions_1.Extensions(extensionImpl); // Export Enums @@ -20136,4 +20138,4 @@ exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType; window.tableau = __webpack_exports__; /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuMTIuMC1wcmUuMTYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsbUJBQU8sQ0FBQyx3RkFBNkI7QUFDckMsa0JBQWtCLG1CQUFPLENBQUMsMEZBQThCOztBQUV4RDs7Ozs7Ozs7Ozs7QUNIQSxtQkFBTyxDQUFDLGtHQUFrQztBQUMxQyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNKQSxtQkFBTyxDQUFDLGdHQUFpQztBQUN6QyxtQkFBTyxDQUFDLDBFQUFzQjtBQUM5QixtQkFBTyxDQUFDLG9HQUFtQztBQUMzQyxtQkFBTyxDQUFDLGtHQUFrQztBQUMxQyxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNOQSxtQkFBTyxDQUFDLHNHQUFvQztBQUM1QyxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNIQSxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNIQSxtQkFBTyxDQUFDLHdHQUFxQztBQUM3QyxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNIQSxtQkFBTyxDQUFDLG9HQUFtQztBQUMzQyxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNIQSxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNIQSxtQkFBTyxDQUFDLGdHQUFpQztBQUN6QyxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNIQSxtQkFBTyxDQUFDLGtIQUEwQztBQUNsRCxXQUFXLG1CQUFPLENBQUMsMEVBQXNCOztBQUV6Qzs7Ozs7Ozs7Ozs7QUNIQSxtQkFBTyxDQUFDLGtHQUFrQztBQUMxQyxtQkFB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c0dBQWdDO0FBQ2hDLG9GQUF1QjtBQUN2Qix3RkFBeUI7QUFDekIsMEVBQWtCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9maW5kLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL21hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3Byb21pc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGVhci1lcnJvci1zdGFjay5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1icm93c2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MtcGViYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnRyeS11bmJpbmQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvZ3VpZC9ndWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvTWFya3NTZWxlY3RlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1U2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVXb3Jrc2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1dvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQ29ubmVjdGVkU2VydmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvU2V0dGluZ3NJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVUlJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkT2JqZWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvUGFyYW1ldGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvU2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3JrYm9vay50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtzaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Vudmlyb25tZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvVUkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9VSVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUHVsc2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9WaXpJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvTm90aWZpY2F0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvUGFyYW1ldGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvVmVyYnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VUeXBlQ2hlY2tzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25UcmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uQ29udmVydGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQXBpVmVyc2lvbi50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Db25uZWN0aW9uU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9EYXRhU291cmNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FdmVudExpc3RlbmVyTWFuYWdlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9GaWVsZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXRhU291cmNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0ZpZWxkSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1BhcmFtZXRlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2luZ2xlRXZlbnRNYW5hZ2VySW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvV29ya3NoZWV0SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Mb2dpY2FsVGFibGUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0FjY2Vzc2liaWxpdHlNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0ZpbHRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvR2V0RGF0YU1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvR2V0RGF0YVRhYmxlUmVhZGVyTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvUG9pbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvR2V0RGF0YVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9BY2Nlc3NpYmlsaXR5U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0Fubm90YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0RhdGFTb3VyY2VTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4cG9ydFNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRmlsdGVyU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9HZXREYXRhU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1BhcmFtZXRlcnNTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VydmljZUltcGxCYXNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2l6ZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9WaXN1YWxNb2RlbFNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVml6U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9ab25lU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVGFibGVTdW1tYXJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlYXVFcnJvci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EYXRhVmFsdWVGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0VudW1Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRXJyb3JIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0V4cG9ydEhlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvUGFyYW0udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9TaG9ydExpdmVkRGVmZXJyZWQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVmVyc2lvbk51bWJlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9tZDUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbmlsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JlZ2V4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92My5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MzUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnZmluZCcpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZnJvbScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguQXJyYXkuZnJvbTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5NYXA7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNOYU47XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLnBhcnNlRmxvYXQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5wYXJzZUludDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmFzc2lnbjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LnNldFByb3RvdHlwZU9mO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguUHJvbWlzZTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ29uc3RydWN0b3IoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmICh0eXBlb2YgYXJndW1lbnQgPT0gJ29iamVjdCcgfHwgaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKGFyZ3VtZW50KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogY3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUHJvdG90eXBlKSB7XG4gIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcihTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgdmFyIElTX0NPTlNUUlVDVE9SID0gaXNDb25zdHJ1Y3Rvcih0aGlzKTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgaWYgKG1hcHBpbmcpIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICYmICEodGhpcyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IElTX0NPTlNUUlVDVE9SID8gbmV3IHRoaXMoKSA6IFtdO1xuICAgIGZvciAoOyEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKGxlbmd0aCkgOiBBcnJheShsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsInZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZm9yRWFjaCwgbWFwLCBmaWx0ZXIsIHNvbWUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbHRlclJlamVjdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBJU19GSUxURVJfUkVKRUNUID0gVFlQRSA9PSA3O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCwgc3BlY2lmaWNDcmVhdGUpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQpO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShzZWxmKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjcmVhdGUgPSBzcGVjaWZpY0NyZWF0ZSB8fCBhcnJheVNwZWNpZXNDcmVhdGU7XG4gICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiB8fCBJU19GSUxURVJfUkVKRUNUID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaCh0YXJnZXQsIHZhbHVlKTsgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgNDogcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAvLyBldmVyeVxuICAgICAgICAgIGNhc2UgNzogcHVzaCh0YXJnZXQsIHZhbHVlKTsgICAgICAvLyBmaWx0ZXJSZWplY3RcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogdGFyZ2V0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbiAgZm9yRWFjaDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgZmlsdGVyOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuc29tZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbiAgc29tZTogY3JlYXRlTWV0aG9kKDMpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuICBmaW5kOiBjcmVhdGVNZXRob2QoNSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gIGZpbmRJbmRleDogY3JlYXRlTWV0aG9kKDYpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlclJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWZpbHRlcmluZ1xuICBmaWx0ZXJSZWplY3Q6IGNyZWF0ZU1ldGhvZCg3KVxufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyhbXS5zbGljZSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG5cbi8vIGEgcGFydCBvZiBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5KSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKGlzQ29uc3RydWN0b3IoQykgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcbn07XG4iLCJ2YXIgYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoYXJyYXlTcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWxBcnJheSkpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tLCBuby10aHJvdy1saXRlcmFsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyh7fS50b1N0cmluZyk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBzdHJpbmdTbGljZSh0b1N0cmluZyhpdCksIDgsIC0xKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuXG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuLy8gZ2V0dGluZyB0YWcgZnJvbSBFUzYrIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyBjbGFzc29mUmF3IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcblxudmFyIFRFU1QgPSAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gU3RyaW5nKEVycm9yKGFyZykuc3RhY2spOyB9KSgnenhjYXNkJyk7XG52YXIgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZID0gL1xcblxccyphdCBbXjpdKjpbXlxcbl0qLztcbnZhciBJU19WOF9PUl9DSEFLUkFfU1RBQ0sgPSBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkudGVzdChURVNUKTtcbnZhciBJU19GSVJFRk9YX09SX1NBRkFSSV9TVEFDSyA9IC9AW15cXG5dKlxcbi8udGVzdChURVNUKSAmJiAhL3p4Y2FzZC8udGVzdChURVNUKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gIGlmICh0eXBlb2Ygc3RhY2sgIT0gJ3N0cmluZycpIHJldHVybiBzdGFjaztcbiAgaWYgKElTX1Y4X09SX0NIQUtSQV9TVEFDSykge1xuICAgIHdoaWxlIChkcm9wRW50cmllcy0tKSBzdGFjayA9IHJlcGxhY2Uoc3RhY2ssIFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWSwgJycpO1xuICB9IGVsc2UgaWYgKElTX0ZJUkVGT1hfT1JfU0FGQVJJX1NUQUNLKSB7XG4gICAgcmV0dXJuIGpvaW4oYXJyYXlTbGljZShzcGxpdChzdGFjaywgJ1xcbicpLCBkcm9wRW50cmllcyksICdcXG4nKTtcbiAgfSByZXR1cm4gc3RhY2s7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmZhc3RLZXk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIFByb3RvdHlwZSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSxcbiAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiAwXG4gICAgICB9KTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMpIHRoYXQuc2l6ZSA9IDA7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgUHJvdG90eXBlID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4gICAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gICAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgIHZhciBwcmV2aW91cywgaW5kZXg7XG4gICAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUubGFzdCA9IGVudHJ5ID0ge1xuICAgICAgICAgIGluZGV4OiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSxcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzID0gc3RhdGUubGFzdCxcbiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVtb3ZlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzdGF0ZS5maXJzdCkgc3RhdGUuZmlyc3QgPSBlbnRyeTtcbiAgICAgICAgaWYgKHByZXZpb3VzKSBwcmV2aW91cy5uZXh0ID0gZW50cnk7XG4gICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSsrO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSsrO1xuICAgICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHN0YXRlLmluZGV4W2luZGV4XSA9IGVudHJ5O1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9O1xuXG4gICAgdmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIC8vIGZhc3QgY2FzZVxuICAgICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpO1xuICAgICAgdmFyIGVudHJ5O1xuICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiBzdGF0ZS5pbmRleFtpbmRleF07XG4gICAgICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgICAgIGZvciAoZW50cnkgPSBzdGF0ZS5maXJzdDsgZW50cnk7IGVudHJ5ID0gZW50cnkubmV4dCkge1xuICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgcmV0dXJuIGVudHJ5O1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZWRlZmluZUFsbChQcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmNsZWFyKClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5jbGVhclxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmNsZWFyXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDtcbiAgICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wcmV2aW91cykgZW50cnkucHJldmlvdXMgPSBlbnRyeS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUgPSAwO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5kZWxldGVcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5kZWxldGVcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uZXh0O1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uZXh0ID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wcmV2aW91cyA9IHByZXY7XG4gICAgICAgICAgaWYgKHN0YXRlLmZpcnN0ID09IGVudHJ5KSBzdGF0ZS5maXJzdCA9IG5leHQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmxhc3QgPT0gZW50cnkpIHN0YXRlLmxhc3QgPSBwcmV2O1xuICAgICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZS0tO1xuICAgICAgICAgIGVsc2UgdGhhdC5zaXplLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmZvcmVhY2hcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuZmlyc3QpIHtcbiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXR9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmhhc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmhhc1xuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChQcm90b3R5cGUsIElTX01BUCA/IHtcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLmdldChrZXkpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5nZXRcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudmFsdWU7XG4gICAgICB9LFxuICAgICAgLy8gYE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5zZXRcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIGBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmFkZFxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eShQcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKSB7XG4gICAgdmFyIElURVJBVE9SX05BTUUgPSBDT05TVFJVQ1RPUl9OQU1FICsgJyBJdGVyYXRvcic7XG4gICAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICB2YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihJVEVSQVRPUl9OQU1FKTtcbiAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS57IGtleXMsIHZhbHVlcywgZW50cmllcywgQEBpdGVyYXRvciB9KClgIG1ldGhvZHNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZW50cmllc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5rZXlzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLnZhbHVlc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmVudHJpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUua2V5c1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS52YWx1ZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUtQEBpdGVyYXRvclxuICAgIGRlZmluZUl0ZXJhdG9yKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9O1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS52YWx1ZSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGVbQEBzcGVjaWVzXWAgYWNjZXNzb3JzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXQtbWFwLUBAc3BlY2llc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXNldC1AQHNwZWNpZXNcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUsIHdyYXBwZXIsIGNvbW1vbikge1xuICB2YXIgSVNfTUFQID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdNYXAnKSAhPT0gLTE7XG4gIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgTmF0aXZlQ29uc3RydWN0b3IgPSBnbG9iYWxbQ09OU1RSVUNUT1JfTkFNRV07XG4gIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHZhciBDb25zdHJ1Y3RvciA9IE5hdGl2ZUNvbnN0cnVjdG9yO1xuICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24gKEtFWSkge1xuICAgIHZhciB1bmN1cnJpZWROYXRpdmVNZXRob2QgPSB1bmN1cnJ5VGhpcyhOYXRpdmVQcm90b3R5cGVbS0VZXSk7XG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvdG90eXBlLCBLRVksXG4gICAgICBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyB1bmRlZmluZWQgOiB1bmN1cnJpZWROYXRpdmVNZXRob2QodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgdmFyIFJFUExBQ0UgPSBpc0ZvcmNlZChcbiAgICBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICFpc0NhbGxhYmxlKE5hdGl2ZUNvbnN0cnVjdG9yKSB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gICAgfSkpXG4gICk7XG5cbiAgaWYgKFJFUExBQ0UpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBOYXRpdmVQcm90b3R5cGUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBOYXRpdmVQcm90b3R5cGU7XG4gICAgICBOYXRpdmVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORykgZml4TWV0aG9kKEFEREVSKTtcblxuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgTmF0aXZlUHJvdG90eXBlLmNsZWFyKSBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyO1xuICB9XG5cbiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjtcbiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBDb25zdHJ1Y3RvciAhPSBOYXRpdmVDb25zdHJ1Y3RvciB9LCBleHBvcnRlZCk7XG5cbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgRnVuY3Rpb25OYW1lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuUFJPUEVSO1xudmFyIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FID0gRnVuY3Rpb25OYW1lLkNPTkZJR1VSQUJMRTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYWxsYWJsZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICAgICAgICAgIHJlZGVmaW5lKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5LnByb3RvdHlwZS57IHZhbHVlcywgQEBpdGVyYXRvciB9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoUFJPUEVSX0ZVTkNUSU9OX05BTUUgJiYgREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgaWYgKCFJU19QVVJFICYmIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsICduYW1lJywgVkFMVUVTKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIGNhbGwobmF0aXZlSXRlcmF0b3IsIHRoaXMpOyB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGV4cG9ydCBhZGRpdGlvbmFsIG1ldGhvZHNcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKVxuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIHx8ICEoS0VZIGluIEl0ZXJhYmxlUHJvdG90eXBlKSkge1xuICAgICAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvciwgeyBuYW1lOiBERUZBVUxUIH0pO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JztcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL2lwYWR8aXBob25lfGlwb2QvaS50ZXN0KHVzZXJBZ2VudCkgJiYgZ2xvYmFsLlBlYmJsZSAhPT0gdW5kZWZpbmVkO1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC8oPzppcGFkfGlwaG9uZXxpcG9kKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc29mKGdsb2JhbC5wcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBEZW5vID0gZ2xvYmFsLkRlbm87XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnMgfHwgRGVubyAmJiBEZW5vLnZlcnNpb247XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgLy8gaW4gb2xkIENocm9tZSwgdmVyc2lvbnMgb2YgVjggaXNuJ3QgVjggPSBDaHJvbWUgLyAxMFxuICAvLyBidXQgdGhlaXIgY29ycmVjdCB2ZXJzaW9ucyBhcmUgbm90IGludGVyZXN0aW5nIGZvciB1c1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gPiAwICYmIG1hdGNoWzBdIDwgNCA/IDEgOiArKG1hdGNoWzBdICsgbWF0Y2hbMV0pO1xufVxuXG4vLyBCcm93c2VyRlMgTm9kZUpTIGBwcm9jZXNzYCBwb2x5ZmlsbCBpbmNvcnJlY3RseSBzZXQgYC52OGAgdG8gYDAuMGBcbi8vIHNvIGNoZWNrIGB1c2VyQWdlbnRgIGV2ZW4gaWYgYC52OGAgZXhpc3RzLCBidXQgMFxuaWYgKCF2ZXJzaW9uICYmIHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9ICttYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9EKSB7XG4gIHJldHVybiB1bmN1cnJ5VGhpcyhnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdKTtcbn07XG4iLCIvLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBlcnJvciA9IEVycm9yKCdhJyk7XG4gIGlmICghKCdzdGFjaycgaW4gZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIDcpKTtcbiAgcmV0dXJuIGVycm9yLnN0YWNrICE9PSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4gIG9wdGlvbnMubmFtZSAgICAgICAgLSB0aGUgLm5hbWUgb2YgdGhlIGZ1bmN0aW9uIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBrZXlcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHtcbiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0O1xuICB2YXIgR0xPQkFMID0gb3B0aW9ucy5nbG9iYWw7XG4gIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7XG4gIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7XG4gIGlmIChHTE9CQUwpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWw7XG4gIH0gZWxzZSBpZiAoU1RBVElDKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlO1xuICB9XG4gIGlmICh0YXJnZXQpIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07XG4gICAgaWYgKG9wdGlvbnMubm9UYXJnZXRHZXQpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfSBlbHNlIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG4gICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0XG4gICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuIiwidmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGFwcGx5ID0gRnVuY3Rpb25Qcm90b3R5cGUuYXBwbHk7XG52YXIgYmluZCA9IEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQ7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1yZWZsZWN0IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFJlZmxlY3QgPT0gJ29iamVjdCcgJiYgUmVmbGVjdC5hcHBseSB8fCAoYmluZCA/IGNhbGwuYmluZChhcHBseSkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpO1xufSk7XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcblxudmFyIGJpbmQgPSB1bmN1cnJ5VGhpcyh1bmN1cnJ5VGhpcy5iaW5kKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCkge1xuICBhQ2FsbGFibGUoZm4pO1xuICByZXR1cm4gdGhhdCA9PT0gdW5kZWZpbmVkID8gZm4gOiBiaW5kID8gYmluZChmbiwgdGhhdCkgOiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gY2FsbC5iaW5kID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXREZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIEVYSVNUUyA9IGhhc093bihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKTtcbi8vIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBmcm9tIG1pbmlmaWVkIC8gbWFuZ2xlZCAvIGRyb3BwZWQgZnVuY3Rpb24gbmFtZXNcbnZhciBQUk9QRVIgPSBFWElTVFMgJiYgKGZ1bmN0aW9uIHNvbWV0aGluZygpIHsgLyogZW1wdHkgKi8gfSkubmFtZSA9PT0gJ3NvbWV0aGluZyc7XG52YXIgQ09ORklHVVJBQkxFID0gRVhJU1RTICYmICghREVTQ1JJUFRPUlMgfHwgKERFU0NSSVBUT1JTICYmIGdldERlc2NyaXB0b3IoRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJykuY29uZmlndXJhYmxlKSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBFWElTVFM6IEVYSVNUUyxcbiAgUFJPUEVSOiBQUk9QRVIsXG4gIENPTkZJR1VSQUJMRTogQ09ORklHVVJBQkxFXG59O1xuIiwidmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGJpbmQgPSBGdW5jdGlvblByb3RvdHlwZS5iaW5kO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xudmFyIGNhbGxCaW5kID0gYmluZCAmJiBiaW5kLmJpbmQoY2FsbCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZCA/IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZm4gJiYgY2FsbEJpbmQoY2FsbCwgZm4pO1xufSA6IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZm4gJiYgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWxsLmFwcGx5KGZuLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKGFyZ3VtZW50KSA/IGFyZ3VtZW50IDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKSA6IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBnZXRNZXRob2QoaXQsIElURVJBVE9SKVxuICAgIHx8IGdldE1ldGhvZChpdCwgJ0BAaXRlcmF0b3InKVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgdXNpbmdJdGVyYXRvcikge1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGdldEl0ZXJhdG9yTWV0aG9kKGFyZ3VtZW50KSA6IHVzaW5nSXRlcmF0b3I7XG4gIGlmIChhQ2FsbGFibGUoaXRlcmF0b3JNZXRob2QpKSByZXR1cm4gYW5PYmplY3QoY2FsbChpdGVyYXRvck1ldGhvZCwgYXJndW1lbnQpKTtcbiAgdGhyb3cgVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuIiwidmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG5cbi8vIGBHZXRNZXRob2RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXRtZXRob2Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFYsIFApIHtcbiAgdmFyIGZ1bmMgPSBWW1BdO1xuICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcbiIsInZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBhcmd1bWVudHMubGVuZ3RoID09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfVxufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWllZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3Ncbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgaXNDYWxsYWJsZShOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gdW5jdXJyeVRoaXMoRnVuY3Rpb24udG9TdHJpbmcpO1xuXG4vLyB0aGlzIGhlbHBlciBicm9rZW4gaW4gYGNvcmUtanNAMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAoIWlzQ2FsbGFibGUoc3RvcmUuaW5zcGVjdFNvdXJjZSkpIHtcbiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBmdW5jdGlvblRvU3RyaW5nKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcblxuLy8gYEluc3RhbGxFcnJvckNhdXNlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1lcnJvci1jYXVzZS8jc2VjLWVycm9yb2JqZWN0cy1pbnN0YWxsLWVycm9yLWNhdXNlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBvcHRpb25zKSB7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSAmJiAnY2F1c2UnIGluIG9wdGlvbnMpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywgJ2NhdXNlJywgb3B0aW9ucy5jYXVzZSk7XG4gIH1cbn07XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBSRVFVSVJFRCA9IGZhbHNlO1xudmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7XG52YXIgaWQgPSAwO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSAtLSBzYWZlXG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIHNldE1ldGFkYXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeyB2YWx1ZToge1xuICAgIG9iamVjdElEOiAnTycgKyBpZCsrLCAvLyBvYmplY3QgSURcbiAgICB3ZWFrRGF0YToge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG5cbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIGEgcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhc093bihpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBREFUQV0ub2JqZWN0SUQ7XG59O1xuXG52YXIgZ2V0V2Vha0RhdGEgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhc093bihpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIHRoZSBzdG9yZSBvZiB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBREFUQV0ud2Vha0RhdGE7XG59O1xuXG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpJTkcgJiYgUkVRVUlSRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzT3duKGl0LCBNRVRBREFUQSkpIHNldE1ldGFkYXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIGVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWV0YS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4gIFJFUVVJUkVEID0gdHJ1ZTtcbiAgdmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmY7XG4gIHZhciBzcGxpY2UgPSB1bmN1cnJ5VGhpcyhbXS5zcGxpY2UpO1xuICB2YXIgdGVzdCA9IHt9O1xuICB0ZXN0W01FVEFEQVRBXSA9IDE7XG5cbiAgLy8gcHJldmVudCBleHBvc2luZyBvZiBtZXRhZGF0YSBrZXlcbiAgaWYgKGdldE93blByb3BlcnR5TmFtZXModGVzdCkubGVuZ3RoKSB7XG4gICAgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZXN1bHRbaV0gPT09IE1FVEFEQVRBKSB7XG4gICAgICAgICAgc3BsaWNlKHJlc3VsdCwgaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWxNb2R1bGUuZlxuICAgIH0pO1xuICB9XG59O1xuXG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBlbmFibGU6IGVuYWJsZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cbmhpZGRlbktleXNbTUVUQURBVEFdID0gdHJ1ZTtcbiIsInZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEID0gJ09iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVAgfHwgc2hhcmVkLnN0YXRlKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIHZhciB3bWdldCA9IHVuY3VycnlUaGlzKHN0b3JlLmdldCk7XG4gIHZhciB3bWhhcyA9IHVuY3VycnlUaGlzKHN0b3JlLmhhcyk7XG4gIHZhciB3bXNldCA9IHVuY3VycnlUaGlzKHN0b3JlLnNldCk7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAod21oYXMoc3RvcmUsIGl0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgd21zZXQoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChoYXNPd24oaXQsIFNUQVRFKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZ3VtZW50KSB7XG4gIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PSAnQXJyYXknO1xufTtcbiIsIi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgZW1wdHkgPSBbXTtcbnZhciBjb25zdHJ1Y3QgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ2NvbnN0cnVjdCcpO1xudmFyIGNvbnN0cnVjdG9yUmVnRXhwID0gL15cXHMqKD86Y2xhc3N8ZnVuY3Rpb24pXFxiLztcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoY29uc3RydWN0b3JSZWdFeHAuZXhlYyk7XG52YXIgSU5DT1JSRUNUX1RPX1NUUklORyA9ICFjb25zdHJ1Y3RvclJlZ0V4cC5leGVjKG5vb3ApO1xuXG52YXIgaXNDb25zdHJ1Y3Rvck1vZGVybiA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3RydWN0KG5vb3AsIGVtcHR5LCBhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG52YXIgaXNDb25zdHJ1Y3RvckxlZ2FjeSA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgICAvLyB3ZSBjYW4ndCBjaGVjayAucHJvdG90eXBlIHNpbmNlIGNvbnN0cnVjdG9ycyBwcm9kdWNlZCBieSAuYmluZCBoYXZlbid0IGl0XG4gIH0gcmV0dXJuIElOQ09SUkVDVF9UT19TVFJJTkcgfHwgISFleGVjKGNvbnN0cnVjdG9yUmVnRXhwLCBpbnNwZWN0U291cmNlKGFyZ3VtZW50KSk7XG59O1xuXG4vLyBgSXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gIWNvbnN0cnVjdCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBjYWxsZWQ7XG4gIHJldHVybiBpc0NvbnN0cnVjdG9yTW9kZXJuKGlzQ29uc3RydWN0b3JNb2Rlcm4uY2FsbClcbiAgICB8fCAhaXNDb25zdHJ1Y3Rvck1vZGVybihPYmplY3QpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oZnVuY3Rpb24gKCkgeyBjYWxsZWQgPSB0cnVlOyB9KVxuICAgIHx8IGNhbGxlZDtcbn0pID8gaXNDb25zdHJ1Y3RvckxlZ2FjeSA6IGlzQ29uc3RydWN0b3JNb2Rlcm47XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBJc0ludGVncmFsTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNpbnRlZ3JhbG51bWJlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1pc2ludGVnZXIgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iLCJ2YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCBPYmplY3QoaXQpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbnZhciBSZXN1bHRQcm90b3R5cGUgPSBSZXN1bHQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgdW5ib3VuZEZ1bmN0aW9uLCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoYXQ7XG4gIHZhciBBU19FTlRSSUVTID0gISEob3B0aW9ucyAmJiBvcHRpb25zLkFTX0VOVFJJRVMpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBiaW5kKHVuYm91bmRGdW5jdGlvbiwgdGhhdCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX0lURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKCFpdGVyRm4pIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdGVyYWJsZSkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlcmFibGUpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pO1xuICB9XG5cbiAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gIHdoaWxlICghKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG4iLCJ2YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGtpbmQsIHZhbHVlKSB7XG4gIHZhciBpbm5lclJlc3VsdCwgaW5uZXJFcnJvcjtcbiAgYW5PYmplY3QoaXRlcmF0b3IpO1xuICB0cnkge1xuICAgIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgaWYgKCFpbm5lclJlc3VsdCkge1xuICAgICAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbm5lclJlc3VsdCA9IGNhbGwoaW5uZXJSZXN1bHQsIGl0ZXJhdG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbm5lckVycm9yID0gdHJ1ZTtcbiAgICBpbm5lclJlc3VsdCA9IGVycm9yO1xuICB9XG4gIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgaWYgKGlubmVyRXJyb3IpIHRocm93IGlubmVyUmVzdWx0O1xuICBhbk9iamVjdChpbm5lclJlc3VsdCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUta2V5cyAtLSBzYWZlICovXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbnZhciBORVdfSVRFUkFUT1JfUFJPVE9UWVBFID0gSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgLy8gRkY0NC0gbGVnYWN5IGl0ZXJhdG9ycyBjYXNlXG4gIHJldHVybiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0uY2FsbCh0ZXN0KSAhPT0gdGVzdDtcbn0pO1xuXG5pZiAoTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbmVsc2UgaWYgKElTX1BVUkUpIEl0ZXJhdG9yUHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtQEBpdGVyYXRvclxuaWYgKCFpc0NhbGxhYmxlKEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSkpIHtcbiAgcmVkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcblxuLy8gYExlbmd0aE9mQXJyYXlMaWtlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdG9MZW5ndGgob2JqLmxlbmd0aCk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX0lPU19QRUJCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy1wZWJibGUnKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdCcpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcblxudmFyIE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xuLy8gTm9kZS5qcyAxMSBzaG93cyBFeHBlcmltZW50YWxXYXJuaW5nIG9uIGdldHRpbmcgYHF1ZXVlTWljcm90YXNrYFxudmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpO1xudmFyIHF1ZXVlTWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcblxudmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghcXVldWVNaWNyb3Rhc2spIHtcbiAgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgLy8gYWxzbyBleGNlcHQgV2ViT1MgV2Via2l0IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84OThcbiAgaWYgKCFJU19JT1MgJiYgIUlTX05PREUgJiYgIUlTX1dFQk9TX1dFQktJVCAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50KSB7XG4gICAgdG9nZ2xlID0gdHJ1ZTtcbiAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoIUlTX0lPU19QRUJCTEUgJiYgUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAvLyB3b3JrYXJvdW5kIG9mIFdlYktpdCB+IGlPUyBTYWZhcmkgMTAuMSBidWdcbiAgICBwcm9taXNlLmNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbiAgICB0aGVuID0gYmluZChwcm9taXNlLnRoZW4sIHByb21pc2UpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmJpbmQoZ2xvYmFsKVxuICAgIG1hY3JvdGFzayA9IGJpbmQobWFjcm90YXNrLCBnbG9iYWwpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hY3JvdGFzayhmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSBTeW1ib2woKTtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gYGdldC1vd24tcHJvcGVydHktc3ltYm9sc2AgcG9seWZpbGwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gb2JqZWN0IGFyZSBub3QgU3ltYm9sIGluc3RhbmNlc1xuICByZXR1cm4gIVN0cmluZyhzeW1ib2wpIHx8ICEoT2JqZWN0KHN5bWJvbCkgaW5zdGFuY2VvZiBTeW1ib2wpIHx8XG4gICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXNcbiAgICAhU3ltYm9sLnNoYW0gJiYgVjhfVkVSU0lPTiAmJiBWOF9WRVJTSU9OIDwgNDE7XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0NhbGxhYmxlKFdlYWtNYXApICYmIC9uYXRpdmUgY29kZS8udGVzdChpbnNwZWN0U291cmNlKFdlYWtNYXApKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUNhbGxhYmxlKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFDYWxsYWJsZShyZWplY3QpO1xufTtcblxuLy8gYE5ld1Byb21pc2VDYXBhYmlsaXR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbmV3cHJvbWlzZWNhcGFiaWxpdHlcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsInZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsICRkZWZhdWx0KSB7XG4gIHJldHVybiBhcmd1bWVudCA9PT0gdW5kZWZpbmVkID8gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyAnJyA6ICRkZWZhdWx0IDogdG9TdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBuJFBhcnNlRmxvYXQgPSBnbG9iYWwucGFyc2VGbG9hdDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGT1JDRUQgPSAxIC8gbiRQYXJzZUZsb2F0KHdoaXRlc3BhY2VzICsgJy0wJykgIT09IC1JbmZpbml0eVxuICAvLyBNUyBFZGdlIDE4LSBicm9rZW4gd2l0aCBib3hlZCBzeW1ib2xzXG4gIHx8IChJVEVSQVRPUiAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyBuJFBhcnNlRmxvYXQoT2JqZWN0KElURVJBVE9SKSk7IH0pKTtcblxuLy8gYHBhcnNlRmxvYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWZsb2F0LXN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUZsb2F0KHN0cmluZykge1xuICB2YXIgdHJpbW1lZFN0cmluZyA9IHRyaW0odG9TdHJpbmcoc3RyaW5nKSk7XG4gIHZhciByZXN1bHQgPSBuJFBhcnNlRmxvYXQodHJpbW1lZFN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgY2hhckF0KHRyaW1tZWRTdHJpbmcsIDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6IG4kUGFyc2VGbG9hdDtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgJHBhcnNlSW50ID0gZ2xvYmFsLnBhcnNlSW50O1xudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgSVRFUkFUT1IgPSBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIGhleCA9IC9eWystXT8weC9pO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhoZXguZXhlYyk7XG52YXIgRk9SQ0VEID0gJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzB4MTYnKSAhPT0gMjJcbiAgLy8gTVMgRWRnZSAxOC0gYnJva2VuIHdpdGggYm94ZWQgc3ltYm9sc1xuICB8fCAoSVRFUkFUT1IgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsgJHBhcnNlSW50KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4KSB7XG4gIHZhciBTID0gdHJpbSh0b1N0cmluZyhzdHJpbmcpKTtcbiAgcmV0dXJuICRwYXJzZUludChTLCAocmFkaXggPj4+IDApIHx8IChleGVjKGhleCwgUykgPyAxNiA6IDEwKSk7XG59IDogJHBhcnNlSW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gc2FmZVxudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHNob3VsZCBoYXZlIGNvcnJlY3Qgb3JkZXIgb2Ygb3BlcmF0aW9ucyAoRWRnZSBidWcpXG4gIGlmIChERVNDUklQVE9SUyAmJiAkYXNzaWduKHsgYjogMSB9LCAkYXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1zeW1ib2wgLS0gc2FmZVxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBhbHBoYWJldDtcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG4gIHdoaWxlIChhcmd1bWVudHNMZW5ndGggPiBpbmRleCkge1xuICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KG9iamVjdEtleXMoUyksIGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlLCBTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG4iLCIvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUsIFdTSCAqL1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xuXG52YXIgR1QgPSAnPic7XG52YXIgTFQgPSAnPCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgU0NSSVBUID0gJ3NjcmlwdCc7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBFbXB0eUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG52YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIExUICsgU0NSSVBUICsgR1QgKyBjb250ZW50ICsgTFQgKyAnLycgKyBTQ1JJUFQgKyBHVDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBBY3RpdmVYIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHtcbiAgYWN0aXZlWERvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnJykpO1xuICBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTtcbiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDtcbiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDsgLy8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgcmV0dXJuIHRlbXA7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzVcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7XG59O1xuXG4vLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0XG4vLyBObyBuZWVkIHRvIHVzZSBhY3RpdmUgeCBhcHByb2FjaCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyBub3Qgc2V0XG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2XG4vLyBhdm9pZCBJRSBHQyBidWdcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfVxuICBOdWxsUHJvdG9PYmplY3QgPSB0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCdcbiAgICA/IGRvY3VtZW50LmRvbWFpbiAmJiBhY3RpdmVYRG9jdW1lbnRcbiAgICAgID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIC8vIG9sZCBJRVxuICAgICAgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKVxuICAgIDogTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpOyAvLyBXU0hcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gTnVsbFByb3RvT2JqZWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydGllcyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBwcm9wc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzT3duKE8sIFApKSByZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYsIE8sIFApLCBPW1BdKTtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlICovXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJykuZjtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBhcnJheVNsaWNlKHdpbmRvd05hbWVzKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIGNsYXNzb2YoaXQpID09ICdXaW5kb3cnXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKE8pIHtcbiAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzT3duKG9iamVjdCwgSUVfUFJPVE8pKSByZXR1cm4gb2JqZWN0W0lFX1BST1RPXTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBpZiAoaXNDYWxsYWJsZShjb25zdHJ1Y3RvcikgJiYgb2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyh7fS5pc1Byb3RvdHlwZU9mKTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qta2V5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gTmFzaG9ybiB+IEpESzggYnVnXG52YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgISRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlXG5leHBvcnRzLmYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlO1xufSA6ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvIC0tIHNhZmUgKi9cbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LXNldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICAgIHNldHRlciA9IHVuY3VycnlUaGlzKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCk7XG4gICAgc2V0dGVyKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICBhbk9iamVjdChPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHVuY3VycnlUaGlzKCRwcm9wZXJ0eUlzRW51bWVyYWJsZSk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgT2JqZWN0LnsgZW50cmllcywgdmFsdWVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVE9fRU5UUklFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBrZXkgPSBrZXlzW2krK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IHByb3BlcnR5SXNFbnVtZXJhYmxlKE8sIGtleSkpIHtcbiAgICAgICAgcHVzaChyZXN1bHQsIFRPX0VOVFJJRVMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4gIGVudHJpZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYE9iamVjdC52YWx1ZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbi8vIGBPcmRpbmFyeVRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb3JkaW5hcnl0b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChwcmVmID09PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoaXNDYWxsYWJsZShmbiA9IGlucHV0LnZhbHVlT2YpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAocHJlZiAhPT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChrZXlzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCB2YWx1ZTogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9O1xuICB9XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJykuQ09ORklHVVJBQkxFO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlO1xuICB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7XG4gIHZhciBuYW1lID0gb3B0aW9ucyAmJiBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiAgdmFyIHN0YXRlO1xuICBpZiAoaXNDYWxsYWJsZSh2YWx1ZSkpIHtcbiAgICBpZiAoU3RyaW5nKG5hbWUpLnNsaWNlKDAsIDcpID09PSAnU3ltYm9sKCcpIHtcbiAgICAgIG5hbWUgPSAnWycgKyBTdHJpbmcobmFtZSkucmVwbGFjZSgvXlN5bWJvbFxcKChbXildKilcXCkvLCAnJDEnKSArICddJztcbiAgICB9XG4gICAgaWYgKCFoYXNPd24odmFsdWUsICduYW1lJykgfHwgKENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FICYmIHZhbHVlLm5hbWUgIT09IG5hbWUpKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodmFsdWUsICduYW1lJywgbmFtZSk7XG4gICAgfVxuICAgIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpO1xuICAgIGlmICghc3RhdGUuc291cmNlKSB7XG4gICAgICBzdGF0ZS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBuYW1lID09ICdzdHJpbmcnID8gbmFtZSA6ICcnKTtcbiAgICB9XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKHRoaXMpICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXNPd24oaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZTtcbiIsInZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjE5LjAnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMjEgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jb25zdHJ1Y3RvcicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgU3BlY2llc0NvbnN0cnVjdG9yYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUNvbnN0cnVjdG9yKFMpO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7XG4gICAgdmFyIFMgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyT3JJbmZpbml0eShwb3MpO1xuICAgIHZhciBzaXplID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBmaXJzdCA9IGNoYXJDb2RlQXQoUywgcG9zaXRpb24pO1xuICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICAgIHx8IChzZWNvbmQgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBjaGFyQXQoUywgcG9zaXRpb24pXG4gICAgICAgICAgOiBmaXJzdFxuICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBzdHJpbmdTbGljZShTLCBwb3NpdGlvbiwgcG9zaXRpb24gKyAyKVxuICAgICAgICAgIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuICBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxuICBjaGFyQXQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgd2hpdGVzcGFjZSA9ICdbJyArIHdoaXRlc3BhY2VzICsgJ10nO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cCh3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgbHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBydHJpbSwgJycpO1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1SaWdodCwgdHJpbUVuZCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1cbiAgdHJpbTogY3JlYXRlTWV0aG9kKDMpXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgRnVuY3Rpb24gPSBnbG9iYWwuRnVuY3Rpb247XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGxvY2F0aW9uLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudHJ5IHtcbiAgLy8gRGVubyB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciBvbiBgbG9jYXRpb25gIGFjY2VzcyB3aXRob3V0IGAtLWxvY2F0aW9uYCBmbGFnXG4gIGxvY2F0aW9uID0gZ2xvYmFsLmxvY2F0aW9uO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChoYXNPd24ocXVldWUsIGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBwb3N0ID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWwucG9zdE1lc3NhZ2UoU3RyaW5nKGlkKSwgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwcGx5KGlzQ2FsbGFibGUoZm4pID8gZm4gOiBGdW5jdGlvbihmbiksIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKFxuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmXG4gICAgaXNDYWxsYWJsZShnbG9iYWwucG9zdE1lc3NhZ2UpICYmXG4gICAgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmXG4gICAgbG9jYXRpb24gJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOicgJiZcbiAgICAhZmFpbHMocG9zdClcbiAgKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCIvLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyT3JJbmZpbml0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvaW50ZWdlcm9yaW5maW5pdHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBudW1iZXIgPSArYXJndW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gc2FmZVxuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IChudW1iZXIgPiAwID8gZmxvb3IgOiBjZWlsKShudW1iZXIpO1xufTtcbiIsInZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXJPckluZmluaXR5KGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gIH1cbiAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdudW1iZXInO1xuICByZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgcHJlZik7XG59O1xuIiwidmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ1N5bWJvbCcpIHRocm93IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcnKTtcbiAgcmV0dXJuIFN0cmluZyhhcmd1bWVudCk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIFN0cmluZyhhcmd1bWVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG59O1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzeW1ib2xGb3IgPSBTeW1ib2wgJiYgU3ltYm9sWydmb3InXTtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXNPd24oV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSB8fCAhKE5BVElWRV9TWU1CT0wgfHwgdHlwZW9mIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9PSAnc3RyaW5nJykpIHtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSAnU3ltYm9sLicgKyBuYW1lO1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpKSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgfSBlbHNlIGlmIChVU0VfU1lNQk9MX0FTX1VJRCAmJiBzeW1ib2xGb3IpIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IHN5bWJvbEZvcihkZXNjcmlwdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbChkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07XG59O1xuIiwiLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgY2xlYXJFcnJvclN0YWNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsZWFyLWVycm9yLXN0YWNrJyk7XG52YXIgaW5zdGFsbEVycm9yQ2F1c2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQnKTtcbnZhciBFUlJPUl9TVEFDS19JTlNUQUxMQUJMRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZScpO1xuXG52YXIgRXJyb3IgPSBnbG9iYWwuRXJyb3I7XG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbnZhciAkQWdncmVnYXRlRXJyb3IgPSBmdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UgLyogLCBvcHRpb25zICovKSB7XG4gIHZhciB0aGF0ID0gaXNQcm90b3R5cGVPZihBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSwgdGhpcykgPyB0aGlzIDogY3JlYXRlKEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlKTtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgdGhhdCA9IHNldFByb3RvdHlwZU9mKG5ldyBFcnJvcih1bmRlZmluZWQpLCBnZXRQcm90b3R5cGVPZih0aGF0KSk7XG4gIH1cbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgbm9ybWFsaXplU3RyaW5nQXJndW1lbnQobWVzc2FnZSwgJycpKTtcbiAgaWYgKEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ3N0YWNrJywgY2xlYXJFcnJvclN0YWNrKHRoYXQuc3RhY2ssIDEpKTtcbiAgaW5zdGFsbEVycm9yQ2F1c2UodGhhdCwgb3B0aW9ucyk7XG4gIHZhciBlcnJvcnNBcnJheSA9IFtdO1xuICBpdGVyYXRlKGVycm9ycywgcHVzaCwgeyB0aGF0OiBlcnJvcnNBcnJheSB9KTtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdlcnJvcnMnLCBlcnJvcnNBcnJheSk7XG4gIHJldHVybiB0aGF0O1xufTtcblxuaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZigkQWdncmVnYXRlRXJyb3IsIEVycm9yKTtcbmVsc2UgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcygkQWdncmVnYXRlRXJyb3IsIEVycm9yKTtcblxudmFyIEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlID0gJEFnZ3JlZ2F0ZUVycm9yLnByb3RvdHlwZSA9IGNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAkQWdncmVnYXRlRXJyb3IpLFxuICBtZXNzYWdlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJycpLFxuICBuYW1lOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJ0FnZ3JlZ2F0ZUVycm9yJylcbn0pO1xuXG4vLyBgQWdncmVnYXRlRXJyb3JgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFnZ3JlZ2F0ZS1lcnJvci1jb25zdHJ1Y3RvclxuJCh7IGdsb2JhbDogdHJ1ZSB9LCB7XG4gIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3Jcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmluZDtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG52YXIgRklORCA9ICdmaW5kJztcbnZhciBTS0lQU19IT0xFUyA9IHRydWU7XG5cbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoRklORCBpbiBbXSkgQXJyYXkoMSlbRklORF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFNLSVBTX0hPTEVTIH0sIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKEZJTkQpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogZnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgQVJSQVlfSVRFUkFUT1IgPSAnQXJyYXkgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfSVRFUkFUT1IpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllc1xuLy8gYEFycmF5LnByb3RvdHlwZS5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnZhbHVlc1xuLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4vLyBgQ3JlYXRlQXJyYXlJdGVyYXRvcmAgaW50ZXJuYWwgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7XG4gIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKztcbiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkge1xuICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogaW5kZXgsIGRvbmU6IGZhbHNlIH07XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogdGFyZ2V0W2luZGV4XSwgZG9uZTogZmFsc2UgfTtcbiAgcmV0dXJuIHsgdmFsdWU6IFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGRvbmU6IGZhbHNlIH07XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGV1bm1hcHBlZGFyZ3VtZW50c29iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYE1hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLW9iamVjdHNcbmNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0ludGVncmFsTnVtYmVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlcicpO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNJbnRlZ2VyOiBpc0ludGVncmFsTnVtYmVyXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTnVtYmVyLmlzTmFOYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzbmFuXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWZsb2F0Jyk7XG5cbi8vIGBOdW1iZXIucGFyc2VGbG9hdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZUZsb2F0XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbnVtYmVyLXBhcnNlZmxvYXQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUZsb2F0ICE9IHBhcnNlRmxvYXQgfSwge1xuICBwYXJzZUZsb2F0OiBwYXJzZUZsb2F0XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlSW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQnKTtcblxuLy8gYE51bWJlci5wYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZWludFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1wYXJzZWludCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUsIGZvcmNlZDogTnVtYmVyLnBhcnNlSW50ICE9IHBhcnNlSW50IH0sIHtcbiAgcGFyc2VJbnQ6IHBhcnNlSW50XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoTykge1xuICAgIHJldHVybiAkZW50cmllcyhPKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIHNldFByb3RvdHlwZU9mOiBzZXRQcm90b3R5cGVPZlxufSk7XG4iLCJ2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZycpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVycm9yIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxudmFyIFBST01JU0VfQU5ZX0VSUk9SID0gJ05vIG9uZSBwcm9taXNlIHJlc29sdmVkJztcblxuLy8gYFByb21pc2UuYW55YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbnlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFueTogZnVuY3Rpb24gYW55KGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBBZ2dyZWdhdGVFcnJvciA9IGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJyk7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yc1tpbmRleF0gPSBlcnJvcjtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgTmF0aXZlUHJvbWlzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3RvcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIE5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10uY2FsbCh7IHRoZW46IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSBpc0NhbGxhYmxlKG9uRmluYWxseSk7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuXG4vLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNmaW5hbGx5YCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbmlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2UpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J107XG4gIGlmIChOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddICE9PSBtZXRob2QpIHtcbiAgICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfQlJPV1NFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3NlcicpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZSAmJiBOYXRpdmVQcm9taXNlLnByb3RvdHlwZTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlO1xudmFyIFByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcbnZhciBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eTtcblxudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIE5BVElWRV9SRUpFQ1RJT05fRVZFTlQgPSBpc0NhbGxhYmxlKGdsb2JhbC5Qcm9taXNlUmVqZWN0aW9uRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG5cbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuO1xuXG52YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkge1xuICB2YXIgUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgPSBpbnNwZWN0U291cmNlKFByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgIT09IFN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO1xuICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAvLyBXZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UgJiYgVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAvLyBXZSBuZWVkIFByb21pc2UjZmluYWxseSBpbiB0aGUgcHVyZSB2ZXJzaW9uIGZvciBwcmV2ZW50aW5nIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgaWYgKElTX1BVUkUgJiYgIVByb21pc2VQcm90b3R5cGVbJ2ZpbmFsbHknXSkgcmV0dXJuIHRydWU7XG4gIC8vIFdlIGNhbid0IHVzZSBAQHNwZWNpZXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4gIC8vIGRlb3B0aW1pemF0aW9uIGFuZCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5XG4gIGlmIChWOF9WRVJTSU9OID49IDUxICYmIC9uYXRpdmUgY29kZS8udGVzdChQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSkpIHJldHVybiBmYWxzZTtcbiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICB9O1xuICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgaWYgKCFTVUJDTEFTU0lORykgcmV0dXJuIHRydWU7XG4gIC8vIFVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgcmV0dXJuICFHTE9CQUxfQ09SRV9KU19QUk9NSVNFICYmIElTX0JST1dTRVIgJiYgIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQ7XG59KTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiBpc0NhbGxhYmxlKHRoZW4gPSBpdC50aGVuKSA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAoc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9ucztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PSBGVUxGSUxMRUQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gY2hhaW5baW5kZXgrK107XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQoc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICBjYWxsKHRoZW4sIHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoSVNfVU5IQU5ETEVEKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKElTX05PREUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50O1xufTtcblxudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNhbGwodGFzaywgZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgaWYgKElTX05PREUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7XG4gIH0pO1xufTtcblxudmFyIGJpbmQgPSBmdW5jdGlvbiAoZm4sIHN0YXRlLCB1bndyYXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZuKHN0YXRlLCB2YWx1ZSwgdW53cmFwKTtcbiAgfTtcbn07XG5cbnZhciBpbnRlcm5hbFJlamVjdCA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7XG4gIG5vdGlmeShzdGF0ZSwgdHJ1ZSk7XG59O1xuXG52YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdGUuZmFjYWRlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgdmFyIHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKTtcbiAgICBpZiAodGhlbikge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IGRvbmU6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbCh0aGVuLCB2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRCkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICBhQ2FsbGFibGUoZXhlY3V0b3IpO1xuICAgIGNhbGwoSW50ZXJuYWwsIHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHN0YXRlLCBlcnJvcik7XG4gICAgfVxuICB9O1xuICBQcm9taXNlUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBbXSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoUHJvbWlzZVByb3RvdHlwZSwge1xuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbnMgPSBzdGF0ZS5yZWFjdGlvbnM7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IGlzQ2FsbGFibGUob25GdWxmaWxsZWQpID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IGlzQ2FsbGFibGUob25SZWplY3RlZCkgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgICByZWFjdGlvbnNbcmVhY3Rpb25zLmxlbmd0aF0gPSByZWFjdGlvbjtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcblxuICBpZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlKSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGUudGhlbjtcblxuICAgIGlmICghU1VCQ0xBU1NJTkcpIHtcbiAgICAgIC8vIG1ha2UgYFByb21pc2UjdGhlbmAgcmV0dXJuIGEgcG9seWZpbGxlZCBgUHJvbWlzZWAgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBjYWxsKG5hdGl2ZVRoZW4sIHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG5cbiAgICAgIC8vIG1ha2VzIHN1cmUgdGhhdCBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzIGBQcm9taXNlI2NhdGNoYCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbiAgICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICdjYXRjaCcsIFByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10sIHsgdW5zYWZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIG1ha2UgYC5jb25zdHJ1Y3RvciA9PT0gUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIHRyeSB7XG4gICAgICBkZWxldGUgTmF0aXZlUHJvbWlzZVByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcbiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbiAgICAvLyBtYWtlIGBpbnN0YW5jZW9mIFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIHNldFByb3RvdHlwZU9mKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsIFByb21pc2VQcm90b3R5cGUpO1xuICAgIH1cbiAgfVxufVxuXG4kKHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvclxufSk7XG5cbnNldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpO1xuc2V0U3BlY2llcyhQUk9NSVNFKTtcblxuUHJvbWlzZVdyYXBwZXIgPSBnZXRCdWlsdEluKFBST01JU0UpO1xuXG4vLyBzdGF0aWNzXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZWplY3RcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgY2FsbChjYXBhYmlsaXR5LnJlamVjdCwgdW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoSVNfUFVSRSAmJiB0aGlzID09PSBQcm9taXNlV3JhcHBlciA/IFByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgLy8gYFByb21pc2UuYWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoYXJBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlJykuY2hhckF0O1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIFNUUklOR19JVEVSQVRPUiA9ICdTdHJpbmcgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiB0b1N0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIihmdW5jdGlvbiAoKSB7XG4gIHZhciB2YWxpZGF0b3IgPSBuZXcgUmVnRXhwKFwiXlthLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfSRcIiwgXCJpXCIpO1xuXG4gIGZ1bmN0aW9uIGdlbihjb3VudCkge1xuICAgIHZhciBvdXQgPSBcIlwiO1xuICAgIGZvciAodmFyIGk9MDsgaTxjb3VudDsgaSsrKSB7XG4gICAgICBvdXQgKz0gKCgoMStNYXRoLnJhbmRvbSgpKSoweDEwMDAwKXwwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gR3VpZChndWlkKSB7XG4gICAgaWYgKCFndWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudDsgYHZhbHVlYCBoYXMgbm8gdmFsdWUuXCIpO1xuICAgICAgXG4gICAgdGhpcy52YWx1ZSA9IEd1aWQuRU1QVFk7XG4gICAgXG4gICAgaWYgKGd1aWQgJiYgZ3VpZCBpbnN0YW5jZW9mIEd1aWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBndWlkLnRvU3RyaW5nKCk7XG5cbiAgICB9IGVsc2UgaWYgKGd1aWQgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGd1aWQpID09PSBcIltvYmplY3QgU3RyaW5nXVwiICYmIEd1aWQuaXNHdWlkKGd1aWQpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcikge1xuICAgICAgLy8gQ29tcGFyaW5nIHN0cmluZyBgdmFsdWVgIGFnYWluc3QgcHJvdmlkZWQgYGd1aWRgIHdpbGwgYXV0by1jYWxsXG4gICAgICAvLyB0b1N0cmluZyBvbiBgZ3VpZGAgZm9yIGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBHdWlkLmlzR3VpZChvdGhlcikgJiYgdGhpcy52YWx1ZSA9PSBvdGhlcjtcbiAgICB9O1xuXG4gICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gR3VpZC5FTVBUWTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgR3VpZC5FTVBUWSA9IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG5cbiAgR3VpZC5pc0d1aWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodmFsdWUgaW5zdGFuY2VvZiBHdWlkIHx8IHZhbGlkYXRvci50ZXN0KHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgfTtcblxuICBHdWlkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgR3VpZChbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpKTtcbiAgfTtcblxuICBHdWlkLnJhdyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpO1xuICB9O1xuXG4gIGlmKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEd1aWQ7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJykge1xuICAgIHdpbmRvdy5HdWlkID0gR3VpZDtcbiAgfVxufSkoKTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIF9kYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzOiBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscygpOiBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXJDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQsIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nLCBwcml2YXRlIF9maWVsZElkPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkLCB3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0LmdldEZpbHRlcnNBc3luYygpLnRoZW48Q29udHJhY3QuRmlsdGVyPigoZmlsdGVycykgPT4ge1xuICAgICAgLy8gVE9ETzogRmlsdGVyaW5nIG9mIHRoZSBmaWx0ZXJzIHNob3VsZCBldmVudHVhbGx5IGJlIGRvbmUgcGxhdGZvcm0gc2lkZS5cbiAgICAgIGNvbnN0IGV2ZW50ZWRGaWx0ZXIgPSB0aGlzLmZpZWxkSWRcbiAgICAgICAgPyBmaWx0ZXJzLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkSWQgPT09IHRoaXMuZmllbGRJZCwgdGhpcylcbiAgICAgICAgOiBmaWx0ZXJzLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkTmFtZSA9PT0gdGhpcy5maWVsZE5hbWUsIHRoaXMpO1xuXG4gICAgICBpZiAoIWV2ZW50ZWRGaWx0ZXIpIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGhpdCB0aGlzIHVubGVzcyB0aGUgZmlsdGVyIHdhcyByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldFxuICAgICAgICAvLyBhZnRlciB0aGUgZXZlbnQgd2FzIHJhaXNlZC5cbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLk1pc3NpbmdGaWx0ZXIsIGBjYW5ub3QgZmluZCBmaWx0ZXI6ICR7dGhpcy5fZmllbGROYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZlbnRlZEZpbHRlcjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgTWFya3NTZWxlY3RlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuTWFya3NTZWxlY3RlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMud29ya3NoZWV0LmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFBhcmFtZXRlcnNTZXJ2aWNlLCBTZXJ2aWNlTmFtZXMsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi4vTW9kZWxzL1BhcmFtZXRlcic7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVGFibGVhdVNoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVTaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dsb2JhbEZpZWxkTmFtZTogc3RyaW5nLCBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQsIHNoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlcj4ge1xuICAgIC8vIENhbGwgZG93biB0byBvdXIgc2VydmljZSB0byBnZXQgdGhlIHBhcmFtZXRlciBiYWNrIHZpYSBpdHMgZmllbGQgbmFtZVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5R2xvYmFsRmllbGROYW1lQXN5bmModGhpcy5fZ2xvYmFsRmllbGROYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nUGFyYW1ldGVyLCBgQ2Fubm90IGZpbmQgcGFyYW1ldGVyOiAke3RoaXMuX2dsb2JhbEZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXIocGFyYW1ldGVySW1wbCwgdGhpcy5zaGVldCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLlN1bW1hcnlEYXRhQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdUV2ZW50IHtcbiAgcHJpdmF0ZSBfdHlwZTogVGFibGVhdUV2ZW50VHlwZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1U2hlZXRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVTaGVldEV2ZW50IHtcbiAgcHJpdmF0ZSBfc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0O1xuXG4gIHB1YmxpYyBnZXQgc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICAgIHJldHVybiB0aGlzLl9zaGVldDtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXMuX3NoZWV0ID0gc2hlZXQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVXb3Jrc2hlZXRFdmVudCB7XG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBwcm90ZWN0ZWQgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIodHlwZSwgX3dvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSA9ICdCZW50b24gU2FucyBMb3ctRFBJJztcblxuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIEJvb2snO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIEJvb2sgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWknO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBTZW1pRGVtaSBJdGFsaWMnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBMaWdodCc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBNZWRpdW0nO1xuXG5leHBvcnQgY29uc3QgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlczogTW9kZWxbXSA9IFtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xpZ2h0Rm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0ZWRTZXJ2ZXIgaW1wbGVtZW50cyBDb250cmFjdC5Db25uZWN0ZWRTZXJ2ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF91c2VySWQ/OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9zaXRlSWQ/OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9zaXRlTmFtZXNwYWNlPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfd29ya2Jvb2tJZD86IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgdXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l0ZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NpdGVJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l0ZU5hbWVzcGFjZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlTmFtZXNwYWNlO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9va0lkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgRGF0YVNvdXJjZSwgRGF0YVNvdXJjZUltcGwsIERhdGFTb3VyY2VTZXJ2aWNlLCBTZXJ2aWNlTmFtZXMsIFdvcmtib29rSW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbldvcmtib29rSW1wbCBleHRlbmRzIFdvcmtib29rSW1wbCB7XG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldEFsbERhdGFTb3VyY2VzQXN5bmMoKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3QgZGF0YVNvdXJjZXM6IEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+ID0gW107XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIE9iamVjdC52YWx1ZXMoZGF0YVNjaGVtYS5kYXRhU291cmNlcykuZm9yRWFjaCgoZHMpID0+IHtcbiAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkcykpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTb3VyY2VJbmZvOiBEYXRhU291cmNlSW5mbyk6IERhdGFTb3VyY2Uge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VJbXBsID0gbmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2VJbmZvLCBFeHRlbnNpb25zUmVnaXN0cnlJZCk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMsIFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb250ZXh0TWVudUV2ZW50LFxuICBEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLFxuICBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvLFxuICBGb250TmFtZUFuZEluZm8sXG4gIEZvcm1hdHRpbmdTaGVldCxcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25JZCxcbiAgUGFyYW1ldGVySWQsXG4gIFNoZWV0UGF0aCxcbiAgVmVyYklkLFxuICBXb3JrYm9va0Zvcm1hdHRpbmcsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEFwaVZlcnNpb24sXG4gIERhc2hib2FyZEltcGwsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2hlZXRJbmZvSW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIFZpelNlcnZpY2UsXG4gIFdvcmtzaGVldEltcGwsXG4gIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCxcbiAgcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuLi9Nb2RlbHMvRGFzaGJvYXJkJztcbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSAnLi4vTW9kZWxzL1dvcmtib29rJztcbmltcG9ydCB7IFdvcmtzaGVldCB9IGZyb20gJy4uL01vZGVscy9Xb3Jrc2hlZXQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ29udGVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvRW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuLi9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9VSSc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQsIHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvICYmIHRoaXMuaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yKSkge1xuICAgICAgICB0aGlzLmRhc2hib2FyZENvbnRlbnQgPSB0aGlzLmluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yLmRhc2hib2FyZFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uWm9uZUlkID0gcmVzdWx0LmV4dGVuc2lvbkRhc2hib2FyZEluZm8uZXh0ZW5zaW9uWm9uZUlkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pIHtcbiAgICAgICAgdGhpcy53b3Jrc2hlZXRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplV29ya3NoZWV0Q29udGVudChyZXN1bHQuZXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50KTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhyZXN1bHQuZXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTtcbiAgICAgIHRoaXMudWkgPSBuZXcgVUkobmV3IFVJSW1wbCgpKTtcbiAgICAgIHRoaXMud29ya2Jvb2sgPSBuZXcgV29ya2Jvb2sobmV3IEV4dGVuc2lvbldvcmtib29rSW1wbCgpKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgICAgICB0aGlzLmFwcGx5QWxsRm9ybWF0dGluZyhyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZCwgc2V0dXAgbGlzdGVuZXJzIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXRcbiAgICAgIC8vIGFyZSBtZWFudCB0byBiZSB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBjb250ZXh0IG1lbnUgaXRlbSBpcyBjbGlja2VkLlxuICAgICAgdGhpcy5pbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnMpO1xuXG4gICAgICAvLyBBbHNvIHNldCB1cCBsaXN0ZW5lcnMgZm9yIEV4dGVuc2lvblN0eWxlc0NoYW5nZWRFdmVudFxuICAgICAgdGhpcy5pbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcik7XG5cbiAgICAgIC8vIEluIHRoZSBub3JtYWwgaW5pdGlhbGl6YXRpb24gY2FzZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy4gIFdoZW4gcmV0dXJuaW5nIGZyb20gaW5pdGlhbGl6ZUFzeW5jIHRvIHRoZVxuICAgICAgLy8gZGV2ZWxvcGVyLCB3ZSBqdXN0IGluZ29yZSB0aGF0IHN0cmluZy4gIEluIHRoZSBjYXNlIG9mIGluaXRpYWxpemluZyBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2csIHRoaXMgc3RyaW5nXG4gICAgICAvLyBpcyBhbiBvcHRpb25hbCBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICAgIHJldHVybiByZXN1bHQuZXh0ZW5zaW9uRGlhbG9nUGF5bG9hZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUFsbEZvcm1hdHRpbmcoZm9ybWF0dGluZ01vZGVsOiBXb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5fc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudC5pZCA9ICdUYWJsZWF1LUV4dGVuc2lvbi1Gb3JtYXR0aW5nJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5fc3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCB8fCAhZm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCA9IHRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCBhcyBDU1NTdHlsZVNoZWV0O1xuICAgIHdoaWxlIChzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBmb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXR0aW5nU2hlZXRUb1N0eWxlU2hlZXQoY3VycmVudEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQ6IEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCk6IHZvaWQge1xuICAgIGxldCBzdHlsZUluZm8gPSAnJztcblxuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXM7XG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LWZhbWlseTogJyArIGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250U2l6ZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXNpemU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC13ZWlnaHQ6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtc3R5bGU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbikge1xuICAgICAgc3R5bGVJbmZvICs9ICd0ZXh0LWRlY29yYXRpb246ICcgKyBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmNvbG9yKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2NvbG9yOiAnICsgY3NzUHJvcGVydGllcy5jb2xvciArICc7ICc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3I6IHN0cmluZyA9ICcuJyArIGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5O1xuICAgIGNvbnN0IHJ1bGU6IHN0cmluZyA9IHNlbGVjdG9yICsgJyB7ICcgKyBzdHlsZUluZm8gKyAnIH0nO1xuICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcbiAgICAvLyBVbnJlZ2lzdGVyIGZ1bmN0aW9uIG5vdCB1c2VkIHNpbmNlIHRoZXNlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlXG4gICAgLy8gb2JzZXJ2ZWQgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBleHRlbnNpb24uXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnRGb3JtYXR0aW5nKSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcoZXZlbnRGb3JtYXR0aW5nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgd29ya2Jvb2tGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmb250TmFtZXM6IE1vZGVsW10gPSBbLi4uU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcywgLi4uU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlc107XG4gICAgd29ya2Jvb2tGb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZm9yRWFjaCgoZm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICBpZiAoZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgICBmb250TmFtZXMucHVzaChmb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmb250TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5Gb250TmFtZUxpc3RJdGVtc106IGZvbnROYW1lcyB9O1xuICAgICAgZGlzcGF0Y2hlclxuICAgICAgICAuZXhlY3V0ZShWZXJiSWQuR2V0Rm9udHMsIHBhcmFtZXRlcnMpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEZvbnRzKHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxGb250TmFtZUFuZEluZm8+KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRm9udHMoZm9udHM6IEFycmF5PEZvbnROYW1lQW5kSW5mbz4pOiB2b2lkIHtcbiAgICBmb250cy5mb3JFYWNoKChmb250TmFtZUFuZEluZm8pID0+IHtcbiAgICAgIGlmIChTdXBwb3J0ZWRUYWJsZWF1Rm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVhdUZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMuaW5jbHVkZXMoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSkge1xuICAgICAgICB0aGlzLmxvYWRCZW50b25TYW5zRm9udHMoZm9udE5hbWVBbmRJbmZvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURhc2hib2FyZENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbywgc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBEYXNoYm9hcmRDb250ZW50IHtcbiAgICAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICBjb25zdCBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoaW5mby5uYW1lLCBTaGVldFR5cGUuRGFzaGJvYXJkLCB7IHdpZHRoOiBpbmZvLnNpemUudywgaGVpZ2h0OiBpbmZvLnNpemUuaCB9LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIGNvbnN0IGRhc2hib2FyZEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChzaGVldEluZm9JbXBsLCBpbmZvLnpvbmVzLCBzaGVldFBhdGgsIEV4dGVuc2lvbnNSZWdpc3RyeUlkLCBudWxsLCBpbmZvLmFjdGl2ZURhc2hib2FyZE9iamVjdElkKTtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKGRhc2hib2FyZEltcGwpO1xuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkQ29udGVudChkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya3NoZWV0Q29udGVudChpbmZvOiBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvKTogV29ya3NoZWV0Q29udGVudCB7XG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgaW5mby52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gaW5kZXggcHJvcGVydHkgaXMgZW1iZWRkaW5nIHNwZWNpZmljXG4gICAgICB0cnVlLCAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKFxuICAgICAgc2hlZXRJbmZvSW1wbCxcbiAgICAgIEV4dGVuc2lvbnNSZWdpc3RyeUlkLFxuICAgICAgaW5mby52aXN1YWxJZCxcbiAgICAgIG51bGwsIC8vIHBhcmVudERhc2hib2FyZCBpcyBhbHdheXMgbnVsbCBmb3Igd29ya3NoZWV0IGluIFdvcmtzaGVldENvbnRlbnRcbiAgICAgIG51bGwsIC8vIHBhcmVudFN0b3J5UG9pbnQgaXMgb25seSB1c2VkIGZvciBlbWJlZGRpbmdcbiAgICApO1xuICAgIGNvbnN0IHdvcmtzaGVldCA9IG5ldyBXb3Jrc2hlZXQod29ya3NoZWV0SW1wbCk7XG4gICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXRDb250ZW50KHdvcmtzaGVldCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IFNldHRpbmdzIHtcbiAgICBjb25zdCBzZXR0aW5nc0ltcGwgPSBuZXcgU2V0dGluZ3NJbXBsKHNldHRpbmdzSW5mbyk7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5ncyhzZXR0aW5nc0ltcGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuQ29udGV4dE1lbnVDbGljayxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGNvbnRleHQgbWVudSBldmVudCwgdGhlc2UgYXJlIGFscmVhZHkgZmlsdGVyZWQgb24gYXBpLWNvcmVcbiAgICAgICAgLy8gYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBsb2NhdG9yLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IENvbnRleHRNZW51RXZlbnQpID0+IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBtZW51IElEXG4gICAgICAgIGlmIChjb250ZXh0TWVudUZ1bmN0aW9ucykge1xuICAgICAgICAgIGlmICghY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlY2VpdmVkIHVuZXhwZWN0ZWQgY29udGV4dCBtZW51IElkIGZyb20gZXZlbnQ6ICR7ZXZlbnQuaWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbzogRm9udE5hbWVBbmRJbmZvKTogdm9pZCB7XG4gICAgc3dpdGNoIChmb250TmFtZUFuZEluZm8uZm9udE5hbWUpIHtcbiAgICAgIGNhc2UgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHN0eWxlOiAnaXRhbGljJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAnYXR0ZW1wdGVkIHRvIGxvYWQgdW5zdXBwb3J0ZWQgZm9udDogJHtmb250TmFtZUFuZEluZm8uZm9udE5hbWV9LidgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucywgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSwgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIgaGFzIGJlZW4gbW92ZWQgKGFuZCByZW5hbWVkKSBmcm9tIGFwaS1pbnRlcm5hbC1jb250cmFjdC5cbiAqIEl0IHN1cHBvcnRzIHJ1bm5pbmcgYSBuZXdlciBleHRlcm5hbCBsaWJyYXJ5IGFnYWluc3QgYSBwcmUgMjAxOS4zIGRlc2t0b3AuXG4gKiBTdGFydGluZyBpbiAyMDE5LjMsIHdlIGhhdmUgYSBtZXJnZWQgYm9vdHN0cmFwIHN0eWxlIGZvciBib3RoIGRlc2t0b3AgYW5kIHNlcnZlci5cbiAqIEluIGFkZGl0aW9uLCB0aGUgYWxwaGEgY2hlY2tpbmcgdGhhdCBpcyBoYXBwZW5pbmcgaGVyZSBpcyBub3QgbmVjZXNzYXJ5IGluIGV4dGVybmFsLWFwaS1qc1xuICogIGFmdGVyIDIwMTkuMyBiZWNhdXNlIHRoYXQgY2hlY2tpbmcgaGFwcGVucyBpbiBhcGktcGxhdGZvcm0tanMgKEFwaURpc3BhdGNoZXJUZXN0LnRzKVxuICogVEZTSUQ6IDEwOTE1NjEgdHJhY2tzIGFuIGltcHJvdmVtZW50IHRvIHRoaXMgc3lzdGVtIHRvIG1ha2UgaXQgbGVzcyBjb21wbGV4IGFuZCB0aWUgaXQgZGlyZWN0bHkgdG9cbiAqICB0YWJsZWF1IGJldGEgcmVsZWFzZSB2ZXJzaW9ucy5cbiAqIEBkZXByZWNhdGVkXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgbmFtZXNwYWNlIExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucy5pc0FscGhhID09PSAndW5kZWZpbmVkJykgJiYgIXdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ1RoaXMgaXMgYSBiZXRhIHZlcnNpb24gb2YgdGhlIEV4dGVuc2lvbnMgQVBJLiBQbGVhc2UgdXBncmFkZSB0byBhbiBvZmZpY2lhbCByZWxlYXNlLicpO1xuICAgICAgd2luZG93Ll9fd2FybmluZ0lzc3VlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zPy5pc0FscGhhICYmIHdpbmRvdy5fX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2UpIHtcbiAgICAgIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlclxuICAgICAgICAudGhlbigoZGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlckZhY3RvcnkoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG4gICAgICAgICAgZGlzcGF0Y2hlci5leGVjdXRlKFZlcmJJZC5CbG9ja0V4dGVuc2lvbiwge30pLmNhdGNoKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgd2lsbCBiZSB1bmRlZmluZWQgaWYgcHJvbWlzZSBpcyByZWplY3RlZCBvciB0aHJvd3NcbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PjtcbiAgICBfX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2U6IGJvb2xlYW47XG4gICAgX193YXJuaW5nSXNzdWVkOiBib29sZWFuO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBOb3RpZmljYXRpb25JZCwgU2V0dGluZ3NFdmVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEVycm9ySGVscGVycyxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuLi9FdmVudHMvVGFibGVhdUV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbmNsYXNzIFNldHRpbmdzQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuU2V0dGluZ3NDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmV3U2V0dGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5ld1NldHRpbmdzKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX25ld1NldHRpbmdzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0ltcGwge1xuICBwcml2YXRlIHN0YXRpYyBBU1lOQ19TQVZFX0lOX1BST0dSRVNTID0gJ0FzeW5jIFNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHVwZGF0aW5nIHNldHRpbmdzIGlzIG5vdCBhbGxvd2VkLic7XG4gIHByaXZhdGUgX2lzTW9kaWZpZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2N1cnJlbnRTZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uO1xuXG4gIC8vIFNpbmNlIHByb21pc2VzIGNhbid0IGJlIGludHJvc3BlY3RlZCBmb3Igc3RhdGUsIGtlZXAgYSB2YXJpYWJsZSB0aGF0XG4gIC8vIGluZGljYXRlcyBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHNvIHRoYXQgc2V0L2VyYXNlIGNhbid0IGJlIGNhbGxlZCBkdXJpbmcgYSBzYXZlLlxuICBwcml2YXRlIF9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbyk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgLy8gT25seSBtYWtlIGEgbW9kaWZpY2F0aW9uIGlmIHdlIGhhdmUgdGhlIGtleSBhbHJlYWR5XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldKSB7XG4gICAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICAgICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICAvLyBSZXR1cm5zIGEgbXV0YWJsZSBjb3B5IG9mIHRoZSBzZXR0aW5nc1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgLy8gSnVzdCByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIHNldHRpbmdzIGFyZSB1bmNoYW5nZWRcbiAgICBpZiAoIXRoaXMuX2lzTW9kaWZpZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmU8U2V0dGluZ3NDb2xsZWN0aW9uPih0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgc2V0dGluZ3Mgc2VydmljZSB0byBzYXZlIHNldHRpbmdzIHRvIHR3YlxuICAgIGNvbnN0IHNldHRpbmdzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2V0dGluZ3NTZXJ2aWNlPihcbiAgICAgIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlLFxuICAgICk7XG5cbiAgICByZXR1cm4gc2V0dGluZ3NTZXJ2aWNlLnNhdmVTZXR0aW5nc0FzeW5jKHRoaXMuX2N1cnJlbnRTZXR0aW5ncykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KFxuICAgICAgKG5ld1NldHRpbmdzKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gbmV3U2V0dGluZ3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jdXJyZW50U2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3U2V0dGluZ3M7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGtleSwgJ2tleScpOyAvLyBLZXkgc2hvdWxkbid0IGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlLCAndmFsdWUnKTsgLy8gRW1wdHkgc3RyaW5nIHZhbHVlIGlzIGFsbG93ZWQuXG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gc2V0dGluZ3Mgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IGEgc2V0dGluZ3NVcGRhdGUgZXZlbnQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U2V0dGluZ3NDaGFuZ2VkRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuU2V0dGluZ3NDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlNldHRpbmdzQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnQ6IFNldHRpbmdzRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gZXZlbnQubmV3U2V0dGluZ3M7XG4gICAgICAgIHNldHRpbmdzQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoZXZlbnQubmV3U2V0dGluZ3MpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChzZXR0aW5nc0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8sICdzZXR0aW5nc0luZm8nKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcywgJ3NldHRpbmdzSW5mby5TZXR0aW5nc1ZhbHVlcycpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gc2V0dGluZ3NJbmZvLnNldHRpbmdzVmFsdWVzO1xuXG4gICAgLy8gUmVzZXQgdGhlIGlzTW9kaWZpZWQgZmxhZ1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGhlbHBlciBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgbG9jYWwgdXBkYXRlIHRvIHRoaXMuY3VycmVudFNldHRpbmdzLlxuICAgKiBDaGVja3MgaWYgYSBjdXJyZW50IHNhdmUgY2FsbCBpcyBzdGlsbCBpbiBwcm9ncmVzcyBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIHNvLlxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zYXZlSW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLlNldHRpbmdTYXZlSW5Qcm9ncmVzcywgU2V0dGluZ3NJbXBsLkFTWU5DX1NBVkVfSU5fUFJPR1JFU1MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgVGFibGVhdUJvb2tGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBSZWd1bGFyJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgU2VtaWJvbGQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9vayc7XG5leHBvcnQgY29uc3QgVGFibGVhdUJvbGRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBCb2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBMaWdodCc7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IE1lZGl1bSc7XG5leHBvcnQgY29uc3QgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWUgPSAnVGFibGVhdSBSZWd1bGFyJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBTZW1pIEJvbGQnO1xuXG5leHBvcnQgY29uc3QgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlczogTW9kZWxbXSA9IFtcbiAgVGFibGVhdUJvb2tGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG5dO1xuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgTm90aWZpY2F0aW9uU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgVUlJbXBsIHtcbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdWlTZXJ2aWNlXG4gICAgICAgIC5kaXNwbGF5RGlhbG9nQXN5bmModXJsLCBwYXlsb2FkIHx8ICcnLCBvcHRpb25zKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5yZWdpc3RlckZuID0gbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICAgICAgICBOb3RpZmljYXRpb25JZC5FeHRlbnNpb25EaWFsb2dVcGRhdGUsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBkaWFsb2cgdXBkYXRlIGV2ZW50XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChldmVudDogRGlhbG9nVXBkYXRlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmlzQ2xvc2VFdmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5jbG9zZVBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdjbG9zZVBheWxvYWQgaXMgdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnQuY2xvc2VQYXlsb2FkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkRpYWxvZ0Nsb3NlZEJ5VXNlciwgJ0V4dGVuc2lvbiBkaWFsb2cgY2xvc2VkIGJ5IHVzZXIuJykpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdW5yZWdpc3RlckZuKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsIFRhYmxlYXVFdmVudFR5cGUsIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBEYXNoYm9hcmRPYmplY3RJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0JztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsKSB7XG4gICAgc3VwZXIoX2Rhc2hib2FyZEltcGwpO1xuICAgIF9kYXNoYm9hcmRJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC53b3Jrc2hlZXRzSW1wbC5tYXAoKHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm9iamVjdHMubWFwKChkYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhc2hib2FyZE9iamVjdChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFjdGl2ZURhc2hib2FyZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9uZVZpc2liaWxpdHlBc3luYyh6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5zZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgcmV0dXJuIHpvbmUgJiYgbmV3IERhc2hib2FyZE9iamVjdCh6b25lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuXG4gICAgLy8gSW5pdGlhbGl6aW5nIGV2ZW50cyBhbmQgcmVnaXN0ZXJpbmcgbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVybiAoYWxsb3dzIHVuaXQgdGVzdGluZyB3aXRob3V0IE5vdGlmaWNhdGlvblNlcnZpY2UgbW9jaylcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPERhc2hib2FyZExheW91dENoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkRhc2hib2FyZExheW91dENoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEYXNoYm9hcmRMYXlvdXRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gdGhpcy5fZGFzaGJvYXJkSW1wbC51cGRhdGVab25lcyhcbiAgICAgICAgICBldmVudC56b25lcyxcbiAgICAgICAgICBldmVudC5hY3RpdmVab25lSWQsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlRGFzaGJvYXJkTmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KGRhc2hib2FyZE9iamVjdENoYW5nZXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQoZXZlbnRGb3JtYXR0aW5nKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2god29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5tb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwucmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmRhc2hib2FyZEltcGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKSB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuZmllbGRJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBFdmVudExpc3RlbmVyTWFuYWdlcixcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgUGFyYW1ldGVySW1wbCxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgICAgIH0sXG4gICAgICAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU2l6ZSh0aGlzLl9zaGVldEltcGwuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTaXplKHNpemU6IGFueSk6IHNpemUgaXMgQ29udHJhY3QuU2l6ZSB7XG4gICAgY29uc3QgdGVzdFNpemUgPSBzaXplIGFzIENvbnRyYWN0LlNpemU7XG4gICAgaWYgKHRlc3RTaXplLndpZHRoICE9PSB1bmRlZmluZWQgJiYgdGVzdFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcCgocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge31cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSW1wbC5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb2x1bW4sIEZpbHRlclVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsIFRhYmxlYXVFdmVudFR5cGUsIFRvb2x0aXBDb250ZXh0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpbHRlckV2ZW50LCBOb3RpZmljYXRpb25JZCwgU3VtbWFyeURhdGFFdmVudCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBXb3Jrc2hlZXRJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEZpbHRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgTWFya3NTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudCc7XG5pbXBvcnQgeyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgU2hlZXQgfSBmcm9tICcuL1NoZWV0JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldCBleHRlbmRzIFNoZWV0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkge1xuICAgIHN1cGVyKF93b3Jrc2hlZXRJbXBsKTtcblxuICAgIC8vIENhbGwgdG8gaW5pdGlhbGl6ZSBldmVudHMgYW5kIHRoZW4gY2FsbCBkb3duIHRvIHRoZSBldmVudCBsaXN0ZW5lciBtYW5hZ2VyIHRvIGhhbmRsZSB0aGluZ3NcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudERhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBmb3IgRXh0ZW5zaW9ucyBpZiB0aGUgRGFzaGJvYXJkSW1wbHMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgUGFyZW50IGRhc2hib2FyZCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsSWQgPSBtb2RlbCBhcyBWaXN1YWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQpO1xuICAgICAgfSxcbiAgICAgICgpID0+IG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPEZpbHRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkZpbHRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIEZpbHRlckV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgICAgZmlsdGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBGaWx0ZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZmllbGROYW1lLCBldmVudC5maWVsZElkKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlN1bW1hcnlEYXRhQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBTdW1tYXJ5RGF0YUV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBTdW1tYXJ5RGF0YUV2ZW50KSA9PiB7XG4gICAgICAgIHN1bW1hcnlEYXRhRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCh0aGlzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2gobWFya3NFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKGZpbHRlckV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goc3VtbWFyeURhdGFFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb2x1bW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SURBc3luYyhtYXJrc0luZm86IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgdXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdE1hcmtzQnlJZEFzeW5jKG1hcmtzSW5mbywgdXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmMobWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hbm5vdGF0ZU1hcmtBc3luYyhtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0QW5ub3RhdGlvbnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwucmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb24pO1xuICB9XG5cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGU/OiBudW1iZXIsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCB8IG51bGwsIGFsbG93SG92ZXJBY3Rpb25zID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGUsIHRvb2x0aXAsIGFsbG93SG92ZXJBY3Rpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPiwgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwcml2YXRlIHZpc3VhbElkc0FyZUVxdWFsKGE6IFZpc3VhbElkLCBiOiBWaXN1YWxJZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhICYmXG4gICAgICBiICYmXG4gICAgICBhLndvcmtzaGVldCA9PT0gYi53b3Jrc2hlZXQgJiZcbiAgICAgIGEuZGFzaGJvYXJkID09PSBiLmRhc2hib2FyZCAmJlxuICAgICAgYS5zdG9yeWJvYXJkID09PSBiLnN0b3J5Ym9hcmQgJiZcbiAgICAgIGEuc3RvcnlQb2ludElEID09PSBiLnN0b3J5UG9pbnRJRFxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIERhc2hib2FyZENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBEYXNoYm9hcmRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZDogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbkVudmlyb25tZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVZlcnNpb24sIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENvbm5lY3RlZFNlcnZlciB9IGZyb20gJy4uL0ltcGwvQ29ubmVjdGVkU2VydmVyJztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwgfSBmcm9tICcuL1dvcmtib29rRm9ybWF0dGluZ0VudlV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudCBuYW1lc3BhY2UuXG4gKiBFbnZpcm9ubWVudCBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpc1xuICoganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqIEZpcnN0IGNsYXNzIGV4dGVuc2lvbnMgY2FuIGdldCB0byBDb25uZWN0ZWRTZXJ2ZXIgd2l0aDogZW52aXJvbm1lbnRbJ2Nvbm5lY3RlZFNlcnZlciddXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgLyoqVGhlIGZvbGxvd2luZyBpcyBhbiBpbmRleCBzaWduYXR1cmUuIEl0IGFsbG93cyBwcm9wZXJ0aWVzIHRvIGJlIGFjY2Vzc2VkIGJ5IG5hbWUuXG4gICAqIFRoaXMgYWxsb3dzIHVzIHRvIGFkZCBwcm9wZXJ0aWVzIGR5bmFtaWNhbGx5IChzZWUgdXNhZ2Ugb2YgdGhpcy5jb25uZWN0ZWRTZXJ2ZXIgYmVsb3cpIHdpdGhvdXQgVHlwZXNjcmlwdCBlcnJvcnMuXG4gICAqIFRoZSByZWFzb24gd2UgZG8gdGhpcyBpcyBzbyB0aGF0IDNyZC1wYXJ0eSBleHRlbnNpb24gZGV2ZWxvcGVycyBkbyBub3Qgc2VlIHRoZSBjb25uZWN0ZWRTZXJ2ZXIgcHJvcGVydHlcbiAgICogdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSB0byBmaXJzdCBjbGFzcyBleHRlbnNpb24gZGV2ZWxvcGVycy5cbiAgICogVGhlIHR5cGUgb2YgdGhlIGluZGV4IHNpZ2F0dXJlIG5lZWRzIHRvIGJlIGEgdW5pb24gb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9iamVjdCwgc2luY2Ugd2UgY291bGRcbiAgICogYWNjZXNzIGFueSBwcm9wZXJ0eSB1c2luZyB0aGUgcHJvcGVydHkgaW5kZXggbWV0aG9kLlxuICAgKi9cbiAgW3g6IHN0cmluZ106IENvbm5lY3RlZFNlcnZlciB8IHN0cmluZyB8IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hcGlWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRleHQ6IENvbnRyYWN0LkV4dGVuc2lvbkNvbnRleHQ7XG4gIHByaXZhdGUgX2Zvcm1hdHRpbmc/OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvdW50cnk/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nO1xuICBwcml2YXRlIF9tb2RlOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlO1xuICBwcml2YXRlIF9vcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbiAgcHJpdmF0ZSBfdGFibGVhdVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfdW5pcXVlVXNlcklkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQpIHtcbiAgICB0aGlzLl9hcGlWZXJzaW9uID0gQXBpVmVyc2lvbi5JbnN0YW5jZSAmJiBBcGlWZXJzaW9uLkluc3RhbmNlLmZvcm1hdHRlZFZhbHVlOyAvLyBtYWoubWluLmZpeCAobm8gYnVpbGQpXG4gICAgdGhpcy5fY29udGV4dCA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Db250ZXh0LmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCk7XG4gICAgdGhpcy5fZm9ybWF0dGluZyA9IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgdGhpcy5fbGFuZ3VhZ2UgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25MYW5ndWFnZTtcbiAgICB0aGlzLl9jb3VudHJ5ID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ291bnRyeTtcbiAgICB0aGlzLl9sb2NhbGUgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Mb2NhbGU7XG4gICAgdGhpcy5fbW9kZSA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Nb2RlLmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTW9kZSk7XG4gICAgdGhpcy5fb3BlcmF0aW5nU3lzdGVtID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQub3BlcmF0aW5nU3lzdGVtO1xuICAgIHRoaXMuX3RhYmxlYXVWZXJzaW9uID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudGFibGVhdVZlcnNpb247XG4gICAgdGhpcy5fdW5pcXVlVXNlcklkID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudW5pcXVlVXNlcklkO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHVzZXJJZCwgdGhlbiB3ZSBhcmUgYSBmaXJzdCBjbGFzcyBleHRlbnNpb25cbiAgICBpZiAoZXh0ZW5zaW9uRW52aXJvbm1lbnQudXNlcklkKSB7XG4gICAgICB0aGlzLmNvbm5lY3RlZFNlcnZlciA9IG5ldyBDb25uZWN0ZWRTZXJ2ZXIoXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnVzZXJJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQuc2l0ZUlkLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC5zaXRlTmFtZXNwYWNlLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0lkLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5mZWF0dXJlRmxhZ3MgPSBleHRlbnNpb25FbnZpcm9ubWVudC5mZWF0dXJlRmxhZ3M7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhcGlWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rRm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY291bnRyeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb3VudHJ5O1xuICB9XG5cbiAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2RlKCk6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBvcGVyYXRpbmdTeXN0ZW0oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW5nU3lzdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJsZWF1VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZWF1VmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5pcXVlVXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VuaXF1ZVVzZXJJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENhbGxiYWNrTWFwLCBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4uL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBFeHRlbnNpb25zIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnMgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25zIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uSW1wbDogRXh0ZW5zaW9uc0ltcGwpIHtcbiAgICB0aGlzLmV4dGVuc2lvbkltcGwgPSBleHRlbnNpb25JbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRDb250ZW50KCk6IENvbnRyYWN0LkRhc2hib2FyZENvbnRlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZGFzaGJvYXJkQ29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0Q29udGVudCgpOiBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLndvcmtzaGVldENvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVudmlyb25tZW50KCk6IENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmVudmlyb25tZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBDb250cmFjdC5TZXR0aW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5zZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdWkoKTogQ29udHJhY3QuVUkge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwudWk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rKCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtib29rIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLndvcmtib29rO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZXh0ZW5zaW9uWm9uZUlkO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVBc3luYyhjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5pbml0aWFsaXplQXN5bmMoZmFsc2UsIGNvbnRleHRNZW51Q2FsbGJhY2tzKS50aGVuPHZvaWQ+KCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURpYWxvZ0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5pbml0aWFsaXplQXN5bmModHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNldHRpbmdzIGFzIFNldHRpbmdzQ29udHJhY3QgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4uL0ltcGwvU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIHNldHRpbmdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBTZXR0aW5nc0NvbnRyYWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldHRpbmdzSW1wbDogU2V0dGluZ3NJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuZXJhc2Uoa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0KGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5nZXRBbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmlzTW9kaWZpZWQ7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8U2V0dGluZ3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5zYXZlQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuc2V0KGtleSwgdmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBpbXBsZW1lbnRzIENvbnRyYWN0LlVJIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ltcGw6IFVJSW1wbCkge31cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGwuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2ltcGwuY2xvc2VEaWFsb2cocGF5bG9hZCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvbGliL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB7XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKHdvcmtib29rRm9ybWF0dGluZ01vZGVsPzogV29ya2Jvb2tGb3JtYXR0aW5nKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXdvcmtib29rRm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmb3JtYXR0aW5nTWFwOiBBcnJheTxDb250cmFjdC5Gb3JtYXR0aW5nU2hlZXQ+ID0gd29ya2Jvb2tGb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGluZ1NoZWV0OiBDb250cmFjdC5Gb3JtYXR0aW5nU2hlZXQgPSB7XG4gICAgICAgICAgY2xhc3NOYW1lS2V5OiBFbnVtTWFwcGluZ3MuY2xhc3NOYW1lS2V5LmNvbnZlcnQoY3VycmVudEZvcm1hdHRpbmdTaGVldC5jbGFzc05hbWVLZXkpLFxuICAgICAgICAgIGNzc1Byb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgICAgICAgICAgZm9udFNpemU6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LFxuICAgICAgICAgICAgZm9udFN0eWxlOiBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb246IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbixcbiAgICAgICAgICAgIGNvbG9yOiBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuY29sb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRpbmdTaGVldDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgPSB7XG4gICAgICAgIGZvcm1hdHRpbmdTaGVldHM6IGZvcm1hdHRpbmdNYXAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFdvcmtzaGVldENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBXb3Jrc2hlZXRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFeHRlbnNpb25Cb290c3RyYXBJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHNdOiBjb250ZXh0TWVudUlkcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Jc0V4dGVuc2lvbkRpYWxvZ106IGlzRXh0ZW5zaW9uRGlhbG9nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Jbml0aWFsaXplRXh0ZW5zaW9uLCBwYXJhbXMpLnRoZW48RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBUT0RPIC0gVmFsaWRhdGUgcmV0dXJuIHZhbHVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NldHRpbmdzU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2V0dGluZ3NTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3NBc3luYyhzZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZVNldHRpbmdzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNldHRpbmdzVmFsdWVzXTogc2V0dGluZ3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNhdmVFeHRlbnNpb25TZXR0aW5ncywgcGFyYW1ldGVycykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0IGFzIEV4dGVuc2lvblNldHRpbmdzSW5mbztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zZXR0aW5nc1ZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3Igc2F2aW5ncyBzZXR0aW5ncy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdC5zZXR0aW5nc1ZhbHVlcztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlhbG9nT3B0aW9ucywgRGlhbG9nU3R5bGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCwgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMsIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncywgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVCA9IDQwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19XSURUSCA9IDYwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19TVFlMRTogRGlhbG9nU3R5bGUgPSBEaWFsb2dTdHlsZS5XaW5kb3c7XG5cbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVUlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZywgb3B0aW9ucz86IERpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZGlzcGxheURpYWxvZ0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxdOiB1cmwsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF06IHBheWxvYWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGg6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5oZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSBvcHRpb25zICYmIG9wdGlvbnMud2lkdGggPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG4gICAgY29uc3QgZGlhbG9nU3R5bGU6IERpYWxvZ1N0eWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRpYWxvZ1N0eWxlID8gb3B0aW9ucy5kaWFsb2dTdHlsZSA6IERFRkFVTFRfRElBTE9HX1NUWUxFO1xuXG4gICAgLy8gT24gdGhlIHBsYXRmb3JtIHNpZGUsIHdlIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIHJlZ2FyZGVzcyBvZiB3aGV0aGVyIHRoZSBwYXNzZWRcbiAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiAgQnV0IHRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGRldmVsb3BlciBlcnJvcixcbiAgICAvLyBzbyB3ZSB0aHJvdyBhbiBlcnJvciBoZXJlIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gICAgaWYgKGggPD0gMCB8fCB3IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2l6ZSBwYXJhbWV0ZXJzIGZvciBkaXNwbGF5RGlhbG9nQXN5bmMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nSF0gPSBoO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nV10gPSB3O1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGlhbG9nU3R5bGU+KGRpYWxvZ1N0eWxlLCBEaWFsb2dTdHlsZSwgJ0RpYWxvZ1N0eWxlJyk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dTdHlsZV0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MuZGlhbG9nU3R5bGVzLmNvbnZlcnQoZGlhbG9nU3R5bGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRGlzcGxheURpYWxvZywgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZXMuSW52YWxpZERvbWFpbkRpYWxvZyxcbiAgICAgICAgICAgICdUaGUgdXJsIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgbXVzdCBtYXRjaCB0aGUgZG9tYWluIG9mIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBTdWNjZXNzIGNhc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbG9zZURpYWxvZycsXG4gICAgfTtcblxuICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbiwgZXh0ZW5zaW9uWm9uZUlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShjbGlja1Rocm91Z2hFbmFibGVkLCAnYm9vbGVhbicsICdjbGlja1Rocm91Z2hFbmFibGVkJyk7XG5cbiAgICBpZiAoZXh0ZW5zaW9uWm9uZUlkID09PSB1bmRlZmluZWQgfHwgZXh0ZW5zaW9uWm9uZUlkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnRXh0ZW5zaW9uIElkIGlzIGludmFsaWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uWm9uZUlkXTogZXh0ZW5zaW9uWm9uZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLkNsaWNrVGhyb3VnaEVuYWJsZWRdOiBjbGlja1Rocm91Z2hFbmFibGVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRDbGlja1Rocm91Z2gsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFVJU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvVUlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZXR0aW5nc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVUlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG59XG4iLCJleHBvcnQgY29uc3QgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgPSAwO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvQXNrRGF0YUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRGV2aWNlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgVGFibGVhdUV2ZW50VHlwZSBhcyBFbWJlZGRpbmdUYWJsZWF1RXZlbnRUeXBlLFxuICBGaWxlRm9ybWF0cyxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBQdWxzZUxheW91dCxcbiAgU2hlZXRTaXplQmVoYXZpb3IsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXdFdmVudCxcbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgYXMgRW1iZWRkaW5nQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQsXG4gIEZpbHRlckNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdGaWx0ZXJDaGFuZ2VkRXZlbnQsXG4gIE1hcmtzU2VsZWN0ZWRFdmVudCBhcyBFbWJlZGRpbmdNYXJrU2VsZWN0ZWRFdmVudCxcbiAgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ1BhcmFtZXRlckNoYW5nZWRFdmVudCxcbiAgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQsXG4gIFRhYmxlYXVTaGVldEV2ZW50IGFzIEVtYmVkZGluZ1RhYmxlYXVTaGVldEV2ZW50LFxuICBUYWJsZWF1V29ya3NoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVdvcmtzaGVldEV2ZW50LFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nVG9vbGJhclN0YXRlQ2hhbmdlZEV2ZW50LFxuICBGaXJzdFZpelNpemVLbm93bkV2ZW50LFxuICBTdG9yeVBvaW50U3dpdGNoZWRFdmVudCxcbiAgVGFiU3dpdGNoZWRFdmVudCxcbiAgVXJsQWN0aW9uRXZlbnQsXG4gIFZpekxvYWRFcnJvckV2ZW50LFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzRXZlbnQsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFBhcmFtZXRlciBhcyBFbWJlZGRpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5LFxuICBBdXRob3JpbmdXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya3NoZWV0LFxuICBEYXNoYm9hcmQgYXMgRW1iZWRkaW5nRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRW1iZWRkaW5nRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFbWJlZGRpbmdTaGVldCxcbiAgRW1iZWRkaW5nVml6U3RhdGVXaXRoRGF0YU1vZGVsLFxuICBXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nV29ya3NoZWV0LFxuICBIaWVyYXJjaGljYWxMZXZlbHMsXG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeSwgU3RvcnlQb2ludCwgU3RvcnlQb2ludEluZm8gfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXcsXG4gIEF1dGhvcmluZ1dvcmtib29rIGFzIEVtYmVkZGluZ0F1dGhvcmluZ1dvcmtib29rLFxuICBXb3JrYm9vayBhcyBFbWJlZGRpbmdXb3JrYm9vayxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Xb3JrYm9va0ludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL0V2ZW50SW50ZXJmYWNlJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmV4cG9ydCB7XG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCB7IFdvcmtzaGVldENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwLFxuICBEYXNoYm9hcmQgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IFdvcmtib29rIGFzIEV4dGVuc2lvbldvcmtib29rIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvV29ya2Jvb2tJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsImltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXNrLWRhdGE+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZW51bSBBc2tEYXRhQXR0cmlidXRlcyB7XG4gIE9yaWdpbiA9ICdvcmlnaW4nLFxuICBTaG93RW1iZWQgPSAnc2hvdy1lbWJlZCcsXG4gIFNob3dQaW4gPSAnc2hvdy1waW4nLFxuICBTaG93U2F2ZSA9ICdzaG93LXNhdmUnLFxuICBTaG93U2hhcmUgPSAnc2hvdy1zaGFyZScsXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc2tEYXRhU2V0dGluZ3MgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCwgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1iZWQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctZW1iZWQ+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBpbiBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1waW4+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1Bpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzYXZlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXNhdmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2hhcmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2hhcmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NoYXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogIFVzZWQgZm9yIHRlbGVtZXRyeVxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIG9yaWdpbj1cImVtYmVkZGluZ1NpdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICBvcmlnaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBc2tEYXRhIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGEgZXh0ZW5kcyBBc2tEYXRhU2V0dGluZ3Mge31cbiIsIi8vIEFsbCBlbnVtIHZhbHVlcyBtYWRlIGF2YWlsYWJsZSB0byBFbWJlZGRpbmcgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cbi8vIE1vc3Qgb2YgdGhlbSBzaG91bGQgbWF0Y2ggYW4gZW51bSBvbiB0aGUgc2VydmVyIGRlZmluZWQgYXRcbi8vIHdvcmtncm91cC92cWx3ZWIvc2NyaXB0c2hhcnAvc3JjL0FwaVNoYXJlZC9QdWJsaWNFbnVtcy5jcyNMMzk4OjE3XG5cbi8qKlxuICogQ3Jvc3N0YWIgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgVml6LmV4cG9ydENyb3NzdGFiQXN5bmN9XG4gKi9cbmV4cG9ydCBlbnVtIENyb3NzdGFiRmlsZUZvcm1hdCB7XG4gIENTViA9ICdjc3YnLFxuICBFeGNlbCA9ICd4bHN4Jyxcbn1cblxuLyoqXG4gKiBEZXZpY2UgdHlwZXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZGV2aWNlfVxuICovXG5leHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgVGFibGV0ID0gJ3RhYmxldCcsXG4gIFBob25lID0gJ3Bob25lJyxcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIHJlcXVlc3QgdG8gdGhlIGF1dGggZW5kcG9pbnQgZmFpbHMuXG4gICAqL1xuICBBdXRoRmFpbGVkID0gJ2F1dGgtZmFpbGVkJyxcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGlzIG5vdCBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIFRhYmxlYXUgRW1iZWRkaW5nIEFQSVxuICAgKi9cbiAgQnJvd3Nlck5vdENhcGFibGUgPSAnYnJvd3Nlci1ub3QtY2FwYWJsZScsXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgb24gYSB3b3JrYm9vayBvciBhIHZpZXcgZG8gbm90IGFsbG93IGRvd25sb2FkaW5nIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIERvd25sb2FkV29ya2Jvb2tOb3RBbGxvd2VkID0gJ2Rvd25sb2FkLXdvcmtib29rLW5vdC1hbGxvd2VkJyxcbiAgLyoqXG4gICAqIFRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJLiBDb250YWN0IFRhYmxlYXUgU3VwcG9ydC5cbiAgICovXG4gIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEVpdGhlciBhIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLCBvciB0aGUgdmFsdWUgc3VwcGxpZWRcbiAgICogaW4gdGhlIGZpbHRlciBvcGVyYXRpb24gaXMgdGhlIHdyb25nIGRhdGEgdHlwZSBvciBmb3JtYXQuXG4gICAqL1xuICBpbnZhbGlkRmlsdGVyRmllbGROYW1lT3JWYWx1ZSA9ICdpbnZhbGlkLWZpbHRlci1maWVsZC1uYW1lJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZVxuICAgKiBmaWVsZC5cbiAgICovXG4gIEludmFsaWRQYXJhbWV0ZXIgPSAnaW52YWxpZC1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQSBuZWdhdGl2ZSBzaXplIHdhcyBzcGVjaWZpZWQgb3IgdGhlIG1heFNpemUgdmFsdWUgaXMgbGVzcyB0aGFuIG1pblNpemUgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkuXG4gICAqL1xuICBJbnZhbGlkU2l6ZSA9ICdpbnZhbGlkLXNpemUnLFxuICAvKipcbiAgICogQXR0ZW1wdGVkIHRvIGdldCBhbiBhdXRob3Jpbmcgd29ya3NoZWV0IHdoZW4gdGhlIGN1cnJlbnQgc2hlZXQgaXMgbm90IGEgd29ya3NoZWV0LlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBJbnZhbGlkU2hlZXRUeXBlID0gJ2ludmFsaWQtc2hlZXQtdHlwZScsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIHZhbHVlIHdhcyBmb3VuZCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgU2hlZXRTaXplQmVoYXZpb3IgZW51bS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3IgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yJyxcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb3RoZXIgdGhhbiBTaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMgd2FzIHNwZWNpZmllZCBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHRoZSBzaGVldCBpcyBhXG4gICAqIFdvcmtzaGVldCBpbnN0YW5jZS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCA9ICdpbnZhbGlkLXNpemUtYmVoYXZpb3Itb24td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIFRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBWaXogY2xhc3MgY29uc3RydWN0b3IgaXMgbm90IHZhbGlkLlxuICAgKi9cbiAgSW52YWxpZFVybCA9ICdpbnZhbGlkLXVybCcsXG4gIC8qKlxuICAgKiBUaGUgbWF4U2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QuXG4gICAqL1xuICBNaXNzaW5nTWF4U2l6ZSA9ICdtaXNzaW5nLW1heC1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QuXG4gICAqL1xuICBNaXNzaW5nTWluU2l6ZSA9ICdtaXNzaW5nLW1pbi1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIG9yIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UuXG4gICAqL1xuICBNaXNzaW5nTWluTWF4U2l6ZSA9ICdtaXNzaW5nLW1pbi1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIGVtYmVkZGluZyBhcHAgaW50ZXJhY3RzIHdpdGggYSBwYXJhbWV0ZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldC5cbiAgICovXG4gIE1pc3NpbmdQYXJhbWV0ZXIgPSAnbWlzc2luZy1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIHJhbmdlTiBmaWVsZCBpcyBtaXNzaW5nIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIHR5cGUgTEFTVE4gb3IgTkVYVE4uXG4gICAqL1xuICBNaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyA9ICdtaXNzaW5nLXJhbmdlLW4tZm9yLXJlbGF0aXZlLWRhdGUtZmlsdGVycycsXG4gIC8qKlxuICAgKiBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyBTaGVldC5nZXRVcmwoKSBvbiBhIGhpZGRlbiBzaGVldC4gSGlkZGVuIHNoZWV0cyBkbyBub3QgaGF2ZSBVUkxzLlxuICAgKi9cbiAgTm9VcmxGb3JIaWRkZW5Xb3Jrc2hlZXQgPSAnbm8tdXJsLWZvci1oaWRkZW4td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIE9uZSBvciBib3RoIG9mIHRoZSBwYXJlbnRFbGVtZW50IG9yIHRoZSBVUkwgcGFyYW1ldGVycyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBOb1VybE9yUGFyZW50RWxlbWVudE5vdEZvdW5kID0gJ25vLXVybC1vci1wYXJlbnQtZWxlbWVudC1ub3QtZm91bmQnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGlzIG5vdCBhY3RpdmUgb3IgZW1iZWRkZWQgd2l0aGluIHRoZSBhY3RpdmUgZGFzaGJvYXJkLlxuICAgKi9cbiAgTm90QWN0aXZlU2hlZXQgPSAnbm90LWFjdGl2ZS1zaGVldCcsXG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IHNwZWNpZmllZCwgbnVsbCwgb3IgYW4gZW1wdHkgc3RyaW5nL2FycmF5LlxuICAgKi9cbiAgTnVsbE9yRW1wdHlQYXJhbWV0ZXIgPSAnbnVsbC1vci1lbXB0eS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIFNoZWV0Tm90SW5Xb3JrYm9vayA9ICdzaGVldC1ub3QtaW4td29ya2Jvb2snLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBhIEN1c3RvbVZpZXcgb2JqZWN0IHRoYXQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpdCBoYXMgYmVlbiByZW1vdmVkKS5cbiAgICovXG4gIFN0YWxlRGF0YVJlZmVyZW5jZSA9ICdzdGFsZS1kYXRhLXJlZmVyZW5jZScsXG4gIC8qKlxuICAgKiBVbmtub3duIGVycm9yIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGF1dGggZmxvdy5cbiAgICovXG4gIFVua25vd25BdXRoRXJyb3IgPSAndW5rbm93bi1hdXRoLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIFZpei5hZGRFdmVudExpc3RlbmVyIG9yIFZpei5yZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gIC8qKlxuICAgKiBBIFZpeiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudEVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBWaXpBbHJlYWR5SW5NYW5hZ2VyID0gJ3Zpei1hbHJlYWR5LWluLW1hbmFnZXInLFxuICAvKipcbiAgICogRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW1iZWRkaW5nIGFwaS5cbiAgICovXG4gIEltcGxlbWVudGF0aW9uRXJyb3IgPSAnd3JvbmctaW1wbGVtZW50YXRpb24nLFxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqL1xuICBOb3RJbXBsZW1lbnRlZCA9ICdub3QtaW1wbGVtZW50ZWQnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciBkdXJpbmcgZXZlbnQgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIEV2ZW50SW5pdGlhbGl6YXRpb25FcnJvciA9ICdldmVudC1pbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBlbWJlZGRpbmcgYXBpIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgdGFibGVhdVxuICAgKi9cbiAgSW5jb21wYXRpYmxlVmVyc2lvbkVycm9yID0gJ2luY29tcGF0aWJsZS12ZXJzaW9uLWVycm9yJyxcblxuICAvKipcbiAgICogVW5rbm93biB7QGxpbmsgVGFibGVhdURpYWxvZ1R5cGV9IHBhc3NlZCBpbiB0byBWaXouZGlzcGxheURpYWxvZ0FzeW5jLlxuICAgKi9cbiAgVW5rbm93bkRpYWxvZ1R5cGUgPSAndW5rbm93bi1kaWFsb2ctdHlwZScsXG5cbiAgLyoqXG4gICAqIENhbiBvY2N1ciBpZiB0aGUgQVBJIGludGVyYWN0cyB3aXRoIGEgZmlsdGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAqIENhbiBhbHNvIG9jY3VycyBpZiBhIHtAbGluayBGaWx0ZXJUeXBlfSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQuXG4gICAqL1xuICBGaWx0ZXJNaXNzaW5nT3JOb3RJbXBsZW1lbnRlZCA9ICdmaWx0ZXItbWlzc2luZy1ub3QtaW1wbGVtZW50ZWQnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgc3RvcnkgcG9pbnQgaWRzIG5vIGxvbmdlciBtYXRjaC5cbiAgICovXG4gIFN0b3J5UG9pbnRJZE1pc21hdGNoID0gJ3N0b3J5cG9pbnQtaWQtbWlzbWF0Y2gnLFxufVxuXG4vKipcbiAqIEZvcm1hdHMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIGRpc3BsYXlTdGF0aWNJbWFnZSBpbiBAVml6SW50ZXJmYWNlc1xuICovXG5leHBvcnQgZW51bSBGaWxlRm9ybWF0cyB7XG4gIFBERiA9ICdwZGYnLFxuICBQTkcgPSAncG5nJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRPcmllbnRhdGlvbiB7XG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50UGFnZVNpemUge1xuICBMZXR0ZXIgPSAnbGV0dGVyJyxcbiAgTGVnYWwgPSAnbGVnYWwnLFxuICBOb3RlID0gJ25vdGUnLFxuICBGb2xpbyA9ICdmb2xpbycsXG4gIFRhYmxvaWQgPSAndGFibG9pZCcsXG4gIExlZGdlciA9ICdsZWRnZXInLFxuICBTdGF0ZW1lbnQgPSAnc3RhdGVtZW50JyxcbiAgRXhlY3V0aXZlID0gJ2V4ZWN1dGl2ZScsXG4gIEEzID0gJ0EzJyxcbiAgQTQgPSAnQTQnLFxuICBBNSA9ICdBNScsXG4gIEI0ID0gJ0I0JyxcbiAgQjUgPSAnQjUnLFxuICBRdWFydG8gPSAncXVhcnRvJyxcbiAgVW5zcGVjaWZpZWQgPSAndW5zcGVjaWZpZWQnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFNjYWxpbmcge1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgUGVyYzI1ID0gJzI1JScsXG4gIFBlcmM1MCA9ICc1MCUnLFxuICBQZXJjNjAgPSAnNjAlJyxcbiAgUGVyYzc1ID0gJzc1JScsXG4gIFBlcmM4MCA9ICc4MCUnLFxuICBQZXJjOTAgPSAnOTAlJyxcbiAgUGVyYzEwMCA9ICcxMDAlJyxcbiAgUGVyYzIwMCA9ICcyMDAlJyxcbiAgUGVyYzQwMCA9ICc0MDAlJyxcbiAgQXRNb3N0MVBhZ2VIaWdoID0gJ2F0LW1vc3QtMS1wYWdlLWhpZ2gnLFxuICBBdE1vc3QyUGFnZXNIaWdoID0gJ2F0LW1vc3QtMi1wYWdlcy1oaWdoJyxcbiAgQXRNb3N0MVBhZ2VXaWRlID0gJ2F0LW1vc3QtMS1wYWdlLXdpZGUnLFxuICBBdE1vc3QyUGFnZXNXaWRlID0gJ2F0LW1vc3QtMi1wYWdlcy13aWRlJyxcbn1cblxuZXhwb3J0IGVudW0gUmV2ZXJ0Vml6U2VsZWN0aW9uIHtcbiAgQWxsID0gJ2FsbCcsXG4gIEF4ZXMgPSAnYXhlcycsXG4gIEZpbHRlcnMgPSAnZmlsdGVycycsXG4gIFNvcnRzID0gJ3NvcnRzJyxcbiAgU2hlbHZlcyA9ICdzaGVsdmVzJyxcbn1cblxuZXhwb3J0IGVudW0gVG9vbGJhckJ1dHRvbnMge1xuICBBbGVydHMgPSAnYWxlcnRzJyxcbiAgQXNrRGF0YSA9ICdhc2tEYXRhJyxcbiAgQ3VzdG9tVmlld3MgPSAnY3VzdG9tVmlld3MnLFxuICBEYXRhRGV0YWlscyA9ICdkYXRhRGV0YWlscycsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU3Vic2NyaWJlID0gJ3N1YnNjcmliZScsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXIge1xuICBUb3AgPSAndG9wJyxcbiAgQm90dG9tID0gJ2JvdHRvbScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFNpemVCZWhhdmlvciB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBFeGFjdGx5ID0gJ2V4YWN0bHknLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIEF0TGVhc3QgPSAnYXRsZWFzdCcsXG4gIEF0TW9zdCA9ICdhdG1vc3QnLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUxheW91dCB7XG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXG4gIENhcmQgPSAnY2FyZCcsXG4gIEJhbiA9ICdiYW4nLFxufVxuXG4vKipcbiAqIEJlIGNhcmVmdWwgd2hlbiBhZGRpbmcgbmV3IGV2ZW50IHR5cGVzLiBFeHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgZm9sbG93IHR3byBkaWZmZXJlbnQgcGF0dGVybnMgb24gaG93IGV2ZW50cyBhcmUgbmFtZWQuXG4gKiBFdmVudHMgc2hvdWxkIGJlIGFsbCBsb3dlciBjYXNlIGFuZCB3aXRob3V0IGh5cGhlbnMgb3IgdW5kZXJzY29yZXMuXG4gKi9cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB0eXBlIG9mIHRhYmxlYXUgZW1iZWRkaW5nIGV2ZW50IHRoYXQgY2FuIGJlIGxpc3RlbmVkIGZvci5cbiAqL1xuZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBmaW5pc2hlZCBsb2FkaW5nLiBUaGlzIGV2ZW50IGlzIHJhaXNlZCBhZnRlciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHtAbGluayBGaXJzdEludGVyYWN0aXZlfSAoaWYgYW55KSBoYXMgYmVlbiBjYWxsZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3TG9hZGVkID0gJ2N1c3RvbXZpZXdsb2FkZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b212aWV3cmVtb3ZlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2F2ZWQgKG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3U2F2ZWQgPSAnY3VzdG9tdmlld3NhdmVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQgYXMgdGhlIGRlZmF1bHQgdmlldyBmb3IgYSB3b3JrYm9vay5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ2N1c3RvbXZpZXdzZXRkZWZhdWx0JyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEJ1dHRvbi5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEVkaXRCdXR0b25DbGlja2VkID0gJ2VkaXRidXR0b25jbGlja2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBFZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdlZGl0aW5kZXNrdG9wYnV0dG9uY2xpY2tlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyY2hhbmdlZCcsXG5cbiAgLyoqIEZpcmVkIHdoZW4gdml6IHNpemUgaXMga25vd25cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3R2aXpzaXpla25vd24nLFxuXG4gIC8qKiBGaXJlZCB3aGVuIGEgdml6IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmVcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRmlyc3RJbnRlcmFjdGl2ZSA9ICdmaXJzdGludGVyYWN0aXZlJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ2N1c3RvbW1hcmtjb250ZXh0bWVudScsXG5cbiAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrc2VsZWN0aW9uY2hhbmdlZCcsXG5cbiAgLyoqIEEgcGFyYW1ldGVyIGhhcyBoYWQgaXRzIHZhbHVlIG1vZGlmaWVkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBbW1BhcmFtZXRlcl1dIG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlcmNoYW5nZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIHRvb2xiYXIgYnV0dG9uIG9yIGNvbnRyb2wgYmVjb21lcyBhdmFpbGFibGUgb3IgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhcnN0YXRlY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2tyZWFkeXRvY2xvc2UnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9va3B1Ymxpc2hlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2twdWJsaXNoZWRhcycsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgVVJMIGFjdGlvbiBvY2N1cnMuIFNlZSB0aGUge0BsaW5rIFVybEFjdGlvbkV2ZW50fSBjbGFzcy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFVybEFjdGlvbiA9ICd1cmxhY3Rpb24nLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVGFiU3dpdGNoZWQgPSAndGFic3dpdGNoZWQnLFxuICAvKipcbiAgICpcbiAgICogUmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5cG9pbnRzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudHMgb2YgdGhlIHdlYmNvbXBvbmVudC5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgVml6TG9hZEVycm9yID0gJ3ZpemxvYWRlcnJvcicsXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgdGhlIGlmcmFtZSBzcmMgYXR0cmlidXRlIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgSWZyYW1lU3JjVXBkYXRlZCA9ICdpZnJhbWVzcmN1cGRhdGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSB0byBzdW1tYXJ5IGRhdGEuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeWRhdGFjaGFuZ2VkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gdGFibGVhdSAodml6LWNsaWVudCkgaXMgcmVhZHkgdG8gcmVjZWl2ZSBhbiBhdXRoIHRva2VuLlxuICAgKiBVc2VkIGZvciBhdXRoZW50aWNhdGlvbiBpbiBzYWxlc2ZvcmNlIG5hdGl2ZSBtb2RlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsXG4gICAqL1xuICBSZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdyZWFkeXRvcmVjZWl2ZWF1dGh0b2tlbicsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgYSBjb250ZXh0IG1lbnUgd2hlcmUgdXNlcnMgY2FuIGFkZCBleHRlcm5hbCBtZW51IGl0ZW1zLlxuICovXG5leHBvcnQgZW51bSBBcGlNZW51VHlwZSB7XG4gIC8qKiBFeHRlcm5hbCBtZW51IGl0ZW0gd2lsbCBiZSBpbmplY3RlZCBpbiB1YmVydGlwIGRpYWxvZyAqL1xuICBVYmVydGlwID0gJ3ViZXJ0aXAnLFxufVxuXG4vKiogWW91IGNhbiB1c2UgdGhpcyB0eXBlIHdpdGggYSB7QGxpbmsgVml6fSBvYmplY3QuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RGlhbG9nVHlwZSB7XG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBERiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRQREYgPSAnZXhwb3J0LXBkZicsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBvd2VyUG9pbnQgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UG93ZXJQb2ludCA9ICdleHBvcnQtcG93ZXJwb2ludCcsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIERhdGEgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIENyb3NzVGFiIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydENyb3NzVGFiID0gJ2V4cG9ydC1jcm9zcy10YWInLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBXb3JrYm9vayBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRXb3JrYm9vayA9ICdleHBvcnQtd29ya2Jvb2snLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBTaGFyZSBkaWFsb2cuXG4gICAqL1xuICBTaGFyZSA9ICdzaGFyZScsXG59XG4iLCJpbXBvcnQgeyBQdWxzZUxheW91dCB9IGZyb20gJy4vRW51bXMnO1xuaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXB1bHNlPiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBQdWxzZUF0dHJpYnV0ZXMge1xuICBEaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlLWV4cGxvcmUtZmlsdGVyJyxcbiAgTGF5b3V0ID0gJ2xheW91dCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGN1c3RvbSBsYXlvdXQgb2YgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgbGF5b3V0PVwiY2FyZFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGxheW91dD86IFB1bHNlTGF5b3V0O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AtbGV2ZWwgUHVsc2Ugb2JqZWN0LlxuICoqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZSBleHRlbmRzIFB1bHNlU2V0dGluZ3Mge31cbiIsImltcG9ydCB7XG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRGV2aWNlVHlwZSxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBUYWJsZWF1RGlhbG9nVHlwZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVG9vbGJhcixcbn0gZnJvbSAnLi9FbnVtcyc7XG5pbXBvcnQgeyBTaGVldFNpemUgfSBmcm9tICcuL1NoZWV0SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4vV29ya2Jvb2tJbnRlcmZhY2UnO1xuXG4vKipcbiAqIFRoZSBzaGFyZWQgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS12aXo+IGFuZCA8dGFibGVhdS1hdXRob3Jpbmctdml6PiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBWaXpTaGFyZWRBdHRyaWJ1dGVzIHtcbiAgVG91Y2hPcHRpbWl6ZSA9ICd0b3VjaC1vcHRpbWl6ZScsXG4gIEhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uID0gJ2hpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbicsXG4gIFN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvciA9ICdzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3InLFxuICBEaXNhYmxlVmVyc2lvbkNoZWNrID0gJ2Rpc2FibGUtdmVyc2lvbi1jaGVjaycsXG4gIE9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCcsXG4gIE9uRmlyc3RWaXpTaXplS25vd24gPSAnb25GaXJzdFZpelNpemVLbm93bicsXG4gIE9uRmlyc3RJbnRlcmFjdGl2ZSA9ICdvbkZpcnN0SW50ZXJhY3RpdmUnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF0dHJpYnV0ZXMge1xuICBEaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9ICdkaXNhYmxlLXVybC1hY3Rpb25zJyxcbiAgSGlkZVRhYnMgPSAnaGlkZS10YWJzJyxcbiAgVG9vbGJhciA9ICd0b29sYmFyJyxcbiAgSW5zdGFuY2VJZFRvQ2xvbmUgPSAnaW5zdGFuY2UtaWQtdG8tY2xvbmUnLFxuICBEZXZpY2UgPSAnZGV2aWNlJyxcbiAgSGlkZUVkaXRCdXR0b24gPSAnaGlkZS1lZGl0LWJ1dHRvbicsXG4gIE9uRWRpdEJ1dHRvbkNsaWNrZWQgPSAnb25FZGl0QnV0dG9uQ2xpY2tlZCcsXG4gIE9uRmlsdGVyQ2hhbmdlZCA9ICdvbkZpbHRlckNoYW5nZWQnLFxuICBPbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ29uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQnLFxuICBPbk1hcmtTZWxlY3Rpb25DaGFuZ2VkID0gJ29uTWFya1NlbGVjdGlvbkNoYW5nZWQnLFxuICBPblBhcmFtZXRlckNoYW5nZWQgPSAnb25QYXJhbWV0ZXJDaGFuZ2VkJyxcbiAgT25Ub29sYmFyU3RhdGVDaGFuZ2VkID0gJ29uVG9vbGJhclN0YXRlQ2hhbmdlZCcsXG4gIE9uVXJsQWN0aW9uID0gJ29uVXJsQWN0aW9uJyxcbiAgT25UYWJTd2l0Y2hlZCA9ICdvblRhYlN3aXRjaGVkJyxcbiAgT25DdXN0b21WaWV3TG9hZGVkID0gJ29uQ3VzdG9tVmlld0xvYWRlZCcsXG4gIE9uQ3VzdG9tVmlld1JlbW92ZWQgPSAnb25DdXN0b21WaWV3UmVtb3ZlZCcsXG4gIE9uQ3VzdG9tVmlld1NhdmVkID0gJ29uQ3VzdG9tVmlld1NhdmVkJyxcbiAgT25DdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdvbkN1c3RvbVZpZXdTZXREZWZhdWx0JyxcbiAgT25TdG9yeVBvaW50U3dpdGNoZWQgPSAnb25TdG9yeVBvaW50U3dpdGNoZWQnLFxuICBPblN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdvblN1bW1hcnlEYXRhQ2hhbmdlZCcsXG4gIE9uUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4gPSAnb25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbicsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF1dGhvcmluZ0F0dHJpYnV0ZXMge1xuICBPbldvcmtib29rUHVibGlzaGVkID0gJ29uV29ya2Jvb2tQdWJsaXNoZWQnLFxuICBPbldvcmtib29rUHVibGlzaGVkQXMgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZEFzJyxcbiAgT25Xb3JrYm9va1JlYWR5VG9DbG9zZSA9ICdvbldvcmtib29rUmVhZHlUb0Nsb3NlJyxcbiAgSGlkZUNsb3NlQnV0dG9uID0gJ2hpZGUtY2xvc2UtYnV0dG9uJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiBhbmQgVGFibGVhdUF1dGhvcmluZ1ZpeiBjdXN0b20gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGZpbHRlciBwYXJhbWV0ZXJzLiBBdmFpbGFibGUgb25seSBpbiB2aWV3aW5nIG1vZGUuXG4gICAqL1xuICBWaXpGaWx0ZXIgPSAndml6LWZpbHRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbmFtZSBhbmQgdmFsdWUgZm9yIGEgcGFyYW1ldGVyLiBBdmFpbGFibGUgb25seSBpbiB2aWV3aW5nIG1vZGUuXG4gICAqL1xuICBWaXpQYXJhbWV0ZXIgPSAndml6LXBhcmFtZXRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcbn1cblxuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AgbGV2ZWwgVml6IG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6IGV4dGVuZHMgVml6U2V0dGluZ3MsIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogT25lIFdvcmtib29rIGlzIHN1cHBvcnRlZCBwZXIgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rPzogV29ya2Jvb2s7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEF1dGhvcmluZyBWaXogb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcmluZ1ZpeiBleHRlbmRzIFZpekF1dGhvcmluZ1NldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgLSBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgdml6XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6QWN0aW9ucyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhdXRvbWF0aWMgdXBkYXRlcyBhcmUgY3VycmVudGx5IHBhdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF1dG9tYXRpY1VwZGF0ZXNBcmVQYXVzZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdXNlIGxheW91dCB1cGRhdGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlc2l6aW5nIHRoZSB2aXN1YWxpemF0aW9uIG9yIHBlcmZvcm1pbmcgbXVsdGlwbGUgY2FsbHMgdGhhdCBjb3VsZCBhZmZlY3QgdGhlIGxheW91dC5cbiAgICovXG4gIHBhdXNlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBsYXlvdXQgdXBkYXRlcy5cbiAgICovXG4gIHJlc3VtZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICB0b2dnbGVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiB0aGUgUmV2ZXJ0IEFsbCB0b29sYmFyIGJ1dHRvbiwgd2hpY2ggcmVzdG9yZXMgdGhlIHdvcmtib29rIHRvIGl0cyBzdGFydGluZyBzdGF0ZS5cbiAgICovXG4gIHJldmVydEFsbEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJlZnJlc2ggRGF0YSB0b29sYmFyIGJ1dHRvbi5cbiAgICovXG4gIHJlZnJlc2hEYXRhQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiBEb3dubG9hZCA+IEltYWdlIGZyb20gdGhlIHRvb2xiYXIsIHdoaWNoIGNyZWF0ZXMgYSBQTkcgZmlsZSBvZiB0aGUgY3VycmVudCB2aXN1YWxpemF0aW9uLlxuICAgKi9cbiAgZXhwb3J0SW1hZ2VBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBjcm9zc3RhYiBvZiBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3IHRvIGFcbiAgICogc3BlY2lmaWVkIGZvcm1hdCAoQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKS5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzaGVldCBuYW1lIGRvZXMgbm90IG1hdGNoIGFueSB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgYWN0aXZlIHNoZWV0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNyb3NzdGFiIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydENyb3NzdGFiQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogdml6LmV4cG9ydENyb3NzdGFiQXN5bmMoJ1NhbGVzIGJ5IFNlZ21lbnQnLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRDcm9zc3RhYkFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIHN1bW1hcnkgZGF0YSBzaG93biBpbiB0aGUgVmlldyBEYXRhIHdpbmRvd1xuICAgKiAoc2hvd24gd2hlbiB5b3UgY2xpY2sgRG93bmxvYWQgPiBEYXRhIGZyb20gdGhlIHRvb2xiYXIgZm9yIGFueSBnaXZlbiB3b3Jrc2hlZXQgd2l0aGluIHRoZSBjdXJyZW50IHZpZXcpLlxuICAgKiBUaGUgY3VycmVudCBmaWxlIGZvcm1hdCBpcyBDU1YuIFRoZXJlIGlzIG5vIGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCBvZiBzdW1tYXJ5IGRhdGEgeW91IGNhbiBleHBvcnQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZC5cbiAgICogTm90ZTogZXhwb3J0RGF0YUFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gdml6Lndvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAqICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IGFjdGl2ZVNoZWV0LmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk7XG4gICAqICAgLy8gR2V0dGluZyBmaWVsZElkJ3MgZm9yIExhdGl0dWRlIGFuZCBMb25naXR1ZGUgY29sdW1uc1xuICAgKiAgIGNvbnN0IGNvbHVtbnNUb0luY2x1ZGVCeUlkID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgKiAgICAgaWYgKGNvbHVtbi5maWVsZE5hbWUgPT09ICdMYXRpdHVkZScgfHwgY29sdW1uLmZpZWxkTmFtZSA9PT0gJ0xvbmdpdHVkZScpIHtcbiAgICogICAgICAgcmV0dXJuIGNvbHVtbi5maWVsZElkO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMoYWN0aXZlU2hlZXQubmFtZSwgeyBjb2x1bW5zVG9JbmNsdWRlQnlJZCB9KTtcbiAgICogfVxuICAgKiBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgaW4gdGhlIGRhc2hib2FyZCB3aGlsZSBhbHNvIGlnbm9yaW5nIGFsaWFzZXNcbiAgICogICBmb3IgKGNvbnN0IHdvcmtzaGVldCBvZiBhY3RpdmVTaGVldC53b3Jrc2hlZXRzKSB7XG4gICAqICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKHdvcmtzaGVldC5uYW1lLCB7IGlnbm9yZUFsaWFzZXM6IHRydWUgfSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGVsc2VcbiAgICoge1xuICAgKiAgIC8vIGFjdGl2ZVNoZWV0IGlzIGEgU3RvcnkgYW5kIHdlIHdhbnQgdG8gZXhwb3J0IHdvcmtzaGVldHMgd2l0aGluIHRoZSBjdXJyZW50IHZpZXdcbiAgICogICBjb25zdCBjb250YWluZWRTaGVldCA9IGFjdGl2ZVNoZWV0LmFjdGl2ZVN0b3J5UG9pbnQuY29udGFpbmVkU2hlZXQ7XG4gICAqICAgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgc3VtbWFyeSBkYXRhIG9mIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgYWN0aXZlIHN0b3J5IHBvaW50XG4gICAqICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGNvbnRhaW5lZFNoZWV0Lm5hbWUpO1xuICAgKiAgIH0gZWxzZSBpZiAoY29udGFpbmVkU2hlZXQgIT09IHVuZGVmaW5lZCAmJiBjb250YWluZWRTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICAgIC8vIEV4cG9ydGluZyB0aGUgc3VtbWFyeSBkYXRhIGZvciBlYWNoIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgY29udGFpbmVkU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKHdvcmtzaGVldC5uYW1lKTtcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBleHBvcnREYXRhQXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBFeHBvcnREYXRhT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGxpc3Qgb2Ygc2hlZXRzIHRvIGEgUG93ZXJQb2ludCBmaWxlLiBJZiBubyBzaGVldHMgYXJlIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2hlZXQgaXMgZXhwb3J0ZWQuXG4gICAqIFRoZSBvcmRlciB0aGUgc2hlZXRzIGFwcGVhciBpbiB0aGUgbGlzdCBpcyB0aGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIFBvd2VyUG9pbnQgZmlsZS5cbiAgICogVGhlIGxpc3Qgb2Ygc2hlZXRzIGNhbiBlaXRoZXIgZXhjbHVzaXZlbHkgaW5jbHVkZSB0aGUgd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgb3IgZXhjbHVzaXZlbHkgaW5jbHVkZSB0aGUgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBsaXN0IG9mIHNoZWV0cyBjb250YWlucyBib3RoIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIGFuZCBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIFBvd2VyUG9pbnQgZmlsZSBmYWlscyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBOb3RlOiBleHBvcnRQb3dlclBvaW50QXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCk7XG4gICAqIH0gZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSAgU2hlZXRUeXBlLkRhc2hib2FyZCkge1xuICAgKiAgIGNvbnN0IHdvcmtzaGVldE5hbWVzID0gYWN0aXZlU2hlZXQud29ya3NoZWV0cy5tYXAoKHdvcmtzaGVldCkgPT4gd29ya3NoZWV0Lm5hbWUpO1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQb3dlclBvaW50QXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUG93ZXJQb2ludFxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHB1Ymxpc2hlZFNoZWV0TmFtZXMpO1xuICAgKiBgYGBcbiAgICovXG4gIGV4cG9ydFBvd2VyUG9pbnRBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGxpc3Qgb2Ygc2hlZXRzIHdpdGggdGhlIGdpdmVuIHtAbGluayBFeHBvcnRQREZPcHRpb25zfSBvcHRpb25zLiBJZiBubyBzaGVldHMgYXJlIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2hlZXQgaXMgZXhwb3J0ZWQuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIElmIG5vIEV4cG9ydFBERk9wdGlvbnMgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXJlOiBTY2FsaW5nID0gQXV0b21hdGljLCBQYWdlU2l6ZSA9IExldHRlciwgYW5kIE9yaWVudGF0aW9uID0gUG9ydHJhaXQuXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQREYgZmlsZSBmYWlscyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBOb3RlOiBleHBvcnRQREZBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCB3b3JrYm9vayA9IHZpei53b3JrYm9vaztcbiAgICogY29uc3QgYWN0aXZlU2hlZXQgPSB3b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCB8fCBhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5TdG9yeSkge1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQREZBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUERGXG4gICAqIGNvbnN0IHB1Ymxpc2hlZFNoZWV0TmFtZXMgPSB3b3JrYm9vay5wdWJsaXNoZWRTaGVldHNJbmZvLm1hcCgocHVibGlzaGVkU2hlZXRJbmZvKSA9PiBwdWJsaXNoZWRTaGVldEluZm8ubmFtZSk7XG4gICAqIGF3YWl0IHZpei5leHBvcnRQREZBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQREZBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPiwgb3B0aW9ucz86IEV4cG9ydFBERk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG9uZSBvZiB0aGUgZXhwb3J0IGRpYWxvZ3MgYmFzZWQgb24gdGhlIGRpYWxvZ1R5cGUgcGFyYW1ldGVyXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBkaWFsb2dUeXBlIGlzIGludmFsaWRcbiAgICovXG4gIGRpc3BsYXlEaWFsb2dBc3luYyhkaWFsb2dUeXBlOiBUYWJsZWF1RGlhbG9nVHlwZSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFJlZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICByZWRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5kb2VzIHRoZSBsYXN0IGFjdGlvbiBwZXJmb3JtZWQgb24gYSBzaGVldC5cbiAgICovXG4gIHVuZG9Bc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqXG4gICAqIGBgYFxuICAgKiBhc3luYyBmdW5jdGlvbiBnZXRTZWxlY3RlZE1hcmtzKGV2ZW50KSB7XG4gICAqICAgICBjb25zdCBtYXJrc1NlbGVjdGVkID0gYXdhaXQgZXZlbnQuZGV0YWlsLmdldE1hcmtzQXN5bmMoKTtcbiAgICogICAgIGNvbnN0IG51bU1hcmtzID0gbWFya3NTZWxlY3RlZC5kYXRhWzBdLmRhdGEubGVuZ3RoO1xuICAgKiAgICAgY29uc29sZS5sb2coYCR7bnVtTWFya3N9IG1hcmtzIFNlbGVjdGVkYCk7XG4gICAqIH1cbiAgICpcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5hZGRFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5yZW1vdmVFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIHZpeiBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSB2aXouXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDx2aXotZmlsdGVyPmAgZWxlbWVudCBpbiB0aGUgYDx0YWJsZWF1LXZpej5gIHdlYiBjb21wb25lbnQsXG4gICAqIHlvdSBtaWdodCBleHBlcmllbmNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlIFNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiB2aXouYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXpTaXplIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNoZWV0U2l6ZSByZWNvcmQgZm9yIHRoZSBjdXJyZW50IHNoZWV0XG4gICAqL1xuICByZWFkb25seSBzaGVldFNpemU6IFNoZWV0U2l6ZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBUYWJsZWF1IFVJIGVsZW1lbnRzICh0aGUgY2hyb21lKSBzdXJyb3VuZGluZyB0aGUgdmlldy5cbiAgICovXG4gIHJlYWRvbmx5IGNocm9tZUhlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGUuXG4gKi9cbmludGVyZmFjZSBWaXpTZXR0aW5nc1NoYXJlZCBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHRvdWNoIG9wdGltaXplIHZpeiBjb250cm9scy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRvdWNoLW9wdGltaXplIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG91Y2hPcHRpbWl6ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogYGBgXG4gICAqL1xuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGVkaXQgYmVoYXZpb3IgaXMgc3VwcHJlc3NlZC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIG5vdCBzdXBwcmVzc2VkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHN1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIGBgYFxuICAgKi9cbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPVwib25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzaXplIG9mIHRoZSB2aXogaXMga25vd24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gcGVyZm9ybSB0YXNrcyBzdWNoIGFzIHJlc2l6aW5nXG4gICAqIHRoZSBlbGVtZW50cyBzdXJyb3VuZGluZyB0aGUgVml6IG9iamVjdCBvbmNlIHRoZSBvYmplY3QncyBzaXplIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdFZpelNpemVLbm93blwiPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlyc3RWaXpTaXplS25vd249XCJvbkZpcnN0Vml6U2l6ZUtub3duSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdFZpelNpemVLbm93bj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIFZpeiBvYmplY3QgZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZS4gVGhpcyBpcyBvbmx5IHJhaXNlZCBvbmNlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdEludGVyYWN0aXZlXCI9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0SW50ZXJhY3RpdmU9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpcnN0SW50ZXJhY3RpdmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIHZpZXcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHN1cHByZXNzIHRoZSBleGVjdXRpb24gb2YgVVJMIGFjdGlvbnMuIFRoaXMgb3B0aW9uIGRvZXMgbm90IHByZXZlbnQgdGhlIFVSTCBhY3Rpb25cbiAgICogZXZlbnQgZnJvbSBiZWluZyByYWlzZWQuIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBJZiBzZXRcbiAgICogdG8gdHJ1ZSBhbmQgeW91IGNyZWF0ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIFVSTF9BQ1RJT04gZXZlbnQsIHlvdSBjYW4gdXNlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqIGhhbmRsZXIgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRpc2FibGUtdXJsLWFjdGlvbnMgLz5cbiAgICogYGBgXG4gICAqL1xuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYnMgYXJlIGhpZGRlbiBvciBzaG93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgaGlkZS10YWJzIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZVRhYnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sYmFyLCBpZiBpdCBpcyBzaG93bi4gVGhlIHZhbHVlcyBjYW4gYmUgVG9vbGJhci5Ub3AsXG4gICAqIFRvb2xiYXIuQm90dG9tIG9yIFRvb2xiYXIuSGlkZGVuLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBUb29sYmFyLkJvdHRvbS5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgdG9vbGJhcj1cImhpZGRlblwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9vbGJhcj86IFRvb2xiYXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGRldmljZSBsYXlvdXQgZm9yIGEgZGFzaGJvYXJkLCBpZiBpdCBleGlzdHMuXG4gICAqIFZhbHVlcyBjYW4gYmUgZGVmYXVsdCwgZGVza3RvcCwgdGFibGV0LCBvciBwaG9uZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gbG9hZGluZyBhIGxheW91dCBiYXNlZCBvbiB0aGVcbiAgICogc21hbGxlc3QgZGltZW5zaW9uIG9mIHRoZSBob3N0aW5nIGlmcmFtZSBlbGVtZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBkZXZpY2U9XCJkZXNrdG9wXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBkZXZpY2U/OiBEZXZpY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIElEIG9mIGFuIGV4aXN0aW5nIGluc3RhbmNlIHRvIG1ha2UgYSBjb3B5IChjbG9uZSkgb2YuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlIGFuYWx5c2lzIG9mIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb25cbiAgICogd2l0aG91dCBsb3NpbmcgdGhlIHN0YXRlIG9mIHRoZSBvcmlnaW5hbC4gSWYgdGhlIElEIGRvZXMgbm90IHJlZmVyIHRvIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb24sXG4gICAqIHRoZSBjbG9uZWQgdmVyc2lvbiBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGluc3RhbmNlLWlkLXRvLWNsb25lPVwiaWQxXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpbnN0YW5jZUlkVG9DbG9uZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEVkaXQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25FZGl0QnV0dG9uQ2xpY2tlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlsdGVyQ2hhbmdlZD1cIm9uRmlsdGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlsdGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50PVwib25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD1cIm9uTWFya1NlbGVjdGlvbkNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIHBhcmFtZXRlciBoYXMgaGFkIGl0cyB2YWx1ZSBtb2RpZmllZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tQYXJhbWV0ZXJdXSBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uUGFyYW1ldGVyQ2hhbmdlZD1cIm9uUGFyYW1ldGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uUGFyYW1ldGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSB0b29sYmFyIGJ1dHRvbiBvciBjb250cm9sIGJlY29tZXMgYXZhaWxhYmxlIG9yIGJlY29tZXMgdW5hdmFpbGFibGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPVwib25Ub29sYmFyU3RhdGVDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBTZWUgdGhlIHtAbGluayBVcmxBY3Rpb25FdmVudH0gY2xhc3MuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25VcmxBY3Rpb249XCJvblVybEFjdGlvbkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVXJsQWN0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVGFiU3dpdGNoZWQ9XCJvblRhYlN3aXRjaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25UYWJTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrXG4gICAqIGZ1bmN0aW9uIGZvciB7QGxpbmsgRmlyc3RJbnRlcmFjdGl2ZX0gKGlmIGFueSkgaGFzIGJlZW4gY2FsbGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld0xvYWRlZD1cIm9uQ3VzdG9tVmlld0xvYWRlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld0xvYWRlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiByZW1vdmVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1JlbW92ZWQ9XCJvbkN1c3RvbVZpZXdSZW1vdmVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3UmVtb3ZlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdTYXZlZD1cIm9uQ3VzdG9tVmlld1NhdmVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2F2ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0IGFzIHRoZSBkZWZhdWx0IHZpZXcgZm9yIGEgd29ya2Jvb2suXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2V0RGVmYXVsdD1cIm9uQ3VzdG9tVmlld1NldERlZmF1bHRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdTZXREZWZhdWx0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSBuZXcgc3RvcnkgcG9pbnQgYmVjb21lcyBhY3RpdmUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdG9yeVBvaW50U3dpdGNoZWQ9XCJvblN0b3J5UG9pbnRTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3RvcnlQb2ludFN3aXRjaGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc3VtbWFyeSBkYXRhIG9uIGEgdmlzdWFsaXphdGlvbiBoYXZlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblN1bW1hcnlEYXRhQ2hhbmdlZD1cIm9uU3VtbWFyeURhdGFDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25TdW1tYXJ5RGF0YUNoYW5nZWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogKEJldGEpIFJlcHJlc2VudHMgdGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIGF1dGhvcmluZyBtb2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekF1dGhvcmluZ1NldHRpbmdzIGV4dGVuZHMgVml6U2V0dGluZ3NTaGFyZWQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIENsb3NlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgQ2xvc2UgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtY2xvc2UtYnV0dG9uIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUNsb3NlQnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGhhcyBiZWVuIHB1Ymxpc2hlZC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZD1cIm9uV29ya2Jvb2tQdWJsaXNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUHVibGlzaGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBcInB1Ymxpc2ggYXNcIiBpcyBzdWNjZXNzZnVsLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbldvcmtib29rUHVibGlzaGVkQXM9XCJvbldvcmtib29rUHVibGlzaGVkQXNIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUHVibGlzaGVkQXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT1cIm9uV29ya2Jvb2tSZWFkeVRvQ2xvc2VIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUmVhZHlUb0Nsb3NlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlclBhcmFtZXRlcnMge1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZpelBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gc2V0IFBhcmFtZXRlciB2YWx1ZXMgb24gdGhlIHZpei5cbiAqXG4gKiAqIGBgYFxuICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICogIDx2aXotcGFyYW1ldGVyIG5hbWU9XCJwYXJhbWV0ZXItbmFtZVwiIHZhbHVlPVwicGFyYW1ldGVyLXZhbHVlXCI+PC92aXotcGFyYW1ldGVyPlxuICogPC90YWJsZWF1LXZpej5cbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpQYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDdXN0b21QYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHBhc3MgYWxvbmcgc2V0dGluZ3MsIGluZm9ybWF0aW9uLCBldGMuLCB0aGF0IGFyZW4ndCBleHBvc2VkIG9uIHRoZVxuICogdGFibGVhdS12aXogZWxlbWVudC4gQ3VzdG9tUGFyYW1ldGVycyB3aWxsIG92ZXJyaWRlIGF0dHJpYnV0ZXMsIG9yIGZpbHRlcnMsIHNldCBvbiB0aGUgdGFibGVhdS12aXogZWxlbWVudC5cbiAqXG4gKiAqIGBgYFxuICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICogIDxjdXN0b20tcGFyYW1ldGVyIG5hbWU9XCJwYXJhbWV0ZXItbmFtZVwiIHZhbHVlPVwicGFyYW1ldGVyLXZhbHVlXCI+PC9jdXN0b20tcGFyYW1ldGVyPlxuICogPC90YWJsZWF1LXZpej5cbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21QYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgZXhwb3J0aW5nIGRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0RGF0YU9wdGlvbnMge1xuICAvKipcbiAgICogRG8gbm90IHVzZSBhbGlhc2VzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBzb3VyY2UgaW4gVGFibGVhdS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAgICovXG4gIGlnbm9yZUFsaWFzZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGNvbHVtbnMgdG8gaW5jbHVkZSBzcGVjaWZpZWQgYnkgZmllbGQgaWQsIGluY2x1ZGVzIGFsbCBieSBkZWZhdWx0LlxuICAgKiBUaGUgb3JkZXIgb2YgdGhlIGNvbHVtbiBpZHMgaW4gdGhlIGFycmF5IGRldGVybWluZXMgdGhlIGNvbHVtbiBvcmRlciBzaG93biBpbiB0aGUgc3VtbWFyeSBkYXRhIHRhYmxlLlxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFBERk9wdGlvbnMge1xuICBzY2FsaW5nOiBQcmludFNjYWxpbmc7XG4gIHBhZ2VTaXplOiBQcmludFBhZ2VTaXplO1xuICBvcmllbnRhdGlvbjogUHJpbnRPcmllbnRhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50IHtcbiAgY3VycmVudFNoZWV0TmFtZTogc3RyaW5nO1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21EYXNoYm9hcmQ6IEFycmF5PHN0cmluZz47XG4gIGV4cG9ydGFibGVTaGVldE5hbWVzRnJvbVdvcmtib29rOiBBcnJheTxzdHJpbmc+O1xufVxuIiwiLyoqXG4gKiBVc2VyIHN1cHBsaWVkIG9wdGlvbnMgdGhhdCBkbyBub3QgZ2V0IHBhc3NlZCBhcyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gbG9hZCBhIFRhYmxlYXUgdml6LCBUYWJsZWF1IGFza2RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFRoZSB2aXogc3JjXG4gICAqL1xuICBzcmM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHdpZHRoIGluIHBpeGVsc1xuICAgKiBDYW4gYmUgYW55IHZhbGlkIENTUyBzaXplIHNwZWNpZmllci4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHB1Ymxpc2hlZCB3aWR0aCBvZiB0aGUgdmlldy5cbiAgICovXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGhlaWdodCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgaGVpZ2h0IG9mIHRoZSB2aWV3LlxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHdlYmNvbXBvbmVudCB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdml6IGFuZCBhc2tkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbiB1c2VkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vbi1taW5pZmllZCB2ZXJzaW9uIG9mIEphdmFTY3JpcHQgaXMgbG9hZGVkLiBJZiBzcGVjaWZpZWQgKG9yIHNldCB0byB0cnVlKSwgdGhlXG4gICAqIG5vbi1taW5pZmllZCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGJvdGggdGhlIGxvY2FsIGNvbXBvbmVudCBhbmQgdGhlIFRhYmxlYXUgU2VydmVyIHZpc3VhbGl6YXRpb24gKGlmIGVuYWJsZWQpLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkIChvciBzZXQgdG8gZmFsc2UpLCB0aGUgbWluaWZpZWQgdmVyc2lvbiBvZiB0aGUgSmF2YVNjcmlwdCBmaWxlcyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgZGVidWcgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIGRlYnVnIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgdGhlIG9sZCBhdXRoIG1lY2hhbmlzbSBmb3IgYXV0aGVudGljYXRpb24gd2hpY2ggaGFwcGVucyBpbnNpZGUgdGhlIGlmcmFtZS4gSWYgc3BlY2lmaWVkLCBWaXpMb2FkRXJyb3JFdmVudHNcbiAgICogdHJpZ2dlcmVkIGR1ZSB0byBhdXRoIGZhaWx1cmVzIHdpbGwgbm90IGJlIHRocm93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdXRoIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF1dGg/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgY29tbW9uIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgdGFibGVhdSB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRBdHRyaWJ1dGVzIHtcbiAgU3JjID0gJ3NyYycsXG4gIFdpZHRoID0gJ3dpZHRoJyxcbiAgSGVpZ2h0ID0gJ2hlaWdodCcsXG4gIFRva2VuID0gJ3Rva2VuJyxcbiAgRGVidWcgPSAnZGVidWcnLFxuICBJZnJhbWVBdXRoID0gJ2lmcmFtZS1hdXRoJyxcbiAgT25WaXpMb2FkRXJyb3IgPSAnb252aXpsb2FkZXJyb3InLFxuICBGb3JjZVRva2VuU3luYyA9ICdmb3JjZS10b2tlbi1zeW5jJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIEV4dGVuc2lvbnMgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAqL1xuICBleHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgICBWaWV3aW5nID0gJ3ZpZXdpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdG8gYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWVcbi8vICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHlhcm4gcHVibGlzaDpidW1wIHZpYSBzY3JpcHRzL3B1Ymxpc2gtY2hlY2sudHNcbi8vICB1cGRhdGVJbnRlcm5hbENvbnRyYWN0UnVudGltZVZlcnNpb24gaW4gdGhlIG1vbm9yZXBvIHJvb3QuXG5pbXBvcnQgKiBhcyBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiBmcm9tICcuLi9pbnRlcm5hbC1jb250cmFjdC12ZXJzaW9uLmpzb24nO1xuZXhwb3J0IGNvbnN0IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04gPSBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjtcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1BhcmFtZXRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9WZXJicyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9JbnRlcm5hbEFwaURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuXG4vLyBFeHBvcnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIG1lc3NhZ2luZyBmb3IgY29uc3VtZXJzIHRvIHVzZS5cbi8vIEJlIHZlcnkgY2FyZWZ1bCBtYWtpbmcgYW55IHVwZGF0ZXMgdG8gdGhpcyBjb250cmFjdCB3aGljaCBicmVhayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgTUVTU0FHSU5HX1ZFUlNJT04gPSB7XG4gIG1ham9yOiAxLFxuICBtaW5vcjogMCxcbiAgZml4OiAwLFxufTtcbiIsImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9FbnVtcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVHlwZUNvbnZlcnRlciB7XG4gIHByaXZhdGUgc3RhdGljIGlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBQcmlvciB0byBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyBjb21lIHRvIHVzIGFzXG4gICAgLy8gJyVudWxsJScsICclYWxsJScsICcld2lsZGNhcmQlJywgJyVtaXNzaW5nJScuLi5cbiAgICAvLyBXaGlsZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIHRydWUgZm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29udmVyc2lvbixcbiAgICAvLyBpdCBpcyBhcyBjaGVhcCBhcyBwYXNzaW5nIGFyb3VuZCBhIHZlcnNpb24gYW5kIGNoZWNraW5nIHRoYXQuXG4gICAgLy8gKFNlZSBEYXRhVmFsdWVGb3JtYXR0ZXIuY3BwKVxuXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcubGVuZ3RoID4gMiAmJiB2YWx1ZUFzU3RyaW5nWzBdID09PSAnJScgJiYgdmFsdWVBc1N0cmluZ1t2YWx1ZUFzU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnJScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzcGVjaWFsVmFsdWVJbmRpY2F0b3IgPSAnJW51bGwlJztcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlQm9vbGVhbihib29sZWFuU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHtcbiAgICAvLyBib29sZWFuIHZhbHVlcyBjb21lIHRvIHVzIGFzICd0cnVlJ3wnZmFsc2UnXG4gICAgY29uc3Qgbm9ybWFsaXplZEJvb2xlYW46IHN0cmluZyA9IGJvb2xlYW5TdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZEJvb2xlYW4gIT09ICd0cnVlJyAmJiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ2ZhbHNlJyA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogbm9ybWFsaXplZEJvb2xlYW4gPT09ICd0cnVlJztcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VOdW1iZXIodmFsdWVBc1N0cmluZzogc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcih2YWx1ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZShkYXRlQXNTdHJpbmc6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBOb3RlIHRoYXQgd2l0aG91dCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDXG4gICAgLy8gSW5wdXQgb2YgMjAyMC0wMy0yNSBpcyBwcmludGVkIGFzOiBNYXIgMjQgMjAyMCAxNzowMDowMCBHTVQtMDcwMFxuICAgIC8vIFRoaXMgbWF0Y2hlcyBzdHlsZSB1c2VkIGluIGV4aXN0aW5nIGNvbnZlcnRGaWx0ZXJWYWx1ZVByZXNNb2RlbFxuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZGF0ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGVUaW1lKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIFdpdGggYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQy5cbiAgICAvLyBPdXIgZGF0ZSBmb3JtYXQgaXMgYWx3YXlzOiB5eXl5LW1tLWRkIGhoOm1tOnNzXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgSUUxMSBjYW4ndCBwYXJzZSB0aGF0IGZvcm1hdCBzbyB3ZSBhZGQgYSBUIGJldHdlZW4gdGhlIGRheSBhbmQgdGltZS5cbiAgICAvLyBXZSBhbHNvIGFkZCBhIFogc28gdGhhdCBpdCBpcyBVVEMuIChXaXRob3V0IHRoZSBaLCBzb21lIGJyb3dzZXJzIGFzc3VtZSBsb2NhbCwgYW5kIG90aGVycyBVVEMpXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0ZVN0cmluZzogc3RyaW5nID0gZGF0ZUFzU3RyaW5nLnJlcGxhY2UoJyAnLCAnVCcpLmNvbmNhdCgnWicpO1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZm9ybWF0dGVkRGF0ZVN0cmluZyk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xuICB9XG5cbiAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZXJnZSB0aGlzIGFuZCB0aGUgbWV0aG9kIEZpbHRlckNvbnZlcnRlcjo6Y29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsIGluIGFwaS1wbGF0Zm9ybS1qc1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyBpcyBib3RoIERhdGFEaWN0aW9uYXJ5IGFuZCBTaG93RGF0YVRhYmxlUHJlc01vZGVsIGNvbXBhdGlibGUuXG4gICAgLy8gSW4gdGhlIERhdGFEaWN0aW9uYXJ5LCB2YWx1ZUFzU3RyaW5nIGNhbiBiZSAnJW51bGwlJyBvciAnJW1pc3NpbmclJywgd2hpbGUgaW5cbiAgICAvLyBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCB3ZSBjYW4gZ2V0ICdudWxsJyBvciAnbWlzc2luZycsIG9yICclbnVsbCUnIGZvciBzdHJpbmcgc3BlY2lhbCB2YWx1ZXMuXG4gICAgLy8gRm9yIGVpdGhlciBvZiB0aGVzZSBjYXNlcywgd2UgcmV0dXJuIHNwZWNpYWxWYWx1ZUluZGljYXRvciAob3IgdGhlIG9yaWdpbmFsIHNwZWNpYWwgc3RyaW5nKS5cbiAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbHR5LCB0aGlzIGNvbnZlcnRlcjpcbiAgICAvLyAxLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgc3BlY2lhbCB2YWx1ZXNcbiAgICAvLyAyLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgZGF0ZVxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggdmFsdWVzIGNhbiBiZSB1bmRlZmluZWQsIHNvIHJlc3VsdCBpcyBhbHNvIHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZUFzU3RyaW5nID09PSB1bmRlZmluZWQgfHwgdmFsdWVBc1N0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NwZWNpYWwodmFsdWVBc1N0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJvb2xlYW4odmFsdWVBc1N0cmluZyk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgLy8gUmV0dXJuIHNwZWNpYWwgdmFsdWUgJyVudWxsJScgZm9yIGFueSBmYWlsdXJlIGluIHBhcnNpbmcuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgd2lsbCBnaXZlIHVzIHN0cmluZ3MgbGlrZSAnbnVsbCdcbiAgICAgICAgLy8gZm9yIHNwZWNpYWwgdmFsdWVzLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAvLyBGb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgd2lsbCBiZSBcIm51bGxcIiB3aGljaCB3aWxsIGZhaWwgdG8gcGFyc2UuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuICclbnVsbCUnLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWVBc1N0cmluZykgPT09IG51bGwgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlQXNTdHJpbmc7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJSdcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlVGltZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWVBc1N0cmluZztcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBjb252ZXJ0cyBmcm9tIG91ciAxLjIgQVBJIHRoYXQgcmV0dXJucyBzdHJpbmdzIGZvciBzcGVjaWFscywgYW5kIGRhdGVzIGFzIHN0cmluZ3MuXG4gICAgLy8gSXQgdGFrZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiAnJW51bGwlJyBhbmQgcmV0dXJucyBhIG51bGwuXG4gICAgLy8gRm9yIGRhdGVzLCBpdCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcuXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBzaG91bGQgYmUgdXNlZCB0byBidWlsZCBhIERhdGFWYWx1ZS5uYXRpdmVWYWx1ZSBmaWVsZC5cblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IGNhbiBiZSB1bmRlZmluZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG5hdGl2ZVZhbHVlIGlzIHRyZWF0ZWQgbGlrZSBhIHNwZWNpYWxcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBEYXRlIG9iamVjdCAob3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzIC4uLiB3ZSBhc3N1bWUgc3BlY2lhbClcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3BlY2lhbCh2YWx1ZSkgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3BhdGlhbDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGRpcmVjdGx5IHRvIG5hdGl2ZSB2YWx1ZSBmb3IgYWxsIHR5cGVzXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh0aGlzLmNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZSwgdHlwZSksIHR5cGUpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBFeHRlbnNpb25Db250ZXh0IHtcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgU2VydmVyID0gJ3NlcnZlcicsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgVmlld2luZyA9ICd2aWV3aW5nJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gQW5ub3RhdGVFbnVtIHtcbiAgTWFyayA9ICdtYXJrJyxcbiAgUG9pbnQgPSAncG9pbnQnLFxuICBBcmVhID0gJ2FyZWEnLFxufVxuXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcbiAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG5leHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgQmxhbmsgPSAnYmxhbmsnLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgUXVpY2tGaWx0ZXIgPSAncXVpY2stZmlsdGVyJyxcbiAgUGFyYW1ldGVyQ29udHJvbCA9ICdwYXJhbWV0ZXItY29udHJvbCcsXG4gIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICBMZWdlbmQgPSAnbGVnZW5kJyxcbiAgVGl0bGUgPSAndGl0bGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBJbWFnZSA9ICdpbWFnZScsXG4gIFdlYlBhZ2UgPSAnd2ViLXBhZ2UnLFxuICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbn1cblxuZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgSW50ID0gJ2ludCcsXG4gIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgQm9vbCA9ICdib29sJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgU3BhdGlhbCA9ICdzcGF0aWFsJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICBXaW5kb3cgPSAnd2luZG93JyxcbiAgTW9kYWwgPSAnbW9kYWwnLFxuICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG59XG5cbmV4cG9ydCBlbnVtIEVuY29kZWREYXRhVHlwZSB7XG4gIE51bWJlciA9ICdudW1iZXInLFxuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgQm9vbGVhbiA9ICdib29sZWFuJyxcbn1cblxuZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gIElOSVRJQUxJWkFUSU9OX0VSUk9SID0gJ2luaXRpYWxpemF0aW9uLWVycm9yJyxcbiAgSU5URVJOQUxfRVJST1IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICBNSVNTSU5HX0VOVU1fTUFQUElORyA9ICdtaXNzaW5nLWVudW0tbWFwcGluZycsXG4gIE1JU1NJTkdfUEFSQU1FVEVSID0gJ21pc3NpbmctcGFyYW1ldGVyJyxcbiAgUEVSTUlTU0lPTl9ERU5JRUQgPSAncGVybWlzc2lvbi1kZW5pZWQnLFxuICBQUkVTX01PREVMX1BBUlNJTkdfRVJST1IgPSAncHJlcy1tb2RlbC1wYXJzaW5nLWVycm9yJyxcbiAgVkVSU0lPTl9OT1RfQ09ORklHVVJFRCA9ICd2ZXJzaW9uLW5vdC1jb25maWd1cmVkJyxcbiAgVklTSUJJTElUWV9FUlJPUiA9ICd2aXNpYmlsaXR5LWVycm9yJyxcbiAgVU5LTk9XTl9WRVJCX0lEID0gJ3Vua25vd24tdmVyYi1pZCcsXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgU3VtID0gJ3N1bScsXG4gIEF2ZyA9ICdhdmcnLFxuICBNaW4gPSAnbWluJyxcbiAgTWF4ID0gJ21heCcsXG4gIFN0ZGV2ID0gJ3N0ZGV2JyxcbiAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gIFZhciA9ICd2YXInLFxuICBWYXJwID0gJ3ZhcnAnLFxuICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICBDb3VudCA9ICdjb3VudCcsXG4gIENvdW50ZCA9ICdjb3VudGQnLFxuICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgQXR0ciA9ICdhdHRyJyxcbiAgTm9uZSA9ICdub25lJyxcbiAgWWVhciA9ICd5ZWFyJyxcbiAgUXRyID0gJ3F0cicsXG4gIE1vbnRoID0gJ21vbnRoJyxcbiAgRGF5ID0gJ2RheScsXG4gIEhvdXIgPSAnaG91cicsXG4gIE1pbnV0ZSA9ICdtaW51dGUnLFxuICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgV2VlayA9ICd3ZWVrJyxcbiAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICBNZHkgPSAnbWR5JyxcbiAgRW5kID0gJ2VuZCcsXG4gIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICBRdWFydDEgPSAncXVhcnQxJyxcbiAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICBJbk91dCA9ICdpbi1vdXQnLFxuICBVc2VyID0gJ3VzZXInLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZFJvbGVUeXBlIHtcbiAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gIE1lYXN1cmUgPSAnbWVhc3VyZScsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbi8qKlxuICogIFRoZSBkaWZmZXJlbnQgdXBkYXRlIHR5cGVzIGZvciBhcHBseWluZyBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlclVwZGF0ZVR5cGUge1xuICBBZGQgPSAnYWRkJyxcbiAgQWxsID0gJ2FsbCcsXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG4gIFJlbW92ZSA9ICdyZW1vdmUnLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFR5cGUge1xuICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgU3RvcnkgPSAnc3RvcnknLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0Jyxcbn1cblxuZXhwb3J0IGVudW0gRG9tYWluUmVzdHJpY3Rpb25UeXBlIHtcbiAgQWxsID0gJ2FsbCcsXG4gIExpc3QgPSAnbGlzdCcsXG4gIFJhbmdlID0gJ3JhbmdlJyxcbn1cblxuZXhwb3J0IGVudW0gRGF0ZVN0ZXBQZXJpb2Qge1xuICBZZWFycyA9ICd5ZWFycycsXG4gIFF1YXJ0ZXJzID0gJ3F1YXJ0ZXJzJyxcbiAgTW9udGhzID0gJ21vbnRocycsXG4gIFdlZWtzID0gJ3dlZWtzJyxcbiAgRGF5cyA9ICdkYXlzJyxcbiAgSG91cnMgPSAnaG91cnMnLFxuICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICBTZWNvbmRzID0gJ3NlY29uZHMnLFxufVxuXG4vKipcbiAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZy5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gIE51bGxWYWx1ZXMgPSAnbnVsbHZhbHVlcycsXG4gIE5vbk51bGxWYWx1ZXMgPSAnbm9ubnVsbHZhbHVlcycsXG4gIEFsbFZhbHVlcyA9ICdhbGx2YWx1ZXMnLFxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGZpbHRlciBkb21haW5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyRG9tYWluVHlwZSB7XG4gIFJlbGV2YW50ID0gJ3JlbGV2YW50JyxcbiAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdGlvbiB0eXBlIGZvciBzZWxlY3QgbWFya3MgYXBpLlxuICovXG5leHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgUmVwbGFjZSA9ICdzZWxlY3QtcmVwbGFjZScsXG4gIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBzZWxlY3QgdHVwbGVzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0T3B0aW9ucyB7XG4gIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICBUb2dnbGUgPSAnc2VsZWN0LW9wdGlvbnMtdG9nZ2xlJyxcbiAgTWVudSA9ICdzZWxlY3Qtb3B0aW9ucy1tZW51JywgLy8gbm90IGltcGxlbWVudGVkIGluIHRoZSBleHRlcm5hbCBjb250cmFjdFxuICBSYW5nZSA9ICdzZWxlY3Qtb3B0aW9ucy1yYW5nZScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgU2VhcmNoID0gJ3NlbGVjdC1vcHRpb25zLXNlYXJjaCcsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3Rcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBpbmNsdWRlZCB2YWx1ZXMgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcyB7XG4gIEluY2x1ZGVOdWxsID0gJ2luY2x1ZGUtbnVsbCcsXG4gIEluY2x1ZGVOb25OdWxsID0gJ2luY2x1ZGUtbm9uLW51bGwnLFxuICBJbmNsdWRlQWxsID0gJ2luY2x1ZGUtYWxsJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIGEgaGllcmFyY2hpY2FsIGxldmVsIHNlbGVjdGlvbiBzdGF0ZS5cbiAqL1xuZXhwb3J0IGVudW0gSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gIEFsbFNlbGVjdGVkID0gJ2FsbC1zZWxlY3RlZCcsXG4gIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgU29tZVNlbGVjdGVkID0gJ3NvbWUtc2VsZWN0ZWQnLFxuICBVbmtub3duU2VsZWN0ZWQgPSAndW5rbm93bi1zZWxlY3RlZCcsXG59XG5cbi8qKlxuICogVHlwZSBvZiBtYXJrIGZvciBhIGdpdmVuIG1hcmtzIGNhcmQgaW4gYSB2aXouXG4gKi9cbmV4cG9ydCBlbnVtIE1hcmtUeXBlIHtcbiAgQmFyID0gJ2JhcicsXG4gIExpbmUgPSAnbGluZScsXG4gIEFyZWEgPSAnYXJlYScsXG4gIFNxdWFyZSA9ICdzcXVhcmUnLFxuICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBNYXAgPSAnbWFwJyxcbiAgUGllID0gJ3BpZScsXG4gIEdhbnR0QmFyID0gJ2dhbnR0LWJhcicsXG4gIFBvbHlnb24gPSAncG9seWdvbicsXG4gIEhlYXRtYXAgPSAnaGVhdG1hcCcsXG4gIFZpekV4dGVuc2lvbiA9ICd2aXotZXh0ZW5zaW9uJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGZpbHRlclxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgQ2F0ZWdvcmljYWwgPSAnY2F0ZWdvcmljYWwnLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZURhdGUnLFxuICBIaWVyYXJjaGljYWwgPSAnaGllcmFyY2hpY2FsJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBEYXRlUmFuZ2VUeXBlIG9mIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZVJhbmdlVHlwZSB7XG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGxhc3QgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0ID0gJ2xhc3QnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0TiA9ICdsYXN0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIG5leHQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0ID0gJ25leHQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0TiA9ICduZXh0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBDdXJyZW50ID0gJ2N1cnJlbnQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIGV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY3VycmVudCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIFRvRGF0ZSA9ICd0b0RhdGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsYXVuY2hpbmcgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICovXG5leHBvcnQgZW51bSBFeHRlbnNpb25EaWFsb2dSZXN1bHQge1xuICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgSW52YWxpZERvbWFpbiA9ICdpbnZhbGlkLWRvbWFpbicsXG4gIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG59XG5cbi8vIEVudW1lcmF0aW9uIGZvciBBcGlTaG93RGF0YSB0YWJsZSBpZCBzZW50aW5lbHMuXG5leHBvcnQgZW51bSBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwge1xuICAvLyBmaW5kIHRoZSBvbmUgbG9naWNhbCB0YWJsZSAtIHVzZWQgaW4gdmVyc2lvbiBjb21wYXRpYmlsaXR5IGNoZWNrIGZvciBnZXRVbmRlcmx5aW5nRGF0YVRhYmxlIGFuZCBnZXRMb2dpY2FsRGF0YVRhYmxlIGNvbW1hbmRzXG4gIFNpbmdsZVRhYmxlSWQgPSAnc2luZ2xlLXRhYmxlLWlkLXNlbnRpbmVsJyxcbiAgU2luZ2xlVGFibGVDYXB0aW9uID0gJ1NpbmdsZSB0YWJsZSBpZCBzZW50aW5lbCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBvcHRpbWl6ZSB0aGUgZ2V0U3VtbWFyeURhdGEvZ2V0VW5kZXJseWluZ1RhYmxlRGF0YSByZXN1bHRzXG4gKiBNYXBwZWQgZnJvbSBleHRlcm5hbCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvblxuICovXG5leHBvcnQgZW51bSBBcGlTaG93RGF0YVRhYmxlRm9ybWF0IHtcbiAgTmF0aXZlVmFsdWVzT25seSA9ICduYXRpdmUtdmFsdWVzLW9ubHknLFxuICBGb3JtYXR0ZWRWYWx1ZXNPbmx5ID0gJ2Zvcm1hdHRlZC12YWx1ZXMtb25seScsXG4gIE5hdGl2ZUFuZEZvcm1hdHRlZFZhbHVlcyA9ICduYXRpdmUtYW5kLWZvcm1hdHRlZC12YWx1ZXMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gZGVub3RlIHRoZSBzZWN0aW9ucyBvZiBmb3JtYXR0aW5nIHdpdGhpbiB0YWJsZWF1XG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIENsYXNzTmFtZUtleSB7XG4gIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgV29ya3NoZWV0ID0gJ3RhYmxlYXUtd29ya3NoZWV0JyxcbiAgVG9vbHRpcCA9ICd0YWJsZWF1LXRvb2x0aXAnLFxuICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICBEYXNoYm9hcmRUaXRsZSA9ICd0YWJsZWF1LWRhc2hib2FyZC10aXRsZScsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgcGFnZSBzaXplIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTaXplT3B0aW9uIHtcbiAgTGV0dGVyID0gJ2xldHRlcicsXG4gIExlZ2FsID0gJ2xlZ2FsJyxcbiAgTm90ZSA9ICdub3RlJyxcbiAgRm9saW8gPSAnZm9saW8nLFxuICBUYWJsb2lkID0gJ3RhYmxvaWQnLFxuICBMZWRnZXIgPSAnbGVkZ2VyJyxcbiAgU3RhdGVtZW50ID0gJ3N0YXRlbWVudCcsXG4gIEV4ZWN1dGl2ZSA9ICdleGVjdXRpdmUnLFxuICBBMyA9ICdhMycsXG4gIEE0ID0gJ2E0JyxcbiAgQTUgPSAnYTUnLFxuICBCNCA9ICdiNCcsXG4gIEI1ID0gJ2I1JyxcbiAgUXVhcnRvID0gJ3F1YXJ0bycsXG4gIFVuc3BlY2lmaWVkID0gJ3Vuc3BlY2lmaWVkJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIHNldCB0aGUgcGFnZSBvcmllbnRhdGlvbiBtb2RlIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VPcmllbnRhdGlvbiB7XG4gIFByaW50ZXIgPSAncHJpbnRlcicsXG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgc2NhbGUgbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBTY2FsZU1vZGUge1xuICBTY2FsZUF1dG8gPSAnYXV0bycsXG4gIFNjYWxlUGVyY2VudGFnZSA9ICdwZXJjZW50JyxcbiAgU2NhbGVGaXRQYWdlcyA9ICdmaXQtcGFnZXMnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgcGVyY2VudCB2YWx1ZXNcbiAqL1xuZXhwb3J0IGVudW0gUGFnZVNjYWxpbmdPcHRpb24ge1xuICBTY2FsZVBjdEF1dG8gPSAnYXV0bycsXG4gIFNjYWxlUGN0NDAwID0gJ3BjdDQwMCcsXG4gIFNjYWxlUGN0MjAwID0gJ3BjdDIwMCcsXG4gIFNjYWxlUGN0MTAwID0gJ3BjdDEwMCcsXG4gIFNjYWxlUGN0OTAgPSAncGN0OTAnLFxuICBTY2FsZVBjdDgwID0gJ3BjdDgwJyxcbiAgU2NhbGVQY3Q3NSA9ICdwY3Q3NScsXG4gIFNjYWxlUGN0NjAgPSAncGN0NjAnLFxuICBTY2FsZVBjdDUwID0gJ3BjdDUwJyxcbiAgU2NhbGVQY3QyNSA9ICdwY3QyNScsXG59XG5cbi8qKlxuICogVXNlZCBieSBzZXRGaXRBbmRTY2FsZVZhbHVlcyB0byBzY2FsZSBmaXQgcGFnZSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGVudW0gRml0UGFnZXMge1xuICBGaXRPbmVIaWdoID0gJ2ZpdDB4MScsXG4gIEZpdFR3b0hpZ2ggPSAnZml0MHgyJyxcbiAgRml0T25lV2lkZSA9ICdmaXQxeDAnLFxuICBGaXRUd29XaWRlID0gJ2ZpdDJ4MCcsXG59XG5cbi8qKlxuICogVXNlZCBieSBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmNcbiAqL1xuZXhwb3J0IGVudW0gRW5jb2RpbmdUeXBlIHtcbiAgQ29sb3IgPSAnY29sb3InLFxuICBTaXplID0gJ3NpemUnLFxuICBMYWJlbCA9ICdsYWJlbCcsXG4gIERldGFpbCA9ICdkZXRhaWwnLFxuICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICBTaGFwZSA9ICdzaGFwZScsXG4gIFBhdGggPSAncGF0aCcsXG4gIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgR2VvbWV0cnkgPSAnZ2VvbWV0cnknLFxuICBDdXN0b20gPSAnY3VzdG9tJyxcbn1cbiIsImV4cG9ydCBlbnVtIE5vdGlmaWNhdGlvbklkIHtcbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51Q2xpY2tlZCA9ICdjdXN0b20tbWFyay1jb250ZXh0LW1lbnUtY2xpY2tlZCcsXG4gIENvbnRleHRNZW51Q2xpY2sgPSAnY29udGV4dC1tZW51LWNsaWNrJyxcbiAgQ3VzdG9tVmlld1JlbW92ZWQgPSAnY3VzdG9tLXZpZXctcmVtb3ZlZCcsXG4gIEN1c3RvbVZpZXdTYXZlZCA9ICdjdXN0b20tdmlldy1zYXZlZCcsXG4gIEN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ2N1c3RvbS12aWV3LXNldC1kZWZhdWx0JyxcbiAgQ3VzdG9tVmlld3NMb2FkZWQgPSAnY3VzdG9tLXZpZXdzLWxvYWRlZCcsXG4gIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcbiAgRWRpdEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1idXR0b24tY2xpY2tlZCcsXG4gIEVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ2VkaXQtaW4tZGVza3RvcC1idXR0b24tY2xpY2tlZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSA9ICdleHRlbnNpb24tZGlhbG9nLXVwZGF0ZScsXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyLWNoYW5nZWQnLFxuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdC12aXotc2l6ZS1rbm93bicsXG4gIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyLWNoYW5nZWQnLFxuICBTZWxlY3RlZE1hcmtzQ2hhbmdlZCA9ICdzZWxlY3RlZC1tYXJrcy1jaGFuZ2VkJyxcbiAgU2V0dGluZ3NDaGFuZ2VkID0gJ3NldHRpbmdzLWNoYW5nZWQnLFxuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeS1kYXRhLWNoYW5nZWQnLFxuICBUZXN0Q29udmVyc2lvbk5vdGlmaWNhdGlvbiA9ICd0ZXN0LWNvbnZlcnNpb24tbm90aWZpY2F0aW9uJyxcbiAgVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICd0b29sYmFyLXN0YXRlLWNoYW5nZWQnLFxuICBWaXpJbnRlcmFjdGl2ZSA9ICd2aXotaW50ZXJhY3RpdmUnLFxuICBBc2tEYXRhSW50ZXJhY3RpdmUgPSAnYXNrLWRhdGEtaW50ZXJhY3RpdmUnLFxuICBXb3JrYm9va1JlYWR5VG9DbG9zZSA9ICd3b3JrYm9vay1yZWFkeS10by1jbG9zZScsXG4gIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgV29ya2Jvb2tQdWJsaXNoZWQgPSAnd29ya2Jvb2stcHVibGlzaGVkJyxcbiAgV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICd3b3JrYm9vay1wdWJsaXNoZWQtYXMnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwID0gJ2V4cG9ydC1jcm9zc3RhYi1zaGVldC1tYXAnLFxuICBFeHBvcnRGaWxlID0gJ2V4cG9ydC1maWxlJyxcbiAgRXhwb3J0T3JpZ2luVXJsID0gJ2V4cG9ydC1vcmlnaW4tdXJsJyxcbiAgRXhwb3J0UGRmT3B0aW9ucyA9ICdleHBvcnQtcGRmLW9wdGlvbnMnLFxuICBFeHRlbnNpb25Cb290c3RyYXBJbmZvID0gJ2V4dGVuc2lvbi1ib290c3RyYXAtaW5mbycsXG4gIEV4dGVuc2lvbkNvbnRleHRNZW51SWRzID0gJ2V4dGVuc2lvbi1jb250ZXh0LW1lbnUtaWRzJyxcbiAgRXh0ZW5zaW9uRGlhbG9nSCA9ICdleHRlbnNpb24tZGlhbG9nLWhlaWdodCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1BheWxvYWQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1wYXlsb2FkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0ID0gJ2V4dGVuc2lvbi1kaWFsb2ctcmVzdWx0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nU3R5bGUgPSAnZXh0ZW5zaW9uLWRpYWxvZy1zdHlsZScsXG4gIEV4dGVuc2lvbkRpYWxvZ1VybCA9ICdleHRlbnNpb24tZGlhbG9nLXVybCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1cgPSAnZXh0ZW5zaW9uLWRpYWxvZy13aWR0aCcsXG4gIEV4dGVuc2lvbkxvY2F0b3IgPSAnZXh0ZW5zaW9uLWxvY2F0b3InLFxuICBFeHRlbnNpb25TZXR0aW5nc0luZm8gPSAnZXh0ZW5zaW9uLXNldHRpbmdzLWluZm8nLFxuICBFeHRlbnNpb25ab25lSWQgPSAnZXh0ZW5zaW9uLXpvbmUtaWQnLFxuICBFeHRlcm5hbE1lbnVEZXNjcmlwdGlvbiA9ICdleHRlcm5hbC1tZW51LWRlc2NyaXB0aW9uJyxcbiAgRXh0ZXJuYWxNZW51SGVhZGVyID0gJ2V4dGVybmFsLW1lbnUtaGVhZGVyJyxcbiAgRXh0ZXJuYWxNZW51SXRlbURpc3BsYXlOYW1lID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1kaXNwbGF5LW5hbWUnLFxuICBFeHRlcm5hbE1lbnVJdGVtSWQgPSAnZXh0ZXJuYWwtbWVudS1pdGVtLWlkJyxcblxuICBGaWVsZCA9ICdmaWVsZCcsXG4gIEZpZWxkSWQgPSAnZmllbGQtaWQnLFxuICBGaWVsZE5hbWUgPSAnZmllbGQtbmFtZScsXG4gIEZpbHRlckxldmVscyA9ICdmaWx0ZXItbGV2ZWxzJyxcbiAgRmlsdGVyUmFuZ2VNYXggPSAnZmlsdGVyLXJhbmdlLW1heCcsXG4gIEZpbHRlclJhbmdlTWluID0gJ2ZpbHRlci1yYW5nZS1taW4nLFxuICBGaWx0ZXJSYW5nZU51bGxPcHRpb24gPSAnZmlsdGVyLXJhbmdlLW51bGwtb3B0aW9uJyxcbiAgRmlsdGVyVXBkYXRlVHlwZSA9ICdmaWx0ZXItdXBkYXRlLXR5cGUnLFxuICBGaWx0ZXJWYWx1ZXMgPSAnZmlsdGVyLXZhbHVlcycsXG4gIEZvbnROYW1lTGlzdEl0ZW1zID0gJ2ZvbnQtbmFtZS1saXN0LWl0ZW1zJyxcbiAgRm9ybWF0dGVkVGV4dCA9ICdmb3JtYXR0ZWQtdGV4dCcsXG4gIEZ1bmN0aW9uTmFtZSA9ICdmdW5jdGlvbi1uYW1lJyxcblxuICBIaWVyVmFsU2VsZWN0aW9uTW9kZWxzID0gJ2hpZXJhcmNoaWNhbFZhbHVlU2VsZWN0aW9uTW9kZWxzJyxcbiAgSGlnaGxpZ2h0ZWREYXRhID0gJ2hpZ2hsaWdodGVkLWRhdGEnLFxuICBIb3ZlclR1cGxlSW50ZXJhY3Rpb24gPSAnaG92ZXItdHVwbGUtaW50ZXJhY3Rpb24nLFxuXG4gIElnbm9yZUFsaWFzZXMgPSAnaWdub3JlLWFsaWFzZXMnLFxuICBJZ25vcmVTZWxlY3Rpb24gPSAnaWdub3JlLXNlbGVjdGlvbicsXG4gIEluY2x1ZGVBbGxDb2x1bW5zID0gJ2luY2x1ZGUtYWxsLWNvbHVtbnMnLFxuICBJbnZhbGlkQWdnRmllbGROYW1lID0gJ2ludmFsaWQtYWdnLWZpZWxkLW5hbWUnLFxuICBJbnZhbGlkRGF0ZXMgPSAnaW52YWxpZC1kYXRlcycsXG4gIEludmFsaWRGaWVsZENhcHRpb24gPSAnaW52YWxpZC1maWVsZC1jYXB0aW9uJyxcbiAgSW52YWxpZEZpZWxkcyA9ICdpbnZhbGlkLWZpZWxkcycsXG4gIEludmFsaWRWYWx1ZXMgPSAnaW52YWxpZC12YWx1ZXMnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXhIZWlnaHQgPSAnbWF4LWhlaWdodCcsXG4gIE1heFJvd3MgPSAnbWF4LXJvd3MnLFxuICBNYXhXaWR0aCA9ICdtYXgtd2lkdGgnLFxuICBNaW5IZWlnaHQgPSAnbWluLWhlaWdodCcsXG4gIE1pbldpZHRoID0gJ21pbi13aWR0aCcsXG5cbiAgUGFnZVJvd0NvdW50ID0gJ3BhZ2Utcm93LWNvdW50JyxcbiAgUGFyYW1ldGVyQ2FwdGlvbiA9ICdwYXJlbWV0ZXItY2FwdGlvbicsXG4gIFBhcmFtZXRlckVycm9yID0gJ3BhcmFtZXRlci1lcnJvcicsXG4gIFBhcmFtZXRlckZpZWxkTmFtZSA9ICdwYXJhbWV0ZXItZmllbGQtbmFtZScsXG4gIFBhcmFtZXRlckluZm8gPSAncGFyYW1ldGVyLWluZm8nLFxuICBQYXJhbWV0ZXJJbmZvcyA9ICdwYXJhbWV0ZXItaW5mb3MnLFxuICBQYXJhbWV0ZXJWYWx1ZSA9ICdwYXJhbWV0ZXItdmFsdWUnLFxuICBQZXJpb2RUeXBlID0gJ3BlcmlvZC10eXBlJyxcblxuICBRdWFudGl0YXRpdmVEb21haW4gPSAncXVhbnRpdGF0aXZlLWRtYWluJyxcbiAgUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVscyA9ICdxdWFudGF0aXZlUmFuZ2VTZWxlY3Rpb25Nb2RlbHMnLFxuXG4gIFJhbmdlTiA9ICdyYW5nZS1uJyxcbiAgUmVwbGF5U3BlZWQgPSAncmVwbGF5LXNwZWVkJyxcblxuICBTZWxlY3RlZERhdGEgPSAnc2VsZWN0ZWQtZGF0YScsXG4gIFNlbGVjdGVkU2hlZXROYW1lcyA9ICdzZWxlY3RlZC1zaGVldC1uYW1lcycsXG4gIFNlbGVjdGlvbiA9ICdzZWxlY3Rpb24nLFxuICBTZWxlY3Rpb25MaXN0ID0gJ3NlbGVjdGlvbi1saXN0JyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSA9ICdzZWxlY3Rpb25VcGRhdGVUeXBlJyxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24gPSAnc2VsZWN0LXR1cGxlcy1pbnRlcmFjdGlvbicsXG4gIFNlbmROb3RpZmljYXRpb25zID0gJ3NlbmQtbm90aWZpY2F0aW9ucycsXG4gIFNldHRpbmdzVmFsdWVzID0gJ3NldHRpbmdzLXZhbHVlcycsXG4gIFNoYXJlZEZpbHRlclNoZWV0cyA9ICdzaGFyZWQtZmlsdGVyLXNoZWV0cycsXG4gIFNoYXJlZEZpbHRlcnNJbmZvID0gJ3NoYXJlZC1maWx0ZXJzLWluZm8nLFxuICBTaGVldElkZW50aWZpZXIgPSAnc2hlZXQtaWRlbnRpZmllcicsXG4gIFNoZWV0TmFtZSA9ICdzaGVldC1uYW1lJyxcbiAgU2hlZXRQYXRoID0gJ3NoZWV0LXBhdGgnLFxuICBTaG91bGRSZWZyZXNoRFMgPSAnc2hvdWxkLXJlZnJlc2gtZHMnLFxuICBTaG93RGF0YVRhYmxlRm9ybWF0ID0gJ3Nob3ctZGF0YS10YWJsZS1mb3JtYXQnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb29sdGlwQ29udGV4dCA9ICd0b29sdGlwLWNvbnRleHQnLFxuICBUb29sdGlwVGV4dFJlcXVlc3QgPSAndG9vbHRpcC10ZXh0LXJlcXVlc3QnLFxuICBUb29sdGlwVGV4dCA9ICd0b29sdGlwLXRleHQnLFxuXG4gIFVuZGVybHlpbmdEYXRhVGFibGUgPSAndW5kZXJseWluZy1kYXRhLXRhYmxlJyxcbiAgVW5kZXJseWluZ1N1bW1hcnlEYXRhVGFibGUgPSAndW5kZXJseWluZy1zdW1tYXJ5LWRhdGEtdGFibGUnLFxuICBVcmwgPSAndXJsJyxcbiAgVXNlVGFiRGVsaW1pdGVycyA9ICd1c2UtdGFiLWRlbGltaXRlcnMnLFxuXG4gIFZpZXdEYXRhVGFibGVDYWNoZUlkID0gJ3ZpZXctZGF0YS10YWJsZS1jYWNoZS1pZCcsXG4gIFZpZXdEYXRhVGFibGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtaWQnLFxuICBWaXN1YWxJZCA9ICd2aXN1YWwtaWQnLFxuICBWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ3Zpc3VhbC1zcGVjaWZpY2F0aW9uJyxcbiAgVml6QVBJSW5wdXRKc29uID0gJ3ZpemFwaS1pbnB1dC1qc29uJyxcbiAgVml6QVBJU3RhdGVXaXRoRGF0YU1vZGVsID0gJ3ZpemFwaS1zdGF0ZS13aXRoLWRhdGEtbW9kZWwnLFxuICBWaXpBUElTdGF0ZVdhcm5pbmdNc2cgPSAndml6YXBpLXN0YXRlLXdhcm5pbmctbXNnJyxcbiAgVml6QVBJU1ZHID0gJ3ZpemFwaS1zdmcnLFxuXG4gIFdvcmtzaGVldE5hbWUgPSAnd29ya3NoZWV0LW5hbWUnLFxuICBXb3Jrc2hlZXRGaWx0ZXJzID0gJ3dvcmtzaGVldC1maWx0ZXJzJyxcblxuICBab25lSWRzVmlzaWJpbGl0eU1hcCA9ICd6b25lLWlkcy12aXNpYmlsaXR5LW1hcCcsXG59XG4iLCIvLyBEZWNsYXJlIHRoaXMga2V5IHR5cGUgYW5kIGV4cG9ydCB0aGUgTm90aWZpY2F0aW9uSWQgdG8gbWFrZSB0aGlzIGJlaGF2ZSBsaWtlIGEgc3RyaW5nIGVudW0uXG4vL1xuLy8gUExFQVNFIEtFRVAgSU4gQUxQSEFCRVRJQ0FMIE9SREVSLiBUaGlzIGhlbHBzIHdpdGggdmlzdWFsbHkgZmluZGluZyBlbnRyaWVzLCBrbm93aW5nIHdoZXJlIHRvIHB1dFxuLy8gbmV3IG9uZXMsIGFuZCBtZXJnZSBjb25mbGljdHMuXG5leHBvcnQgZW51bSBWZXJiSWQge1xuICBBY3RpdmF0ZU5leHRTdG9yeVBvaW50ID0gJ2FjdGl2YXRlLW5leHQtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1wcmV2aW91cy1zdG9yeS1wb2ludCcsXG4gIEFjdGl2YXRlU2hlZXQgPSAnYWN0aXZhdGVTaGVldCcsXG4gIEFjdGl2YXRlU3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1zdG9yeS1wb2ludCcsXG4gIEFwcGVuZEV4dGVybmFsTWVudUl0ZW0gPSAnYXBwZW5kLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIEFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXIgPSAnY2F0ZWdvcmljYWwtZmlsdGVyJyxcbiAgQXBwbHlSYW5nZUZpbHRlciA9ICdyYW5nZS1maWx0ZXInLFxuICBBcHBseVJlbGF0aXZlRGF0ZUZpbHRlciA9ICdhcHBseS1yZWxhdGl2ZS1kYXRlLUZpbHRlcicsXG4gIEF1dGhlbnRpY2F0ZSA9ICdhdXRoZW50aWNhdGUnLFxuXG4gIEJsb2NrRXh0ZW5zaW9uID0gJ2Jsb2NrLWV4dGVuc2lvbicsXG5cbiAgQ2hhbmdlUGFyYW1ldGVyVmFsdWUgPSAnY2hhbmdlLXBhcmFtZXRlci12YWx1ZScsXG4gIENoYW5nZVNoYXJlZEZpbHRlciA9ICdjaGFuZ2Utc2hhcmVkLWZpbHRlcicsXG4gIENsZWFyRmlsdGVyID0gJ2NsZWFyLWZpbHRlcicsXG4gIENsZWFyU2VsZWN0ZWRNYXJrcyA9ICdjbGVhci1zZWxlY3RlZC1tYXJrcycsXG4gIENsb3NlRGlhbG9nID0gJ2Nsb3NlLWRpYWxvZycsXG4gIENyZWF0ZUFubm90YXRpb24gPSAnY3JlYXRlLWFubm90YXRpb24nLFxuXG4gIERhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyID0gJ2Rhc2hib2FyZC1jYXRlZ29yaWNhbC1maWx0ZXInLFxuICBEaXNwbGF5RGlhbG9nID0gJ2Rpc3BsYXktZGlhbG9nJyxcbiAgRG93bmxvYWRXb3JrYm9vayA9ICdkb3dubG9hZC13b3JrYm9vaycsXG5cbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRSYW5nZURvbWFpbiA9ICdnZXQtcmFuZ2UtZG9tYWluJyxcbiAgR2V0U2VsZWN0ZWRNYXJrcyA9ICdnZXQtc2VsZWN0ZWQtbWFya3MnLFxuICBHZXRTaGFyZWRGaWx0ZXIgPSAnZ2V0LXNoYXJlZC1maWx0ZXInLFxuICBHZXRUb29sdGlwVGV4dCA9ICdnZXQtdG9vbHRpcC10ZXh0JyxcbiAgR2V0VW5kZXJseWluZ0RhdGEgPSAnZ2V0LXVuZGVybHlpbmctZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGEgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRVbmRlcmx5aW5nVGFibGVzID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlcycsXG5cbiAgSGllcmFyY2hpY2FsRmlsdGVyID0gJ2hpZXJhY2hpY2FsLWZpbHRlcicsXG5cbiAgSW5pdGlhbGl6ZUV4dGVuc2lvbiA9ICdpbml0aWFsaXplLWV4dGVuc2lvbicsXG5cbiAgTW92ZUFuZFJlc2l6ZVpvbmVzID0gJ21vdmUtYW5kLXJlc2l6ZS16b25lcycsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmV2ZXJ0U3RvcnlQb2ludCA9ICdyZXZlcnQtc3RvcnktcG9pbnQnLFxuICBSZXZlcnRXb3JrYm9vayA9ICdyZXZlcnQtd29ya2Jvb2snLFxuXG4gIFNhdmVFeHRlbnNpb25TZXR0aW5ncyA9ICdzYXZlLWV4dGVuc2lvbi1zZXR0aW5ncycsXG4gIFNhdmVXb3JrYm9va0FzQ3VzdG9tVmlldyA9ICdzYXZlLXdvcmtib29rLWFzLWN1c3RvbS12aWV3JyxcbiAgU2VsZWN0QnlWYWx1ZSA9ICdzZWxlY3QtYnktdmFsdWUnLFxuICBTZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0ID0gJ3NldC1hY3RpdmUtY3VzdG9tLXZpZXctYXMtZGVmYXVsdCcsXG4gIFNldEF1dG9VcGRhdGUgPSAnc2V0LWF1dG8tdXBkYXRlJyxcbiAgU2V0Q2xpY2tUaHJvdWdoID0gJ3NldC1jbGljay10aHJvdWdoJyxcbiAgU2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ3NldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgU2V0U2hlZXRTaXplID0gJ3NldC1zaGVldC1zaXplJyxcbiAgU2V0Wm9uZVZpc2liaWxpdHkgPSAnc2V0LXpvbmUtdmlzaWJpbGl0eScsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU2hvd0N1c3RvbVZpZXcgPSAnc2hvdy1jdXN0b20tdmlldycsXG5cbiAgVGVzdENvbnZlcnNpb25WZXJiID0gJ3Rlc3QtY29udmVyc2lvbi12ZXJiJyxcblxuICBVbmRvID0gJ3VuZG8nLFxuICBVcGRhdGVDdXN0b21WaWV3ID0gJ3VwZGF0ZS1jdXN0b20tdmlldycsXG5cbiAgVml6QVBJID0gJ3Zpei1hcGknLFxufVxuIiwiZXhwb3J0IGVudW0gQXNrRGF0YU9wdGlvbk5hbWVzIHtcbiAgdG9rZW4gPSAndG9rZW4nLFxuICBvcmlnaW4gPSAnb3JpZ2luJyxcbiAgc2hvd0VtYmVkID0gJ3Nob3dFbWJlZCcsXG4gIHNob3dQaW4gPSAnc2hvd1BpbicsXG4gIHNob3dTYXZlID0gJ3Nob3dTYXZlJyxcbiAgc2hvd1NoYXJlID0gJ3Nob3dTaGFyZScsXG4gIGRlYnVnID0gJzpqc2RlYnVnJyxcbiAgQXBpSUQgPSAnOmFwaUlEJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIEFza0RhdGFXZWJDb21wb25lbnQgPSAnOmFza0RhdGFXZWJDb21wb25lbnQnLFxufVxuIiwiZXhwb3J0IGVudW0gUHVsc2VPcHRpb25OYW1lcyB7XG4gIGVtYmVkID0gJ2VtYmVkJyxcbiAgdG9rZW4gPSAndG9rZW4nLFxuICBkaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlRXhwbG9yZUZpbHRlcicsXG4gIGxheW91dCA9ICdlbWJlZF9sYXlvdXQnLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgUHVsc2VXZWJDb21wb25lbnQgPSAnOnB1bHNlV2ViQ29tcG9uZW50Jyxcbn1cbiIsIi8qKlxuICogVGhlc2Ugc3RyaW5ncyB3ZXJlICptYW51YWxseSBjb3BpZWQqIGZyb20gdGhlIHNlcnZlcixcbiAqIHdvcmtncm91cC9zcmMvc2lsb3MvdGFibGVhdS1zZXJ2ZXIvbGlicmFyaWVzL3RhYi1jb250cm9sbGVyLXZpenFsL3NyYy9jb20vdGFibGVhdXNvZnR3YXJlL1xuICogY29udHJvbGxlci92aXpxbC9jb25zdGFudHMvUGFyYW1ldGVyS2V5cy5qYXZhI0w5XG4gKiBzaG91bGQgYmUgZXhwb3J0ZWQgaW5zdGVhZFxuICogcGFyYW1ldGVycyB0aGF0IHZpenFsIHdpbGwgYWNjZXB0IGluIGFuIGVtYmVkZGluZyBVUkxcbiAqKi9cbmVudW0gVnFsUGFyYW1ldGVyTmFtZXMge1xuICBPTkUgPSAnMScsXG4gIEFMRVJUUyA9ICc6YWxlcnRzJyxcbiAgQUxJQVMgPSAnYWxpYXMnLFxuICBBTExPV19ERUZFUlJFRF9CT09UU1RSQVAgPSAnOmFsbG93RGVmZXJyZWRCb290c3RyYXAnLFxuICBBTExPV19BVVRPR0VOX1dPUktTSEVFVF9QSE9ORV9MQVlPVVRTID0gJ2FsbG93QXV0b2dlbldvcmtzaGVldFBob25lTGF5b3V0cycsXG4gIEFQSV9JRCA9ICc6YXBpSUQnLFxuICBBUFAgPSAnOmFwcCcsXG4gIEFUVEFDSE1FTlQgPSAnYXR0YWNobWVudCcsXG4gIElTX0lQQURfQVBQID0gJ2FwcCcsXG4gIEFOSU1BVEVfVFJBTlNJVElPTiA9ICc6YW5pbWF0ZV90cmFuc2l0aW9uJyxcbiAgQVNDRU5ESU5HID0gJ2FzY2VuZGluZycsXG4gIEFVVEhFTlRJQ0FUSU9OID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQVRUUklCVVRFUyA9ICdhdHRyaWJ1dGVzJyxcbiAgQVVUSE9SSU5HX1NIRUVUID0gJzphdXRoU2hlZXQnLFxuICBBWElTID0gJ2F4aXMnLFxuICBCT09UU1RSQVBfV0hFTl9OT1RJRklFRCA9ICc6Ym9vdHN0cmFwV2hlbk5vdGlmaWVkJyxcbiAgQlJPV1NFUl9CQUNLX0JVVFRPTl9VTkRPID0gJzpicm93c2VyQmFja0J1dHRvblVuZG8nLFxuICBCUk9XU0VSX1JFTkRFUklOR19PTiA9ICdpc0Jyb3dzZXJSZW5kZXJpbmcnLFxuICBCUk9XU0VSX1JFTkRFUklOR19USFJFU0hPTEQgPSAnYnJvd3NlclJlbmRlcmluZ1RocmVzaG9sZCcsXG4gIENIQVJTRVQgPSAnY2hhcnNldCcsXG4gIENMSUVOVF9ESU1FTlNJT04gPSAnY2xpZW50RGltZW5zaW9uJyxcbiAgQ0xJRU5UX0lQID0gJ2NsaWVudF9pcCcsXG4gIENMSUVOVF9OVU0gPSAnY2xpZW50TnVtJyxcbiAgQ09MT05fRU1CRURERUQgPSAnOmVtYmVkZGVkJyxcbiAgQ09MT05fTU9CSUxFID0gJzptb2JpbGUnLFxuICBDT0xPTl9ERUVQX0xJTktJTkdfRElTQUJMRUQgPSAnOmRlZXBMaW5raW5nRGlzYWJsZWQnLFxuICBDT0xPTl9XQVRFUk1BUksgPSAnOndhdGVybWFyaycsXG4gIENPTU1FTlRTID0gJzpjb21tZW50cycsXG4gIENPTU1FTlRJTkdfRU5BQkxFRCA9ICc6Y29tbWVudGluZ0VuYWJsZWQnLFxuICBDT01NRU5USU5HX01FTlRJT05TX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdNZW50aW9ucycsXG4gIENPTk5FQ1RJT04gPSAnY29ubmVjdGlvbicsXG4gIENSRUFURURfQllfRkVBVFVSRSA9ICdjcmVhdGVkQnlGZWF0dXJlJyxcbiAgQ1JZUFRFRF9QQVNTV09SRCA9ICdjcnlwdGVkJyxcbiAgQ1NTREVCVUcgPSAnOmNzc2RlYnVnJyxcbiAgQ1NWID0gJ2NzdicsXG4gIENVU1RPTV9WSUVXUyA9ICc6Y3VzdG9tVmlld3MnLFxuICBDViA9ICc6Y3YnLFxuICBDVl9JRCA9ICdjdklkJyxcbiAgREFTSEJPQVJEX1BPUlRfU0laRSA9ICdkYXNoYm9hcmRQb3J0U2l6ZScsXG4gIERBVEFfREVUQUlMUyA9ICc6ZGF0YURldGFpbHMnLFxuICBEQVRBU09VUkNFID0gJ2RhdGFzb3VyY2UnLFxuICBERUJVRyA9ICc6ZGVidWcnLFxuICBERUxBWSA9ICc6ZGVsYXknLFxuICBERVBUSCA9ICdkZXB0aCcsXG4gIERFVklDRV9UWVBFID0gJzpkZXZpY2UnLFxuICBERVZJQ0VfUElYRUxfUkFUSU8gPSAnZGV2aWNlUGl4ZWxSYXRpbycsXG4gIERFVklDRV9QUkVWSUVXX01PREUgPSAnOmRldmljZXByZXZpZXdtb2RlJyxcbiAgRElNRU5TSU9OUyA9ICc6ZGltZW5zaW9ucycsXG4gIERJU0FCTEVfU0hBUkVEX1NFU1NJT05TID0gJzpkaXNhYmxlX3NoYXJlZF9zZXNzaW9ucycsXG4gIERJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTID0gJzpkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcycsXG4gIERJUkVDVElPTiA9ICdkaXJlY3Rpb24nLFxuICBESVNQTEFZX09WRVJMQVkgPSAnOmRpc3BsYXlfb3ZlcmxheScsXG4gIERJU1BMQVlfU0hBUkUgPSAnOmRpc3BsYXlfc2hhcmUnLFxuICBESVNQTEFZX1NQSU5ORVIgPSAnOmRpc3BsYXlfc3Bpbm5lcicsXG4gIERJU1BMQVlfU1RBVElDX0lNQUdFID0gJzpkaXNwbGF5X3N0YXRpY19pbWFnZScsXG4gIERJU1BMQVlfVEFCUyA9ICdkaXNwbGF5X3RhYnMnLFxuICBESVNQTEFZX1ZJRVdfQ09VTlQgPSAnOmRpc3BsYXlfY291bnQnLFxuICBJR05PUkVfU1RJQ0tZX1NFU1NJT04gPSAnOmlnbm9yZV9zdGlja3lfc2Vzc2lvbicsXG4gIElOQ1JFTUVOVF9WSUVXX0NPVU5UID0gJzppbmNyZW1lbnRfdmlld19jb3VudCcsXG4gIERPQ01PREUgPSAnZG9jbW9kZScsXG4gIERPTUFJTiA9ICdkb21haW4nLFxuICBET19XT1JLID0gJ2RvX3dvcmsnLFxuICBEWCA9ICdkeCcsXG4gIERZID0gJ2R5JyxcbiAgRURJVF9EQVRBX0FMRVJUID0gJzplZGl0RGF0YUFsZXJ0JyxcbiAgRU1CRUQgPSAnOmVtYmVkJyxcbiAgRU1CRURERUQgPSAnZW1iZWRkZWQnLFxuICBFTkNSWVBURUQgPSAnZW5jcnlwdGVkJyxcbiAgQVBJX0VYVEVSTkFMX1ZFUlNJT04gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFQSV9JTlRFUk5BTF9WRVJTSU9OID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBFWENMVURFID0gJ2V4Y2x1ZGUnLFxuICBFWFBPUlRfRk9STUFUID0gJzpleHBvcnRfZm9ybWF0JyxcbiAgRklFTEROQU1FID0gJ2ZpZWxkbmFtZScsXG4gIEZJRUxEX05BTUUgPSAnZmllbGRfbmFtZScsXG4gIEZJRUxEX1NFUCA9ICdmaWVsZF9zZXAnLFxuICBGSUxFID0gJ2ZpbGUnLFxuICBGSUxURVJfVElMRV9TSVpFID0gJ2ZpbHRlclRpbGVTaXplJyxcbiAgRk4gPSAnZm4nLFxuICBGT0NVUyA9ICdmb2N1cycsXG4gIEZPUkNFX0NBQ0hFID0gJ2ZvcmNlX2NhY2hlJyxcbiAgRk9STUFUID0gJ2Zvcm1hdCcsXG4gIEZPUk1BVF9EQVRBX1ZBTFVFX0xPQ0FMTFkgPSAnZm9ybWF0RGF0YVZhbHVlTG9jYWxseScsXG4gIEZST01fV0cgPSAnOmZyb21fd2cnLFxuICBHUkFQSFFMX0RBVEFCQVNFX0lEID0gJzpncmFwaFFMRGF0YWJhc2VJZCcsXG4gIEdSQVBIUUxfVEFCTEVfSUQgPSAnOmdyYXBoUUxUYWJsZUlkJyxcbiAgR1VJRCA9ICc6Z3VpZCcsXG4gIEggPSAnaCcsXG4gIEhJRERFTiA9ICdoaWRkZW4nLFxuICBISURFX0NMT1NFX0JVVFRPTiA9ICc6aGlkZUNsb3NlQnV0dG9uJyxcbiAgSElERV9FRElUX0JVVFRPTiA9ICc6aGlkZUVkaXRCdXR0b24nLFxuICBISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04gPSAnOmhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uJyxcbiAgSElHSF9EUEkgPSAnOmhpZ2hkcGknLFxuICBJTUFHRV9TSVpFX0xJTUlUID0gJ2ltYWdlU2l6ZUxpbWl0JyxcbiAgVFJBTlNQQVJFTlRfTElORV9NQVJLU19MSU1JVCA9ICd0cmFuc3BhcmVudExpbmVNYXJrTGltaXQnLFxuICBDTElFTlRfUkVOREVSX1BJWEVMX0xJTUlUID0gJ2NsaWVudFJlbmRlclBpeGVsTGltaXQnLFxuICBJTiA9ICdpbicsXG4gIElOU1RBTkNFX0lEID0gJzppaWQnLFxuICBJU19HVUVTVF9SRURJUkVDVF9GUk9NX1ZJWlBPUlRBTCA9ICc6aXNHdWVzdFJlZGlyZWN0RnJvbVZpenBvcnRhbCcsXG4gIElTX01BUktfQU5JTUFUSU9OX0VOQUJMRUQgPSAnaXNNYXJrQW5pbWF0aW9uRW5hYmxlZCcsXG4gIElTX1ZJWlBPUlRBTCA9ICc6aXNWaXpQb3J0YWwnLFxuICBJTlBVVF8gPSAnaW5wdXRfc3RyaW5nJyxcbiAgSlNERUJVRyA9ICc6anNkZWJ1ZycsXG4gIEpTT04gPSAnanNvbicsXG4gIEpTT05fT05MWSA9ICc6anNvbk9ubHknLFxuICBLRUVQRklMRSA9ICdrZWVwZmlsZScsXG4gIEtFWSA9ICdrZXknLFxuICBMQU5HVUFHRSA9ICdsYW5ndWFnZScsXG4gIExBTkdVQUdFX1JFUVVFU1RFRCA9ICc6bGFuZ3VhZ2UnLFxuICBMSU5LVEFSR0VUID0gJzpsaW5rdGFyZ2V0JyxcbiAgTE9BRF9PUkRFUl9JRCA9ICc6bG9hZE9yZGVySUQnLCAvLyB1c2VkIGZvciBQdWJsaWNcbiAgTE9BRF9ORVdFU1RfUkVWSVNJT04gPSAnOmxvYWROZXdlc3RSZXZpc2lvbicsXG4gIExPQ0FMX1BBVEhTID0gJzpsb2NhbFBhdGhzJyxcbiAgTE9DQUxFID0gJ2xvY2FsZScsXG4gIExPQ0FUSU9OX0lEID0gJ2xvY2F0aW9uaWQnLFxuICBMT0NBVElPTl9UWVBFID0gJ2xvY2F0aW9udHlwZScsXG4gIFdPUktCT09LX0xPQ0FMRSA9ICd3b3JrYm9va0xvY2FsZScsXG4gIE1BWFJPV1MgPSAnbWF4cm93cycsXG4gIE1BWF9BR0UgPSAnbWF4QWdlJyxcbiAgTUFYX1JPV1MgPSAnbWF4Um93cycsXG4gIE1FVEhPRCA9ICdtZXRob2QnLFxuICBNT0JJTEUgPSAnbW9iaWxlJyxcbiAgTU9ESUZJRVIgPSAnbW9kaWZpZXInLFxuICBOQU1FID0gJ25hbWUnLFxuICBOQVZfVFlQRSA9ICduYXZUeXBlJyxcbiAgTkFWX1NSQyA9ICduYXZTcmMnLFxuICBOT0FUVEFDSE1FTlQgPSAnbm8tYXR0YWNobWVudCcsXG4gIE5PX09WRVJXUklURSA9ICdub19vdmVyd3JpdGUnLFxuICBPUEVOX0FVVEhPUklOR19JTl9UT1BfV0lORE9XID0gJzpvcGVuQXV0aG9yaW5nSW5Ub3BXaW5kb3cnLFxuICBPUEVOSURfSEQgPSAnOm9wZW5pZF9oZCcsXG4gIE9QRU5JRF9MT0dJTl9ISU5UID0gJzpvcGVuaWRfbG9naW5faGludCcsXG4gIE9BVVRIUkVRVUVTVCA9ICdvYXV0aHJlcXVlc3QnLFxuICBPQVVUSF9DUkVERU5USUFMX0lEUyA9ICdvYXV0aF9jcmVkZW50aWFsX2lkcycsXG4gIE9GRkxJTkVfTU9ERSA9ICc6b2ZmbGluZW1vZGUnLFxuICBPUklHSU4gPSAnOm9yaWdpbicsXG4gIE9WRVJMQVkgPSAnOm92ZXJsYXknLFxuICBQID0gJ3AnLFxuICBQQVRIID0gJ3BhdGgnLFxuICBQQU5FX1JFU09MVkVSX1ggPSAncGFuZVJlc29sdmVyWCcsXG4gIFBBTkVfUkVTT0xWRVJfWSA9ICdwYW5lUmVzb2x2ZXJZJyxcbiAgUEFSQU0gPSAncGFyYW0nLFxuICBQQVJFTlRfSUQgPSAncGFyZW50X2lkJyxcbiAgUEFTU1dPUkQgPSAncGFzc3dvcmQnLFxuICBQQVRURVJOID0gJ3BhdHRlcm4nLFxuICBQSVhFTF9SQVRJTyA9ICc6cGl4ZWxyYXRpbycsXG4gIFBSRUZJWCA9ICc6cHJlZml4JyxcbiAgUFJFVklFVyA9ICc6cHJldmlldycsXG4gIFBSSU1BUllfQ09OVEVOVF9VUkwgPSAncHJpbWFyeV9jb250ZW50X3VybCcsXG4gIFBST0pFQ1QgPSAncHJvamVjdCcsXG4gIFBST1RPQ09MID0gJ3Byb3RvY29sJyxcbiAgUFNFVURPID0gJzpwc2V1ZG8nLFxuICBRVUVSWSA9ICdxdWVyeScsXG4gIFIgPSAncicsXG4gIFJBTkdFX1RZUEUgPSAncmFuZ2VfdHlwZScsXG4gIFJFQ09SRF9TRVAgPSAncmVjb3JkX3NlcCcsXG4gIFJFQ09SRF9DTElFTlRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9jbGllbnRfcGVyZm9ybWFuY2UnLFxuICBSRUNPUkRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9wZXJmb3JtYW5jZScsXG4gIFJFQ09WRVJfT0xEX1NFU1NJT05fSUQgPSAnOnJlY292ZXJfb2xkX3Nlc3Npb25faWQnLFxuICBSRUNPVkVSX1NFU1NJT05fU1RBVEVfVElDS0VUUyA9ICc6cmVjb3Zlcl9zZXNzaW9uX3N0YXRlX3RpY2tldHMnLFxuICBSRUZSRVNIID0gJzpyZWZyZXNoJyxcbiAgUkVGUkVTSFVOTU9ESUZJRUQgPSAnOnJlZnJlc2h1bm1vZGlmaWVkJyxcbiAgUkVHSU9OID0gJ3JlZ2lvbicsXG4gIFJFTE9BRF9PTl9DVVNUT01fVklFV19TQVZFID0gJzpyZWxvYWRPbkN1c3RvbVZpZXdTYXZlJyxcbiAgUkVOREVSID0gJzpyZW5kZXInLFxuICBSRU5ERVJfTUFQU19DTElFTlRfU0lERSA9ICdyZW5kZXJNYXBzQ2xpZW50U2lkZScsXG4gIFJFVFJZID0gJzpyZXRyeScsXG4gIFJFVVNFID0gJ3JldXNlJyxcbiAgUkVVU0VfRk9SRVZFUiA9ICdyZXVzZV9mb3JldmVyJyxcbiAgUkVWRVJUID0gJzpyZXZlcnQnLFxuICBTQVZFX0RCX1BBU1NXT1JEUyA9ICdzYXZlX2RiX3Bhc3N3b3JkcycsXG4gIFNFTEVDVF9YID0gJ3NlbGVjdF94JyxcbiAgU0VMRUNUX1kgPSAnc2VsZWN0X3knLFxuICBTRVNTSU9OX0ZFQVRVUkVfUFJFRklYID0gJzpmZl8nLFxuICBTRVNTSU9OX0ZMQUdTID0gJzpzZXNzaW9uX2ZlYXR1cmVfZmxhZ3MnLFxuICBTSEFSRV9CVVRUT04gPSAnc2hhcmVfYnV0dG9uJyxcbiAgU0hFRVRfSUQgPSAnc2hlZXRfaWQnLFxuICBTSEFSRUQgPSAnc2hhcmVkJyxcbiAgU0hPV0FMTCA9ICdzaG93YWxsJyxcbiAgU0hPV19BUFBfQkFOTkVSID0gJzpzaG93QXBwQmFubmVyJyxcbiAgU0hPV19BU0tfREFUQSA9ICc6c2hvd0Fza0RhdGEnLFxuICBTSE9XX1BBUkFNUyA9ICdzaG93UGFyYW1zJyxcbiAgU0hPV19TSEFSRV9PUFRJT05TID0gJzpzaG93U2hhcmVPcHRpb25zJyxcbiAgU0laRSA9ICc6c2l6ZScsXG4gIFNPVVJDRSA9ICdzb3VyY2UnLFxuICBTVEFURSA9ICdzdGF0ZScsXG4gIFNUSUNLWV9TRVNTSU9OX0tFWSA9ICdzdGlja3lTZXNzaW9uS2V5JyxcbiAgU1VCU0NSSVBUSU9OUyA9ICc6c3Vic2NyaXB0aW9ucycsXG4gIFNVTU1BUlkgPSAnc3VtbWFyeScsXG4gIFNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUiA9ICc6c3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yJyxcbiAgU1lOQ19TRVNTSU9OID0gJzpzeW5jX3Nlc3Npb24nLFxuICBTWU5DX1NFU1NJT05fU1RBVEUgPSAnc3luY19zZXNzaW9uX3N0YXRlJyxcbiAgVEFCUyA9ICc6dGFicycsXG4gIFRBUkdFVCA9ICd0YXJnZXQnLFxuICBUQVJHRVRfU0lURSA9ICd0YXJnZXRfc2l0ZScsXG4gIFRPT0xCQVIgPSAnOnRvb2xiYXInLFxuICBUT09MVElQID0gJzp0b29sdGlwJyxcbiAgVFMgPSAndHMnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0lEID0gJ3VuZGVybHlpbmdfdGFibGVfaWQnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0NBUFRJT04gPSAndW5kZXJseWluZ190YWJsZV9jYXB0aW9uJyxcbiAgVVBEQVRFX1RZUEUgPSAndXBkYXRlX3R5cGUnLFxuICBVU0VfR1VFU1QgPSAnOnVzZUd1ZXN0JyxcbiAgVVNFX0lOTElORV9JTUFHRVMgPSAndXNlX2lubGluZV9pbWFnZXMnLFxuICBVU0VSQUdFTlQgPSAndXNlcmFnZW50JyxcbiAgVVNFUk5BTUUgPSAndXNlcm5hbWUnLFxuICBWQUxVRSA9ICd2YWx1ZScsXG4gIFZFUkJPU0VfTU9ERSA9ICd2ZXJib3NlTW9kZScsXG4gIFZJRVdfSUQgPSAndmlld3NfaWQnLFxuICBWSVpfU05BUFNIT1RfSUQgPSAndml6X3NuYXBzaG90X2lkJyxcbiAgVlcgPSAnOnZ3JyxcbiAgVyA9ICd3JyxcbiAgV09SS1NIRUVUX1BPUlRfU0laRSA9ICd3b3Jrc2hlZXRQb3J0U2l6ZScsXG4gIFdBVEVSTUFSSyA9ICd3YXRlcm1hcmsnLFxuICBXQVRFUk1BUktfTUFSR0lOID0gJzp3YXRlcm1hcmtfbWFyZ2luJyxcbiAgV0IgPSAnOndiJyxcbiAgV0hJQ0ggPSAnd2hpY2gnLFxuICBYID0gJ3gnLFxuICBZID0gJ3knLFxuICBaSUQgPSAnemlkJyxcbiAgWk9ORV9JRCA9ICd6b25lX2lkJyxcbiAgS0VZQ0hBSU5fVkVSU0lPTiA9ICdrZXljaGFpbl92ZXJzaW9uJyxcbiAgREFUQVNPVVJDRV9JRCA9ICdkYXRhc291cmNlX2lkJyxcbiAgREFUQVNPVVJDRV9OQU1FID0gJ2RhdGFzb3VyY2VfbmFtZScsXG4gIExFTlNfSUQgPSAnbGVuc19pZCcsXG4gIFdJRFRIID0gJ3dpZHRoJyxcbiAgSEVJR0hUID0gJ2hlaWdodCcsXG5cbiAgLy8gRGVmYXVsdCBMYXlvdXQgcGFyYW1zXG4gIExBWU9VVF9WSUVXUyA9ICd2aWV3cycsXG4gIExBWU9VVF9NRU5VUyA9ICdtZW51cycsXG4gIExBWU9VVF9HRU9NRVRSWSA9ICdnZW9tZXRyeScsXG4gIExBWU9VVF9QQUdFUyA9ICdwYWdlcycsXG4gIExBWU9VVF9DQUNIRVVSTCA9ICdjYWNoZXVybCcsXG4gIExBWU9VVF9TSEVFVCA9ICdzaGVldCcsXG4gIExBWU9VVF9ERVBUSCA9ICdkZXB0aCcsXG59XG5cbi8qKlxuICogcGFyYW1ldGVycyB0aGF0IGFyZSBvbmx5IHJlbGV2YW50IHdoZW4gd29ya2luZyB3aXRoIFRhYmxlYXUgUHVibGljXG4gKiBtYXliZSBub3QgcmVhbGx5IG5lY2Vzc3J5IHRvIHNwbGl0IHRoZW0gb3V0XG4gKi9cbmVudW0gUHVibGljUGFyYW1ldGVyTmFtZXMge1xuICBTSE9XX1ZJWl9IT01FID0gJzpzaG93Vml6SG9tZScsXG4gIC8vIGRpc3BsYXkgdmlldyBjb3VudFxufVxuXG4vKipcbiAqIE1hcCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFzIHVzZWQgaW4gdGhlIHVybCB0byB3aGF0IHdlIGNhbGwgdGhlbSBwdWJsaWNseSBpbiB0aGUgZW1iZWRkaW5nIGxpYnJhcnkuXG4gKiBUaGUgb25seSBwYXJhbWV0ZXJzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSB0aGUgb25lcyB0aGF0IGdldCBzZW50IHRvIHZpenFsXG4gKiAgLSB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJmYWNlIGF0IGV4dGVybmFsLWNvbnRyYWN0OlZpekludGVyZmFjZXM6Vml6U2V0dGluZ3NcbiAqL1xuZXhwb3J0IGVudW0gVml6T3B0aW9uTmFtZXMge1xuICAvLyBwdWJsaWNOYW1lID0gaW50ZXJuYWxTdHJpbmdWYWx1ZVxuICBTaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuU0laRSxcbiAgRW1iZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5FTUJFRCxcbiAgQXBpSW50ZXJuYWxWZXJzaW9uID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0lOVEVSTkFMX1ZFUlNJT04sXG4gIEFwaUV4dGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9FWFRFUk5BTF9WRVJTSU9OLFxuICBTaG93Vml6SG9tZSA9IFB1YmxpY1BhcmFtZXRlck5hbWVzLlNIT1dfVklaX0hPTUUsXG4gIEpzZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBCb290c3RyYXBXaGVuTm90aWZpZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5CT09UU1RSQVBfV0hFTl9OT1RJRklFRCxcbiAgTmF2VHlwZSA9IFZxbFBhcmFtZXRlck5hbWVzLk5BVl9UWVBFLFxuICBOYXZTcmMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfU1JDLFxuICBkZWJ1ZyA9IFZxbFBhcmFtZXRlck5hbWVzLkpTREVCVUcsXG4gIEFwaUlEID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0lELFxuXG4gIGRpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gVnFsUGFyYW1ldGVyTmFtZXMuRElTQUJMRV9VUkxfQUNUSU9OU19QT1BVUFMsXG4gIGhpZGVUYWJzID0gVnFsUGFyYW1ldGVyTmFtZXMuVEFCUyxcbiAgdG9vbGJhciA9IFZxbFBhcmFtZXRlck5hbWVzLlRPT0xCQVIsXG4gIGRldmljZSA9IFZxbFBhcmFtZXRlck5hbWVzLkRFVklDRV9UWVBFLFxuICBpbnN0YW5jZUlkVG9DbG9uZSA9IFZxbFBhcmFtZXRlck5hbWVzLklOU1RBTkNFX0lELFxuICB0b3VjaE9wdGltaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuTU9CSUxFLFxuICBoaWRlRWRpdEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9CVVRUT04sXG4gIGhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OLFxuICBzdXBwcmVzc0RlZmF1bHRFZGl0QmVoYXZpb3IgPSBWcWxQYXJhbWV0ZXJOYW1lcy5TVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IsXG4gIGhpZGVDbG9zZUJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfQ0xPU0VfQlVUVE9OLFxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmltcG9ydCB7IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL0Nyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgaXNDb21tYW5kTWVzc2FnZSxcbiAgaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBpc0hhbmRzaGFrZU1lc3NhZ2UsXG4gIGlzSW5pdE1lc3NhZ2UsXG4gIGlzTWVzc2FnZSxcbiAgaXNOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL01lc3NhZ2VUeXBlQ2hlY2tzJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlSGFuZGxlcixcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIsXG4gIEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyLFxuICBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlTGlzdGVuZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IE1lc3NlbmdlciB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vKipcbiAqIFRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGlzIHRoZSBwcmltYXJ5IGV4cG9ydCBmcm9tIHRoZSBhcGktbWVzc2FnaW5nIG1vZHVsZS4gQW4gaW5zdGFuY2Ugb2ZcbiAqIHRoaXMgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZCBvbiBib3RoIHNpZGVzIG9mIGEgZnJhbWUgYm91bmRhcnkgdG8gZmFjaWxpdGF0ZSBjb21tdW5pY2F0aW9uXG4gKiBpbiBib3RoIGRpcmVjdGlvbnMgYmV0d2VlbiB0aGUgZnJhbWVzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYm90aCB0aGUgZGlzcGF0Y2hlciBhbmQgdGhlIGxpc3RlbmVyXG4gKiBwb3J0aW9ucywgYnV0IGRvZXNuJ3QgcmVxdWlyZSBjYWxsZXJzIHRvIGNhcmUgYWJvdXQgYm90aC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVNZXNzZW5nZXIgaW1wbGVtZW50cyBNZXNzZW5nZXIge1xuICBwcml2YXRlIHVucmVnaXN0ZXJGdW5jdGlvbj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZE1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lTWVzc2VuZ2VyLiBJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgYXMgYSBNZXNzYWdlTGlzdGVuZXIsXG4gICAqIGJlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZyBhbmQgcmVnaXN0ZXIgbWVzc2FnZSBoYW5kbGVycy5cbiAgICogQHBhcmFtIHRoaXNXaW5kb3cgVGhlIHdpbmRvdyBvYmplY3Qgd2hpY2ggdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgbGl2ZXMuIEFuIG9uTWVzc2FnZSBsaXN0ZW5lciB3aWxsIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3ddIE9wdGlvbmFsIG90aGVyV2luZG93IHdoaWNoIG1lc3NhZ2VzIHdpbGwgYmUgcG9zdGVkIHRvLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiBkZWZpbmVkLCBpbmNvbWluZyBtZXNzYWdlcyBtdXN0IG9yaWdpbmF0ZSBmcm9tIG90aGVyV2luZG93IHRvIGJlIHBhc3NlZCBvblxuICAgKiBAcGFyYW0gW290aGVyV2luZG93T3JpZ2luXSBUaGUgdGFyZ2V0IG9yaWdpbiB3aGljaCBvdGhlcldpbmRvdyBtdXN0IGhhdmUgaW4gb3JkZXIgdG8gcmVjZWl2ZSBkaXNwYXRjaGVkIG1lc3NhZ2VzLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgc2VudCBhcyB0aGUgdGFyZ2V0T3JpZ2luIG9mIGEgcG9zdE1lc3NhZ2VcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvcG9zdE1lc3NhZ2UpXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSB0aGlzV2luZG93OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3c/OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3dPcmlnaW4/OiBzdHJpbmcpIHtcbiAgICAvLyBNYWtlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZ1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZUxpc3RlbmVyIEltcGxlbWVudGF0aW9uXG5cbiAgcHVibGljIHN0YXJ0TGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgYXJlIGxpc3RlbmluZywgaWYgbm90LCBob29rIHVwIGEgbWVzc2FnZSBsaXN0ZW5lclxuICAgIGlmICghdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IGJvdW5kSGFuZGxlciA9IHRoaXMub25NZXNzYWdlUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudGhpc1dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gKCkgPT4gdGhpcy50aGlzV2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdG9wTGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIFN0b3AgbGlzdGVuaW5nIGlmIHdlIGhhdmUgc3RhcnRlZCBsaXN0ZW5pbmdcbiAgICBpZiAodGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKCk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0SW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0SGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvLy8vLyBNZXNzYWdlRGlzcGF0Y2hlciBJbXBsZW1lbnRhdGlvblxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXBpVmVyc2lvbiBhcGktaW50ZXJuYWwtY29udHJhY3QtanMgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIGNyb3NzRnJhbWVWZXJzaW9uIGNyb3NzZnJhbWUgbWVzc2FnaW5nIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBvcHRpb25zIGFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXQgaW5pdGlhbGl6YXRpb24gKGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mXG4gICAqICAgICAgICAgICAgICAgIGV4dGVybmFsIGJlaW5nIHVzZWQgZm9yIGV4YW1wbGUpXG4gICAqL1xuICBwdWJsaWMgcHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShcbiAgICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gICk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBjcm9zc0ZyYW1lVmVyc2lvbixcbiAgICAgIGFwaVZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZE1lc3NhZ2UodmVyYklkOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgICAgdmVyYklkOiB2ZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShjb21tYW5kR3VpZDogc3RyaW5nLCBkYXRhOiBNb2RlbCB8IHVuZGVmaW5lZCwgZXJyb3I6IE1vZGVsIHwgdW5kZWZpbmVkKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICAgIGNvbW1hbmRHdWlkOiBjb21tYW5kR3VpZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgLy8gc3RyaW5naWZ5IGVycm9yIG9iamVjdCB0byByZW1vdmUgdW5zZXJpYWxpemFibGUgZmllbGRzIGxpa2UgZnVuY3Rpb25zIGFuZCBwcmV2ZW50IHNlcmlhbGl6YXRpb24gZXJyb3JzXG4gICAgICBtZXNzYWdlLmVycm9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVOb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZCwgZGF0YTogTW9kZWwpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLFxuICAgICAgbm90aWZpY2F0aW9uSWQ6IG5vdGlmaWNhdGlvbklkLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUFja01lc3NhZ2UoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkFjayxcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBwZW5kaW5nIG1lc3NhZ2UgZm9yIHNlbmRpbmcgYW5kIHJldHVybnMgdGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICpcbiAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBiZSBzZW50IHRvIHRoaXMub3RoZXJXaW5kb3dcbiAgICogQHJldHVybnMgVGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgcHJlcGFyZU1lc3NhZ2UobXNnOiBNZXNzYWdlKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBpZiAoIXRoaXMub3RoZXJXaW5kb3cgfHwgIXRoaXMub3RoZXJXaW5kb3dPcmlnaW4pIHtcbiAgICAgIHRocm93ICdPdGhlciB3aW5kb3cgbm90IGluaXRpYWxpemVkLCBjYW5ub3QgZGlzcGF0Y2ggbWVzc2FnZXMnO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXBhcmVkTWVzc2FnZSA9IG5ldyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlKG1zZywgdGhpcy5vdGhlcldpbmRvdywgdGhpcy5vdGhlcldpbmRvd09yaWdpbik7XG4gICAgcmV0dXJuIHByZXBhcmVkTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuIERvZXMgc29tZSB2YWxpZGF0aW9uIG9mIHRoZSBtZXNzYWdlLCBhbmQgdGhlblxuICAgKiBjYWxscyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGhhbmRsZXIgaWYgb25lIGlzIGRlZmluZWRcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBpbmNvbWluZyBNZXNzYWdlRXZlbnRcbiAgICovXG4gIHByaXZhdGUgb25NZXNzYWdlUmVjZWl2ZWQoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gb3RoZXJXaW5kb3cgZGVmaW5lZCwgbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGlzIGNvbWluZyBmcm9tIHRoZXJlXG4gICAgaWYgKHRoaXMub3RoZXJXaW5kb3cgJiYgZXZlbnQuc291cmNlICE9PSB0aGlzLm90aGVyV2luZG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG8gc29tZSB2YWxpZGF0aW9uIG9uIGV2ZW50LmRhdGEgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhIHJlYWwgbWVzc2FnZVxuICAgIGlmICghZXZlbnQuZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhO1xuICAgIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIG1lc3NhZ2UgdHlwZSwgdmFsaWRhdGUgdGhlIG1lc3NhZ2UsIGFuZCBjYWxsIGFuIGFwcHJvcHJpYXRlIGhhbmRlciBpZiBvbmUgZXhpc3RzXG4gICAgc3dpdGNoIChtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZToge1xuICAgICAgICBpZiAoIWlzSW5pdE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZToge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmQ6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb246IHtcbiAgICAgICAgaWYgKCFpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5IYW5kc2hha2U6IHtcbiAgICAgICAgaWYgKCFpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIEp1c3QgaWdub3JlIHRoaXMgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHR5cGVcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3cob3RoZXJXaW5kb3c6IFdpbmRvdyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3cgPSBvdGhlcldpbmRvdztcbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvd09yaWdpbihvcmlnaW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4gPSBvcmlnaW47XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJlcGFyZWRNZXNzYWdlIGludGVyZmFjZSB1c2VkIHRvIHBvc3QgbWVzc2FnZXMgYmV0d2VlblxuICogdHdvIGZyYW1lcyB1c2luZyB3aW5kb3cucG9zdE1lc3NhZ2VcbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgaW1wbGVtZW50cyBQcmVwYXJlZE1lc3NhZ2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLlxuICAgKiBAcGFyYW0gX21lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudFxuICAgKiBAcGFyYW0gX3RhcmdldCBUaGUgdGFyZ2V0IHdpbmRvdyB3aGVyZSB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnRcbiAgICogQHBhcmFtIF9vcmlnaW4gVGhlIHRhcmdldE9yaWdpbiB3aGVyZSB0aGlzIG1lc3NhZ2UgY2FuIGJlIHJlY2VpdmVkXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWVzc2FnZTogTWVzc2FnZSwgcHJpdmF0ZSBfdGFyZ2V0OiBXaW5kb3csIHByaXZhdGUgX29yaWdpbjogc3RyaW5nKSB7fVxuXG4gIHB1YmxpYyBnZXQgbWVzc2FnZUd1aWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZS5tc2dHdWlkO1xuICB9XG5cbiAgcHVibGljIHNlbmQoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICB0aGlzLl90YXJnZXQucG9zdE1lc3NhZ2UodGhpcy5fbWVzc2FnZSwgdGhpcy5fb3JpZ2luKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlL1ZlcnNpb25OdW1iZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcblxuY29uc3QgZXhwZWN0ZWRFbXB0eU5vdGlmaWNhdGlvbnMgPSBuZXcgU2V0KFtcbiAgTm90aWZpY2F0aW9uSWQuRWRpdEJ1dHRvbkNsaWNrZWQsXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va1B1Ymxpc2hlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tSZWFkeVRvQ2xvc2UsXG4gIE5vdGlmaWNhdGlvbklkLlJlYWR5VG9SZWNlaXZlQXV0aFRva2VuLFxuXSk7XG5cbi8qIHRzbGludDpkaXNhYmxlIG5vLWFueSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWVzc2FnZShkYXRhOiBNZXNzYWdlIHwgYW55KTogZGF0YSBpcyBNZXNzYWdlIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGRhdGEgYXMgTWVzc2FnZTtcbiAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLm1zZ0d1aWQgfHwgIW1lc3NhZ2UubXNnVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQobWVzc2FnZS5tc2dHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbWVzc2FnZS5tc2dUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2VUeXBlczogQXJyYXk8c3RyaW5nPiA9IFtcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLFxuICAgIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICBNZXNzYWdlVHlwZS5IYW5kc2hha2UsXG4gIF07XG5cbiAgaWYgKG1lc3NhZ2VUeXBlcy5pbmRleE9mKG1lc3NhZ2UubXNnVHlwZSkgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnNpb24odmVyc2lvbk51bWJlcjogVmVyc2lvbk51bWJlciB8IGFueSk6IHZlcnNpb25OdW1iZXIgaXMgVmVyc2lvbk51bWJlciB7XG4gIGlmICghdmVyc2lvbk51bWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHYgPSB2ZXJzaW9uTnVtYmVyIGFzIFZlcnNpb25OdW1iZXI7XG5cbiAgaWYgKHR5cGVvZiB2ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygdi5maXggIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1pbm9yICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5tYWpvciAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5pdE1lc3NhZ2UobWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEluaXRpYWxpemVNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpbml0TWVzc2FnZSA9IG1lc3NhZ2UgYXMgSW5pdGlhbGl6ZU1lc3NhZ2U7XG4gIGlmIChpbml0TWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5hcGlWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3JNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlO1xuICBpZiAoY3JNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQoY3JNZXNzYWdlLmNvbW1hbmRHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY3JNZXNzYWdlLmRhdGEgJiYgIWNyTWVzc2FnZS5lcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZE1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmRNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kTWVzc2FnZTtcbiAgaWYgKGNvbW1hbmRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS52ZXJiSWQgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnZlcmJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBOb3RpZmljYXRpb25NZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0gbWVzc2FnZSBhcyBOb3RpZmljYXRpb25NZXNzYWdlO1xuICBpZiAobm90aWZpY2F0aW9uTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2UuZGF0YSAmJiAhZXhwZWN0ZWRFbXB0eU5vdGlmaWNhdGlvbnMuaGFzKG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkIHx8IHR5cGVvZiBub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEhhbmRzaGFrZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRzaGFrZU1lc3NhZ2UgPSBtZXNzYWdlIGFzIEhhbmRzaGFrZU1lc3NhZ2U7XG4gIGlmIChoYW5kc2hha2VNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkhhbmRzaGFrZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBOb3RpZmljYXRpb25JZCwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuXG4vKipcbiAqIEVudW0gZGVmaW5pbmcgdGhlIDQgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzIHdlIGhhdmUgZGVmaW5lZFxuICovXG5leHBvcnQgZW51bSBNZXNzYWdlVHlwZSB7XG4gIEluaXRpYWxpemUgPSAnaW5pdGlhbGl6ZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24nLFxuICBDb21tYW5kID0gJ2NvbW1hbmQnLFxuICBDb21tYW5kUmVzcG9uc2UgPSAnY29tbWFuZC1yZXNwb25zZScsXG4gIEhhbmRzaGFrZSA9ICd2LWhhbmRzaGFrZScsXG4gIEFjayA9ICd2LWFjaycsXG59XG5cbi8qKlxuICogVGhlIE1lc3NhZ2UgaW50ZXJmYWNlIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIHRoZSBvdGhlclxuICogbWVzc2FnZSB0eXBlIGludGVyZmFjZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlXG4gICAqL1xuICBtc2dHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnVHlwZTogTWVzc2FnZVR5cGU7XG59XG5cbi8qKlxuICogVGhlIGluaXRpYWxpemUgbWVzc2FnZSBpcyB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHNlbnRcbiAqIGZyb20gdGhlIGphdmFzY3JpcHQgdG8gc2V0IHVwIGNvbW11bmljYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6ZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcGkgd2hpY2ggdGhlIHNlbmRlciB3YW50cyB0byB1c2VcbiAgICovXG4gIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoaXMgbWVzc2FnaW5nIGNvbnRyYWN0IHRvIGJlIHVzZWQuIEZvciBub3csIHRoZXJlXG4gICAqIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHZlcnNpb24gYnV0IHNlbmRpbmcgdGhpcyBhbG9uZyBzaG91bGQgaGVscFxuICAgKiBpZiB3ZSBuZWVkIHRvIGFkZCBhIG5ldyB2ZXJzaW9uIGluIGEgZnV0dXJlIHJlbGVhc2VcbiAgICovXG4gIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IHRoZSB0aW1lIG9mIGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gYSBub3RpZmljYXRpb24gb2NjdXJzIGZyb20gdGhlIHByZXNsYXllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBmb3IgdGhpcyB0eXBlIG9mIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgbm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB3aGljaCBjYW1lIGFsb25nIHdpdGggdGhlIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgZGF0YTogTW9kZWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBjYWxsaW5nIGFuIGludGVybmFsIGNvbnRyYWN0IGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBjb21tYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZFxuICAgKi9cbiAgdmVyYklkOiBWZXJiSWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZFxuICAgKi9cbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7XG59XG5cbi8qKlxuICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBDb21tYW5kTWVzc2FnZSB3aXRoIHRoZVxuICogcmVzdWx0IG9mIHRoYXQgY29tbWFuZHMgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEd1aWQgb2YgdGhlIENvbW1hbmRNZXNzYWdlIHdoaWNoIHRoaXMgaXMgaW4gcmVzcG9uc2UgdG9cbiAgICovXG4gIGNvbW1hbmRHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZXR1cm5lZCBmcm9tIHRoZSBjb21tYW5kLCB0aGlzIHdpbGwgYmUgZGVmaW5lZFxuICAgKiBhbmQgY29udGFpbiB0aGUgZXJyb3JcbiAgICovXG4gIGVycm9yPzogTW9kZWw7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBjb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGNvbW1hbmQgcmVzdWx0XG4gICAqL1xuICBkYXRhPzogTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZHNoYWtlTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogSW50ZXJuYWwgQVBJIGNvbnRyYWN0IHZlcnNpb25cbiAgICovXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgaW50ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyYjogdmVyYiBhcyBWZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIGFzIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhlIG9ubHlcbiAqIG1vZGUgaXQgc3VwcG9ydHMgaXMgZXh0ZXJuYWwncyB2ZXJzaW9uIDw9IHBsYXRmb3JtJ3MgdmVyc2lvbi4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIHVwZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIGRvd25ncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LiBTaW1pbGFybHkgZm9yIG5vdGlmaWNhdGlvbnMsIGl0IGNhblxuICogZG93bmdyYWRlIHRob3NlIG9uIHRoZSB3YXkgZnJvbSBwbGF0Zm9ybSB0byBleHRlcm5hbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1WZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApOiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIge1xuICAgIHJldHVybiBuZXcgdGhpcyhcbiAgICAgIGV4dGVybmFsVmVyc2lvbi5tYWpvcixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbi5tYWpvcixcbiAgICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybU1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2V4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbiA+IHRoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IGJldHdlZW4gZXh0ZXJuYWwgdmVyc2lvbiAke3RoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9ufSBhbmQgJHt0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgdXBncmFkZWQgPSB7IHZlcmI6IHZlcmIsIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQudmVyYiwgdXBncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIERvd25ncmFkZSB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gZXhlY3V0ZVJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlELCBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyB9IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGxocy5taW5vciA8IHJocy5taW5vcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGhzLm1ham9yID09PSByaHMubWFqb3IgJiYgbGhzLm1pbm9yID09PSByaHMubWlub3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHtcbiAgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTtcbn1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IE5vdGlmaWNhdGlvbk1pbm9yRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0ge1xuICAxOiB7XG4gICAgOTogW10sXG4gICAgMTA6IFtEb3duZ3JhZGVGbGlwYm9hcmRab25lSURdLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMsXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlVXBncmFkZXMsXG4gICAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24gPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBjb25zdCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpKTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGV4dGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoaXMgY29udmVydGVyXG4gKiBzdXBwb3J0cyBleHRlcm5hbCdzIHZlcnNpb24obWlub3IpID49IHBsYXRmb3JtJ3MgdmVyc2lvbihtaW5vcikuIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byBkb3duZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIHVwZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gZG93bmdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZCBpcyBleGVjdXRlZFxuICAgKiBAcGFyYW0gX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHVwZ3JhZGUgbm90ZmljYXRpb25zIHRvIHBlcmZvcm0gb24gZXZlbnRzXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3IgPiB0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxWZXJzaW9uLm1ham9yfVxuICAgICAgYW5kICR7dGhpcy5fcGxhdGZvcm1WZXJzaW9uLm1ham9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSBkb3duZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkLnZlcmIsIGRvd25ncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgdXBncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVOb3RpZmljYXRpb24gb2YgdGhpcy5fdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlTm90aWZpY2F0aW9uKHVwZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgR2V0TWF4aW11bU1pbm9ySW5kZXgsIE1ham9yTWlub3JUcmFuc2xhdG9ycywgVmVyc2lvbkVxdWFsVG8gfSBmcm9tICcuLi9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNFeHRlcm5hbCBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQge1xuICBEb3duZ3JhZGVMb2dpY2FsVGFibGVEYXRhQXN5bmMsXG4gIERvd25ncmFkZVVuZGVybHlpbmdUYWJsZURhdGFBc3luYyxcbiAgVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zLFxuICBVcGdyYWRlRGF0YVRhYmxlVHlwZXMsXG59IGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gICAgMTM6IFtEb3duZ3JhZGVVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMsIERvd25ncmFkZUxvZ2ljYWxUYWJsZURhdGFBc3luY10sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW1VwZ3JhZGVEYXRhVGFibGVUeXBlc10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICAgIDI5OiBbVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zXSwgLy8gMjAyMS4xIHdhcyByZWxlYXNlZCB3aXRoIDEuMjkuIFVwZ3JhZGUgZnJvbSAxLjI5IGluIHRoZSBbMV1bMjldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCJpbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwsXG4gIERhdGFIZWFkZXIsXG4gIERhdGFUYWJsZSxcbiAgRGF0YVR5cGVDb252ZXJ0ZXIsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEludGVybmFsVGFibGVhdUVycm9yLFxuICBOb3RpZmljYXRpb24sXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbn0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgbmV3ZXIgdmVyc2lvbiBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb25cbiAqICBUaGUgdmVyYiBhbmQgcGFyYW1ldGVycyBwcm92aWRlIGEgY29udGV4dCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlUmV0dXJuID0gKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiBFeGVjdXRlUmVzcG9uc2U7XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byB1cGdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgVXBncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyAxLjIgLT4gMS4wIFRyYW5zbGF0aW9uc1xuLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBpbXBvcnQgZnJvbSB0aGUgVjEgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4vLyBpbXBvcnQgKiBhcyBWMSBmcm9tICdAdGFibGVhdS1hcGktaW50ZXJuYWwtY29udHJhY3QtanNfdjEnO1xuXG4vKipcbiAqIFByaW9yIHRvIDIwMTkuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuOSksIERhdGFWYWx1ZS52YWx1ZSB3ZXJlIGFsbCBzdHJpbmdzLlxuICogR28gdGhyb3VnaCBhbGwgRGF0YVZhbHVlIG9iamVjdHMuIElmIHdlIGhhdmUgYSBzdHJpbmcsIGJ1dCB0aGUgdHlwZSBzaG91bGQgbm90IGJlIGEgc3RyaW5nLFxuICogY29udmVydCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLiBUaGUgdHlwZSBvZiBEYXRhVmFsdWUudmFsdWUgaXMgJ2FueScgaW4gdGhlIGNvbnRyYWN0LCBzb1xuICogdGhpcyBjaGFuZ2UgZG9lc24ndCBuZWVkIGFueSB1cGRhdGVzIHRvIGNsYXNzZXMgb3IgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVcGdyYWRlRGF0YVRhYmxlVHlwZXMoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoIWV4ZWN1dGVSZXNwb25zZSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCBvbGRVbmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAob2xkVW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2xkVW5kZXJseWluZ0RhdGFUYWJsZS5pc1N1bW1hcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnZlcnREYXRhVmFsdWVzKG9sZFVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSk7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IG9sZFNlbGVjdGVkTWFya3NUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICBpZiAob2xkU2VsZWN0ZWRNYXJrc1RhYmxlLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhKSkge1xuICAgIG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhLmZvckVhY2goKG1hcmtzVGFibGUpID0+IHtcbiAgICAgIGNvbnZlcnREYXRhVmFsdWVzKG1hcmtzVGFibGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vKipcbiAqIFByaW9yIHRvIDIwMjAuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuMTMgYW5kIG9sZGVyKSwgd29ya3NoZWV0LmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXRVbmRlcmx5aW5nRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlVW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gIH07XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMC4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4xMyBhbmQgb2xkZXIpLCBkYXRhc291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXREYXRhU291cmNlRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlTG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhVmFsdWVzKHRhYmxlOiBEYXRhVGFibGUpOiB2b2lkIHtcbiAgLy8gZGF0YVRhYmxlIGlzIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IG9mIGRhdGEuIEZpcnN0IGluZGV4IGlzIHRoZSByb3csIHNlY29uZCBpcyB0aGUgY29sdW1uLlxuICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCB8fCB0YWJsZS5kYXRhVGFibGUgPT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheSh0YWJsZS5kYXRhVGFibGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFibGUuZGF0YVRhYmxlLmZvckVhY2goKHJvdykgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChkYXRhVmFsdWUsIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFWYWx1ZS52YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBkYXRhVmFsdWUudmFsdWUgPSBEYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWUsIHRhYmxlLmhlYWRlcnNbY29sdW1uSW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIFRvRG86IFRGUzEwNjkwMjcgUmVmYWN0b3IgaW5wdXQgdmVyYnMgJiBwYXJhbWV0ZXJzIGluIGFwaS1pbnRlcm5hbC1jb250cmFjdCBVcGdyYWRlL0Rvd25ncmFkZSBmcmFtZXdvcmtcbmZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiB2b2lkIHtcbiAgaWYgKHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdICE9PSBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2dpY2FsIHRhYmxlIGlkIHBhc3NlZCB0byAke3ZlcmJ9LmApIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMS4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4yOSBhbmQgYmVsb3cpLCBnZXRTdW1tYXJ5RGF0YUFzeW5jIGRpZCBub3Qgc3VwcG9ydCBtYXhSb3dzLFxuICogYW5kIGFueSBnZXQuLi5EYXRhQXN5bmMgZGlkIG5vdCBzdXBwb3J0IGNvbHVtbnNUb0luY2x1ZGVCeUlkLlxuICogVHJpbSByZXN1bHQgdG8gbWF4Um93cyBpZiBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgZ2V0U3VtbWFyeURhdGFBc3luY1xuICogVHJpbSBjb2x1bW5zIHRvIGNvbHVtbnNUb0luY2x1ZGUgaWYgaW5jbHVkZWQgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBnZXQuLi5EYXRhQXN5bmNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVwZ3JhZGVEYXRhVGFibGVSb3dzQW5kQ29sdW1ucyhcbiAgZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsXG4gIHZlcmI6IFZlcmJJZCxcbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMsXG4pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoaXNHZXRTdW1tYXJ5RGF0YVZlcmIodmVyYikgJiYgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSkge1xuICAgIGV4ZWN1dGVSZXNwb25zZSA9IGFkanVzdERhdGFSb3dMZW5ndGgoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLk1heFJvd3NdIGFzIG51bWJlcik7XG4gIH1cblxuICBpZiAoaXNHZXRUYWJsZURhdGFWZXJiKHZlcmIpICYmIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdKSB7XG4gICAgZXhlY3V0ZVJlc3BvbnNlID0gYWRqdXN0RGF0YUNvbHVtbnMoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSBhcyBzdHJpbmdbXSk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc0dldFN1bW1hcnlEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGE7XG59XG5cbmZ1bmN0aW9uIGlzR2V0VGFibGVEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhIHx8XG4gICAgdmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEgfHxcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU291cmNlRGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YVxuICApO1xufVxuXG5mdW5jdGlvbiBhZGp1c3REYXRhUm93TGVuZ3RoKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBtYXhSb3dzOiBudW1iZXIpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBpZiAobWF4Um93cyA+IDAgJiYgbWF4Um93cyA8IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUubGVuZ3RoKSB7XG4gICAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZS5sZW5ndGggPSBtYXhSb3dzO1xuICB9XG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGFkanVzdERhdGFDb2x1bW5zKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBjb2x1bW5zVG9JbmNsdWRlOiBzdHJpbmdbXSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIGlmIChjb2x1bW5zVG9JbmNsdWRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICAvLyB2ZXJpZnkgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgVW5kZXJseWluZ0RhdGFUYWJsZVxuICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycykpIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgLy8gMS4gZmlsdGVyIHRoZSBoZWFkZXJzIHRvIG9ubHkgY29sdW1uc1RvSW5jbHVkZVxuICAvLyAyLiB1c2UgdGhlIG5ldyBoZWFkZXJzIHRvIGZpbHRlciBhbGwgcm93c1xuICAvLyAzLiB1cGRhdGUgdGhlIGluZGljZXMgaW4gb3VyIG5ldyBoZWFkZXJzXG4gIGNvbnN0IG5ld0hlYWRlcnM6IERhdGFIZWFkZXJbXSA9IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5oZWFkZXJzLmZpbHRlcigoaGVhZGVyLCBpbmRleCkgPT5cbiAgICBjb2x1bW5zVG9JbmNsdWRlLmZpbmQoKG5hbWUpID0+IG5hbWUgPT09IGhlYWRlci5maWVsZE5hbWUpLFxuICApO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlW2luZGV4XSA9IHJvdy5maWx0ZXIoXG4gICAgICAodmFsdWUsIHZhbHVlSW5kZXgpID0+IG5ld0hlYWRlcnMuZmluZEluZGV4KChoZWFkZXIpID0+IGhlYWRlci5pbmRleCA9PT0gdmFsdWVJbmRleCkgIT09IC0xLFxuICAgICk7XG4gIH0pO1xuICBsZXQgbmV3SW5kZXggPSAwO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycyA9IG5ld0hlYWRlcnMubWFwKChoZWFkZXIpID0+IHtcbiAgICBoZWFkZXIuaW5kZXggPSBuZXdJbmRleCsrO1xuICAgIHJldHVybiBoZWFkZXI7XG4gIH0pO1xuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uTW9kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc01vZGUsIEV4dGVybmFsRXh0ZW5zaW9uc01vZGU+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZyxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNvbHVtblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENvbHVtblR5cGUsIEV4dGVybmFsQ29sdW1uVHlwZT4oe1xuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuQ29udGludW91c106IEV4dGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuRGlzY3JldGVdOiBFeHRlcm5hbENvbHVtblR5cGUuRGlzY3JldGUsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxDb2x1bW5UeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3Npc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDFdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3MsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZFJvbGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZFJvbGVUeXBlLCBFeHRlcm5hbEZpZWxkUm9sZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb24sXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmUsXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxTaGVldFR5cGUsIEV4dGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0ludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEV4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFUeXBlLCBFeHRlcm5hbERhdGFUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YVR5cGUuQm9vbF06IEV4dGVybmFsRGF0YVR5cGUuQm9vbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVUaW1lXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlVGltZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5GbG9hdF06IEV4dGVybmFsRGF0YVR5cGUuRmxvYXQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuSW50XTogRXh0ZXJuYWxEYXRhVHlwZS5JbnQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3BhdGlhbF06IEV4dGVybmFsRGF0YVR5cGUuU3BhdGlhbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBhbGxvd2FibGVWYWx1ZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZSwgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuQWxsXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5MaXN0XTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuUmFuZ2VdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVJhbmdlVHlwZSwgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBlcnJvckNvZGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEVycm9yQ29kZXMsIEV4dGVybmFsRXJyb3JDb2Rlcz4oXG4gICAge1xuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTklUSUFMSVpBVElPTl9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX0VOVU1fTUFQUElOR106IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX1BBUkFNRVRFUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QUkVTX01PREVMX1BBUlNJTkdfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVU5LTk9XTl9WRVJCX0lEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZJU0lCSUxJVFlfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuVmlzaWJpbGl0eUVycm9yLFxuICAgIH0sXG4gICAgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJUeXBlLCBFeHRlcm5hbEZpbHRlclR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmFuZ2VdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGVdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjbGFzc05hbWVLZXkgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENsYXNzTmFtZUtleSwgRXh0ZXJuYWxDbGFzc05hbWVLZXk+KHtcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXBdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgLy8gVGVtcG9yYXJ5IHVudGlsIHdlIGZpeCAxMzE3MjY2IC0gUGxhdGZvcm0gaGFzbid0IGJlZW4gdXBkYXRlZCBjdXJyZW50bHkgYmVjYXVzZSBuZWFyIGJyYW5jaCBpcyBjbG9zZWRcbiAgICBbJ2Rhc2hib2FyZC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbJ3N0b3J5LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgWyd0b29sdGlwJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgWyd3b3Jrc2hlZXQnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFsnd29ya3NoZWV0LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgPSBuZXcgRW51bUNvbnZlcnRlcjxcbiAgICBJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gICAgRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlXG4gID4oe1xuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Ob25lU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuU29tZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlVua25vd25TZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYW5ub3RhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEFubm90YXRpb25UeXBlLCBFeHRlcm5hbEFubm90YXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYV06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrXTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrLFxuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLlBvaW50XTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBtYXJrVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsTWFya1R5cGUsIEV4dGVybmFsTWFya1R5cGU+KHtcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5BcmVhXTogRXh0ZXJuYWxNYXJrVHlwZS5BcmVhLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkJhcl06IEV4dGVybmFsTWFya1R5cGUuQmFyLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkNpcmNsZV06IEV4dGVybmFsTWFya1R5cGUuQ2lyY2xlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkdhbnR0QmFyXTogRXh0ZXJuYWxNYXJrVHlwZS5HYW50dEJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5IZWF0bWFwXTogRXh0ZXJuYWxNYXJrVHlwZS5IZWF0bWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkxpbmVdOiBFeHRlcm5hbE1hcmtUeXBlLkxpbmUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuTWFwXTogRXh0ZXJuYWxNYXJrVHlwZS5NYXAsXG4gICAgW0ludGVybmFsTWFya1R5cGUuUGllXTogRXh0ZXJuYWxNYXJrVHlwZS5QaWUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuUG9seWdvbl06IEV4dGVybmFsTWFya1R5cGUuUG9seWdvbixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5TaGFwZV06IEV4dGVybmFsTWFya1R5cGUuU2hhcGUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuU3F1YXJlXTogRXh0ZXJuYWxNYXJrVHlwZS5TcXVhcmUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVGV4dF06IEV4dGVybmFsTWFya1R5cGUuVGV4dCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb25dOiBFeHRlcm5hbE1hcmtUeXBlLlZpekV4dGVuc2lvbixcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBDbGFzcyBkZXNpZ25lZCB0byByZWdpc3RlciBhbmQgdW5yZWdpc3RlciBoYW5kbGVycyBmcm9tIGEgdXNlci4gT25seSB0aG9zZSBldmVudHNcbiAqIHdoaWNoIGFyZSBhZGRlZCB2aWEgQWRkTmV3RXZlbnRUeXBlIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXZlbnRMaXN0ZW5lck1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudExpc3RlbmVyTWFuYWdlcnM6IHsgW3RhYmxlYXVFdmVudFR5cGU6IHN0cmluZ106IFNpbmdsZUV2ZW50TWFuYWdlciB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSwgaGFuZGxlcjogQ29udHJhY3QuVGFibGVhdUV2ZW50SGFuZGxlckZuKTogQ29udHJhY3QuVGFibGVhdUV2ZW50VW5yZWdpc3RlckZuIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRFdmVudE5hbWUsIGBDYW5ub3QgYWRkIGV2ZW50LCB1bnN1cHBvcnRlZCBldmVudCB0eXBlOiAke2V2ZW50VHlwZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50VHlwZV0uYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSwgaGFuZGxlcjogQ29udHJhY3QuVGFibGVhdUV2ZW50SGFuZGxlckZuKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IHJlbW92ZSBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLnJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkTmV3RXZlbnRUeXBlKGV2ZW50TWFuYWdlcjogU2luZ2xlRXZlbnRNYW5hZ2VyKTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50TWFuYWdlci5ldmVudFR5cGVdID0gZXZlbnRNYW5hZ2VyO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSwgRGF0YVR5cGUsIEZpZWxkQWdncmVnYXRpb25UeXBlLCBGaWVsZFJvbGVUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vSW1wbC9GaWVsZEltcGwnO1xuXG5leHBvcnQgY2xhc3MgRmllbGQgaW1wbGVtZW50cyBDb250cmFjdC5GaWVsZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEltcGw6IEZpZWxkSW1wbCkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb24oKTogRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuYWdncmVnYXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IEZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwucm9sZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uVHlwZSgpOiBDb2x1bW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmNvbHVtblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW9zcGF0aWFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW9zcGF0aWFsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcywgVml6U2VydmljZSB9IGZyb20gJy4uLy4uL0FwaVNoYXJlZCc7XG5leHBvcnQgY2xhc3MgQ3VzdG9tVmlld0ltcGwge1xuICBwcml2YXRlIF9sdWlkOiBzdHJpbmc7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfc2hhcmVkOiBib29sZWFuO1xuICBwcml2YXRlIF9pc0RlZmF1bHQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX293bmVyTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF91cmw6IHN0cmluZztcbiAgcHVibGljIGNvbnN0cnVjdG9yKGN1c3RvbVZpZXdNb2RlbDogQ3VzdG9tVmlld01vZGVsLCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9sdWlkID0gY3VzdG9tVmlld01vZGVsLmx1aWQ7XG4gICAgdGhpcy5fbmFtZSA9IGN1c3RvbVZpZXdNb2RlbC5uYW1lO1xuICAgIHRoaXMuX3NoYXJlZCA9IGN1c3RvbVZpZXdNb2RlbC5zaGFyZWQ7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gY3VzdG9tVmlld01vZGVsLmlzRGVmYXVsdDtcbiAgICB0aGlzLl9vd25lck5hbWUgPSBjdXN0b21WaWV3TW9kZWwub3duZXIudXNlckZyaWVuZGx5TmFtZTtcbiAgICB0aGlzLl91cmwgPSBjdXN0b21WaWV3TW9kZWwudXJsO1xuICB9XG5cbiAgcHVibGljIGdldCBsdWlkKCkge1xuICAgIHJldHVybiB0aGlzLl9sdWlkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIHNldCBuYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGFyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoYXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hhcmVkKHNoYXJlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3NoYXJlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNEZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLl9pc0RlZmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGlzRGVmYXVsdChpc0RlZmF1bHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG93bmVyTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3duZXJOYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2F2ZUFzeW5jKHRoaXMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLFxuICBFcnJvckNvZGVzLFxuICBTaGFyZWRFcnJvckNvZGVzLFxuICBTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlLCBEYXNoYm9hcmRab25lLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9Qb2ludCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQW5pbWF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1pvbmVTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF93b3Jrc2hlZXRzSW1wbDogQXJyYXk8V29ya3NoZWV0SW1wbD47XG4gIHByaXZhdGUgX29iamVjdHM6IEFycmF5PERhc2hib2FyZE9iamVjdEltcGw+O1xuICBwcml2YXRlIHpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBfc2hlZXRJbmZvOiBTaGVldEluZm9JbXBsLFxuICAgIHByaXZhdGUgX3pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPixcbiAgICBwcml2YXRlIF9zaGVldFBhdGg6IFNoZWV0UGF0aCxcbiAgICBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlciA9IDAsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm8sIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0c0ltcGwoKTogQXJyYXk8V29ya3NoZWV0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRzSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5UG9pbnQoKTogU3RvcnlQb2ludEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZURhc2hib2FyZE9iamVjdElkO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsID0gbmV3IEFycmF5PFdvcmtzaGVldEltcGw+KCk7XG4gICAgdGhpcy5fb2JqZWN0cyA9IG5ldyBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuICAgIHRoaXMuem9uZU1hcCA9IG5ldyBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuXG4gICAgLy8gUHJvY2VzcyBhbGwgdGhlIHpvbmVzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gdGhpcyBkYXNoYm9hcmRcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGxldCB3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB6b25lU2l6ZTogQ29udHJhY3QuU2l6ZSA9IHsgd2lkdGg6IHpvbmUud2lkdGgsIGhlaWdodDogem9uZS5oZWlnaHQgfTtcbiAgICAgIC8vIEFzIHRoZSBkYXNoYm9hcmQgaXMgYWN0aXZlLCBhbGwgb3RoZXIgem9uZXMgaW4gdGhlIGRhc2hib2FyZCBhcmUgaW5hY3RpdmUuXG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAoem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQgfHwgem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcikge1xuICAgICAgICBsZXQgd29ya3NoZWV0TmFtZSA9ICcnO1xuICAgICAgICBsZXQgd29ya3NoZWV0VXJsID0gJyc7XG4gICAgICAgIGxldCBpc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICAgICAgd29ya3NoZWV0TmFtZSA9IHpvbmUuc2hlZXRJbmZvLm5hbWU7XG5cbiAgICAgICAgICAvLyB3b3Jrc2hlZXRVcmwgJiBpc0hpZGRlbiBpcyBmb3IgRW1iZWRkaW5nIG9ubHlcbiAgICAgICAgICB3b3Jrc2hlZXRVcmwgPSB6b25lLnNoZWV0SW5mby51cmwgfHwgJyc7XG4gICAgICAgICAgLy8gSWYgdGhlcmUncyBhIHVybCwgdGhlbiBpdCdzIG5vdCBoaWRkZW5cbiAgICAgICAgICBpc0hpZGRlbiA9IHdvcmtzaGVldFVybCA9PT0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd29ya3NoZWV0TmFtZSA9IHpvbmUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmRleGVzLCBpc0FjdGl2ZSBhbmQgc29tZSBtb3JlIHByb3BlcnRpZXMgaW4gc2hlZXRJbmZvSW1wbCBhcmUgZW1iZWRkaW5nIHNwZWNpZmljLlxuICAgICAgICAvLyBCdXQgd2UgaW5pdCB0aGVtIGZvciBib3RoIGV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBhcyB0aGUgTW9kZWxzIHdpbGwgb25seSB1c2Ugd2hhdCBpcyByZWxldmFudC5cbiAgICAgICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgICAgIHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgICAgICB6b25lU2l6ZSxcbiAgICAgICAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbC5sZW5ndGgsXG4gICAgICAgICAgaXNBY3RpdmUsXG4gICAgICAgICAgaXNIaWRkZW4sXG4gICAgICAgICAgd29ya3NoZWV0VXJsLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgZGFzaGJvYXJkOiB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgICAgc3Rvcnlib2FyZDogdGhpcy5fc2hlZXRQYXRoLnN0b3J5Ym9hcmQsXG4gICAgICAgICAgZmxpcGJvYXJkWm9uZUlEOiB0aGlzLl9zaGVldFBhdGguZmxpcGJvYXJkWm9uZUlELFxuICAgICAgICAgIHN0b3J5UG9pbnRJRDogdGhpcy5fc2hlZXRQYXRoLnN0b3J5UG9pbnRJRCxcbiAgICAgICAgfTtcblxuICAgICAgICB3b3Jrc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoc2hlZXRJbmZvSW1wbCwgdGhpcy5fcmVnaXN0cnlJZCwgdml6SWQsIHRoaXMsIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsKTtcbiAgICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwucHVzaCh3b3Jrc2hlZXRJbXBsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB6b25lUG9pbnQgPSBuZXcgUG9pbnQoem9uZS54LCB6b25lLnkpO1xuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RJbXBsID0gbmV3IERhc2hib2FyZE9iamVjdEltcGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXNoYm9hcmRPYmplY3RUeXBlLmNvbnZlcnQoem9uZS56b25lVHlwZSksXG4gICAgICAgIHpvbmVQb2ludCxcbiAgICAgICAgem9uZVNpemUsXG4gICAgICAgIHdvcmtzaGVldEltcGwsXG4gICAgICAgIHpvbmUubmFtZSxcbiAgICAgICAgem9uZS5pc0Zsb2F0aW5nICE9PSB1bmRlZmluZWQgPyB6b25lLmlzRmxvYXRpbmcgOiBmYWxzZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzRmxvYXRpbmcsIHNvIHdlIGFzc3VtZSBmYWxzZVxuICAgICAgICB6b25lLmlzVmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gem9uZS5pc1Zpc2libGUgOiB0cnVlLCAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNWaXNpYmxlLCBzbyB3ZSBhc3N1bWUgdHJ1ZVxuICAgICAgICB6b25lLnpvbmVJZCxcbiAgICAgICAgem9uZS5maWVsZElkLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5fb2JqZWN0cy5wdXNoKGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgICAgdGhpcy56b25lTWFwLnNldCh6b25lLnpvbmVJZCwgZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwIHwgb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5zZXRWaXNpYmlsaXR5QXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3RJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy56b25lTWFwLmdldChkYXNoYm9hcmRPYmplY3RJZCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlWm9uZXMobmV3Wm9uZXM6IEFycmF5PERhc2hib2FyZFpvbmU+LCBuZXdBY3RpdmVab25lSWQgPSAwLCBuZXdBY3RpdmVEYXNoYm9hcmROYW1lID0gJycpOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIHtcbiAgICAvLyBnZXR0aW5nIHByZXZpb3VzIGRhc2hib2FyZCBvYmplY3RzLCBhY3RpdmUgem9uZSBJRCBhbmQgYWN0aXZlIGRhc2hib2FyZCBuYW1lXG4gICAgY29uc3Qgb2xkRGFzaGJvYXJkT2JqZWN0cyA9IHRoaXMuX29iamVjdHM7XG4gICAgY29uc3Qgb2xkWm9uZU1hcCA9IHRoaXMuem9uZU1hcDtcbiAgICBjb25zdCBvbGRBY3RpdmVab25lSWQgPSB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgICBjb25zdCBvbGRBY3RpdmVEYXNoYm9hcmROYW1lID0gdGhpcy5fc2hlZXRQYXRoLnNoZWV0TmFtZTtcbiAgICAvLyB1cGRhdGluZyB6b25lcyBhbmQgcmVpbml0aWFsaXppbmcgaW5zdGFuY2UgdmFyaWFibGVzXG4gICAgdGhpcy5fem9uZXMgPSBuZXdab25lcztcbiAgICB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCA9IG5ld0FjdGl2ZVpvbmVJZDtcbiAgICB0aGlzLl9zaGVldFBhdGguc2hlZXROYW1lID0gbmV3QWN0aXZlRGFzaGJvYXJkTmFtZTtcbiAgICB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKCk7XG4gICAgLy8gZ2V0dGluZyBuZXcgZGFzaGJvYXJkIG9iamVjdHNcbiAgICBjb25zdCBuZXdEYXNoYm9hcmRPYmplY3RzID0gdGhpcy5fb2JqZWN0cztcbiAgICBjb25zdCBuZXdab25lTWFwID0gdGhpcy56b25lTWFwO1xuICAgIC8vIGluaXRpYWxpemluZyBtYXAgZm9yIGNoYW5nZXNcbiAgICBjb25zdCB6b25lQ2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyA9IG5ldyBNYXAoKTtcblxuICAgIC8vIGNvbXBhcmluZyBvbGQgZGFzaGJvYXJkIG9iamVjdHMgd2l0aCBuZXcgb25lc1xuICAgIG9sZERhc2hib2FyZE9iamVjdHMuZm9yRWFjaCgob2xkT2JqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbGRJZDogbnVtYmVyID0gb2xkT2JqZWN0LmlkO1xuXG4gICAgICAvLyBjaGVja2luZyBpZiB6b25lIHdhcyByZW1vdmVkXG4gICAgICBpZiAoIW5ld1pvbmVNYXAuaGFzKG9sZElkKSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5SZW1vdmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSBuZXdab25lTWFwLmdldChvbGRJZCk7XG4gICAgICBpZiAob2xkT2JqZWN0LmlzRmxvYXRpbmcgIT09IG5ld09iamVjdCEuaXNGbG9hdGluZykge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5Jc0Zsb2F0aW5nQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QuaXNWaXNpYmxlICE9PSBuZXdPYmplY3QhLmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5Jc1Zpc2libGVDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5uYW1lICE9PSBuZXdPYmplY3QhLm5hbWUpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuTmFtZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0LnBvc2l0aW9uLnggIT09IG5ld09iamVjdCEucG9zaXRpb24ueCB8fCBvbGRPYmplY3QucG9zaXRpb24ueSAhPT0gbmV3T2JqZWN0IS5wb3NpdGlvbi55KSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlBvc2l0aW9uQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3Quc2l6ZS53aWR0aCAhPT0gbmV3T2JqZWN0IS5zaXplLndpZHRoIHx8IG9sZE9iamVjdC5zaXplLmhlaWdodCAhPT0gbmV3T2JqZWN0IS5zaXplLmhlaWdodCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5TaXplQ2hhbmdlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBmb3IgYW55IGFkZGVkIHpvbmVzXG4gICAgbmV3RGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChuZXdPYmplY3QpID0+IHtcbiAgICAgIGlmICghb2xkWm9uZU1hcC5oYXMobmV3T2JqZWN0LmlkKSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShuZXdPYmplY3QuaWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuQWRkZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgem9uZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWRcbiAgICBpZiAob2xkQWN0aXZlWm9uZUlkICE9PSBuZXdBY3RpdmVab25lSWQpIHtcbiAgICAgIGlmIChuZXdBY3RpdmVab25lSWQgIT09IDApIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2UobmV3QWN0aXZlWm9uZUlkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRBY3RpdmVab25lSWQgIT09IDApIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkQWN0aXZlWm9uZUlkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkRlc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNraW5nIGlmIHN3aXRjaGVkIHRvIGFub3RoZXIgZGFzaGJvYXJkXG4gICAgaWYgKG9sZEFjdGl2ZURhc2hib2FyZE5hbWUgIT09IG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuYWRkQ2hhbmdlKDAsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGFzaGJvYXJkQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHpvbmVDaGFuZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFuZ2Uoem9uZUlkOiBudW1iZXIsIHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBjaGFuZ2U6IERhc2hib2FyZExheW91dENoYW5nZSk6IHZvaWQge1xuICAgIGlmICghem9uZUNoYW5nZXMuaGFzKHpvbmVJZCkpIHtcbiAgICAgIHpvbmVDaGFuZ2VzLnNldCh6b25lSWQsIFtdKTtcbiAgICB9XG5cbiAgICB6b25lQ2hhbmdlcy5nZXQoem9uZUlkKSEucHVzaChjaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+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+LCByZWdpc3RyeUlkOiBudW1iZXIpOiBTaGVldEltcGwge1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SWR4ID0gLTE7XG5cbiAgICBjb25zdCBwdWJsaXNoZWRTaGVldEluZm8gPSBTaGVldFV0aWxzLmdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShjb250YWluZWRTaGVldEluZm8ubmFtZSwgc2hlZXRJbmZvcyk7XG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRTaXplID0gU2hlZXRVdGlscy5jcmVhdGVBdXRvbWF0aWNTaXplKCk7XG4gICAgY29uc3QgaXNDb250YWluZWRTaGVldEhpZGRlbiA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0VXJsID0gcHVibGlzaGVkU2hlZXRJbmZvID8gcHVibGlzaGVkU2hlZXRJbmZvLnVybCA6ICcnO1xuICAgIC8vIENvbnRhaW5lZCBzaGVldHMgYXJlbid0IGFjdGl2ZSAtIHRoZSBjb250YWluaW5nIHNoZWV0IGlzIGFjdGl2ZS5cbiAgICBjb25zdCBjb250YWluZWRTaGVldEFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsXG4gICAgICBTaGVldFV0aWxzLmdldFNoZWV0VHlwZUVudW0oY29udGFpbmVkU2hlZXRJbmZvLnNoZWV0VHlwZSksXG4gICAgICBjb250YWluZWRTaGVldFNpemUsXG4gICAgICBjb250YWluZWRTaGVldElkeCxcbiAgICAgIGNvbnRhaW5lZFNoZWV0QWN0aXZlLFxuICAgICAgaXNDb250YWluZWRTaGVldEhpZGRlbixcbiAgICAgIGNvbnRhaW5lZFNoZWV0VXJsLFxuICAgICk7XG5cbiAgICBsZXQgc2hlZXRJbXBsOiBTaGVldEltcGw7XG4gICAgc3dpdGNoIChjb250YWluZWRTaGVldEluZm9JbXBsLnNoZWV0VHlwZSkge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0OiB7XG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCByZWdpc3RyeUlkLCB2aXpJZCwgbnVsbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkOiB7XG4gICAgICAgIGNvbnN0IHNoZWV0UGF0aDogU2hlZXRQYXRoID0ge1xuICAgICAgICAgIHNoZWV0TmFtZTogY29udGFpbmVkU2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIGlzRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNoZWV0SW1wbCA9IG5ldyBEYXNoYm9hcmRJbXBsKGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwsIGNvbnRhaW5lZFNoZWV0SW5mby5kYXNoYm9hcmRab25lcywgc2hlZXRQYXRoLCByZWdpc3RyeUlkLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoZWV0SW1wbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlQb2ludEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NhcHRpb246IHN0cmluZyxcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FjdGl2ZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cGRhdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5SW1wbDogU3RvcnlJbXBsLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIHNldCBjYXB0aW9uKGNhcHRpb246IHN0cmluZykge1xuICAgIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgc2V0IGluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9pbmRleCA9IGluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FjdGl2ZSA9IGlzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCB1cGRhdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKGlzVXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3VwZGF0ZWQgPSBpc1VwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeUltcGw7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXb3JrYm9va0ltcGwge31cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlNZW51VHlwZSxcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgVG9vbHRpcENvbnRleHQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLCBWaXN1YWxJZCwgV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVmlzdWFsTW9kZWxTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5RmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuUmFuZ2VGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmlsdGVyT3B0aW9ucywgJ2ZpbHRlck9wdGlvbnMnKTtcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlck51bGxPcHRpb24+KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbiwgRmlsdGVyTnVsbE9wdGlvbiwgJ0ZpbHRlck51bGxPcHRpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVJhbmdlUGFyYW1UeXBlKGZpbHRlck9wdGlvbnMubWluLCBmaWx0ZXJPcHRpb25zLm1heCk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSYW5nZUZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4gfCBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbHMsXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZXMsICd2YWx1ZXMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykgJiYgIXZhbHVlcy5sZXZlbHMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheSBvciBjb250YWluIGEgbGV2ZWxzIGtleScsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhckZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxQZXJpb2RUeXBlPihvcHRpb25zLnBlcmlvZFR5cGUsIFBlcmlvZFR5cGUsICdQZXJpb2RUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXRlUmFuZ2VUeXBlPihvcHRpb25zLnJhbmdlVHlwZSwgRGF0ZVJhbmdlVHlwZSwgJ0RhdGVSYW5nZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhdGFTb3VyY2VzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvOiBXb3Jrc2hlZXREYXRhU291cmNlSW5mbyA9IGRhdGFTY2hlbWEud29ya3NoZWV0RGF0YVNjaGVtYU1hcFt0aGlzLm5hbWVdO1xuXG4gICAgICBjb25zdCBkYXRhU291cmNlczogQXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4gPSBbXTtcblxuICAgICAgLy8gRmlyc3QsIGFkZCB0aGUgcHJpbWFyeSBkYXRhc291cmNlLiAgQnkgY29udmVudGlvbiwgaXQgY29tZXMgZmlyc3QgaW4gdGhlIHJldHVybmVkIGFycmF5LlxuICAgICAgY29uc3QgcHJpbWFyeUlkOiBzdHJpbmcgPSB3b3Jrc2hlZXREYXRhU291cmNlSW5mby5wcmltYXJ5RGF0YVNvdXJjZTtcbiAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1twcmltYXJ5SWRdKSk7XG5cbiAgICAgIC8vIFRoZW4sIGxvb3AgdGhyb3VnaCBhbnkgc2Vjb25kYXJ5IGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBmb3IgKGNvbnN0IHNlY29uZGFyeUlkIG9mIHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnJlZmVyZW5jZWREYXRhU291cmNlTGlzdCkge1xuICAgICAgICBpZiAoc2Vjb25kYXJ5SWQgIT09IHByaW1hcnlJZCkge1xuICAgICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1tzZWNvbmRhcnlJZF0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmlsdGVyc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTZWxlY3RlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5TdW1tYXJ5LFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSwgLy8gaW5jbHVkZUFsbENvbHVtbnMgKGNhbiBiZSBvdmVycmlkZGVuIGJ5IGNvbHVtbnNUb0luY2x1ZGVCeUlkKVxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuVW5kZXJseWluZyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHRoaXMudmlzdWFsSWQpLnRoZW48QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4oKGxvZ2ljYWxUYWJsZUluZm9zKSA9PiB7XG4gICAgICByZXR1cm4gbG9naWNhbFRhYmxlSW5mb3MubWFwKChsb2dpY2FsVGFibGVJbmZvKSA9PiBuZXcgTG9naWNhbFRhYmxlKGxvZ2ljYWxUYWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhclNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5SWRBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIobWFyaywgJ21hcmsnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYW5ub3RhdGVNYXJrQXN5bmModGhpcy52aXN1YWxJZCwgbWFyaywgYW5ub3RhdGlvblRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBbm5vdGF0aW9uc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKSB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhbm5vdGF0aW9uLCAnYW5ub3RhdGlvbicpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVBbm5vdGF0aW9uQXN5bmModGhpcy52aXN1YWxJZCwgYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgY29uZmlnOiBDb250ZXh0TWVudU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBlbmRDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBjb25maWcpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbmFtZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVIZWFkZXIsIG1lbnVEZXNjcmlwdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGhvdmVyVHVwbGVBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuaG92ZXJUdXBsZUFzeW5jKHRoaXMudmlzdWFsSWQsIGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBzZWxlY3RUdXBsZXNBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0VHVwbGVzQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkOiBudW1iZXIpOiBQcm9taXNlPFN0cmluZz4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBnZXRUb29sdGlwVGV4dEFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRUb29sdGlwVGV4dEFzeW5jKHRoaXMudmlzdWFsSWQsIHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgICAgIGBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFjY2Vzc2liaWxpdHlTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eSk7XG4gICAgcmV0dXJuIHNlcnZpY2UubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNvdXJjZUluZm86IERhdGFTb3VyY2VJbmZvKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZUltcGwgPSBuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZUluZm8sIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlBY3RpdmVTaGVldCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVXb3Jrc2hlZXQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQoKTtcbiAgICBjb25zdCBpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLmlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpO1xuXG4gICAgaWYgKCFpc1Jvb3RBbmRBY3RpdmVXb3Jrc2hlZXQgJiYgIWlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkICYmICFpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsICYmIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgJiYgdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsICE9PSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBsb2dpY2FsIHRhYmxlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgTG9naWNhbFRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuTG9naWNhbFRhYmxlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ2ljYWxUYWJsZTogTG9naWNhbFRhYmxlSW5mbykge31cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuY2FwdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0LCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCBpbXBsZW1lbnRzIFRvb2x0aXBUZXh0UmVxdWVzdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLCBwdWJsaWMgdHVwbGVJZDogbnVtYmVyKSB7fVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUsIEZpbHRlckRvbWFpblR5cGUsIEZpbHRlclR5cGUsIFBlcmlvZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9saWIvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF93b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcHJvdGVjdGVkIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJUeXBlKCk6IEZpbHRlclR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmllbGRBc3luYyh0aGlzLl9maWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+KTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhcHBseVRvV29ya3NoZWV0cywgJ2FwcGx5VG9Xb3Jrc2hlZXRzJyk7XG4gICAgY29uc3QgdW5pcXVlV29ya3NoZWV0cyA9IG5ldyBTZXQoYXBwbHlUb1dvcmtzaGVldHMpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZE5hbWUsIHRoaXMuX2ZpZWxkSWQsIEFycmF5LmZyb20odW5pcXVlV29ya3NoZWV0cykpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0V4Y2x1ZGVNb2RlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ/OiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4Y2x1ZGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0V4Y2x1ZGVNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGlmICghZG9tYWluVHlwZSkge1xuICAgICAgZG9tYWluVHlwZSA9IEZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQ7XG4gICAgfVxuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJEb21haW5UeXBlPihkb21haW5UeXBlLCBGaWx0ZXJEb21haW5UeXBlLCAnRmlsdGVyRG9tYWluVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWU6IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfaGllcmFyY2hpY2FsUGF0aDogc3RyaW5nLCBwcml2YXRlIF9sZXZlbDogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoaWNhbFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2hpY2FsUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsIGltcGxlbWVudHMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmFtZTogc3RyaW5nLCBwcml2YXRlIF9sZXZlbFNlbGVjdGlvblN0YXRlOiBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbFNlbGVjdGlvblN0YXRlKCk6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbFNlbGVjdGlvblN0YXRlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9kaW1lbnNpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaGllcmFyY2h5Q2FwdGlvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgX251bWJlck9mTGV2ZWxzOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4sXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0FsbFNlbGVjdGVkOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBDb250cmFjdC5GaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGltZW5zaW9uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaW1lbnNpb25OYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWVyYXJjaHlDYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZXJhcmNoeUNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IG51bWJlck9mTGV2ZWxzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbERldGFpbHMoKTogQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNBbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBwbGllZFZhbHVlcygpOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGllZFZhbHVlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2luY2x1ZGVOdWxsVmFsdWVzOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5jbHVkZU51bGxWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVOdWxsVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRSYW5nZURvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hbmNob3JEYXRlOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfcGVyaW9kVHlwZTogUGVyaW9kVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZVR5cGU6IERhdGVSYW5nZVR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VOOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFuY2hvckRhdGUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVyaW9kVHlwZSgpOiBQZXJpb2RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyaW9kVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VUeXBlKCk6IERhdGVSYW5nZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmdlTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZU47XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LCBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhbmdlRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4KCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCBNYXJrVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVGFibGUge1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2RhdGE6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+LFxuICAgIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgcHJpdmF0ZSBfdG90YWxSb3dDb3VudDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2lzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNTdW1tYXJ5RGF0YTogYm9vbGVhbixcbiAgICBwcml2YXRlIF9tYXJrc0luZm8/OiBBcnJheTxNYXJrSW5mbz4sXG4gICkge1xuICAgIHRoaXMuX25hbWUgPSBfaXNTdW1tYXJ5RGF0YSA/ICdTdW1tYXJ5IERhdGEgVGFibGUnIDogJ1VuZGVybHlpbmcgRGF0YSBUYWJsZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8Q29udHJhY3QuQ29sdW1uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hcmtzSW5mbygpOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tYXJrc0luZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvdGFsUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxSb3dDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNUb3RhbFJvd0NvdW50TGltaXRlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNUb3RhbFJvd0NvdW50TGltaXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTdW1tYXJ5RGF0YSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdW1tYXJ5RGF0YTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFya0luZm8gaW1wbGVtZW50cyBDb250cmFjdC5NYXJrSW5mbyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF90eXBlOiBNYXJrVHlwZSwgcHJpdmF0ZSBfY29sb3I6IHN0cmluZywgcHJpdmF0ZSBfdHVwbGVJZD86IG51bWJlcikge31cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogTWFya1R5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHVwbGVJZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90dXBsZUlkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW4gaW1wbGVtZW50cyBDb250cmFjdC5Db2x1bW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZmllbGROYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgX2RhdGFUeXBlOiBEYXRhVHlwZSxcbiAgICBwcml2YXRlIF9pc1JlZmVyZW5jZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1JlZmVyZW5jZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVmZXJlbmNlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gIC8qIHRzbGludDpkaXNhYmxlOm5vLWFueSAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWU6IGFueSwgcHJpdmF0ZSBfbmF0aXZlVmFsdWU6IGFueSwgcHJpdmF0ZSBfZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmcpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmF0aXZlVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlZFZhbHVlO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVhZGVyIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlUmVhZGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaWQ6IHN0cmluZywgcHJvdGVjdGVkIF90b3RhbFJvd0NvdW50OiBudW1iZXIsIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlQ291bnQgPSBNYXRoLmNlaWwoX3RvdGFsUm93Q291bnQgLyBfcGFnZVJvd0NvdW50KTtcbiAgfVxuICBwcm90ZWN0ZWQgX3BhZ2VDb3VudDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZShwYWdlTnVtYmVyLCAwLCB0aGlzLl9wYWdlQ291bnQpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYWdlQXN5bmModGhpcy5faWQsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsUGFnZXNBc3luYyhtYXhSb3dzPzogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBmaXJzdFBhZ2U6IENvbnRyYWN0LkRhdGFUYWJsZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKDApO1xuICAgIG1heFJvd3MgPSBtYXhSb3dzIHx8IHRoaXMudG90YWxSb3dDb3VudDtcbiAgICBjb25zdCByb3dzUmVxdWVzdGVkID0gTWF0aC5taW4obWF4Um93cywgdGhpcy50b3RhbFJvd0NvdW50KTtcbiAgICBjb25zdCBwYWdlc1JlcXVlc3RlZCA9IE1hdGguY2VpbChyb3dzUmVxdWVzdGVkIC8gdGhpcy5fcGFnZVJvd0NvdW50KTtcblxuICAgIC8vIEZldGNoIHVwIHRvIDQwMCBwYWdlcywgd2l0aCBhIGRlZmF1bHQgb2YgMTAsMDAwIHBhZ2VSb3dDb3VudCB0aGF0IGdpdmVzIHVzIDQsMDAwLDAwMCByb3dzXG4gICAgY29uc3QgcGFnZXNUb0ZldGNoID0gTWF0aC5taW4ocGFnZXNSZXF1ZXN0ZWQsIDQwMCk7XG4gICAgY29uc3QgaXNEYXRhTGltaXRlZCA9IHBhZ2VzVG9GZXRjaCA8IHBhZ2VzUmVxdWVzdGVkO1xuICAgIGxldCByZW1haW5pbmdEYXRhOiBBcnJheTxBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+Pj4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhZ2VzVG9GZXRjaDsgaSsrKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoaSk7XG4gICAgICByZW1haW5pbmdEYXRhLnB1c2gocGFnZS5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgZnVsbERhdGEgPSBmaXJzdFBhZ2UuZGF0YS5jb25jYXQoLi4ucmVtYWluaW5nRGF0YSk7XG4gICAgLy8gVGhpcyBzbGljZXMgdGhlIGFycmF5IG9ubHkgaWYgbWF4Um93cyBoYXMgYmVlbiBzZXQgYW5kIGlzIGxlc3MgdGhhbiB0b3RhbFJvd0NvdW50XG4gICAgZnVsbERhdGEubGVuZ3RoID0gcm93c1JlcXVlc3RlZDtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmaXJzdFBhZ2UubmFtZSxcbiAgICAgIGRhdGE6IGZ1bGxEYXRhLFxuICAgICAgY29sdW1uczogZmlyc3RQYWdlLmNvbHVtbnMsXG4gICAgICB0b3RhbFJvd0NvdW50OiBpc0RhdGFMaW1pdGVkID8gcGFnZXNUb0ZldGNoICogdGhpcy5fcGFnZVJvd0NvdW50IDogcm93c1JlcXVlc3RlZCxcbiAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGlzRGF0YUxpbWl0ZWQsXG4gICAgICBpc1N1bW1hcnlEYXRhOiBmaXJzdFBhZ2UuaXNTdW1tYXJ5RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVsZWFzZUFzeW5jKHRoaXMuX2lkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcENvbnRleHQgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSG92ZXJUdXBsZUludGVyYWN0aW9uLCBTZWxlY3RPcHRpb25zLCBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG5cbi8qKlxuICogUmFuZ2UgYmFzZWQgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgbWluVmFsdWU6IHN0cmluZztcbiAgcHVibGljIG1heFZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBpbmNsdWRlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuLyoqXG4gKiBUdXBsZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0aW9uVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgb2JqZWN0SWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGNsYXNzIHRvIHBvcHVsYXRlIGFsbCB0aGUgc2VsZWN0aW9uIG1vZGVscyB3aGVuIHBhcnNpbmcgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gIHB1YmxpYyBoaWVyTW9kZWxBcnI6IEFycmF5PEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgZGltTW9kZWxBcnI6IEFycmF5PERpbWVuc2lvblNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgcXVhbnRNb2RlbEFycjogQXJyYXk8UmFuZ2VTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbjogVHVwbGVTZWxlY3Rpb25Nb2RlbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgIHB1YmxpYyBzZWxlY3RPcHRpb25zOiBTZWxlY3RPcHRpb25zLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0LFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCBpbXBsZW1lbnRzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIHB1YmxpYyBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4sXG4gICkge31cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb2ludCBpbXBsZW1lbnRzIENvbnRyYWN0LlBvaW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6IG51bWJlciwgcHJpdmF0ZSBfeTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl94O1xuICB9XG5cbiAgcHVibGljIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3k7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGVudW0gR2V0RGF0YVR5cGUge1xuICBTdW1tYXJ5ID0gJ3N1bW1hcnknLFxuICBVbmRlcmx5aW5nID0gJ3VuZGVybHlpbmcnLFxufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGltcGxlbWVudGluZyB0aGUgbG9naWMgZm9yIHZhcmlvdXMgZ2V0RGF0YSBjYWxsc1xuICpcbiAqIEBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2VcbiAqIEBleHRlbmRzIHtBcGlTZXJ2aWNlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaW1pdCBvZiByb3dzIGZvciBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jXG4gICAqL1xuICBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge0dldERhdGFUeXBlfSBnZXRUeXBlICBUaGUgdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgb3Igbm90IGFsaWFzZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgb3Igbm90IHNlbGVjdGlvbiBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj59ICBEYXRhIHRhYmxlIHJlYWRlciB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgZGF0YVxuICAgKi9cbiAgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgICovXG4gIGdldFNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgICovXG4gIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICovXG4gIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKiBAcGFyYW0gcGFnZU51bWJlciAgVGhlIHBhZ2UgbnVtYmVyICh6ZXJvLWJhc2VkKS5cbiAgICogQHBhcmFtIHBhZ2VTaXplICAgIFRoZSBwYWdlIHNpemUgb2YgdGhlIG93bmluZyBEYXRhVGFibGVSZWFkZXJcbiAgICogQHJldHVybnMgICAgICAgICAgIEEgRGF0YVRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBwYWdlLiBUaGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSBsZXNzIHRoYW4gcmVxdWVzdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEuXG4gICAqL1xuICBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKi9cbiAgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIFZlcnNpb25OdW1iZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5ub3RhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRXhwb3J0U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1Zpc3VhbE1vZGVsU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVml6U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVml6U2VydmljZUltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1pvbmVTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyLCBwbGF0Zm9ybVZlcnNpb24/OiBWZXJzaW9uTnVtYmVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbmltYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBEYXRhU291cmNlU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCwgcGxhdGZvcm1WZXJzaW9uKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHBvcnRTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBHZXREYXRhU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRmlsdGVyU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgTm90aWZpY2F0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgUGFyYW1ldGVyc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNlbGVjdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFubm90YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBab25lU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2l6ZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFZpc3VhbE1vZGVsU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVml6U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQmFzZSBpbnRlcmZhY2UgZm9yIGFuIGFwaSBzZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYW1lIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3Rpb24gb2Ygc2VydmljZSBuYW1lIHdoaWNoIHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgYXBpLXNoYXJlZCBwcm9qZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFNlcnZpY2VOYW1lcyB7XG4gIEFjY2Vzc2liaWxpdHkgPSAnYWNjZXNzaWJpbGl0eScsXG4gIEF1dGhlbnRpY2F0aW9uID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQ2xpZW50SW5mbyA9ICdjbGllbnQtaW5mby1zZXJ2aWNlJyxcbiAgRGF0YVNvdXJjZVNlcnZpY2UgPSAnZGF0YS1zb3VyY2Utc2VydmljZScsXG4gIEdldERhdGEgPSAnZ2V0LWRhdGEtc2VydmljZScsXG4gIEZpbHRlciA9ICdmaWx0ZXItc2VydmljZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24tc2VydmljZScsXG4gIFBhcmFtZXRlcnMgPSAncGFyYW1ldGVycy1zZXJ2aWNlJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbi1zZXJ2aWNlJyxcbiAgQW5ub3RhdGlvbiA9ICdhbm5vdGF0aW9uLXNlcnZpY2UnLFxuICBab25lID0gJ3pvbmUtc2VydmljZScsXG4gIEFuaW1hdGlvbiA9ICdhbmltYXRpb24tc2VydmljZScsXG4gIFZpeiA9ICd2aXotc2VydmljZScsXG4gIEV4dGVybmFsQ29udGV4dE1lbnUgPSAnZXh0ZXJuYWwtY29udGV4dC1tZW51LXNlcnZpY2UnLFxuICBJbml0aWFsaXphdGlvbiA9ICdpbml0aWFsaXphdGlvbi1zZXJ2aWNlJyxcbiAgU3RvcnlBY3RpdmF0aW9uID0gJ3N0b3J5LWFjdGl2YXRpb24tc2VydmljZScsXG4gIFNpemUgPSAnc2l6ZS1zZXJ2aWNlJyxcbiAgRXhwb3J0ID0gJ2V4cG9ydC1zZXJ2aWNlJyxcbiAgVmlzdWFsTW9kZWwgPSAndmlzdWFsLW1vZGVsLXNlcnZpY2UnLFxufVxuXG4vKipcbiAqIERvIHNvbWUgZ2xvYmFsIGRlY2xhcmF0aW9ucyBzbyB3ZSBjYW4gY3JlYXRlIGEgc2luZ2xldG9uIG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5OiB7IFtyZWdpc3RyeUlkOiBudW1iZXJdOiBTZXJ2aWNlUmVnaXN0cnkgfTtcbiAgfVxufVxuXG53aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCB7fTtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgaW50byB0aGUgc2VydmljZSByZWdpc3RyeS4gQW55IGV4aXN0aW5nIG9uZSB3aWxsXG4gICAqIGJlIG92ZXJ3cml0dGVuLiB0aGUgc2VydmljZSBpcyByZWdpc3RlcmVkIHVuZGVyIHNlcnZpY2Uuc2VydmljZU5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlIFRoZSBzZXJ2aXZlIHRvIHJlZ2lzdGVyXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlcmUgaXMgbm90IGFcbiAgICogc2VydmljZSByZWdpc3RlcmVkIHVuZGVyIHRoYXQgbmFtZSwgdGhyb3dzIGFuZCBlcnJvclxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgcmVxdWVzdGVkIHNlcnZpY2VcbiAgICovXG4gIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUO1xufVxuXG5jbGFzcyBTZXJ2aWNlUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfc2VydmljZXM6IHsgW3NlcnZpY2VOYW1lOiBzdHJpbmddOiBBcGlTZXJ2aWNlIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlLnNlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fc2VydmljZXMuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7c2VydmljZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2VOYW1lXSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2VcbiAqIG9mIHRoZSBBcGlTZXJ2aWNlUmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeUlkLlxuICpcbiAqIEV4dGVuc2lvbnMgYnkgZGVzaWduIGRvbid0IG5lZWQgdG8gc3RvcmUvYWNjZXNzIG11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcy4gVGhlaXIgc2luZ2xlIGluc3RhbmNlIG9mIFNlcnZpY2VSZWdpc3RyeSBpc1xuICogc3RvcmVkL2FjY2VzcyB3aXRoIHJlZ2lzdHJ5SWQgPSAwLlxuICpcbiAqIFdoZXJlYXMgRW1iZWRkaW5nIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHdoaWNoIFNlcnZpY2VSZWdpc3RyeSB0byB1c2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdml6emVzIGVtYmVkZGVkLlxuICogQW4gZXhhbXBsZSBvZiBob3cgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB3aWxsIGxvb2sgd2hlbiB0aGVyZSBhcmUgdHdvIHZpenplczogeyAwIDogU2VydmljZVJlZ2lzdHJ5LCAxIDogU2VydmljZVJlZ2lzdHJ5fVxuICogd2hlcmUgcmVnaXN0cnkgSUQgb2YgMCAmIDEgcmVmZXJzIHRvIHZpeidzIGludGVybmFsIGlkZW50aWZpZXIgKHdoaWNoIGlzIGdlbmVyYXRlZCBieSBWaXpNYW5hZ2VyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VSZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQocmVnaXN0cnlJZDogbnVtYmVyKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwgIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShyZWdpc3RyeUlkLCBuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgc2V0cyB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnlJZC4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2UocmVnaXN0cnlJZDogbnVtYmVyLCBzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdID0gc2VydmljZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSB0byBhdm9pZCBhbnlvbmUgY29uc3RydWN0aW5nIHRoaXNcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvQWNjZXNzaWJpbGl0eU1vZGVscyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgbGV0IHRvb2x0aXBUZXh0UmVxdWVzdCA9IG5ldyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCh2aXN1YWxJZCwgdHVwbGVJZCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VG9vbHRpcFRleHRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVG9vbHRpcFRleHRSZXF1ZXN0XTogdG9vbHRpcFRleHRSZXF1ZXN0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRUb29sdGlwVGV4dCwgcGFyYW1ldGVycykudGhlbjxTdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBsYXlTcGVlZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5pbWF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFuaW1hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBc3luYyhyZXBsYXlTcGVlZDogUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF06IDEuMCxcbiAgICB9O1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxSZXBsYXlTcGVlZFR5cGU+KHJlcGxheVNwZWVkLCBSZXBsYXlTcGVlZFR5cGUsICdSZXBsYXlTcGVlZFR5cGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRSZXBsYXlTcGVlZFR5cGUuY29udmVydChyZXBsYXlTcGVlZCk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZXBsYXlBbmltYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBbm5vdGF0ZUVudW0sIEFubm90YXRpb24sIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciwgVHVwbGVTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFubm90YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYW5ub3RhdGUgYSBtYXJrIG9uIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gbWFya1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblRleHRcbiAgICovXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VNYXJrU2VsZWN0aW9uSWRzKFttYXJrXSk7XG4gICAgY29uc3QgZHVtbXlUYXJnZXRQb2ludCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IGZvcm1hdHRlZFRleHQgPSBgPGZvcm1hdHRlZC10ZXh0PjxydW4+JHthbm5vdGF0aW9uVGV4dH08L3J1bj48L2Zvcm1hdHRlZC10ZXh0PmA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYW5ub3RhdGVNYXJrQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuQW5ub3RhdGVFbnVtXTogQW5ub3RhdGVFbnVtLk1hcmssXG4gICAgICBbUGFyYW1ldGVySWQuVGFyZ2V0UG9pbnRdOiBkdW1teVRhcmdldFBvaW50LFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Gb3JtYXR0ZWRUZXh0XTogZm9ybWF0dGVkVGV4dCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNyZWF0ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbm5vdGF0aW9ucyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEFubm90YXRpb24+Pn1cbiAgICovXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QW5ub3RhdGlvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFubm90YXRpb25zLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zTGlzdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxBbm5vdGF0aW9uPjtcbiAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25GaWx0ZXJNYXAoYW5ub3RhdGlvbnNMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmVtb3ZlIGFuIGFubm90YXRpb24gZnJvbSBhIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgYW5ub3RhdGlvbjogQ29udHJhY3QuQW5ub3RhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhbYW5ub3RhdGlvbl0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUFubm90YXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25MaXN0XTogW3NlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbl0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVBbm5vdGF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlTWFya1NlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmsudHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCAmJiB0dXBsZUlkID4gMCkge1xuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCB0dXBsZUlkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhhbm5vdGF0aW9uczogQXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBhbm5vdGF0aW9uLmFubm90YXRpb25JZDtcbiAgICAgIGlmIChhbm5vdGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uSWQgIT09IG51bGwgJiYgYW5ub3RhdGlvbklkID49IDApIHtcbiAgICAgICAgaWRzLnB1c2goYW5ub3RhdGlvbklkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSBhbm5vdGF0aW9uIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIGFubm90YXRpb25JZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBhbm5vdGF0aW9uIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ2Fubm90YXRpb25zJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtYXAgQW5ub3RhdGlvbiB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICogQHJldHVybnMge0Fubm90YXRpb259XG4gICAqL1xuICBwcml2YXRlIG1hcEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbik6IENvbnRyYWN0LkFubm90YXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uSFRNTDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVGV4dCxcbiAgICAgIGFubm90YXRpb25JZDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uSWQsXG4gICAgICBhbm5vdGF0aW9uVGV4dDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uUGxhaW5UZXh0LFxuICAgICAgYW5ub3RhdGlvblR5cGU6IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbm5vdGF0aW9uVHlwZS5jb252ZXJ0KGFubm90YXRpb24uYW5ub3RhdGVFbnVtKSxcbiAgICAgIHR1cGxlSWQ6IGFubm90YXRpb24udHVwbGVJZCEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIEFubm90YXRpb25zIHRvIE1hcmsgQW5ub3RhdGlvbnMsIGFuZCBtYXAgdGhlbSB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxBbm5vdGF0aW9uPn1cbiAgICovXG4gIHByaXZhdGUgYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj4pOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkluZm9zID0gYW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiB0aGlzLm1hcEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuXG4gICAgcmV0dXJuIGFubm90YXRpb25JbmZvcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbywgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQ2xpZW50SW5mb1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQ2xpZW50SW5mb1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldENsaWVudEluZm9Bc3luYygpOiBQcm9taXNlPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEVtYmVkZGluZ0NsaWVudEluZm87XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENsaWVudEluZm9Bc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFbWJlZGRpbmdCb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudEluZm8gPSByZXNwb25zZS5yZXN1bHQgYXMgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbztcbiAgICAgIHJldHVybiBjbGllbnRJbmZvO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9GaWVsZEltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNvbnN0IFNFTlRJTkVMX0xPR0lDQUxfVEFCTEVfSU5GTzogTG9naWNhbFRhYmxlSW5mbyA9IHtcbiAgaWQ6IEludGVybmFsQ29udHJhY3QuQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsLlNpbmdsZVRhYmxlSWQsXG4gIGNhcHRpb246IEludGVybmFsQ29udHJhY3QuQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsLlNpbmdsZVRhYmxlQ2FwdGlvbixcbn07XG5cbi8vIFRoZSBtaW5pbXVtIHBsYXRmb3JtIHZlcnNpb24gd2hlbiBPYmplY3QgTW9kZWwgd2FzIHN1cHBvcnRlZFxuY29uc3QgcGxhdGZvcm1WZXJzaW9uT2JqZWN0TW9kZWxTdXBwb3J0ID0geyBtYWpvcjogMSwgbWlub3I6IDIwLCBmaXg6IDEgfTtcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIERhdGFTb3VyY2VTZXJ2aWNlIHtcbiAgLy8gU2luY2UgT2JqZWN0IE1vZGVsIGlzIHN1cHBvcnRlZCBzaW5jZSBUYWJsZWF1IDIwMjAuMiwgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIHRoZVxuICAvLyBwbGF0Zm9ybSB2ZXJzaW9uIHdoZW4gT00gd2FzIHN1cHBvcnRlZC4gT25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIFRhYmxlYXUgdmVyc2lvbnMgPD0gMjAyMC4xLCBhbGwgYWRkaXRpb25hbFxuICAvLyBjb2RlIGluIGhlcmUgZm9yIE9iamVjdCBNb2RlbCBjYW4gYmUgcmVtb3ZlZC5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBJbnRlcm5hbENvbnRyYWN0LlZlcnNpb25OdW1iZXIgPSBwbGF0Zm9ybVZlcnNpb25PYmplY3RNb2RlbFN1cHBvcnQsXG4gICkge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVmcmVzaEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy8gT24gc2VydmVyOiBOb3QgcGFzc2luZyB0aGUgZGF0YXNvdXJjZSBpZCB3aWxsIHJlZnJlc2ggYWxsIGRhdGFzb3VyY2VzLlxuICAgIGlmIChkYXRhU291cmNlSWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXSA9IGRhdGFTb3VyY2VJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IGpvaW5QYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWN0aXZlVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWN0aXZlVGFibGVzLCBqb2luUGFyYW1ldGVycykudGhlbjxBcnJheTxUYWJsZUluZm8+Pigoam9pblJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUluZm9zID0gam9pblJlc3BvbnNlLnJlc3VsdCBhcyBUYWJsZUluZm9zO1xuXG4gICAgICAvLyBnZXRBY3RpdmVUYWJsZXMgaXMgdW5zdXBwb3J0ZWQgZm9yIGN1YmVzIGFuZCBHQS4gV2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uIHR5cGUgcHJvcGVydHlcbiAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHRoZSBwbGF0Zm9ybSAoaW50ZW50aW9uYWxseSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYXMgbmV3IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCkuXG4gICAgICAvLyBJbnN0ZWFkLGp1c3QgY2hlY2sgaWYgYW55IHRhYmxlcyBhcmUgcmV0dXJuZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3IgYW55IG5vbi10YWJsZSBiYXNlZCBkYXRhc291cmNlLlxuICAgICAgaWYgKHRhYmxlSW5mb3MudGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRNZXRob2RGb3JEYXRhU291cmNlVHlwZSwgYGdldEFjdGl2ZVRhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGZvcjogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZUluZm9zLnRhYmxlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbGxEYXRhU291cmNlc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFsbERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzLCBwYXJhbXMpLnRoZW48Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uU3VtbWFyaWVzID0gcmVzcG9uc2UucmVzdWx0IGFzIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblN1bW1hcmllcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKGdsb2JhbGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmllbGRBbmREYXRhU291cmNlO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWVsZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlXSBhcyBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2U7XG4gICAgICBjb25zdCBmaWVsZCA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5GaWVsZF0gYXMgRmllbGQ7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmllbGQoZmllbGQsIHRoaXMuY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBpZiAoIXRoaXMuaXNPYmplY3RNb2RlbFN1cHBvcnRlZEJ5UGxhdGZvcm0oKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIHNlbnRpbmVsIElEIGNhbiBiZSBwYXNzZWQgdG8gZGF0YXNvdXJjZS5nZXRMb2dpY2FsVGFibGVEYXRhLlxuICAgICAgICogT25jZSB0aGUgZGVza3RvcCBpcyB1cGdyYWRlZCB0byBhIHZlcnNpb24gdGhhdCBzdXBwb3J0cyBvYmplY3QgbW9kZWwsXG4gICAgICAgKiB0aGUgc2VudGluZWwgSUQgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSB1cGdyYWRlZCB0YWJsZS5cbiAgICAgICAqICovXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNvbHZlKSA9PiByZXNvbHZlKFtTRU5USU5FTF9MT0dJQ0FMX1RBQkxFX0lORk9dKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGlmICghdGhpcy5pc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgc2VudGluZWwgSUQgY2FuIGJlIHBhc3NlZCB0byB3b3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YS5cbiAgICAgICAqIE9uY2UgdGhlIGRlc2t0b3AgaXMgdXBncmFkZWQgdG8gYSB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgb2JqZWN0IG1vZGVsLFxuICAgICAgICogdGhlIHNlbnRpbmVsIElEIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgdXBncmFkZWQgdGFibGUuXG4gICAgICAgKiAqL1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPXSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmllbGQoZmllbGQ6IEludGVybmFsQ29udHJhY3QuRmllbGQsIGRhdGFTb3VyY2U6IENvbnRyYWN0LkRhdGFTb3VyY2UpOiBDb250cmFjdC5GaWVsZCB7XG4gICAgcmV0dXJuIG5ldyBGaWVsZChuZXcgRmllbGRJbXBsKGZpZWxkLCBkYXRhU291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRhU291cmNlKGRhdGFTb3VyY2U6IEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZSwgdGhpcy5fcmVnaXN0cnlJZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwbGF0Zm9ybVZlcnNpb25Ob09iamVjdE1vZGVsU3VwcG9ydCA9IHsgbWFqb3I6IDEsIG1pbm9yOiAxMywgZml4OiAwIH07XG4gICAgcmV0dXJuIEludGVybmFsQ29udHJhY3QuVmVyc2lvbkxlc3NUaGFuKHBsYXRmb3JtVmVyc2lvbk5vT2JqZWN0TW9kZWxTdXBwb3J0LCB0aGlzLl9wbGF0Zm9ybVZlcnNpb24pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCxcbiAgRXhwb3J0RmlsZSxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFNoZWV0VHlwZSBhcyBFeHRlcm5hbFNoZWV0VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRXhwb3J0SGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0V4cG9ydEhlbHBlcnMnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4uL0V4cG9ydFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHBvcnRTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRXhwb3J0O1xuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYyhjdXJyZW50U2hlZXRUeXBlOiBFeHRlcm5hbFNoZWV0VHlwZSk6IFByb21pc2U8RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXJyZW50U2hlZXRUeXBlXTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNoZWV0VHlwZS5jb252ZXJ0KGN1cnJlbnRTaGVldFR5cGUpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEV4cG9ydENyb3NzdGFiU2hlZXRNYXA+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydENyb3NzdGFiU2hlZXRNYXA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydENyb3NzdGFiQXN5bmMoXG4gICAgc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gICAgZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlLFxuICApOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVXb3Jrc2hlZXROYW1lcywgc2hlZXROYW1lKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENyb3NzdGFiRmlsZUZvcm1hdD4oZm9ybWF0LCBDcm9zc3RhYkZpbGVGb3JtYXQsICdDcm9zc3RhYkZpbGVGb3JtYXQnKTtcblxuICAgIC8vIFRoZSBwcmVzIGxheWVyIGNvbW1hbmQgZm9yIGV4cG9ydGluZyBDcm9zc3RhYiB1c2VzIFNpbXBsZVNoZWV0SWRlbnRpZmllcnMgaW5zdGVhZCBvZiBzaGVldCBuYW1lcy5cbiAgICAvLyBUaGUgZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaSBjdXJyZW50IGRvZXMgbm90IHN0b3JlIHJlZmVyZW5jZXMgdG8gdGhlIFNpbXBsZVNoZWV0SWRlbnRpZmllcnMgb2YgaXRzIHNoZWV0c1xuICAgIC8vIHNvIHdlIGNhbGwgYSBwcmVzIGxheWVyIGNvbW1hbmQgdGhhdCBnaXZlcyB1cyB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVyIGZvciBlYWNoIHNoZWV0IG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZVxuICAgIC8vIGV4cG9ydCBDcm9zc3RhYiBkaWFsb2cgcG9wdXAuXG4gICAgY29uc3Qgc2hlZXROYW1lVG9JZE1hcCA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGUpO1xuICAgIGlmICghc2hlZXROYW1lVG9JZE1hcFtzaGVldE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ21pc3Npbmcgc2hlZXQgZG9jIGlkIGZyb20gc2hlZXRNYXAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0Q3Jvc3N0YWJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXRJZGVudGlmaWVyXTogc2hlZXROYW1lVG9JZE1hcFtzaGVldE5hbWVdLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbmROb3RpZmljYXRpb25zXTogdHJ1ZSwgLy8gc2VuZCBub3RpZmljYXRpb24gb24gcHJlcyBsYXllciB0aGF0IHRyaWdnZXJzIGZpbGUgZG93bmxvYWRcbiAgICB9O1xuXG4gICAgLy8gcHJlcyBsYXllciBjb21tYW5kIGludm9rZWQgZGVwZW5kcyBvbiB0aGUgY3Jvc3N0YWIgZmlsZSBmb3JtYXRcbiAgICBsZXQgdmVyYjtcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiQ3N2RG93bmxvYWQ7XG4gICAgICAgIC8vIENTViBvbmx5IHBhcmFtZXRlcjogc2VlIGJyb3dzZXItY2xpZW50cy9leHBvcnQtY3Jvc3N0YWItb3B0aW9ucy1kaWFsb2cgcmVwb1xuICAgICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlVzZVRhYkRlbGltaXRlcnNdID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbDpcbiAgICAgICAgdmVyYiA9IFZlcmJJZC5FeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICd1bnN1cHBvcnRlZCBDcm9zc3RhYiBmaWxlIGZvcm1hdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkNyb3NzdGFiQ3JlYXRpb25FcnJvciwgJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnQuJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnREYXRhQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIC8vIFJlbW92ZSBhbnkgZHVwbGljYXRlcyBmcm9tIHRoZSBpbnB1dCBhcnJheVxuICAgIGNvbnN0IGNvbHVtbnNBc1NldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQpO1xuICAgIGNvbnN0IGNvbHVtbnNUb0luY2x1ZGVCeUlkID0gQXJyYXkuZnJvbShjb2x1bW5zQXNTZXQpO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnREYXRhRG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydERhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogb3B0aW9ucy5pZ25vcmVBbGlhc2VzID8/IGZhbHNlLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogY29sdW1uc1RvSW5jbHVkZUJ5SWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPHZvaWQ+KCgpID0+IHt9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkRhdGFDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydFBvd2VyUG9pbnRBc3luYyhzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQpOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lc0ZvclBERkFuZFBQVChzaGVldE5hbWVzLCBleHBvcnRTY2VuYXJpb3MpO1xuXG4gICAgLy8gTm90ZTogdGhlIEV4cG9ydE9yaWdpblVybCBwYXJhbSBpcyBsaXN0ZWQgYXMgb3B0aW9uYWwgZm9yIHRoZSBwcmVzIGxheWVyIGNvbW1hbmQgd2UgYXJlIGludm9raW5nOyBob3dldmVyLFxuICAgIC8vIHJlY2VudCBjaGFuZ2VzIHdlcmUgbWFkZSB0aGF0IGVuZm9yY2VkIHRoZSB1c2Ugb2YgdGhlIGVtcHR5IHN0cmluZyB3aGVuIGludm9raW5nIHRoaXMgY29tbWFuZCB3aXRoIG5vIEV4cG9ydE9yaWdpblVybC5cbiAgICAvLyBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wb3dlcnBvaW50LW9wdGlvbnMtZGlhbG9nIHJlcG8uXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnRQb3dlcnBvaW50RG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydFBvd2VyUG9pbnRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0T3JpZ2luVXJsXTogJycsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0ZWRTaGVldE5hbWVzXTogc2hlZXROYW1lcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5Qb3dlclBvaW50Q3JlYXRpb25FcnJvcixcbiAgICAgICAgICAnQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIHRoZSBQb3dlclBvaW50IGZpbGUuJyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydFBERkFzeW5jKFxuICAgIHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gICAgZXhwb3J0U2NlbmFyaW9zOiBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICApOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RXhwb3J0UERGT3B0aW9ucyhleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICBjb25zdCBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk7XG4gICAgRXhwb3J0SGVscGVycy51cGRhdGVJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIHNoZWV0TmFtZXMpO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnRQZGZEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UERGQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4cG9ydFBkZk9wdGlvbnNdOiBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuUERGQ3JlYXRpb25FcnJvciwgJ1VuYWJsZSB0byBjcmVhdGUgUERGIGJlY2F1c2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcuIFRyeSBhZ2Fpbi4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydFBERk9wdGlvbnNBc3luYygpOiBQcm9taXNlPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RXhwb3J0UGRmT3B0aW9ucztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RXhwb3J0UGRmT3B0aW9uc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFwaU1lbnVUeXBlLCBDb250ZXh0TWVudU9wdGlvbnMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIGFwcGVuZENvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBlbmRFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBlbmRDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZV06IGNvbmZpZy5kaXNwbGF5TmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBuZXdNZW51SXRlbUlkID0gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIHJldHVybiBuZXdNZW51SXRlbUlkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbW92ZUV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeGVjdXRlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZW5hbWVFeHRlcm5hbE1lbnU7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbmFtZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SGVhZGVyXTogbWVudUhlYWRlcixcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVEZXNjcmlwdGlvbl06IG1lbnVEZXNjcmlwdGlvbixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRmlsdGVyVHlwZSwgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBJbnRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsRG9tYWluLFxuICBDYXRlZ29yaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsRGF0YVZhbHVlLFxuICBIaWVyYXJjaGljYWxGaWx0ZXIsXG4gIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsLFxuICBSYW5nZURvbWFpbixcbiAgUmFuZ2VGaWx0ZXIsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlcixcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL0ZpbHRlck1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEZpbHRlclNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5GaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5RmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID1cbiAgICAgIGZpbHRlck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSYW5nZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSYW5nZUZpbHRlckFzeW5jJyxcbiAgICB9O1xuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5taW4gIT09IG51bGwpIHtcbiAgICAgIGxldCBtaW46IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWluID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbiA9IGZpbHRlck9wdGlvbnMubWluO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1pbl0gPSBtaW47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5tYXggIT09IG51bGwpIHtcbiAgICAgIGxldCBtYXg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWF4ID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9IGZpbHRlck9wdGlvbnMubWF4O1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1heF0gPSBtYXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIG51bGwgb3B0aW9uIGlzIHVzZWQgd2l0aCBtaW4rbWF4IGZvciAnaW5jbHVkZS1yYW5nZScgb3IgJ2luY2x1ZGUtcmFuZ2Utb3ItbnVsbCdcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTnVsbE9wdGlvbl0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIubnVsbE9wdGlvbnMuY29udmVydChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihyZXNwb25zZS5yZXN1bHQgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG5cbiAgICBjb25zdCBoaWVyYXJjaGljYWxMZXZlbHMgPSAodmFsdWVzIGFzIENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscykubGV2ZWxzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGllcmFyY2hpY2FsTGV2ZWxzKSAmJiBoaWVyYXJjaGljYWxMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJMZXZlbHNdID0gaGllcmFyY2hpY2FsTGV2ZWxzO1xuICAgIH0gZWxzZSBpZiAoKHZhbHVlcyBhcyBBcnJheTxTdHJpbmc+KS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBzZXJ2ZXIgY29tbWFuZCBleHBlY3RzIGVtcHR5IGxpc3QgZm9yIGNsZWFyaW5nIHRoZSBmaWx0ZXJcbiAgICAgIC8vIGl0IGFsc28gZXhwZWN0cyBlaXRoZXJzIEZpbHRlckxldmVscyBvciBGaWx0ZXJWYWx1ZXMgdG8gYmUgc2V0XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID0gZmlsdGVyT3B0aW9ucyAmJiAhIWZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2xlYXJGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3Bvc25lKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucykge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QZXJpb2RUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5wZXJpb2RUeXBlLmNvbnZlcnQob3B0aW9ucy5wZXJpb2RUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRhdGVSYW5nZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChvcHRpb25zLnJhbmdlVHlwZSk7XG4gICAgaWYgKG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLkxhc3ROIHx8IG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLk5leHROKSB7XG4gICAgICBpZiAob3B0aW9ucy5yYW5nZU4gPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnJhbmdlTiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIEVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMsXG4gICAgICAgICAgJ01pc3NpbmcgcmFuZ2VOIGZpZWxkIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIExBU1ROIG9yIE5FWFROLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJhbmdlTl0gPSBvcHRpb25zLnJhbmdlTjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbmNob3JEYXRlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hbmNob3JEYXRlICE9PSBudWxsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkFuY2hvckRhdGVdID0gdGhpcy5jb252ZXJ0QW5jaG9yRGF0ZShvcHRpb25zLmFuY2hvckRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmlsdGVycztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RmlsdGVyc0FzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0Q2F0ZWdvcmljYWxEb21haW47XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENhdGVnb3JpY2FsRG9tYWluQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRG9tYWluVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyRG9tYWluVHlwZS5jb252ZXJ0KGRvbWFpblR5cGUpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJhbmdlRG9tYWluQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcsIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRSYW5nZURvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UmFuZ2VEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlJhbmdlRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXREYXNoYm9hcmRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5EYXNoYm9hcmRDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYycpO1xuICAgIGNvbnN0IHdvcmtzaGVldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHM/Lm1hcCgod29ya3NoZWV0SW5mbzogSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbCkgPT4ge1xuICAgICAgaWYgKHdvcmtzaGVldEluZm8uaXNTZWxlY3RlZCkge1xuICAgICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldEluZm8ud29ya3NoZWV0TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdvcmtzaGVldE5hbWVzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBhcHBseVRvV29ya3NoZWV0czogQXJyYXk8c3RyaW5nPixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luY0ludGVybmFsJyk7XG4gICAgaWYgKCFzaGFyZWRGaWx0ZXJNb2RlbCB8fCAhc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdUaGlzIGZpbHRlciBkb2VzIG5vdCBhcHBseSB0byBtdWx0aXBsZSB3b3Jrc2hlZXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dlZFdvcmtzaGVldHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGFjdGl2ZVdvcmtzaGVldCA9ICcnO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHMuZm9yRWFjaCgod29ya3NoZWV0KSA9PiB7XG4gICAgICAvLyBHZXQgYWN0aXZlIHdvcmtzaGVldFxuICAgICAgaWYgKHdvcmtzaGVldC5pc0FjdGl2ZSkge1xuICAgICAgICBhY3RpdmVXb3Jrc2hlZXQgPSB3b3Jrc2hlZXQud29ya3NoZWV0TmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gUG9wdWxhdGUgYWxsb3dlZCB3b3Jrc2hlZXRzXG4gICAgICBpZiAod29ya3NoZWV0LmlzU2VsZWN0ZWQgfHwgd29ya3NoZWV0LmlzRW5hYmxlZCkge1xuICAgICAgICBhbGxvd2VkV29ya3NoZWV0cy5wdXNoKHdvcmtzaGVldC53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhY3RpdmVXb3Jrc2hlZXQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ05vIGFjdGl2ZSB3b3Jrc2hlZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwcGx5VG9Xb3Jrc2hlZXRzLmluY2x1ZGVzKGFjdGl2ZVdvcmtzaGVldCkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthY3RpdmVXb3Jrc2hlZXR9IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFwcGxpZWQgd29ya3NoZWV0c2ApO1xuICAgIH1cblxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzLmZvckVhY2goKHNoZWV0KSA9PiB7XG4gICAgICAvLyBjaGVjayBpZiBpdCdzIHByZXNlbnQgd2l0aGluIGNvbXBhdGlibGUgc2hlZXRzXG4gICAgICBpZiAoIWFsbG93ZWRXb3Jrc2hlZXRzLmluY2x1ZGVzKHNoZWV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFRoZSBmaWVsZCAke2ZpZWxkTmFtZX0gaXNuJ3QgYXBwbGljYWJsZSB0byB0aGUgd29ya3NoZWV0ICR7c2hlZXR9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkNoYW5nZVNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9ICdzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hhcmVkRmlsdGVyU2hlZXRzXSA9IGFwcGx5VG9Xb3Jrc2hlZXRzO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZ1tdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBhcHBseVRvV29ya3NoZWV0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgcHJpdmF0ZSBleGVjdXRlR2V0QXBwbGllZFdvcmtzaGVldHMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRTaGFyZWRGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV0gPSB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZEZpbHRlck1vZGVsID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgICByZXR1cm4gc2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREb21haW5GaWx0ZXJzKGRvbWFpbkZpbHRlcnM6IEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPik6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4ge1xuICAgIGNvbnN0IGZpbHRlcnM6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4gPSBbXTtcbiAgICBkb21haW5GaWx0ZXJzLmZvckVhY2goKGRvbWFpbkZpbHRlcikgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBDYXRlZ29yaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuSGllcmFyY2hpY2FsOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRIaWVyYXJjaGljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIaWVyYXJjaGljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJhbmdlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydFJhbmdlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmFuZ2UgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZToge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmVsYXRpdmUgRGF0ZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcik6IENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGR2KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNFeGNsdWRlLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyKTogQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGhpZXJhcmNoaWNhbERhdGFWYWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxEYXRhVmFsdWUoXG4gICAgICAgIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShoaWVyYXJjaGljYWxEYXRhVmFsdWUudmFsdWUpLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUuaGllcmFyY2hpY2FsUGF0aCxcbiAgICAgICAgaGllcmFyY2hpY2FsRGF0YVZhbHVlLmxldmVsLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxldmVsRGV0YWlsczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWw+ID0gZG9tYWluRmlsdGVyLmxldmVsSW5mby5tYXAoKGFMZXZlbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxMZXZlbERldGFpbChcbiAgICAgICAgYUxldmVsLm5hbWUsXG4gICAgICAgIEludGVybmFsRW51bUNvbnZlcnRlci5oaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLmNvbnZlcnQoYUxldmVsLmxldmVsU2VsZWN0aW9uU3RhdGUpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgSGllcmFyY2hpY2FsRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgZG9tYWluRmlsdGVyLmRpbWVuc2lvbk5hbWUsXG4gICAgICBkb21haW5GaWx0ZXIuaGllcmFyY2h5Q2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5sZXZlbHMsXG4gICAgICBsZXZlbERldGFpbHMsXG4gICAgICBhcHBsaWVkVmFsdWVzLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJhbmdlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcik6IENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgICBjb25zdCBtaW5WYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5taW4pO1xuICAgIGNvbnN0IG1heFZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1heCk7XG4gICAgcmV0dXJuIG5ldyBSYW5nZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIpOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICAgIGNvbnN0IGFuY2hvckRhdGVWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5hbmNob3JEYXRlKTtcbiAgICByZXR1cm4gbmV3IFJlbGF0aXZlRGF0ZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYW5jaG9yRGF0ZVZhbHVlLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQoZG9tYWluRmlsdGVyLnBlcmlvZFR5cGUpLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChkb21haW5GaWx0ZXIucmFuZ2VUeXBlKSxcbiAgICAgIGRvbWFpbkZpbHRlci5yYW5nZU4sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT4gPSBkb21haW4udmFsdWVzLm1hcCgoZG9tYWluRHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRHYpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxEb21haW4odmFsdWVzLCBkb21haW5UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJhbmdlRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5SYW5nZURvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LlJhbmdlRG9tYWluIHtcbiAgICBjb25zdCBtaW46IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWluKTtcbiAgICBjb25zdCBtYXg6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRG9tYWluKG1pbiwgbWF4LCBkb21haW5UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEFuY2hvckRhdGUoYW5jaG9yRGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgLy8gQ29udmVydHMgYSBEYXRlIG9iamVjdCBpbnRvIGEgc3RyaW5nIGZvcm1hdCB0aGF0IHRoZSBzZXJ2ZXIgZXhwZWN0cyBmb3IgZGF0ZS90aW1lIHZhbHVlcy5cbiAgICAvLyBJZiBhbmNob3JEYXRlIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgRGF0ZSBvYmplY3QsIGFueSBvZiB0aGVzZSB3b3VsZCBiZSBOYU4uXG4gICAgY29uc3QgeWVhciA9IGFuY2hvckRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IGFuY2hvckRhdGUuZ2V0VVRDTW9udGgoKSArIDE7XG4gICAgY29uc3QgZGF5ID0gYW5jaG9yRGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGggPSBhbmNob3JEYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgY29uc3QgbW0gPSBhbmNob3JEYXRlLmdldFVUQ01pbnV0ZXMoKTtcbiAgICBjb25zdCBzZWMgPSBhbmNob3JEYXRlLmdldFVUQ1NlY29uZHMoKTtcblxuICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkgfHwgaXNOYU4oZGF5KSB8fCBpc05hTihoaCkgfHwgaXNOYU4obW0pIHx8IGlzTmFOKHNlYykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkRGF0ZVBhcmFtZXRlciwgJ0ludmFsaWQgZGF0ZSBwYXJhbWV0ZXI6IGFuY2hvckRhdGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtoaH06JHttbX06JHtzZWN9YDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3Ioc2VydmVyUG06IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuUGFyYW1ldGVyRXJyb3JdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEZpbHRlckZpZWxkTmFtZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRDYXB0aW9uXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEZpbHRlckZpZWxkVmFsdWUsIHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkQWdnRmllbGROYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRBZ2dyZWdhdGlvbkZpZWxkTmFtZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkQWdnRmllbGROYW1lXSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ1NlcnZlciBFcnJvcicpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCxcbiAgRGF0YVRhYmxlIGFzIERhdGFUYWJsZUludGVybmFsQ29udHJhY3QsXG4gIERhdGFUYWJsZVJlYWRlciBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0LFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSGlnaGxpZ2h0ZWRNYXJrc1RhYmxlLFxuICBQYXJhbWV0ZXJJZCxcbiAgU2VsZWN0ZWRNYXJrc1RhYmxlLFxuICBVbmRlcmx5aW5nRGF0YVRhYmxlLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBDb2x1bW4sIERhdGFUYWJsZSwgTWFya0luZm8gfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVGFibGVSZWFkZXIgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YVRhYmxlUmVhZGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBHZXREYXRhU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBHZXREYXRhU2VydmljZSB7XG4gIC8vIFRoZSBleHRlbnNpb24vZW1iZWRkaW5nIGluc3RhbmNlIHVzZXMgdGhlIHNhbWUgY2FjaGUgZm9yIGFsbCBEYXRhVGFibGVSZWFkZXJzLlxuICBwcml2YXRlIHZpZXdEYXRhVGFibGVDYWNoZUlkOiBzdHJpbmcgPSB1dWlkdjQoKTtcblxuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5HZXREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldE1heFJvd0xpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDEwMDAwO1xuICB9XG5cbiAgcHVibGljIGdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmlld0RhdGFUYWJsZUNhY2hlSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldExpbWl0ZWRNYXhSb3dzKHJlcXVlc3RlZFJvd3M6IG51bWJlciwgcm93Q291bnRMaW1pdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmVxdWVzdGVkUm93cyA+IDAgJiYgcmVxdWVzdGVkUm93cyA8IHJvd0NvdW50TGltaXQgPyByZXF1ZXN0ZWRSb3dzIDogcm93Q291bnRMaW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSkgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgcmVzcG9uc2VEYXRhLmlzU3VtbWFyeSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlBhZ2VSb3dDb3VudF06IHBhZ2VSb3dDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhO1xuICAgICAgY29uc3QgY29sdW1ucyA9IGRhdGFUYWJsZS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0U2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0SGlnaGxpZ2h0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBwYWdlUm93Q291bnQgPSB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKHBhZ2VSb3dDb3VudCwgdGhpcy5nZXRNYXhSb3dMaW1pdCgpKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDEpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcGFnZVJvd0NvdW50ID0gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhwYWdlUm93Q291bnQsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSk7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZVJlYWRlcj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlUmVhZGVySW50ZXJuYWxDb250cmFjdDtcblxuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWFkZXIocmVzcG9uc2VEYXRhLmlkLCByZXNwb25zZURhdGEudG90YWxSb3dDb3VudCwgcGFnZVJvd0NvdW50LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN1bW1hcnlUYWJsZUlkID0gJyc7XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyh0YWJsZUlkOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhZ2VBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUlkXTogdGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhUm93SW5kZXhdOiBwYWdlTnVtYmVyICogcGFnZVNpemUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFUYWJsZVJlYWRlclBhZ2UsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+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+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdG9yeVBvaW50TW9kZWw7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQsIFZpc3VhbFNwZWNpZmljYXRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVmlzdWFsTW9kZWxTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFZpc3VhbFNwZWNpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgVmlzdWFsU3BlY2lmaWNhdGlvbjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vVml6U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYyksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlZpekFQSSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU2hlZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Td2l0Y2hUb1NoZWV0TmFtZV06IG5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFjdGl2YXRlU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbVZpZXdzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDdXN0b21WaWV3SW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VzdG9tVmlld3NBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1c3RvbVZpZXdzLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3cyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxDdXN0b21WaWV3TW9kZWw+O1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdzLm1hcCgoY3VzdG9tVmlldzogQ3VzdG9tVmlld01vZGVsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lPzogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2hvd0N1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSB8fCAnJywgLy8gYSBmYWxzZXkgdmFsdWUgbWVhbnMgXCJzaG93IG9yaWdpbmFsIHZpZXdcIlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TaG93Q3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbCB8IHVuZGVmaW5lZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3Py5sdWlkID8gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUN1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICAvLyBDdXN0b21WaWV3SXNEZWZhdWx0IGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyLCBidXQgb3VyIEFQSSBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byBhbGxvdyBpdCB0byBiZSBzcGVjaWZpZWQgeWV0LlxuICAgIC8vIFdlIHNob3VsZCBhZGQgYSAnZGVmYXVsdCcgcGFyYW1ldGVyIHRvIHRoZSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NhdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzRGVmYXVsdF06IGZhbHNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdJbXBsKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdMdWlkXTogY3VzdG9tVmlldy5sdWlkLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlldy5uYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBjdXN0b21WaWV3LmlzRGVmYXVsdCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNQdWJsaWNdOiBjdXN0b21WaWV3LnNoYXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVXBkYXRlQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNyY0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1cnJlbnRTcmNBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1cnJlbnRTcmMsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogc3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0VmlzaWJpbGl0eUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdOiB7fSxcbiAgICB9O1xuXG4gICAgLy8gem9uZVZpc2liaWxpdHlNYXAgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYSBNYXAgLSBjb252ZXJ0IGl0IHRvIGEgTWFwXG4gICAgY29uc3QgcGFyYW1ldGVyQXNNYXAgPSBQYXJhbS5jb252ZXJ0UGFyYW1ldGVyVG9NYXAoem9uZVZpc2liaWxpdHlNYXAsICd6b25lVmlzaWJpbGl0eU1hcCcpO1xuXG4gICAgcGFyYW1ldGVyQXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXAsIE51bWJlci5wYXJzZUludChrZXksIDEwKSk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlPih2YWx1ZSwgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsICdEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZScpO1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF1ba2V5XSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRWaXNpYmlsaXR5VHlwZS5jb252ZXJ0KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFpvbmVWaXNpYmlsaXR5LCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3RdOiBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgICB9O1xuXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkuZm9yRWFjaCgoZGFzaGJvYXJkT2JqZWN0OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXAsIGRhc2hib2FyZE9iamVjdC5kYXNoYm9hcmRPYmplY3RJRCk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5V2lkdGhBbmRIZWlnaHRPZkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZShkYXNoYm9hcmRPYmplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZUFuZFJlc2l6ZVpvbmVzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRhYmxlIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZVN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZVN1bW1hcnkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFibGVJbmZvOiBUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY29ubmVjdGlvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXN0b21TUUwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmN1c3RvbVNRTDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqIFRoaXMgYWxsb3dzIHVzIHRvIHByb3ZpZGUgYSBmaWVsZCB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBtb3JlIGVhc2lseSBwcm9ncmFtbWF0aWNhbGx5IHJlc3BvbmRcbiAqIHRvIGVycm9yIHNjZW5hcmlvcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlYXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgJHtfZXJyb3JDb2RlfTogJHttZXNzYWdlfWApO1xuXG4gICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIC8vIEVycm9yIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgcHJvcGVydGx5IHdoZW4gY29tcGlsaW5nIHRvIEVTNSwgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2VcbiAgICAvLyB0aGUgcHJvdG8gY2hhaW4gdG8gYmUgYnVpbHQgY29ycmVjdGx5LiAgU2VlIHRoZSBnaXRodWIgbGluayBhYm92ZSBmb3IgZGV0YWlscy5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVGFibGVhdUVycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yQ29kZSgpOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcyB8IFNoYXJlZEVycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSksXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlRmlsdGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRmlsdGVycyBhbHJlYWR5IGhhdmUgbmF0aXZlIHR5cGUgaW4gdmFsdWUsIGp1c3QgdXNlIHRoYXQgZm9yIG5hdGl2ZVZhbHVlIGFsc29cbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZVRhYmxlRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIERhdGFUYWJsZXMgY29udGFpbiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgZGF0ZSBhcyBzdHJpbmcgfCAnJW51bGwlXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBjb252ZXJ0cyBkYXRlcyBhcyBzdHJpbmcgdG8gZGF0ZXMsIGFuZCBhbnkgc3BlY2lhbCB0byBudWxsXG4gICAgLy8gKGJvb2xlYW4sIG51bWJlcnMsIHN0cmluZ3MgYXJlIHBhc3NlZCB0aHJvdWdoKVxuICAgIC8vIEJlY2F1c2Ugb2YgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gLSB3ZSBjYW4gaGF2ZSB1bmRlZmluZWQgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IHRoYW4gYW55IHNwZWNpYWxcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgZGF0YVR5cGUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUsXG4gICAgKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBBIFByb21pc2Ugd3JhcHBlciBjbGFzcyBhbGxvd2luZyBmb3IgcmVzb2x2aW5nL3JlamVjdGluZyB0aGUgUHJvbWlzZSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGl0cyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgRGVmZXJyZWRcbiAqIEB0ZW1wbGF0ZSBUUmVzb2x2ZSBUaGUgdHlwZSB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2UuXG4gKiBAdGVtcGxhdGUgVFJlamVjdCBUaGUgdHlwZSB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZS4gRGVmYXVsdHMgdG8gYW55LlxuICogQGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM0NjM3NDM2XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdCA9IGFueT4ge1xuICBwcml2YXRlIF9wcm9taXNlOiBQcm9taXNlPFRSZXNvbHZlPjtcbiAgcHJpdmF0ZSBfcmVzb2x2ZTogKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPikgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfcmVqZWN0OiAocmVhc29uPzogVFJlamVjdCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEZWZlcnJlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZTxUUmVzb2x2ZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgUHJvbWlzZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtQcm9taXNlPFRSZXNvbHZlPn1cbiAgICovXG4gIGdldCBwcm9taXNlKCk6IFByb21pc2U8VFJlc29sdmU+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgd3JhcHBlZCBQcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0geyhUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPil9IHJlc3BvbnNlIFRoZSBhcmd1bWVudCB0byBiZSByZXNvbHZlZCBieSB0aGUgUHJvbWlzZS5cbiAgICogQHJldHVybnMgeyp9ICB7dm9pZH1cbiAgICovXG4gIHJlc29sdmUocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZXNvbHZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb2x2ZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtUUmVqZWN0fSBbcmVhc29uXSBUaGUgcmVhc29uIHdoeSB0aGUgUHJvbWlzZSByZWplY3RlZC5cbiAgICogQHJldHVybnMgeyp9ICB7dm9pZH1cbiAgICovXG4gIHJlamVjdChyZWFzb24/OiBUUmVqZWN0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZWplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWplY3QocmVhc29uKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IDMwMDAwO1xuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgY29udmVydHMgZnJvbSBhIHNvdXJjZSBlbnVtIHZhbHVlIHRvIGRlc3RpbmF0aW9uIGVudW1cbiAqIHZhbHVlIGdpdmVuIGEgbWFwcGluZyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aGVuIGNvbnN0cnVjdGVkLlxuICpcbiAqIE5vdGU6IFRoaXMgZXhhY3Qgc2FtZSBjbGFzcyBpcyBkZWZpbmVkIGluIGFwaS1jb3JlLiAgR2l2ZW4gaXRzIHNtYWxsXG4gKiBuYXR1cmUsIGl0IGlzIG5vdCB3b3J0aCBoYXZpbmcgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHRvIHNoYXJlIHRoaXMgYmV0d2VlblxuICogYXBpLWNvcmUgYW5kIGFwaS1zaGFyZWQuICBJZiBtb3JlIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSBpcyBhZGRlZCB0aGF0IGlzIHVzZWQgYnkgYXBpLWNvcmVcbiAqIGFuZCBhcGktc2hhcmVkIGJ1dCBoYXMgbm8gb3RoZXIgZGVwZW5kZWNpZXMsIGEgdXRpbHRpdHkgcHJvamVjdCBtaWdodCBiZSBtZXJpdGVkLFxuICogYW5kIHRoaXMgY2xhc3MgY291bGQgYmUgbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnVtQ29udmVydGVyPFRTb3VyY2VUeXBlIGV4dGVuZHMgc3RyaW5nLCBURGVzdGluYXRpb25UeXBlPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tYXBwaW5nczogeyBbZW51bVZhbDogc3RyaW5nXTogVERlc3RpbmF0aW9uVHlwZSB9LCBwcml2YXRlIF9kZWZhdWx0VmFsPzogVERlc3RpbmF0aW9uVHlwZSkge31cblxuICBwdWJsaWMgY29udmVydChlbnVtVmFsOiBUU291cmNlVHlwZSwgdGhyb3dJZk1pc3Npbmc6IFNob3VsZFRocm93ID0gU2hvdWxkVGhyb3cuWWVzKTogVERlc3RpbmF0aW9uVHlwZSB7XG4gICAgaWYgKHRoaXMuX21hcHBpbmdzLmhhc093blByb3BlcnR5KGVudW1WYWwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwcGluZ3NbZW51bVZhbCBhcyBzdHJpbmddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZhdWx0VmFsICE9PSB1bmRlZmluZWQgJiYgdGhyb3dJZk1pc3NpbmcgIT09IFNob3VsZFRocm93Llllcykge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWw7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBFbnVtIE1hcHBpbmcgbm90IGZvdW5kIGZvcjogJHtlbnVtVmFsfWApO1xuICB9XG59XG5cbmV4cG9ydCBlbnVtIFNob3VsZFRocm93IHtcbiAgWWVzID0gJ3llcycsXG4gIE5vID0gJ25vJyxcbn1cbiIsImltcG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi4vSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4vUGFyYW0nO1xuXG5pbnRlcmZhY2UgRW51bUxpa2Uge1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBjb21tb24gZXJyb3JzIHRocm91Z2hvdXQgdGhlIGV4dGVybmFsXG4gKiBwcm9qZWN0cyAoYXBpLXNoYXJlZCwgZXh0ZW5zaW9ucy1hcGksIGV0Yy4pLiAgSXQgaGFzIHNvbWUgZHVwbGljYXRpb24gd2l0aFxuICogdGhlIEVycm9ySGVscGVycyBjbGFzcyBpbiBhcGktY29yZSwgYnV0IGlzIHNlcGFyYXRlIGR1ZSB0byB0aGUgbmVlZCB0byB0aHJvd1xuICogYW4gZXh0ZXJuYWwgVGFibGVhdUVycm9yIHZzLiBhbiBJbnRlcm5hbFRhYmxlYXVFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVycm9ySGVscGVycyB7XG4gIC8qKlxuICAgKiBUaHJvd3Mgd2l0aCBjb2RlIEludGVybmFsRXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcGlOYW1lIG5hbWUgb2YgYXBpIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXBpTm90SW1wbGVtZW50ZWQoYXBpTmFtZTogc3RyaW5nKTogVGFibGVhdUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FwaU5hbWV9IEFQSSBub3QgeWV0IGltcGxlbWVudGVkLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBpbnRlcm5hbCBlcnJvciBpZiBhcmd1bWVudCBpcyBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5SW50ZXJuYWxWYWx1ZShhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3I6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyKGFyZ3VtZW50VmFsdWU6IGFueSwgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBub3QgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgKiBGb3Igb2JqZWN0cywgaXQganVzdCB0ZXN0cyB0aGF0IGl0IGlzIGFuIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBleHBlY3RlZCByZXN1bHQgb2YgdHlwZW9mXG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyVHlwZShhcmd1bWVudFZhbHVlOiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRWYWx1ZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaGFzIGludmFsaWQgdHlwZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIGVtcHR5IHN0cmluZywgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVN0cmluZ1BhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBzdHJpbmcsIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGFyZ3VtZW50VmFsdWUgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW10ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhlbnVtVHlwZSkuZm9yRWFjaCgoZW51bUtleSkgPT4ge1xuICAgICAgaWYgKGVudW1UeXBlW2VudW1LZXldID09PSBlbnVtVmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IGFueSwgbWF4OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIW1pbiAmJiAhbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgYXQgbGVhc3Qgb25lIG9mIG1pbiBvciBtYXggaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG1pbiAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1pbikgJiYgIVBhcmFtLmlzVHlwZURhdGUobWluKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1pbi4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWF4ICYmICFQYXJhbS5pc1R5cGVOdW1iZXIobWF4KSAmJiAhUGFyYW0uaXNUeXBlRGF0ZShtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIG9ubHkgRGF0ZSBhbmQgbnVtYmVyIGFyZSBhbGxvd2VkIGZvciBwYXJhbWV0ZXIgbWF4LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtaW4gJiYgbWF4ICYmIHR5cGVvZiBtaW4gIT09IHR5cGVvZiBtYXgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgcGFyYW1ldGVycyBtaW4gYW5kIG1heCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZS4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgem9uZUlkIGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZFpvbmVNYXAgQSBtYXAgb2Ygem9uZUlkJ3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGFzaGJvYXJkIG9iamVjdC5cbiAgICogQHBhcmFtIHpvbmVJRCBab25lSWQgdG8gYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+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+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdjM1IGZyb20gJy4vdjM1LmpzJztcbmltcG9ydCBtZDUgZnJvbSAnLi9tZDUuanMnO1xudmFyIHYzID0gdjM1KCd2MycsIDB4MzAsIG1kNSk7XG5leHBvcnQgZGVmYXVsdCB2MzsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgc2hhMSBmcm9tICcuL3NoYTEuanMnO1xudmFyIHY1ID0gdjM1KCd2NScsIDB4NTAsIHNoYTEpO1xuZXhwb3J0IGRlZmF1bHQgdjU7IiwiaW1wb3J0IFJFR0VYIGZyb20gJy4vcmVnZXguanMnO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZSh1dWlkKSB7XG4gIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgJiYgUkVHRVgudGVzdCh1dWlkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGU7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZmluZCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZnJvbSc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbWFwJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlcic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL3BhcnNlLWZsb2F0JztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtaW50JztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvZW50cmllcyc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL3Byb21pc2UnO1xuLy8gRHVlIHRvIHRoZSB3YXkgd2UgY29uZmlndXJlZCB3ZWJwYWNrLCB3ZSBzaG91bGQgYmUgZXhwb3J0aW5nIHRoaW5ncyB3aGljaCB3aWxsIGJlIHVuZGVyXG4vLyBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQgXCJ0YWJsZWF1XCIuIEV4cG9ydCBldmVyeXRoaW5nIHdlIHdhbnQgdG8gYmUgdmlzaWJsZSB1bmRlciB0YWJsZWF1XG4vLyBmcm9tIHRoaXMgZmlsZS5cbmltcG9ydCB7IEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuXG5kZWNsYXJlIGxldCBWRVJTSU9OX0lTX0FMUEhBOiBib29sZWFuO1xuY29uc3QgaXNBbHBoYTogYm9vbGVhbiA9IHR5cGVvZiBWRVJTSU9OX0lTX0FMUEhBICE9PSAndW5kZWZpbmVkJyA/IFZFUlNJT05fSVNfQUxQSEEgOiBmYWxzZTtcblxuZGVjbGFyZSBsZXQgQVBJX1ZFUlNJT05fTlVNQkVSOiBzdHJpbmc7XG5BcGlWZXJzaW9uLlNldFZlcnNpb25OdW1iZXIodHlwZW9mIEFQSV9WRVJTSU9OX05VTUJFUiAhPT0gJ3VuZGVmaW5lZCcgPyBBUElfVkVSU0lPTl9OVU1CRVIgOiAnMC4wLjAnLCBpc0FscGhhKTtcblxuY29uc3QgZXh0ZW5zaW9uSW1wbCA9IG5ldyBFeHRlbnNpb25zSW1wbCgpO1xuZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSBuZXcgRXh0ZW5zaW9ucyhleHRlbnNpb25JbXBsKTtcblxuLy8gRXhwb3J0IEVudW1zXG4vLyBUaGVzZSBzaG93IHVwIHVuZGVyIHRoZSB0YWJsZWF1IG9iamVjdC4gSS5lLiB0YWJsZWF1LkV4dGVuc2lvbkNvbnRleHQuU2VydmVyXG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlck9wdGlvbnMsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuMTIuMS1wcmUuMS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxrQkFBa0IsbUJBQU8sQ0FBQywwRkFBOEI7O0FBRXhEOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLG1CQUFPLENBQUMsd0ZBQTZCO0FBQ3JDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0pBLG1CQUFPLENBQUMsZ0dBQWlDO0FBQ3pDLG1CQUFPLENBQUMsMEVBQXNCO0FBQzlCLG1CQUFPLENBQUMsb0dBQW1DO0FBQzNDLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ05BLG1CQUFPLENBQUMsc0dBQW9DO0FBQzVDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsOEZBQWdDO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsd0dBQXFDO0FBQzdDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsb0dBQW1DO0FBQzNDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsOEZBQWdDO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsZ0dBQWlDO0FBQ3pDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0hBQTBDO0FBQ2xELFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLG1CQUFP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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixxQkFBcUIsYUFBYTtBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPLElBQUksY0FBYzs7QUFFekI7QUFDQSw2RUFBNkUsY0FBYztBQUMzRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdCQUFnQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksMENBQTBDO0FBQzlDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsSUFBSSw2Q0FBNkM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELElBQUksd0RBQXdEO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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MEVBQWtCO0FBQ2xCLDhFQUFvQjtBQUNwQiw0RUFBbUI7QUFDbkIsc0dBQWdDO0FBQ2hDLG9GQUF1QjtBQUN2Qix3RkFBeUI7QUFDekIsMEVBQWtCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9maW5kLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL21hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3Byb21pc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGVhci1lcnJvci1zdGFjay5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1icm93c2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MtcGViYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnRyeS11bmJpbmQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvZ3VpZC9ndWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvTWFya3NTZWxlY3RlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1U2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVXb3Jrc2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1dvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQ29ubmVjdGVkU2VydmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvU2V0dGluZ3NJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVUlJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkT2JqZWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvUGFyYW1ldGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvU2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3JrYm9vay50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtzaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Vudmlyb25tZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvVUkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9VSVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUHVsc2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9WaXpJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvTm90aWZpY2F0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvUGFyYW1ldGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvVmVyYnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VUeXBlQ2hlY2tzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25UcmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uQ29udmVydGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQXBpVmVyc2lvbi50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Db25uZWN0aW9uU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9EYXRhU291cmNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FdmVudExpc3RlbmVyTWFuYWdlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9GaWVsZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXRhU291cmNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0ZpZWxkSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1BhcmFtZXRlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2luZ2xlRXZlbnRNYW5hZ2VySW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvV29ya3NoZWV0SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Mb2dpY2FsVGFibGUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0FjY2Vzc2liaWxpdHlNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0ZpbHRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvR2V0RGF0YU1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvR2V0RGF0YVRhYmxlUmVhZGVyTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvUG9pbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvR2V0RGF0YVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9BY2Nlc3NpYmlsaXR5U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0Fubm90YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0RhdGFTb3VyY2VTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4cG9ydFNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRmlsdGVyU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9HZXREYXRhU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1BhcmFtZXRlcnNTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VydmljZUltcGxCYXNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2l6ZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9WaXN1YWxNb2RlbFNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVml6U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9ab25lU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVGFibGVTdW1tYXJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlYXVFcnJvci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EYXRhVmFsdWVGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0VudW1Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRXJyb3JIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0V4cG9ydEhlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvUGFyYW0udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9TaG9ydExpdmVkRGVmZXJyZWQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVmVyc2lvbk51bWJlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9tZDUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbmlsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JlZ2V4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92My5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MzUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnZmluZCcpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZnJvbScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguQXJyYXkuZnJvbTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5NYXA7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNJbnRlZ2VyO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIuaXNOYU47XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLnBhcnNlRmxvYXQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5wYXJzZUludDtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmFzc2lnbjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LnNldFByb3RvdHlwZU9mO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguUHJvbWlzZTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ29uc3RydWN0b3IoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciBTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmICh0eXBlb2YgYXJndW1lbnQgPT0gJ29iamVjdCcgfHwgaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKGFyZ3VtZW50KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogY3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUHJvdG90eXBlKSB7XG4gIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcihTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgdmFyIElTX0NPTlNUUlVDVE9SID0gaXNDb25zdHJ1Y3Rvcih0aGlzKTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgaWYgKG1hcHBpbmcpIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICYmICEodGhpcyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IElTX0NPTlNUUlVDVE9SID8gbmV3IHRoaXMoKSA6IFtdO1xuICAgIGZvciAoOyEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKGxlbmd0aCkgOiBBcnJheShsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsInZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZm9yRWFjaCwgbWFwLCBmaWx0ZXIsIHNvbWUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbHRlclJlamVjdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBJU19GSUxURVJfUkVKRUNUID0gVFlQRSA9PSA3O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCwgc3BlY2lmaWNDcmVhdGUpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQpO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShzZWxmKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjcmVhdGUgPSBzcGVjaWZpY0NyZWF0ZSB8fCBhcnJheVNwZWNpZXNDcmVhdGU7XG4gICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiB8fCBJU19GSUxURVJfUkVKRUNUID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaCh0YXJnZXQsIHZhbHVlKTsgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgNDogcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAvLyBldmVyeVxuICAgICAgICAgIGNhc2UgNzogcHVzaCh0YXJnZXQsIHZhbHVlKTsgICAgICAvLyBmaWx0ZXJSZWplY3RcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogdGFyZ2V0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbiAgZm9yRWFjaDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgZmlsdGVyOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuc29tZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbiAgc29tZTogY3JlYXRlTWV0aG9kKDMpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuICBmaW5kOiBjcmVhdGVNZXRob2QoNSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gIGZpbmRJbmRleDogY3JlYXRlTWV0aG9kKDYpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlclJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWZpbHRlcmluZ1xuICBmaWx0ZXJSZWplY3Q6IGNyZWF0ZU1ldGhvZCg3KVxufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyhbXS5zbGljZSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG5cbi8vIGEgcGFydCBvZiBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5KSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKGlzQ29uc3RydWN0b3IoQykgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcbn07XG4iLCJ2YXIgYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoYXJyYXlTcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWxBcnJheSkpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tLCBuby10aHJvdy1saXRlcmFsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyh7fS50b1N0cmluZyk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBzdHJpbmdTbGljZSh0b1N0cmluZyhpdCksIDgsIC0xKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xuXG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuLy8gZ2V0dGluZyB0YWcgZnJvbSBFUzYrIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyBjbGFzc29mUmF3IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcblxudmFyIFRFU1QgPSAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gU3RyaW5nKEVycm9yKGFyZykuc3RhY2spOyB9KSgnenhjYXNkJyk7XG52YXIgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZID0gL1xcblxccyphdCBbXjpdKjpbXlxcbl0qLztcbnZhciBJU19WOF9PUl9DSEFLUkFfU1RBQ0sgPSBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkudGVzdChURVNUKTtcbnZhciBJU19GSVJFRk9YX09SX1NBRkFSSV9TVEFDSyA9IC9AW15cXG5dKlxcbi8udGVzdChURVNUKSAmJiAhL3p4Y2FzZC8udGVzdChURVNUKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gIGlmICh0eXBlb2Ygc3RhY2sgIT0gJ3N0cmluZycpIHJldHVybiBzdGFjaztcbiAgaWYgKElTX1Y4X09SX0NIQUtSQV9TVEFDSykge1xuICAgIHdoaWxlIChkcm9wRW50cmllcy0tKSBzdGFjayA9IHJlcGxhY2Uoc3RhY2ssIFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWSwgJycpO1xuICB9IGVsc2UgaWYgKElTX0ZJUkVGT1hfT1JfU0FGQVJJX1NUQUNLKSB7XG4gICAgcmV0dXJuIGpvaW4oYXJyYXlTbGljZShzcGxpdChzdGFjaywgJ1xcbicpLCBkcm9wRW50cmllcyksICdcXG4nKTtcbiAgfSByZXR1cm4gc3RhY2s7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmZhc3RLZXk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIFByb3RvdHlwZSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSxcbiAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiAwXG4gICAgICB9KTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMpIHRoYXQuc2l6ZSA9IDA7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgUHJvdG90eXBlID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4gICAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gICAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgIHZhciBwcmV2aW91cywgaW5kZXg7XG4gICAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUubGFzdCA9IGVudHJ5ID0ge1xuICAgICAgICAgIGluZGV4OiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSxcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzID0gc3RhdGUubGFzdCxcbiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVtb3ZlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzdGF0ZS5maXJzdCkgc3RhdGUuZmlyc3QgPSBlbnRyeTtcbiAgICAgICAgaWYgKHByZXZpb3VzKSBwcmV2aW91cy5uZXh0ID0gZW50cnk7XG4gICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSsrO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSsrO1xuICAgICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHN0YXRlLmluZGV4W2luZGV4XSA9IGVudHJ5O1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9O1xuXG4gICAgdmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIC8vIGZhc3QgY2FzZVxuICAgICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpO1xuICAgICAgdmFyIGVudHJ5O1xuICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiBzdGF0ZS5pbmRleFtpbmRleF07XG4gICAgICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgICAgIGZvciAoZW50cnkgPSBzdGF0ZS5maXJzdDsgZW50cnk7IGVudHJ5ID0gZW50cnkubmV4dCkge1xuICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgcmV0dXJuIGVudHJ5O1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZWRlZmluZUFsbChQcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmNsZWFyKClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5jbGVhclxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmNsZWFyXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDtcbiAgICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wcmV2aW91cykgZW50cnkucHJldmlvdXMgPSBlbnRyeS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUgPSAwO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5kZWxldGVcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5kZWxldGVcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uZXh0O1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uZXh0ID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wcmV2aW91cyA9IHByZXY7XG4gICAgICAgICAgaWYgKHN0YXRlLmZpcnN0ID09IGVudHJ5KSBzdGF0ZS5maXJzdCA9IG5leHQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmxhc3QgPT0gZW50cnkpIHN0YXRlLmxhc3QgPSBwcmV2O1xuICAgICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZS0tO1xuICAgICAgICAgIGVsc2UgdGhhdC5zaXplLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmZvcmVhY2hcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuZmlyc3QpIHtcbiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXR9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmhhc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmhhc1xuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChQcm90b3R5cGUsIElTX01BUCA/IHtcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLmdldChrZXkpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5nZXRcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudmFsdWU7XG4gICAgICB9LFxuICAgICAgLy8gYE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5zZXRcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIGBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmFkZFxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eShQcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKSB7XG4gICAgdmFyIElURVJBVE9SX05BTUUgPSBDT05TVFJVQ1RPUl9OQU1FICsgJyBJdGVyYXRvcic7XG4gICAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICB2YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihJVEVSQVRPUl9OQU1FKTtcbiAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS57IGtleXMsIHZhbHVlcywgZW50cmllcywgQEBpdGVyYXRvciB9KClgIG1ldGhvZHNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZW50cmllc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5rZXlzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLnZhbHVlc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmVudHJpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUua2V5c1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS52YWx1ZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUtQEBpdGVyYXRvclxuICAgIGRlZmluZUl0ZXJhdG9yKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9O1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS52YWx1ZSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBbZW50cnkua2V5LCBlbnRyeS52YWx1ZV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGVbQEBzcGVjaWVzXWAgYWNjZXNzb3JzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXQtbWFwLUBAc3BlY2llc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXNldC1AQHNwZWNpZXNcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUsIHdyYXBwZXIsIGNvbW1vbikge1xuICB2YXIgSVNfTUFQID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdNYXAnKSAhPT0gLTE7XG4gIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgTmF0aXZlQ29uc3RydWN0b3IgPSBnbG9iYWxbQ09OU1RSVUNUT1JfTkFNRV07XG4gIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHZhciBDb25zdHJ1Y3RvciA9IE5hdGl2ZUNvbnN0cnVjdG9yO1xuICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24gKEtFWSkge1xuICAgIHZhciB1bmN1cnJpZWROYXRpdmVNZXRob2QgPSB1bmN1cnJ5VGhpcyhOYXRpdmVQcm90b3R5cGVbS0VZXSk7XG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvdG90eXBlLCBLRVksXG4gICAgICBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyB1bmRlZmluZWQgOiB1bmN1cnJpZWROYXRpdmVNZXRob2QodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgdmFyIFJFUExBQ0UgPSBpc0ZvcmNlZChcbiAgICBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICFpc0NhbGxhYmxlKE5hdGl2ZUNvbnN0cnVjdG9yKSB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gICAgfSkpXG4gICk7XG5cbiAgaWYgKFJFUExBQ0UpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBOYXRpdmVQcm90b3R5cGUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBOYXRpdmVQcm90b3R5cGU7XG4gICAgICBOYXRpdmVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORykgZml4TWV0aG9kKEFEREVSKTtcblxuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgTmF0aXZlUHJvdG90eXBlLmNsZWFyKSBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyO1xuICB9XG5cbiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjtcbiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBDb25zdHJ1Y3RvciAhPSBOYXRpdmVDb25zdHJ1Y3RvciB9LCBleHBvcnRlZCk7XG5cbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgRnVuY3Rpb25OYW1lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuUFJPUEVSO1xudmFyIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FID0gRnVuY3Rpb25OYW1lLkNPTkZJR1VSQUJMRTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYWxsYWJsZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICAgICAgICAgIHJlZGVmaW5lKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5LnByb3RvdHlwZS57IHZhbHVlcywgQEBpdGVyYXRvciB9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoUFJPUEVSX0ZVTkNUSU9OX05BTUUgJiYgREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgaWYgKCFJU19QVVJFICYmIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsICduYW1lJywgVkFMVUVTKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIGNhbGwobmF0aXZlSXRlcmF0b3IsIHRoaXMpOyB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGV4cG9ydCBhZGRpdGlvbmFsIG1ldGhvZHNcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKVxuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIHx8ICEoS0VZIGluIEl0ZXJhYmxlUHJvdG90eXBlKSkge1xuICAgICAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvciwgeyBuYW1lOiBERUZBVUxUIH0pO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JztcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL2lwYWR8aXBob25lfGlwb2QvaS50ZXN0KHVzZXJBZ2VudCkgJiYgZ2xvYmFsLlBlYmJsZSAhPT0gdW5kZWZpbmVkO1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC8oPzppcGFkfGlwaG9uZXxpcG9kKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc29mKGdsb2JhbC5wcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBEZW5vID0gZ2xvYmFsLkRlbm87XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnMgfHwgRGVubyAmJiBEZW5vLnZlcnNpb247XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODtcbnZhciBtYXRjaCwgdmVyc2lvbjtcblxuaWYgKHY4KSB7XG4gIG1hdGNoID0gdjguc3BsaXQoJy4nKTtcbiAgLy8gaW4gb2xkIENocm9tZSwgdmVyc2lvbnMgb2YgVjggaXNuJ3QgVjggPSBDaHJvbWUgLyAxMFxuICAvLyBidXQgdGhlaXIgY29ycmVjdCB2ZXJzaW9ucyBhcmUgbm90IGludGVyZXN0aW5nIGZvciB1c1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gPiAwICYmIG1hdGNoWzBdIDwgNCA/IDEgOiArKG1hdGNoWzBdICsgbWF0Y2hbMV0pO1xufVxuXG4vLyBCcm93c2VyRlMgTm9kZUpTIGBwcm9jZXNzYCBwb2x5ZmlsbCBpbmNvcnJlY3RseSBzZXQgYC52OGAgdG8gYDAuMGBcbi8vIHNvIGNoZWNrIGB1c2VyQWdlbnRgIGV2ZW4gaWYgYC52OGAgZXhpc3RzLCBidXQgMFxuaWYgKCF2ZXJzaW9uICYmIHVzZXJBZ2VudCkge1xuICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7XG4gICAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgIGlmIChtYXRjaCkgdmVyc2lvbiA9ICttYXRjaFsxXTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9EKSB7XG4gIHJldHVybiB1bmN1cnJ5VGhpcyhnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdKTtcbn07XG4iLCIvLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBlcnJvciA9IEVycm9yKCdhJyk7XG4gIGlmICghKCdzdGFjaycgaW4gZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIDcpKTtcbiAgcmV0dXJuIGVycm9yLnN0YWNrICE9PSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4gIG9wdGlvbnMubmFtZSAgICAgICAgLSB0aGUgLm5hbWUgb2YgdGhlIGZ1bmN0aW9uIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBrZXlcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHtcbiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0O1xuICB2YXIgR0xPQkFMID0gb3B0aW9ucy5nbG9iYWw7XG4gIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7XG4gIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7XG4gIGlmIChHTE9CQUwpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWw7XG4gIH0gZWxzZSBpZiAoU1RBVElDKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlO1xuICB9XG4gIGlmICh0YXJnZXQpIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07XG4gICAgaWYgKG9wdGlvbnMubm9UYXJnZXRHZXQpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfSBlbHNlIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG4gICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0XG4gICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuIiwidmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGFwcGx5ID0gRnVuY3Rpb25Qcm90b3R5cGUuYXBwbHk7XG52YXIgYmluZCA9IEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQ7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1yZWZsZWN0IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFJlZmxlY3QgPT0gJ29iamVjdCcgJiYgUmVmbGVjdC5hcHBseSB8fCAoYmluZCA/IGNhbGwuYmluZChhcHBseSkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpO1xufSk7XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcblxudmFyIGJpbmQgPSB1bmN1cnJ5VGhpcyh1bmN1cnJ5VGhpcy5iaW5kKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCkge1xuICBhQ2FsbGFibGUoZm4pO1xuICByZXR1cm4gdGhhdCA9PT0gdW5kZWZpbmVkID8gZm4gOiBiaW5kID8gYmluZChmbiwgdGhhdCkgOiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gY2FsbC5iaW5kID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXREZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIEVYSVNUUyA9IGhhc093bihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKTtcbi8vIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBmcm9tIG1pbmlmaWVkIC8gbWFuZ2xlZCAvIGRyb3BwZWQgZnVuY3Rpb24gbmFtZXNcbnZhciBQUk9QRVIgPSBFWElTVFMgJiYgKGZ1bmN0aW9uIHNvbWV0aGluZygpIHsgLyogZW1wdHkgKi8gfSkubmFtZSA9PT0gJ3NvbWV0aGluZyc7XG52YXIgQ09ORklHVVJBQkxFID0gRVhJU1RTICYmICghREVTQ1JJUFRPUlMgfHwgKERFU0NSSVBUT1JTICYmIGdldERlc2NyaXB0b3IoRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJykuY29uZmlndXJhYmxlKSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBFWElTVFM6IEVYSVNUUyxcbiAgUFJPUEVSOiBQUk9QRVIsXG4gIENPTkZJR1VSQUJMRTogQ09ORklHVVJBQkxFXG59O1xuIiwidmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGJpbmQgPSBGdW5jdGlvblByb3RvdHlwZS5iaW5kO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xudmFyIGNhbGxCaW5kID0gYmluZCAmJiBiaW5kLmJpbmQoY2FsbCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZCA/IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZm4gJiYgY2FsbEJpbmQoY2FsbCwgZm4pO1xufSA6IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZm4gJiYgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWxsLmFwcGx5KGZuLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKGFyZ3VtZW50KSA/IGFyZ3VtZW50IDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKSA6IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBnZXRNZXRob2QoaXQsIElURVJBVE9SKVxuICAgIHx8IGdldE1ldGhvZChpdCwgJ0BAaXRlcmF0b3InKVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgdXNpbmdJdGVyYXRvcikge1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGdldEl0ZXJhdG9yTWV0aG9kKGFyZ3VtZW50KSA6IHVzaW5nSXRlcmF0b3I7XG4gIGlmIChhQ2FsbGFibGUoaXRlcmF0b3JNZXRob2QpKSByZXR1cm4gYW5PYmplY3QoY2FsbChpdGVyYXRvck1ldGhvZCwgYXJndW1lbnQpKTtcbiAgdGhyb3cgVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuIiwidmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG5cbi8vIGBHZXRNZXRob2RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXRtZXRob2Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFYsIFApIHtcbiAgdmFyIGZ1bmMgPSBWW1BdO1xuICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcbiIsInZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIGZhbGxiYWNrXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBhcmd1bWVudHMubGVuZ3RoID09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfVxufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWllZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3Ncbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZVxuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgaXNDYWxsYWJsZShOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciBmdW5jdGlvblRvU3RyaW5nID0gdW5jdXJyeVRoaXMoRnVuY3Rpb24udG9TdHJpbmcpO1xuXG4vLyB0aGlzIGhlbHBlciBicm9rZW4gaW4gYGNvcmUtanNAMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyXG5pZiAoIWlzQ2FsbGFibGUoc3RvcmUuaW5zcGVjdFNvdXJjZSkpIHtcbiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBmdW5jdGlvblRvU3RyaW5nKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcblxuLy8gYEluc3RhbGxFcnJvckNhdXNlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1lcnJvci1jYXVzZS8jc2VjLWVycm9yb2JqZWN0cy1pbnN0YWxsLWVycm9yLWNhdXNlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBvcHRpb25zKSB7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSAmJiAnY2F1c2UnIGluIG9wdGlvbnMpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywgJ2NhdXNlJywgb3B0aW9ucy5jYXVzZSk7XG4gIH1cbn07XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbnZhciBSRVFVSVJFRCA9IGZhbHNlO1xudmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7XG52YXIgaWQgPSAwO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSAtLSBzYWZlXG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIHNldE1ldGFkYXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeyB2YWx1ZToge1xuICAgIG9iamVjdElEOiAnTycgKyBpZCsrLCAvLyBvYmplY3QgSURcbiAgICB3ZWFrRGF0YToge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG5cbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIGEgcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhc093bihpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBREFUQV0ub2JqZWN0SUQ7XG59O1xuXG52YXIgZ2V0V2Vha0RhdGEgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhc093bihpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIHRoZSBzdG9yZSBvZiB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBREFUQV0ud2Vha0RhdGE7XG59O1xuXG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpJTkcgJiYgUkVRVUlSRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzT3duKGl0LCBNRVRBREFUQSkpIHNldE1ldGFkYXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIGVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWV0YS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4gIFJFUVVJUkVEID0gdHJ1ZTtcbiAgdmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmY7XG4gIHZhciBzcGxpY2UgPSB1bmN1cnJ5VGhpcyhbXS5zcGxpY2UpO1xuICB2YXIgdGVzdCA9IHt9O1xuICB0ZXN0W01FVEFEQVRBXSA9IDE7XG5cbiAgLy8gcHJldmVudCBleHBvc2luZyBvZiBtZXRhZGF0YSBrZXlcbiAgaWYgKGdldE93blByb3BlcnR5TmFtZXModGVzdCkubGVuZ3RoKSB7XG4gICAgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZXN1bHRbaV0gPT09IE1FVEFEQVRBKSB7XG4gICAgICAgICAgc3BsaWNlKHJlc3VsdCwgaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWxNb2R1bGUuZlxuICAgIH0pO1xuICB9XG59O1xuXG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBlbmFibGU6IGVuYWJsZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cbmhpZGRlbktleXNbTUVUQURBVEFdID0gdHJ1ZTtcbiIsInZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEID0gJ09iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVAgfHwgc2hhcmVkLnN0YXRlKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIHZhciB3bWdldCA9IHVuY3VycnlUaGlzKHN0b3JlLmdldCk7XG4gIHZhciB3bWhhcyA9IHVuY3VycnlUaGlzKHN0b3JlLmhhcyk7XG4gIHZhciB3bXNldCA9IHVuY3VycnlUaGlzKHN0b3JlLnNldCk7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAod21oYXMoc3RvcmUsIGl0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgd21zZXQoc3RvcmUsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChoYXNPd24oaXQsIFNUQVRFKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZ3VtZW50KSB7XG4gIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PSAnQXJyYXknO1xufTtcbiIsIi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgZW1wdHkgPSBbXTtcbnZhciBjb25zdHJ1Y3QgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ2NvbnN0cnVjdCcpO1xudmFyIGNvbnN0cnVjdG9yUmVnRXhwID0gL15cXHMqKD86Y2xhc3N8ZnVuY3Rpb24pXFxiLztcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoY29uc3RydWN0b3JSZWdFeHAuZXhlYyk7XG52YXIgSU5DT1JSRUNUX1RPX1NUUklORyA9ICFjb25zdHJ1Y3RvclJlZ0V4cC5leGVjKG5vb3ApO1xuXG52YXIgaXNDb25zdHJ1Y3Rvck1vZGVybiA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3RydWN0KG5vb3AsIGVtcHR5LCBhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG52YXIgaXNDb25zdHJ1Y3RvckxlZ2FjeSA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgICAvLyB3ZSBjYW4ndCBjaGVjayAucHJvdG90eXBlIHNpbmNlIGNvbnN0cnVjdG9ycyBwcm9kdWNlZCBieSAuYmluZCBoYXZlbid0IGl0XG4gIH0gcmV0dXJuIElOQ09SUkVDVF9UT19TVFJJTkcgfHwgISFleGVjKGNvbnN0cnVjdG9yUmVnRXhwLCBpbnNwZWN0U291cmNlKGFyZ3VtZW50KSk7XG59O1xuXG4vLyBgSXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gIWNvbnN0cnVjdCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBjYWxsZWQ7XG4gIHJldHVybiBpc0NvbnN0cnVjdG9yTW9kZXJuKGlzQ29uc3RydWN0b3JNb2Rlcm4uY2FsbClcbiAgICB8fCAhaXNDb25zdHJ1Y3Rvck1vZGVybihPYmplY3QpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oZnVuY3Rpb24gKCkgeyBjYWxsZWQgPSB0cnVlOyB9KVxuICAgIHx8IGNhbGxlZDtcbn0pID8gaXNDb25zdHJ1Y3RvckxlZ2FjeSA6IGlzQ29uc3RydWN0b3JNb2Rlcm47XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBJc0ludGVncmFsTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNpbnRlZ3JhbG51bWJlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1pc2ludGVnZXIgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iLCJ2YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCBPYmplY3QoaXQpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbnZhciBSZXN1bHRQcm90b3R5cGUgPSBSZXN1bHQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgdW5ib3VuZEZ1bmN0aW9uLCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoYXQ7XG4gIHZhciBBU19FTlRSSUVTID0gISEob3B0aW9ucyAmJiBvcHRpb25zLkFTX0VOVFJJRVMpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBiaW5kKHVuYm91bmRGdW5jdGlvbiwgdGhhdCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX0lURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKCFpdGVyRm4pIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdGVyYWJsZSkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlcmFibGUpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pO1xuICB9XG5cbiAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gIHdoaWxlICghKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG4iLCJ2YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGtpbmQsIHZhbHVlKSB7XG4gIHZhciBpbm5lclJlc3VsdCwgaW5uZXJFcnJvcjtcbiAgYW5PYmplY3QoaXRlcmF0b3IpO1xuICB0cnkge1xuICAgIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgaWYgKCFpbm5lclJlc3VsdCkge1xuICAgICAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbm5lclJlc3VsdCA9IGNhbGwoaW5uZXJSZXN1bHQsIGl0ZXJhdG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbm5lckVycm9yID0gdHJ1ZTtcbiAgICBpbm5lclJlc3VsdCA9IGVycm9yO1xuICB9XG4gIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgaWYgKGlubmVyRXJyb3IpIHRocm93IGlubmVyUmVzdWx0O1xuICBhbk9iamVjdChpbm5lclJlc3VsdCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUta2V5cyAtLSBzYWZlICovXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbnZhciBORVdfSVRFUkFUT1JfUFJPVE9UWVBFID0gSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgLy8gRkY0NC0gbGVnYWN5IGl0ZXJhdG9ycyBjYXNlXG4gIHJldHVybiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0uY2FsbCh0ZXN0KSAhPT0gdGVzdDtcbn0pO1xuXG5pZiAoTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbmVsc2UgaWYgKElTX1BVUkUpIEl0ZXJhdG9yUHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtQEBpdGVyYXRvclxuaWYgKCFpc0NhbGxhYmxlKEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSkpIHtcbiAgcmVkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcblxuLy8gYExlbmd0aE9mQXJyYXlMaWtlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdG9MZW5ndGgob2JqLmxlbmd0aCk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX0lPU19QRUJCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy1wZWJibGUnKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdCcpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcblxudmFyIE11dGF0aW9uT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xuLy8gTm9kZS5qcyAxMSBzaG93cyBFeHBlcmltZW50YWxXYXJuaW5nIG9uIGdldHRpbmcgYHF1ZXVlTWljcm90YXNrYFxudmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpO1xudmFyIHF1ZXVlTWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcblxudmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghcXVldWVNaWNyb3Rhc2spIHtcbiAgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgLy8gYWxzbyBleGNlcHQgV2ViT1MgV2Via2l0IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84OThcbiAgaWYgKCFJU19JT1MgJiYgIUlTX05PREUgJiYgIUlTX1dFQk9TX1dFQktJVCAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50KSB7XG4gICAgdG9nZ2xlID0gdHJ1ZTtcbiAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoIUlTX0lPU19QRUJCTEUgJiYgUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAvLyB3b3JrYXJvdW5kIG9mIFdlYktpdCB+IGlPUyBTYWZhcmkgMTAuMSBidWdcbiAgICBwcm9taXNlLmNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbiAgICB0aGVuID0gYmluZChwcm9taXNlLnRoZW4sIHByb21pc2UpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmJpbmQoZ2xvYmFsKVxuICAgIG1hY3JvdGFzayA9IGJpbmQobWFjcm90YXNrLCBnbG9iYWwpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hY3JvdGFzayhmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSBTeW1ib2woKTtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gYGdldC1vd24tcHJvcGVydHktc3ltYm9sc2AgcG9seWZpbGwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gb2JqZWN0IGFyZSBub3QgU3ltYm9sIGluc3RhbmNlc1xuICByZXR1cm4gIVN0cmluZyhzeW1ib2wpIHx8ICEoT2JqZWN0KHN5bWJvbCkgaW5zdGFuY2VvZiBTeW1ib2wpIHx8XG4gICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXNcbiAgICAhU3ltYm9sLnNoYW0gJiYgVjhfVkVSU0lPTiAmJiBWOF9WRVJTSU9OIDwgNDE7XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0NhbGxhYmxlKFdlYWtNYXApICYmIC9uYXRpdmUgY29kZS8udGVzdChpbnNwZWN0U291cmNlKFdlYWtNYXApKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUNhbGxhYmxlKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFDYWxsYWJsZShyZWplY3QpO1xufTtcblxuLy8gYE5ld1Byb21pc2VDYXBhYmlsaXR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbmV3cHJvbWlzZWNhcGFiaWxpdHlcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsInZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsICRkZWZhdWx0KSB7XG4gIHJldHVybiBhcmd1bWVudCA9PT0gdW5kZWZpbmVkID8gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyAnJyA6ICRkZWZhdWx0IDogdG9TdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBuJFBhcnNlRmxvYXQgPSBnbG9iYWwucGFyc2VGbG9hdDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGT1JDRUQgPSAxIC8gbiRQYXJzZUZsb2F0KHdoaXRlc3BhY2VzICsgJy0wJykgIT09IC1JbmZpbml0eVxuICAvLyBNUyBFZGdlIDE4LSBicm9rZW4gd2l0aCBib3hlZCBzeW1ib2xzXG4gIHx8IChJVEVSQVRPUiAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyBuJFBhcnNlRmxvYXQoT2JqZWN0KElURVJBVE9SKSk7IH0pKTtcblxuLy8gYHBhcnNlRmxvYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWZsb2F0LXN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUZsb2F0KHN0cmluZykge1xuICB2YXIgdHJpbW1lZFN0cmluZyA9IHRyaW0odG9TdHJpbmcoc3RyaW5nKSk7XG4gIHZhciByZXN1bHQgPSBuJFBhcnNlRmxvYXQodHJpbW1lZFN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgY2hhckF0KHRyaW1tZWRTdHJpbmcsIDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6IG4kUGFyc2VGbG9hdDtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgJHBhcnNlSW50ID0gZ2xvYmFsLnBhcnNlSW50O1xudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgSVRFUkFUT1IgPSBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIGhleCA9IC9eWystXT8weC9pO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhoZXguZXhlYyk7XG52YXIgRk9SQ0VEID0gJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdoaXRlc3BhY2VzICsgJzB4MTYnKSAhPT0gMjJcbiAgLy8gTVMgRWRnZSAxOC0gYnJva2VuIHdpdGggYm94ZWQgc3ltYm9sc1xuICB8fCAoSVRFUkFUT1IgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsgJHBhcnNlSW50KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxubW9kdWxlLmV4cG9ydHMgPSBGT1JDRUQgPyBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4KSB7XG4gIHZhciBTID0gdHJpbSh0b1N0cmluZyhzdHJpbmcpKTtcbiAgcmV0dXJuICRwYXJzZUludChTLCAocmFkaXggPj4+IDApIHx8IChleGVjKGhleCwgUykgPyAxNiA6IDEwKSk7XG59IDogJHBhcnNlSW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gc2FmZVxudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHNob3VsZCBoYXZlIGNvcnJlY3Qgb3JkZXIgb2Ygb3BlcmF0aW9ucyAoRWRnZSBidWcpXG4gIGlmIChERVNDUklQVE9SUyAmJiAkYXNzaWduKHsgYjogMSB9LCAkYXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1zeW1ib2wgLS0gc2FmZVxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBhbHBoYWJldDtcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG4gIHdoaWxlIChhcmd1bWVudHNMZW5ndGggPiBpbmRleCkge1xuICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KG9iamVjdEtleXMoUyksIGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlLCBTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG4iLCIvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUsIFdTSCAqL1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xuXG52YXIgR1QgPSAnPic7XG52YXIgTFQgPSAnPCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgU0NSSVBUID0gJ3NjcmlwdCc7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBFbXB0eUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG52YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIExUICsgU0NSSVBUICsgR1QgKyBjb250ZW50ICsgTFQgKyAnLycgKyBTQ1JJUFQgKyBHVDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBBY3RpdmVYIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHtcbiAgYWN0aXZlWERvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnJykpO1xuICBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTtcbiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDtcbiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDsgLy8gYXZvaWQgbWVtb3J5IGxlYWtcbiAgcmV0dXJuIHRlbXA7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzVcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7XG59O1xuXG4vLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0XG4vLyBObyBuZWVkIHRvIHVzZSBhY3RpdmUgeCBhcHByb2FjaCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyBub3Qgc2V0XG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2XG4vLyBhdm9pZCBJRSBHQyBidWdcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfVxuICBOdWxsUHJvdG9PYmplY3QgPSB0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCdcbiAgICA/IGRvY3VtZW50LmRvbWFpbiAmJiBhY3RpdmVYRG9jdW1lbnRcbiAgICAgID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIC8vIG9sZCBJRVxuICAgICAgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKVxuICAgIDogTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpOyAvLyBXU0hcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gTnVsbFByb3RvT2JqZWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydGllcyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBwcm9wc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzT3duKE8sIFApKSByZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYsIE8sIFApLCBPW1BdKTtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlICovXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJykuZjtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBhcnJheVNsaWNlKHdpbmRvd05hbWVzKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIGNsYXNzb2YoaXQpID09ICdXaW5kb3cnXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3QgPSBnbG9iYWwuT2JqZWN0O1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKE8pIHtcbiAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzT3duKG9iamVjdCwgSUVfUFJPVE8pKSByZXR1cm4gb2JqZWN0W0lFX1BST1RPXTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBpZiAoaXNDYWxsYWJsZShjb25zdHJ1Y3RvcikgJiYgb2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyh7fS5pc1Byb3RvdHlwZU9mKTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qta2V5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gTmFzaG9ybiB+IEpESzggYnVnXG52YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgISRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlXG5leHBvcnRzLmYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlO1xufSA6ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvIC0tIHNhZmUgKi9cbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LXNldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICAgIHNldHRlciA9IHVuY3VycnlUaGlzKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCk7XG4gICAgc2V0dGVyKHRlc3QsIFtdKTtcbiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICBhbk9iamVjdChPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHVuY3VycnlUaGlzKCRwcm9wZXJ0eUlzRW51bWVyYWJsZSk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgT2JqZWN0LnsgZW50cmllcywgdmFsdWVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVE9fRU5UUklFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBrZXkgPSBrZXlzW2krK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IHByb3BlcnR5SXNFbnVtZXJhYmxlKE8sIGtleSkpIHtcbiAgICAgICAgcHVzaChyZXN1bHQsIFRPX0VOVFJJRVMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4gIGVudHJpZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYE9iamVjdC52YWx1ZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG5cbi8vIGBPcmRpbmFyeVRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb3JkaW5hcnl0b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChwcmVmID09PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoaXNDYWxsYWJsZShmbiA9IGlucHV0LnZhbHVlT2YpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAocHJlZiAhPT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChrZXlzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCB2YWx1ZTogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9O1xuICB9XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJykuQ09ORklHVVJBQkxFO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlO1xuICB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7XG4gIHZhciBuYW1lID0gb3B0aW9ucyAmJiBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiAgdmFyIHN0YXRlO1xuICBpZiAoaXNDYWxsYWJsZSh2YWx1ZSkpIHtcbiAgICBpZiAoU3RyaW5nKG5hbWUpLnNsaWNlKDAsIDcpID09PSAnU3ltYm9sKCcpIHtcbiAgICAgIG5hbWUgPSAnWycgKyBTdHJpbmcobmFtZSkucmVwbGFjZSgvXlN5bWJvbFxcKChbXildKilcXCkvLCAnJDEnKSArICddJztcbiAgICB9XG4gICAgaWYgKCFoYXNPd24odmFsdWUsICduYW1lJykgfHwgKENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FICYmIHZhbHVlLm5hbWUgIT09IG5hbWUpKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodmFsdWUsICduYW1lJywgbmFtZSk7XG4gICAgfVxuICAgIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpO1xuICAgIGlmICghc3RhdGUuc291cmNlKSB7XG4gICAgICBzdGF0ZS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBuYW1lID09ICdzdHJpbmcnID8gbmFtZSA6ICcnKTtcbiAgICB9XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKHRoaXMpICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXNPd24oaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZTtcbiIsInZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjE5LjAnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMjEgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jb25zdHJ1Y3RvcicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgU3BlY2llc0NvbnN0cnVjdG9yYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUNvbnN0cnVjdG9yKFMpO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgcG9zKSB7XG4gICAgdmFyIFMgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyT3JJbmZpbml0eShwb3MpO1xuICAgIHZhciBzaXplID0gUy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBmaXJzdCA9IGNoYXJDb2RlQXQoUywgcG9zaXRpb24pO1xuICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICAgIHx8IChzZWNvbmQgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBjaGFyQXQoUywgcG9zaXRpb24pXG4gICAgICAgICAgOiBmaXJzdFxuICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HXG4gICAgICAgICAgPyBzdHJpbmdTbGljZShTLCBwb3NpdGlvbiwgcG9zaXRpb24gKyAyKVxuICAgICAgICAgIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuICBjb2RlQXQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxuICBjaGFyQXQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgd2hpdGVzcGFjZSA9ICdbJyArIHdoaXRlc3BhY2VzICsgJ10nO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cCh3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgbHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBydHJpbSwgJycpO1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1SaWdodCwgdHJpbUVuZCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1cbiAgdHJpbTogY3JlYXRlTWV0aG9kKDMpXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgRnVuY3Rpb24gPSBnbG9iYWwuRnVuY3Rpb247XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGxvY2F0aW9uLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudHJ5IHtcbiAgLy8gRGVubyB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciBvbiBgbG9jYXRpb25gIGFjY2VzcyB3aXRob3V0IGAtLWxvY2F0aW9uYCBmbGFnXG4gIGxvY2F0aW9uID0gZ2xvYmFsLmxvY2F0aW9uO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChoYXNPd24ocXVldWUsIGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBwb3N0ID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWwucG9zdE1lc3NhZ2UoU3RyaW5nKGlkKSwgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwcGx5KGlzQ2FsbGFibGUoZm4pID8gZm4gOiBGdW5jdGlvbihmbiksIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKFxuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmXG4gICAgaXNDYWxsYWJsZShnbG9iYWwucG9zdE1lc3NhZ2UpICYmXG4gICAgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmXG4gICAgbG9jYXRpb24gJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOicgJiZcbiAgICAhZmFpbHMocG9zdClcbiAgKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCIvLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyT3JJbmZpbml0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvaW50ZWdlcm9yaW5maW5pdHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBudW1iZXIgPSArYXJndW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gc2FmZVxuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IChudW1iZXIgPiAwID8gZmxvb3IgOiBjZWlsKShudW1iZXIpO1xufTtcbiIsInZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXJPckluZmluaXR5KGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gIH1cbiAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdudW1iZXInO1xuICByZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgcHJlZik7XG59O1xuIiwidmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ1N5bWJvbCcpIHRocm93IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcnKTtcbiAgcmV0dXJuIFN0cmluZyhhcmd1bWVudCk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIFN0cmluZyhhcmd1bWVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG59O1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzeW1ib2xGb3IgPSBTeW1ib2wgJiYgU3ltYm9sWydmb3InXTtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXNPd24oV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSB8fCAhKE5BVElWRV9TWU1CT0wgfHwgdHlwZW9mIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9PSAnc3RyaW5nJykpIHtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSAnU3ltYm9sLicgKyBuYW1lO1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpKSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgfSBlbHNlIGlmIChVU0VfU1lNQk9MX0FTX1VJRCAmJiBzeW1ib2xGb3IpIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IHN5bWJvbEZvcihkZXNjcmlwdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbChkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07XG59O1xuIiwiLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgY2xlYXJFcnJvclN0YWNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsZWFyLWVycm9yLXN0YWNrJyk7XG52YXIgaW5zdGFsbEVycm9yQ2F1c2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQnKTtcbnZhciBFUlJPUl9TVEFDS19JTlNUQUxMQUJMRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZScpO1xuXG52YXIgRXJyb3IgPSBnbG9iYWwuRXJyb3I7XG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbnZhciAkQWdncmVnYXRlRXJyb3IgPSBmdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UgLyogLCBvcHRpb25zICovKSB7XG4gIHZhciB0aGF0ID0gaXNQcm90b3R5cGVPZihBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSwgdGhpcykgPyB0aGlzIDogY3JlYXRlKEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlKTtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgdGhhdCA9IHNldFByb3RvdHlwZU9mKG5ldyBFcnJvcih1bmRlZmluZWQpLCBnZXRQcm90b3R5cGVPZih0aGF0KSk7XG4gIH1cbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgbm9ybWFsaXplU3RyaW5nQXJndW1lbnQobWVzc2FnZSwgJycpKTtcbiAgaWYgKEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ3N0YWNrJywgY2xlYXJFcnJvclN0YWNrKHRoYXQuc3RhY2ssIDEpKTtcbiAgaW5zdGFsbEVycm9yQ2F1c2UodGhhdCwgb3B0aW9ucyk7XG4gIHZhciBlcnJvcnNBcnJheSA9IFtdO1xuICBpdGVyYXRlKGVycm9ycywgcHVzaCwgeyB0aGF0OiBlcnJvcnNBcnJheSB9KTtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdlcnJvcnMnLCBlcnJvcnNBcnJheSk7XG4gIHJldHVybiB0aGF0O1xufTtcblxuaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZigkQWdncmVnYXRlRXJyb3IsIEVycm9yKTtcbmVsc2UgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcygkQWdncmVnYXRlRXJyb3IsIEVycm9yKTtcblxudmFyIEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlID0gJEFnZ3JlZ2F0ZUVycm9yLnByb3RvdHlwZSA9IGNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAkQWdncmVnYXRlRXJyb3IpLFxuICBtZXNzYWdlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJycpLFxuICBuYW1lOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJ0FnZ3JlZ2F0ZUVycm9yJylcbn0pO1xuXG4vLyBgQWdncmVnYXRlRXJyb3JgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFnZ3JlZ2F0ZS1lcnJvci1jb25zdHJ1Y3RvclxuJCh7IGdsb2JhbDogdHJ1ZSB9LCB7XG4gIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3Jcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmluZDtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG52YXIgRklORCA9ICdmaW5kJztcbnZhciBTS0lQU19IT0xFUyA9IHRydWU7XG5cbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoRklORCBpbiBbXSkgQXJyYXkoMSlbRklORF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFNLSVBTX0hPTEVTIH0sIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKEZJTkQpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogZnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgQVJSQVlfSVRFUkFUT1IgPSAnQXJyYXkgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfSVRFUkFUT1IpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllc1xuLy8gYEFycmF5LnByb3RvdHlwZS5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnZhbHVlc1xuLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4vLyBgQ3JlYXRlQXJyYXlJdGVyYXRvcmAgaW50ZXJuYWwgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7XG4gIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKztcbiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkge1xuICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogaW5kZXgsIGRvbmU6IGZhbHNlIH07XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogdGFyZ2V0W2luZGV4XSwgZG9uZTogZmFsc2UgfTtcbiAgcmV0dXJuIHsgdmFsdWU6IFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGRvbmU6IGZhbHNlIH07XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGV1bm1hcHBlZGFyZ3VtZW50c29iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYE1hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLW9iamVjdHNcbmNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0ludGVncmFsTnVtYmVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlcicpO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNJbnRlZ2VyOiBpc0ludGVncmFsTnVtYmVyXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTnVtYmVyLmlzTmFOYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzbmFuXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWZsb2F0Jyk7XG5cbi8vIGBOdW1iZXIucGFyc2VGbG9hdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZUZsb2F0XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbnVtYmVyLXBhcnNlZmxvYXQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUZsb2F0ICE9IHBhcnNlRmxvYXQgfSwge1xuICBwYXJzZUZsb2F0OiBwYXJzZUZsb2F0XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlSW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQnKTtcblxuLy8gYE51bWJlci5wYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZWludFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1wYXJzZWludCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUsIGZvcmNlZDogTnVtYmVyLnBhcnNlSW50ICE9IHBhcnNlSW50IH0sIHtcbiAgcGFyc2VJbnQ6IHBhcnNlSW50XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1hc3NpZ24gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoTykge1xuICAgIHJldHVybiAkZW50cmllcyhPKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIHNldFByb3RvdHlwZU9mOiBzZXRQcm90b3R5cGVPZlxufSk7XG4iLCJ2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZycpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVycm9yIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxudmFyIFBST01JU0VfQU5ZX0VSUk9SID0gJ05vIG9uZSBwcm9taXNlIHJlc29sdmVkJztcblxuLy8gYFByb21pc2UuYW55YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbnlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFueTogZnVuY3Rpb24gYW55KGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBBZ2dyZWdhdGVFcnJvciA9IGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJyk7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yc1tpbmRleF0gPSBlcnJvcjtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgTmF0aXZlUHJvbWlzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3RvcicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIE5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10uY2FsbCh7IHRoZW46IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSBpc0NhbGxhYmxlKG9uRmluYWxseSk7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuXG4vLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNmaW5hbGx5YCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbmlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2UpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J107XG4gIGlmIChOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddICE9PSBtZXRob2QpIHtcbiAgICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfQlJPV1NFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3NlcicpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZSAmJiBOYXRpdmVQcm9taXNlLnByb3RvdHlwZTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlO1xudmFyIFByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcbnZhciBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eTtcblxudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIE5BVElWRV9SRUpFQ1RJT05fRVZFTlQgPSBpc0NhbGxhYmxlKGdsb2JhbC5Qcm9taXNlUmVqZWN0aW9uRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG5cbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuO1xuXG52YXIgRk9SQ0VEID0gaXNGb3JjZWQoUFJPTUlTRSwgZnVuY3Rpb24gKCkge1xuICB2YXIgUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgPSBpbnNwZWN0U291cmNlKFByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgIT09IFN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO1xuICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAvLyBXZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UgJiYgVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAvLyBXZSBuZWVkIFByb21pc2UjZmluYWxseSBpbiB0aGUgcHVyZSB2ZXJzaW9uIGZvciBwcmV2ZW50aW5nIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgaWYgKElTX1BVUkUgJiYgIVByb21pc2VQcm90b3R5cGVbJ2ZpbmFsbHknXSkgcmV0dXJuIHRydWU7XG4gIC8vIFdlIGNhbid0IHVzZSBAQHNwZWNpZXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4gIC8vIGRlb3B0aW1pemF0aW9uIGFuZCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5XG4gIGlmIChWOF9WRVJTSU9OID49IDUxICYmIC9uYXRpdmUgY29kZS8udGVzdChQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSkpIHJldHVybiBmYWxzZTtcbiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICB9O1xuICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgaWYgKCFTVUJDTEFTU0lORykgcmV0dXJuIHRydWU7XG4gIC8vIFVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgcmV0dXJuICFHTE9CQUxfQ09SRV9KU19QUk9NSVNFICYmIElTX0JST1dTRVIgJiYgIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQ7XG59KTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiBpc0NhbGxhYmxlKHRoZW4gPSBpdC50aGVuKSA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAoc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9ucztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PSBGVUxGSUxMRUQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gY2hhaW5baW5kZXgrK107XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQoc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICBjYWxsKHRoZW4sIHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoSVNfVU5IQU5ETEVEKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKElTX05PREUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50O1xufTtcblxudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNhbGwodGFzaywgZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgaWYgKElTX05PREUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7XG4gIH0pO1xufTtcblxudmFyIGJpbmQgPSBmdW5jdGlvbiAoZm4sIHN0YXRlLCB1bndyYXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZuKHN0YXRlLCB2YWx1ZSwgdW53cmFwKTtcbiAgfTtcbn07XG5cbnZhciBpbnRlcm5hbFJlamVjdCA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7XG4gIG5vdGlmeShzdGF0ZSwgdHJ1ZSk7XG59O1xuXG52YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdGUuZmFjYWRlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgdmFyIHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKTtcbiAgICBpZiAodGhlbikge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IGRvbmU6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbCh0aGVuLCB2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRCkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICBhQ2FsbGFibGUoZXhlY3V0b3IpO1xuICAgIGNhbGwoSW50ZXJuYWwsIHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHN0YXRlLCBlcnJvcik7XG4gICAgfVxuICB9O1xuICBQcm9taXNlUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBbXSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoUHJvbWlzZVByb3RvdHlwZSwge1xuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbnMgPSBzdGF0ZS5yZWFjdGlvbnM7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IGlzQ2FsbGFibGUob25GdWxmaWxsZWQpID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IGlzQ2FsbGFibGUob25SZWplY3RlZCkgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgICByZWFjdGlvbnNbcmVhY3Rpb25zLmxlbmd0aF0gPSByZWFjdGlvbjtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcblxuICBpZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlKSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGUudGhlbjtcblxuICAgIGlmICghU1VCQ0xBU1NJTkcpIHtcbiAgICAgIC8vIG1ha2UgYFByb21pc2UjdGhlbmAgcmV0dXJuIGEgcG9seWZpbGxlZCBgUHJvbWlzZWAgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBjYWxsKG5hdGl2ZVRoZW4sIHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG5cbiAgICAgIC8vIG1ha2VzIHN1cmUgdGhhdCBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzIGBQcm9taXNlI2NhdGNoYCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbiAgICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICdjYXRjaCcsIFByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10sIHsgdW5zYWZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIG1ha2UgYC5jb25zdHJ1Y3RvciA9PT0gUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIHRyeSB7XG4gICAgICBkZWxldGUgTmF0aXZlUHJvbWlzZVByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcbiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbiAgICAvLyBtYWtlIGBpbnN0YW5jZW9mIFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIHNldFByb3RvdHlwZU9mKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsIFByb21pc2VQcm90b3R5cGUpO1xuICAgIH1cbiAgfVxufVxuXG4kKHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvclxufSk7XG5cbnNldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UsIHRydWUpO1xuc2V0U3BlY2llcyhQUk9NSVNFKTtcblxuUHJvbWlzZVdyYXBwZXIgPSBnZXRCdWlsdEluKFBST01JU0UpO1xuXG4vLyBzdGF0aWNzXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZWplY3RcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgY2FsbChjYXBhYmlsaXR5LnJlamVjdCwgdW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoSVNfUFVSRSAmJiB0aGlzID09PSBQcm9taXNlV3JhcHBlciA/IFByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgLy8gYFByb21pc2UuYWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoYXJBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlJykuY2hhckF0O1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIFNUUklOR19JVEVSQVRPUiA9ICdTdHJpbmcgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiB0b1N0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIihmdW5jdGlvbiAoKSB7XG4gIHZhciB2YWxpZGF0b3IgPSBuZXcgUmVnRXhwKFwiXlthLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfSRcIiwgXCJpXCIpO1xuXG4gIGZ1bmN0aW9uIGdlbihjb3VudCkge1xuICAgIHZhciBvdXQgPSBcIlwiO1xuICAgIGZvciAodmFyIGk9MDsgaTxjb3VudDsgaSsrKSB7XG4gICAgICBvdXQgKz0gKCgoMStNYXRoLnJhbmRvbSgpKSoweDEwMDAwKXwwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gR3VpZChndWlkKSB7XG4gICAgaWYgKCFndWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudDsgYHZhbHVlYCBoYXMgbm8gdmFsdWUuXCIpO1xuICAgICAgXG4gICAgdGhpcy52YWx1ZSA9IEd1aWQuRU1QVFk7XG4gICAgXG4gICAgaWYgKGd1aWQgJiYgZ3VpZCBpbnN0YW5jZW9mIEd1aWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBndWlkLnRvU3RyaW5nKCk7XG5cbiAgICB9IGVsc2UgaWYgKGd1aWQgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGd1aWQpID09PSBcIltvYmplY3QgU3RyaW5nXVwiICYmIEd1aWQuaXNHdWlkKGd1aWQpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcikge1xuICAgICAgLy8gQ29tcGFyaW5nIHN0cmluZyBgdmFsdWVgIGFnYWluc3QgcHJvdmlkZWQgYGd1aWRgIHdpbGwgYXV0by1jYWxsXG4gICAgICAvLyB0b1N0cmluZyBvbiBgZ3VpZGAgZm9yIGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBHdWlkLmlzR3VpZChvdGhlcikgJiYgdGhpcy52YWx1ZSA9PSBvdGhlcjtcbiAgICB9O1xuXG4gICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gR3VpZC5FTVBUWTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgR3VpZC5FTVBUWSA9IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG5cbiAgR3VpZC5pc0d1aWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodmFsdWUgaW5zdGFuY2VvZiBHdWlkIHx8IHZhbGlkYXRvci50ZXN0KHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgfTtcblxuICBHdWlkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgR3VpZChbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpKTtcbiAgfTtcblxuICBHdWlkLnJhdyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpO1xuICB9O1xuXG4gIGlmKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEd1aWQ7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJykge1xuICAgIHdpbmRvdy5HdWlkID0gR3VpZDtcbiAgfVxufSkoKTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIF9kYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzOiBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscygpOiBDb250cmFjdC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXJDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQsIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nLCBwcml2YXRlIF9maWVsZElkPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkLCB3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0LmdldEZpbHRlcnNBc3luYygpLnRoZW48Q29udHJhY3QuRmlsdGVyPigoZmlsdGVycykgPT4ge1xuICAgICAgLy8gVE9ETzogRmlsdGVyaW5nIG9mIHRoZSBmaWx0ZXJzIHNob3VsZCBldmVudHVhbGx5IGJlIGRvbmUgcGxhdGZvcm0gc2lkZS5cbiAgICAgIGNvbnN0IGV2ZW50ZWRGaWx0ZXIgPSB0aGlzLmZpZWxkSWRcbiAgICAgICAgPyBmaWx0ZXJzLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkSWQgPT09IHRoaXMuZmllbGRJZCwgdGhpcylcbiAgICAgICAgOiBmaWx0ZXJzLmZpbmQoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkTmFtZSA9PT0gdGhpcy5maWVsZE5hbWUsIHRoaXMpO1xuXG4gICAgICBpZiAoIWV2ZW50ZWRGaWx0ZXIpIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGhpdCB0aGlzIHVubGVzcyB0aGUgZmlsdGVyIHdhcyByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldFxuICAgICAgICAvLyBhZnRlciB0aGUgZXZlbnQgd2FzIHJhaXNlZC5cbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLk1pc3NpbmdGaWx0ZXIsIGBjYW5ub3QgZmluZCBmaWx0ZXI6ICR7dGhpcy5fZmllbGROYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXZlbnRlZEZpbHRlcjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgTWFya3NTZWxlY3RlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuTWFya3NTZWxlY3RlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMud29ya3NoZWV0LmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFBhcmFtZXRlcnNTZXJ2aWNlLCBTZXJ2aWNlTmFtZXMsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi4vTW9kZWxzL1BhcmFtZXRlcic7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVGFibGVhdVNoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVTaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dsb2JhbEZpZWxkTmFtZTogc3RyaW5nLCBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQsIHNoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlcj4ge1xuICAgIC8vIENhbGwgZG93biB0byBvdXIgc2VydmljZSB0byBnZXQgdGhlIHBhcmFtZXRlciBiYWNrIHZpYSBpdHMgZmllbGQgbmFtZVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5R2xvYmFsRmllbGROYW1lQXN5bmModGhpcy5fZ2xvYmFsRmllbGROYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nUGFyYW1ldGVyLCBgQ2Fubm90IGZpbmQgcGFyYW1ldGVyOiAke3RoaXMuX2dsb2JhbEZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXIocGFyYW1ldGVySW1wbCwgdGhpcy5zaGVldCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLlN1bW1hcnlEYXRhQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdUV2ZW50IHtcbiAgcHJpdmF0ZSBfdHlwZTogVGFibGVhdUV2ZW50VHlwZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1U2hlZXRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVTaGVldEV2ZW50IHtcbiAgcHJpdmF0ZSBfc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0O1xuXG4gIHB1YmxpYyBnZXQgc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICAgIHJldHVybiB0aGlzLl9zaGVldDtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXMuX3NoZWV0ID0gc2hlZXQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVXb3Jrc2hlZXRFdmVudCB7XG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBwcm90ZWN0ZWQgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIodHlwZSwgX3dvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSA9ICdCZW50b24gU2FucyBMb3ctRFBJJztcblxuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIEJvb2snO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIEJvb2sgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWknO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBTZW1pRGVtaSBJdGFsaWMnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBMaWdodCc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBNZWRpdW0nO1xuXG5leHBvcnQgY29uc3QgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlczogTW9kZWxbXSA9IFtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xpZ2h0Rm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBDb25uZWN0ZWRTZXJ2ZXIgaW1wbGVtZW50cyBDb250cmFjdC5Db25uZWN0ZWRTZXJ2ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF91c2VySWQ/OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9zaXRlSWQ/OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9zaXRlTmFtZXNwYWNlPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfd29ya2Jvb2tJZD86IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgdXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l0ZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NpdGVJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l0ZU5hbWVzcGFjZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlTmFtZXNwYWNlO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9va0lkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgRGF0YVNvdXJjZSwgRGF0YVNvdXJjZUltcGwsIERhdGFTb3VyY2VTZXJ2aWNlLCBTZXJ2aWNlTmFtZXMsIFdvcmtib29rSW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbldvcmtib29rSW1wbCBleHRlbmRzIFdvcmtib29rSW1wbCB7XG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldEFsbERhdGFTb3VyY2VzQXN5bmMoKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3QgZGF0YVNvdXJjZXM6IEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+ID0gW107XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIE9iamVjdC52YWx1ZXMoZGF0YVNjaGVtYS5kYXRhU291cmNlcykuZm9yRWFjaCgoZHMpID0+IHtcbiAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkcykpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTb3VyY2VJbmZvOiBEYXRhU291cmNlSW5mbyk6IERhdGFTb3VyY2Uge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VJbXBsID0gbmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2VJbmZvLCBFeHRlbnNpb25zUmVnaXN0cnlJZCk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMsIFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb250ZXh0TWVudUV2ZW50LFxuICBEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLFxuICBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvLFxuICBGb250TmFtZUFuZEluZm8sXG4gIEZvcm1hdHRpbmdTaGVldCxcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25JZCxcbiAgUGFyYW1ldGVySWQsXG4gIFNoZWV0UGF0aCxcbiAgVmVyYklkLFxuICBXb3JrYm9va0Zvcm1hdHRpbmcsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEFwaVZlcnNpb24sXG4gIERhc2hib2FyZEltcGwsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2hlZXRJbmZvSW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIFZpelNlcnZpY2UsXG4gIFdvcmtzaGVldEltcGwsXG4gIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCxcbiAgcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuLi9Nb2RlbHMvRGFzaGJvYXJkJztcbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSAnLi4vTW9kZWxzL1dvcmtib29rJztcbmltcG9ydCB7IFdvcmtzaGVldCB9IGZyb20gJy4uL01vZGVscy9Xb3Jrc2hlZXQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ29udGVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvRW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuLi9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9VSSc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQsIHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvICYmIHRoaXMuaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yKSkge1xuICAgICAgICB0aGlzLmRhc2hib2FyZENvbnRlbnQgPSB0aGlzLmluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yLmRhc2hib2FyZFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uWm9uZUlkID0gcmVzdWx0LmV4dGVuc2lvbkRhc2hib2FyZEluZm8uZXh0ZW5zaW9uWm9uZUlkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pIHtcbiAgICAgICAgdGhpcy53b3Jrc2hlZXRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplV29ya3NoZWV0Q29udGVudChyZXN1bHQuZXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50KTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhyZXN1bHQuZXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTtcbiAgICAgIHRoaXMudWkgPSBuZXcgVUkobmV3IFVJSW1wbCgpKTtcbiAgICAgIHRoaXMud29ya2Jvb2sgPSBuZXcgV29ya2Jvb2sobmV3IEV4dGVuc2lvbldvcmtib29rSW1wbCgpKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgICAgICB0aGlzLmFwcGx5QWxsRm9ybWF0dGluZyhyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZCwgc2V0dXAgbGlzdGVuZXJzIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXRcbiAgICAgIC8vIGFyZSBtZWFudCB0byBiZSB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBjb250ZXh0IG1lbnUgaXRlbSBpcyBjbGlja2VkLlxuICAgICAgdGhpcy5pbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnMpO1xuXG4gICAgICAvLyBBbHNvIHNldCB1cCBsaXN0ZW5lcnMgZm9yIEV4dGVuc2lvblN0eWxlc0NoYW5nZWRFdmVudFxuICAgICAgdGhpcy5pbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcik7XG5cbiAgICAgIC8vIEluIHRoZSBub3JtYWwgaW5pdGlhbGl6YXRpb24gY2FzZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy4gIFdoZW4gcmV0dXJuaW5nIGZyb20gaW5pdGlhbGl6ZUFzeW5jIHRvIHRoZVxuICAgICAgLy8gZGV2ZWxvcGVyLCB3ZSBqdXN0IGluZ29yZSB0aGF0IHN0cmluZy4gIEluIHRoZSBjYXNlIG9mIGluaXRpYWxpemluZyBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2csIHRoaXMgc3RyaW5nXG4gICAgICAvLyBpcyBhbiBvcHRpb25hbCBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICAgIHJldHVybiByZXN1bHQuZXh0ZW5zaW9uRGlhbG9nUGF5bG9hZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUFsbEZvcm1hdHRpbmcoZm9ybWF0dGluZ01vZGVsOiBXb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5fc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudC5pZCA9ICdUYWJsZWF1LUV4dGVuc2lvbi1Gb3JtYXR0aW5nJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5fc3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCB8fCAhZm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCA9IHRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCBhcyBDU1NTdHlsZVNoZWV0O1xuICAgIHdoaWxlIChzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBmb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXR0aW5nU2hlZXRUb1N0eWxlU2hlZXQoY3VycmVudEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQ6IEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCk6IHZvaWQge1xuICAgIGxldCBzdHlsZUluZm8gPSAnJztcblxuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXM7XG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LWZhbWlseTogJyArIGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250U2l6ZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXNpemU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC13ZWlnaHQ6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtc3R5bGU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbikge1xuICAgICAgc3R5bGVJbmZvICs9ICd0ZXh0LWRlY29yYXRpb246ICcgKyBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmNvbG9yKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2NvbG9yOiAnICsgY3NzUHJvcGVydGllcy5jb2xvciArICc7ICc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3I6IHN0cmluZyA9ICcuJyArIGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5O1xuICAgIGNvbnN0IHJ1bGU6IHN0cmluZyA9IHNlbGVjdG9yICsgJyB7ICcgKyBzdHlsZUluZm8gKyAnIH0nO1xuICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcbiAgICAvLyBVbnJlZ2lzdGVyIGZ1bmN0aW9uIG5vdCB1c2VkIHNpbmNlIHRoZXNlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlXG4gICAgLy8gb2JzZXJ2ZWQgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBleHRlbnNpb24uXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnRGb3JtYXR0aW5nKSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcoZXZlbnRGb3JtYXR0aW5nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgd29ya2Jvb2tGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmb250TmFtZXM6IE1vZGVsW10gPSBbLi4uU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcywgLi4uU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlc107XG4gICAgd29ya2Jvb2tGb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZm9yRWFjaCgoZm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICBpZiAoZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgICBmb250TmFtZXMucHVzaChmb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmb250TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5Gb250TmFtZUxpc3RJdGVtc106IGZvbnROYW1lcyB9O1xuICAgICAgZGlzcGF0Y2hlclxuICAgICAgICAuZXhlY3V0ZShWZXJiSWQuR2V0Rm9udHMsIHBhcmFtZXRlcnMpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEZvbnRzKHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxGb250TmFtZUFuZEluZm8+KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRm9udHMoZm9udHM6IEFycmF5PEZvbnROYW1lQW5kSW5mbz4pOiB2b2lkIHtcbiAgICBmb250cy5mb3JFYWNoKChmb250TmFtZUFuZEluZm8pID0+IHtcbiAgICAgIGlmIChTdXBwb3J0ZWRUYWJsZWF1Rm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVhdUZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMuaW5jbHVkZXMoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSkge1xuICAgICAgICB0aGlzLmxvYWRCZW50b25TYW5zRm9udHMoZm9udE5hbWVBbmRJbmZvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURhc2hib2FyZENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbywgc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBEYXNoYm9hcmRDb250ZW50IHtcbiAgICAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICBjb25zdCBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoaW5mby5uYW1lLCBTaGVldFR5cGUuRGFzaGJvYXJkLCB7IHdpZHRoOiBpbmZvLnNpemUudywgaGVpZ2h0OiBpbmZvLnNpemUuaCB9LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIGNvbnN0IGRhc2hib2FyZEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChzaGVldEluZm9JbXBsLCBpbmZvLnpvbmVzLCBzaGVldFBhdGgsIEV4dGVuc2lvbnNSZWdpc3RyeUlkLCBudWxsLCBpbmZvLmFjdGl2ZURhc2hib2FyZE9iamVjdElkKTtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKGRhc2hib2FyZEltcGwpO1xuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkQ29udGVudChkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya3NoZWV0Q29udGVudChpbmZvOiBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvKTogV29ya3NoZWV0Q29udGVudCB7XG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgaW5mby52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gaW5kZXggcHJvcGVydHkgaXMgZW1iZWRkaW5nIHNwZWNpZmljXG4gICAgICB0cnVlLCAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKFxuICAgICAgc2hlZXRJbmZvSW1wbCxcbiAgICAgIEV4dGVuc2lvbnNSZWdpc3RyeUlkLFxuICAgICAgaW5mby52aXN1YWxJZCxcbiAgICAgIG51bGwsIC8vIHBhcmVudERhc2hib2FyZCBpcyBhbHdheXMgbnVsbCBmb3Igd29ya3NoZWV0IGluIFdvcmtzaGVldENvbnRlbnRcbiAgICAgIG51bGwsIC8vIHBhcmVudFN0b3J5UG9pbnQgaXMgb25seSB1c2VkIGZvciBlbWJlZGRpbmdcbiAgICApO1xuICAgIGNvbnN0IHdvcmtzaGVldCA9IG5ldyBXb3Jrc2hlZXQod29ya3NoZWV0SW1wbCk7XG4gICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXRDb250ZW50KHdvcmtzaGVldCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IFNldHRpbmdzIHtcbiAgICBjb25zdCBzZXR0aW5nc0ltcGwgPSBuZXcgU2V0dGluZ3NJbXBsKHNldHRpbmdzSW5mbyk7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5ncyhzZXR0aW5nc0ltcGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuQ29udGV4dE1lbnVDbGljayxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGNvbnRleHQgbWVudSBldmVudCwgdGhlc2UgYXJlIGFscmVhZHkgZmlsdGVyZWQgb24gYXBpLWNvcmVcbiAgICAgICAgLy8gYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBsb2NhdG9yLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IENvbnRleHRNZW51RXZlbnQpID0+IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBtZW51IElEXG4gICAgICAgIGlmIChjb250ZXh0TWVudUZ1bmN0aW9ucykge1xuICAgICAgICAgIGlmICghY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlY2VpdmVkIHVuZXhwZWN0ZWQgY29udGV4dCBtZW51IElkIGZyb20gZXZlbnQ6ICR7ZXZlbnQuaWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbzogRm9udE5hbWVBbmRJbmZvKTogdm9pZCB7XG4gICAgc3dpdGNoIChmb250TmFtZUFuZEluZm8uZm9udE5hbWUpIHtcbiAgICAgIGNhc2UgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHN0eWxlOiAnaXRhbGljJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAnYXR0ZW1wdGVkIHRvIGxvYWQgdW5zdXBwb3J0ZWQgZm9udDogJHtmb250TmFtZUFuZEluZm8uZm9udE5hbWV9LidgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucywgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSwgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIgaGFzIGJlZW4gbW92ZWQgKGFuZCByZW5hbWVkKSBmcm9tIGFwaS1pbnRlcm5hbC1jb250cmFjdC5cbiAqIEl0IHN1cHBvcnRzIHJ1bm5pbmcgYSBuZXdlciBleHRlcm5hbCBsaWJyYXJ5IGFnYWluc3QgYSBwcmUgMjAxOS4zIGRlc2t0b3AuXG4gKiBTdGFydGluZyBpbiAyMDE5LjMsIHdlIGhhdmUgYSBtZXJnZWQgYm9vdHN0cmFwIHN0eWxlIGZvciBib3RoIGRlc2t0b3AgYW5kIHNlcnZlci5cbiAqIEluIGFkZGl0aW9uLCB0aGUgYWxwaGEgY2hlY2tpbmcgdGhhdCBpcyBoYXBwZW5pbmcgaGVyZSBpcyBub3QgbmVjZXNzYXJ5IGluIGV4dGVybmFsLWFwaS1qc1xuICogIGFmdGVyIDIwMTkuMyBiZWNhdXNlIHRoYXQgY2hlY2tpbmcgaGFwcGVucyBpbiBhcGktcGxhdGZvcm0tanMgKEFwaURpc3BhdGNoZXJUZXN0LnRzKVxuICogVEZTSUQ6IDEwOTE1NjEgdHJhY2tzIGFuIGltcHJvdmVtZW50IHRvIHRoaXMgc3lzdGVtIHRvIG1ha2UgaXQgbGVzcyBjb21wbGV4IGFuZCB0aWUgaXQgZGlyZWN0bHkgdG9cbiAqICB0YWJsZWF1IGJldGEgcmVsZWFzZSB2ZXJzaW9ucy5cbiAqIEBkZXByZWNhdGVkXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgbmFtZXNwYWNlIExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucy5pc0FscGhhID09PSAndW5kZWZpbmVkJykgJiYgIXdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ1RoaXMgaXMgYSBiZXRhIHZlcnNpb24gb2YgdGhlIEV4dGVuc2lvbnMgQVBJLiBQbGVhc2UgdXBncmFkZSB0byBhbiBvZmZpY2lhbCByZWxlYXNlLicpO1xuICAgICAgd2luZG93Ll9fd2FybmluZ0lzc3VlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zPy5pc0FscGhhICYmIHdpbmRvdy5fX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2UpIHtcbiAgICAgIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlclxuICAgICAgICAudGhlbigoZGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlckZhY3RvcnkoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG4gICAgICAgICAgZGlzcGF0Y2hlci5leGVjdXRlKFZlcmJJZC5CbG9ja0V4dGVuc2lvbiwge30pLmNhdGNoKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgd2lsbCBiZSB1bmRlZmluZWQgaWYgcHJvbWlzZSBpcyByZWplY3RlZCBvciB0aHJvd3NcbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PjtcbiAgICBfX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2U6IGJvb2xlYW47XG4gICAgX193YXJuaW5nSXNzdWVkOiBib29sZWFuO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBOb3RpZmljYXRpb25JZCwgU2V0dGluZ3NFdmVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEVycm9ySGVscGVycyxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuLi9FdmVudHMvVGFibGVhdUV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbmNsYXNzIFNldHRpbmdzQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuU2V0dGluZ3NDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmV3U2V0dGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5ld1NldHRpbmdzKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX25ld1NldHRpbmdzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0ltcGwge1xuICBwcml2YXRlIHN0YXRpYyBBU1lOQ19TQVZFX0lOX1BST0dSRVNTID0gJ0FzeW5jIFNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHVwZGF0aW5nIHNldHRpbmdzIGlzIG5vdCBhbGxvd2VkLic7XG4gIHByaXZhdGUgX2lzTW9kaWZpZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2N1cnJlbnRTZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uO1xuXG4gIC8vIFNpbmNlIHByb21pc2VzIGNhbid0IGJlIGludHJvc3BlY3RlZCBmb3Igc3RhdGUsIGtlZXAgYSB2YXJpYWJsZSB0aGF0XG4gIC8vIGluZGljYXRlcyBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHNvIHRoYXQgc2V0L2VyYXNlIGNhbid0IGJlIGNhbGxlZCBkdXJpbmcgYSBzYXZlLlxuICBwcml2YXRlIF9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbyk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgLy8gT25seSBtYWtlIGEgbW9kaWZpY2F0aW9uIGlmIHdlIGhhdmUgdGhlIGtleSBhbHJlYWR5XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldKSB7XG4gICAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICAgICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICAvLyBSZXR1cm5zIGEgbXV0YWJsZSBjb3B5IG9mIHRoZSBzZXR0aW5nc1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgLy8gSnVzdCByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIHNldHRpbmdzIGFyZSB1bmNoYW5nZWRcbiAgICBpZiAoIXRoaXMuX2lzTW9kaWZpZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmU8U2V0dGluZ3NDb2xsZWN0aW9uPih0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgc2V0dGluZ3Mgc2VydmljZSB0byBzYXZlIHNldHRpbmdzIHRvIHR3YlxuICAgIGNvbnN0IHNldHRpbmdzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2V0dGluZ3NTZXJ2aWNlPihcbiAgICAgIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlLFxuICAgICk7XG5cbiAgICByZXR1cm4gc2V0dGluZ3NTZXJ2aWNlLnNhdmVTZXR0aW5nc0FzeW5jKHRoaXMuX2N1cnJlbnRTZXR0aW5ncykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KFxuICAgICAgKG5ld1NldHRpbmdzKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gbmV3U2V0dGluZ3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jdXJyZW50U2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3U2V0dGluZ3M7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGtleSwgJ2tleScpOyAvLyBLZXkgc2hvdWxkbid0IGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlLCAndmFsdWUnKTsgLy8gRW1wdHkgc3RyaW5nIHZhbHVlIGlzIGFsbG93ZWQuXG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gc2V0dGluZ3Mgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IGEgc2V0dGluZ3NVcGRhdGUgZXZlbnQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U2V0dGluZ3NDaGFuZ2VkRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuU2V0dGluZ3NDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlNldHRpbmdzQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnQ6IFNldHRpbmdzRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gZXZlbnQubmV3U2V0dGluZ3M7XG4gICAgICAgIHNldHRpbmdzQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoZXZlbnQubmV3U2V0dGluZ3MpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChzZXR0aW5nc0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8sICdzZXR0aW5nc0luZm8nKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcywgJ3NldHRpbmdzSW5mby5TZXR0aW5nc1ZhbHVlcycpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gc2V0dGluZ3NJbmZvLnNldHRpbmdzVmFsdWVzO1xuXG4gICAgLy8gUmVzZXQgdGhlIGlzTW9kaWZpZWQgZmxhZ1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGhlbHBlciBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgbG9jYWwgdXBkYXRlIHRvIHRoaXMuY3VycmVudFNldHRpbmdzLlxuICAgKiBDaGVja3MgaWYgYSBjdXJyZW50IHNhdmUgY2FsbCBpcyBzdGlsbCBpbiBwcm9ncmVzcyBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIHNvLlxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zYXZlSW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLlNldHRpbmdTYXZlSW5Qcm9ncmVzcywgU2V0dGluZ3NJbXBsLkFTWU5DX1NBVkVfSU5fUFJPR1JFU1MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgVGFibGVhdUJvb2tGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBSZWd1bGFyJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgU2VtaWJvbGQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9vayc7XG5leHBvcnQgY29uc3QgVGFibGVhdUJvbGRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBCb2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBMaWdodCc7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IE1lZGl1bSc7XG5leHBvcnQgY29uc3QgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWUgPSAnVGFibGVhdSBSZWd1bGFyJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBTZW1pIEJvbGQnO1xuXG5leHBvcnQgY29uc3QgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlczogTW9kZWxbXSA9IFtcbiAgVGFibGVhdUJvb2tGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG5dO1xuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgTm90aWZpY2F0aW9uU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgVUlJbXBsIHtcbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdWlTZXJ2aWNlXG4gICAgICAgIC5kaXNwbGF5RGlhbG9nQXN5bmModXJsLCBwYXlsb2FkIHx8ICcnLCBvcHRpb25zKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5yZWdpc3RlckZuID0gbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICAgICAgICBOb3RpZmljYXRpb25JZC5FeHRlbnNpb25EaWFsb2dVcGRhdGUsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBkaWFsb2cgdXBkYXRlIGV2ZW50XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChldmVudDogRGlhbG9nVXBkYXRlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmlzQ2xvc2VFdmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5jbG9zZVBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdjbG9zZVBheWxvYWQgaXMgdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnQuY2xvc2VQYXlsb2FkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkRpYWxvZ0Nsb3NlZEJ5VXNlciwgJ0V4dGVuc2lvbiBkaWFsb2cgY2xvc2VkIGJ5IHVzZXIuJykpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdW5yZWdpc3RlckZuKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsIFRhYmxlYXVFdmVudFR5cGUsIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBEYXNoYm9hcmRPYmplY3RJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0JztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsKSB7XG4gICAgc3VwZXIoX2Rhc2hib2FyZEltcGwpO1xuICAgIF9kYXNoYm9hcmRJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC53b3Jrc2hlZXRzSW1wbC5tYXAoKHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm9iamVjdHMubWFwKChkYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhc2hib2FyZE9iamVjdChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFjdGl2ZURhc2hib2FyZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9uZVZpc2liaWxpdHlBc3luYyh6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5zZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgcmV0dXJuIHpvbmUgJiYgbmV3IERhc2hib2FyZE9iamVjdCh6b25lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuXG4gICAgLy8gSW5pdGlhbGl6aW5nIGV2ZW50cyBhbmQgcmVnaXN0ZXJpbmcgbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVybiAoYWxsb3dzIHVuaXQgdGVzdGluZyB3aXRob3V0IE5vdGlmaWNhdGlvblNlcnZpY2UgbW9jaylcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPERhc2hib2FyZExheW91dENoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkRhc2hib2FyZExheW91dENoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEYXNoYm9hcmRMYXlvdXRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gdGhpcy5fZGFzaGJvYXJkSW1wbC51cGRhdGVab25lcyhcbiAgICAgICAgICBldmVudC56b25lcyxcbiAgICAgICAgICBldmVudC5hY3RpdmVab25lSWQsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlRGFzaGJvYXJkTmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KGRhc2hib2FyZE9iamVjdENoYW5nZXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQoZXZlbnRGb3JtYXR0aW5nKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2god29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5tb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwucmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmRhc2hib2FyZEltcGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKSB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuZmllbGRJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBFdmVudExpc3RlbmVyTWFuYWdlcixcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgUGFyYW1ldGVySW1wbCxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgICAgIH0sXG4gICAgICAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU2l6ZSh0aGlzLl9zaGVldEltcGwuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTaXplKHNpemU6IGFueSk6IHNpemUgaXMgQ29udHJhY3QuU2l6ZSB7XG4gICAgY29uc3QgdGVzdFNpemUgPSBzaXplIGFzIENvbnRyYWN0LlNpemU7XG4gICAgaWYgKHRlc3RTaXplLndpZHRoICE9PSB1bmRlZmluZWQgJiYgdGVzdFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcCgocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge31cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSW1wbC5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb2x1bW4sIEZpbHRlclVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsIFRhYmxlYXVFdmVudFR5cGUsIFRvb2x0aXBDb250ZXh0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpbHRlckV2ZW50LCBOb3RpZmljYXRpb25JZCwgU3VtbWFyeURhdGFFdmVudCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBXb3Jrc2hlZXRJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEZpbHRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgTWFya3NTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudCc7XG5pbXBvcnQgeyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgU2hlZXQgfSBmcm9tICcuL1NoZWV0JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldCBleHRlbmRzIFNoZWV0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkge1xuICAgIHN1cGVyKF93b3Jrc2hlZXRJbXBsKTtcblxuICAgIC8vIENhbGwgdG8gaW5pdGlhbGl6ZSBldmVudHMgYW5kIHRoZW4gY2FsbCBkb3duIHRvIHRoZSBldmVudCBsaXN0ZW5lciBtYW5hZ2VyIHRvIGhhbmRsZSB0aGluZ3NcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudERhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBmb3IgRXh0ZW5zaW9ucyBpZiB0aGUgRGFzaGJvYXJkSW1wbHMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgUGFyZW50IGRhc2hib2FyZCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsSWQgPSBtb2RlbCBhcyBWaXN1YWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQpO1xuICAgICAgfSxcbiAgICAgICgpID0+IG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPEZpbHRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkZpbHRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIEZpbHRlckV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgICAgZmlsdGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBGaWx0ZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZmllbGROYW1lLCBldmVudC5maWVsZElkKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlN1bW1hcnlEYXRhQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBTdW1tYXJ5RGF0YUV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBTdW1tYXJ5RGF0YUV2ZW50KSA9PiB7XG4gICAgICAgIHN1bW1hcnlEYXRhRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCh0aGlzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2gobWFya3NFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKGZpbHRlckV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goc3VtbWFyeURhdGFFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb2x1bW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SURBc3luYyhtYXJrc0luZm86IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgdXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdE1hcmtzQnlJZEFzeW5jKG1hcmtzSW5mbywgdXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmMobWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hbm5vdGF0ZU1hcmtBc3luYyhtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0QW5ub3RhdGlvbnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwucmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb24pO1xuICB9XG5cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGU/OiBudW1iZXIsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCB8IG51bGwsIGFsbG93SG92ZXJBY3Rpb25zID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGUsIHRvb2x0aXAsIGFsbG93SG92ZXJBY3Rpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPiwgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwcml2YXRlIHZpc3VhbElkc0FyZUVxdWFsKGE6IFZpc3VhbElkLCBiOiBWaXN1YWxJZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhICYmXG4gICAgICBiICYmXG4gICAgICBhLndvcmtzaGVldCA9PT0gYi53b3Jrc2hlZXQgJiZcbiAgICAgIGEuZGFzaGJvYXJkID09PSBiLmRhc2hib2FyZCAmJlxuICAgICAgYS5zdG9yeWJvYXJkID09PSBiLnN0b3J5Ym9hcmQgJiZcbiAgICAgIGEuc3RvcnlQb2ludElEID09PSBiLnN0b3J5UG9pbnRJRFxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIERhc2hib2FyZENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBEYXNoYm9hcmRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZDogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbkVudmlyb25tZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVZlcnNpb24sIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENvbm5lY3RlZFNlcnZlciB9IGZyb20gJy4uL0ltcGwvQ29ubmVjdGVkU2VydmVyJztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwgfSBmcm9tICcuL1dvcmtib29rRm9ybWF0dGluZ0VudlV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudCBuYW1lc3BhY2UuXG4gKiBFbnZpcm9ubWVudCBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpc1xuICoganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqIEZpcnN0IGNsYXNzIGV4dGVuc2lvbnMgY2FuIGdldCB0byBDb25uZWN0ZWRTZXJ2ZXIgd2l0aDogZW52aXJvbm1lbnRbJ2Nvbm5lY3RlZFNlcnZlciddXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgLyoqVGhlIGZvbGxvd2luZyBpcyBhbiBpbmRleCBzaWduYXR1cmUuIEl0IGFsbG93cyBwcm9wZXJ0aWVzIHRvIGJlIGFjY2Vzc2VkIGJ5IG5hbWUuXG4gICAqIFRoaXMgYWxsb3dzIHVzIHRvIGFkZCBwcm9wZXJ0aWVzIGR5bmFtaWNhbGx5IChzZWUgdXNhZ2Ugb2YgdGhpcy5jb25uZWN0ZWRTZXJ2ZXIgYmVsb3cpIHdpdGhvdXQgVHlwZXNjcmlwdCBlcnJvcnMuXG4gICAqIFRoZSByZWFzb24gd2UgZG8gdGhpcyBpcyBzbyB0aGF0IDNyZC1wYXJ0eSBleHRlbnNpb24gZGV2ZWxvcGVycyBkbyBub3Qgc2VlIHRoZSBjb25uZWN0ZWRTZXJ2ZXIgcHJvcGVydHlcbiAgICogdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSB0byBmaXJzdCBjbGFzcyBleHRlbnNpb24gZGV2ZWxvcGVycy5cbiAgICogVGhlIHR5cGUgb2YgdGhlIGluZGV4IHNpZ2F0dXJlIG5lZWRzIHRvIGJlIGEgdW5pb24gb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9iamVjdCwgc2luY2Ugd2UgY291bGRcbiAgICogYWNjZXNzIGFueSBwcm9wZXJ0eSB1c2luZyB0aGUgcHJvcGVydHkgaW5kZXggbWV0aG9kLlxuICAgKi9cbiAgW3g6IHN0cmluZ106IENvbm5lY3RlZFNlcnZlciB8IHN0cmluZyB8IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hcGlWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbnRleHQ6IENvbnRyYWN0LkV4dGVuc2lvbkNvbnRleHQ7XG4gIHByaXZhdGUgX2Zvcm1hdHRpbmc/OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvdW50cnk/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nO1xuICBwcml2YXRlIF9tb2RlOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlO1xuICBwcml2YXRlIF9vcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbiAgcHJpdmF0ZSBfdGFibGVhdVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfdW5pcXVlVXNlcklkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQpIHtcbiAgICB0aGlzLl9hcGlWZXJzaW9uID0gQXBpVmVyc2lvbi5JbnN0YW5jZSAmJiBBcGlWZXJzaW9uLkluc3RhbmNlLmZvcm1hdHRlZFZhbHVlOyAvLyBtYWoubWluLmZpeCAobm8gYnVpbGQpXG4gICAgdGhpcy5fY29udGV4dCA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Db250ZXh0LmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCk7XG4gICAgdGhpcy5fZm9ybWF0dGluZyA9IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgdGhpcy5fbGFuZ3VhZ2UgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25MYW5ndWFnZTtcbiAgICB0aGlzLl9jb3VudHJ5ID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ291bnRyeTtcbiAgICB0aGlzLl9sb2NhbGUgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Mb2NhbGU7XG4gICAgdGhpcy5fbW9kZSA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Nb2RlLmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTW9kZSk7XG4gICAgdGhpcy5fb3BlcmF0aW5nU3lzdGVtID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQub3BlcmF0aW5nU3lzdGVtO1xuICAgIHRoaXMuX3RhYmxlYXVWZXJzaW9uID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudGFibGVhdVZlcnNpb247XG4gICAgdGhpcy5fdW5pcXVlVXNlcklkID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQudW5pcXVlVXNlcklkO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHVzZXJJZCwgdGhlbiB3ZSBhcmUgYSBmaXJzdCBjbGFzcyBleHRlbnNpb25cbiAgICBpZiAoZXh0ZW5zaW9uRW52aXJvbm1lbnQudXNlcklkKSB7XG4gICAgICB0aGlzLmNvbm5lY3RlZFNlcnZlciA9IG5ldyBDb25uZWN0ZWRTZXJ2ZXIoXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnVzZXJJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQuc2l0ZUlkLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC5zaXRlTmFtZXNwYWNlLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0lkLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5mZWF0dXJlRmxhZ3MgPSBleHRlbnNpb25FbnZpcm9ubWVudC5mZWF0dXJlRmxhZ3M7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhcGlWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rRm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY291bnRyeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb3VudHJ5O1xuICB9XG5cbiAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2RlKCk6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBvcGVyYXRpbmdTeXN0ZW0oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW5nU3lzdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJsZWF1VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZWF1VmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5pcXVlVXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VuaXF1ZVVzZXJJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENhbGxiYWNrTWFwLCBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4uL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBFeHRlbnNpb25zIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnMgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25zIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZXh0ZW5zaW9uSW1wbDogRXh0ZW5zaW9uc0ltcGwpIHtcbiAgICB0aGlzLmV4dGVuc2lvbkltcGwgPSBleHRlbnNpb25JbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRDb250ZW50KCk6IENvbnRyYWN0LkRhc2hib2FyZENvbnRlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZGFzaGJvYXJkQ29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0Q29udGVudCgpOiBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLndvcmtzaGVldENvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVudmlyb25tZW50KCk6IENvbnRyYWN0LkVudmlyb25tZW50IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmVudmlyb25tZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBDb250cmFjdC5TZXR0aW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5zZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdWkoKTogQ29udHJhY3QuVUkge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwudWk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rKCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtib29rIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLndvcmtib29rO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZXh0ZW5zaW9uWm9uZUlkO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVBc3luYyhjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5pbml0aWFsaXplQXN5bmMoZmFsc2UsIGNvbnRleHRNZW51Q2FsbGJhY2tzKS50aGVuPHZvaWQ+KCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURpYWxvZ0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5pbml0aWFsaXplQXN5bmModHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNldHRpbmdzIGFzIFNldHRpbmdzQ29udHJhY3QgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4uL0ltcGwvU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIHNldHRpbmdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBTZXR0aW5nc0NvbnRyYWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NldHRpbmdzSW1wbDogU2V0dGluZ3NJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuZXJhc2Uoa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0KGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5nZXRBbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmlzTW9kaWZpZWQ7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8U2V0dGluZ3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5zYXZlQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuc2V0KGtleSwgdmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBpbXBsZW1lbnRzIENvbnRyYWN0LlVJIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ltcGw6IFVJSW1wbCkge31cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGwuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2ltcGwuY2xvc2VEaWFsb2cocGF5bG9hZCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvbGliL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB7XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKHdvcmtib29rRm9ybWF0dGluZ01vZGVsPzogV29ya2Jvb2tGb3JtYXR0aW5nKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXdvcmtib29rRm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmb3JtYXR0aW5nTWFwOiBBcnJheTxDb250cmFjdC5Gb3JtYXR0aW5nU2hlZXQ+ID0gd29ya2Jvb2tGb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGluZ1NoZWV0OiBDb250cmFjdC5Gb3JtYXR0aW5nU2hlZXQgPSB7XG4gICAgICAgICAgY2xhc3NOYW1lS2V5OiBFbnVtTWFwcGluZ3MuY2xhc3NOYW1lS2V5LmNvbnZlcnQoY3VycmVudEZvcm1hdHRpbmdTaGVldC5jbGFzc05hbWVLZXkpLFxuICAgICAgICAgIGNzc1Byb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgICAgICAgICAgZm9udFNpemU6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LFxuICAgICAgICAgICAgZm9udFN0eWxlOiBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb246IGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbixcbiAgICAgICAgICAgIGNvbG9yOiBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuY29sb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRpbmdTaGVldDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgPSB7XG4gICAgICAgIGZvcm1hdHRpbmdTaGVldHM6IGZvcm1hdHRpbmdNYXAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFdvcmtzaGVldENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBXb3Jrc2hlZXRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFeHRlbnNpb25Cb290c3RyYXBJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHNdOiBjb250ZXh0TWVudUlkcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Jc0V4dGVuc2lvbkRpYWxvZ106IGlzRXh0ZW5zaW9uRGlhbG9nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Jbml0aWFsaXplRXh0ZW5zaW9uLCBwYXJhbXMpLnRoZW48RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBUT0RPIC0gVmFsaWRhdGUgcmV0dXJuIHZhbHVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NldHRpbmdzU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2V0dGluZ3NTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3NBc3luYyhzZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZVNldHRpbmdzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNldHRpbmdzVmFsdWVzXTogc2V0dGluZ3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNhdmVFeHRlbnNpb25TZXR0aW5ncywgcGFyYW1ldGVycykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0IGFzIEV4dGVuc2lvblNldHRpbmdzSW5mbztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zZXR0aW5nc1ZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3Igc2F2aW5ncyBzZXR0aW5ncy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdC5zZXR0aW5nc1ZhbHVlcztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlhbG9nT3B0aW9ucywgRGlhbG9nU3R5bGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCwgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMsIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncywgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVCA9IDQwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19XSURUSCA9IDYwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19TVFlMRTogRGlhbG9nU3R5bGUgPSBEaWFsb2dTdHlsZS5XaW5kb3c7XG5cbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVUlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZywgb3B0aW9ucz86IERpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZGlzcGxheURpYWxvZ0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxdOiB1cmwsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF06IHBheWxvYWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGg6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5oZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSBvcHRpb25zICYmIG9wdGlvbnMud2lkdGggPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG4gICAgY29uc3QgZGlhbG9nU3R5bGU6IERpYWxvZ1N0eWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRpYWxvZ1N0eWxlID8gb3B0aW9ucy5kaWFsb2dTdHlsZSA6IERFRkFVTFRfRElBTE9HX1NUWUxFO1xuXG4gICAgLy8gT24gdGhlIHBsYXRmb3JtIHNpZGUsIHdlIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIHJlZ2FyZGVzcyBvZiB3aGV0aGVyIHRoZSBwYXNzZWRcbiAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiAgQnV0IHRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGRldmVsb3BlciBlcnJvcixcbiAgICAvLyBzbyB3ZSB0aHJvdyBhbiBlcnJvciBoZXJlIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gICAgaWYgKGggPD0gMCB8fCB3IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2l6ZSBwYXJhbWV0ZXJzIGZvciBkaXNwbGF5RGlhbG9nQXN5bmMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nSF0gPSBoO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nV10gPSB3O1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGlhbG9nU3R5bGU+KGRpYWxvZ1N0eWxlLCBEaWFsb2dTdHlsZSwgJ0RpYWxvZ1N0eWxlJyk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dTdHlsZV0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MuZGlhbG9nU3R5bGVzLmNvbnZlcnQoZGlhbG9nU3R5bGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRGlzcGxheURpYWxvZywgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZXMuSW52YWxpZERvbWFpbkRpYWxvZyxcbiAgICAgICAgICAgICdUaGUgdXJsIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgbXVzdCBtYXRjaCB0aGUgZG9tYWluIG9mIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBTdWNjZXNzIGNhc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbG9zZURpYWxvZycsXG4gICAgfTtcblxuICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbiwgZXh0ZW5zaW9uWm9uZUlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShjbGlja1Rocm91Z2hFbmFibGVkLCAnYm9vbGVhbicsICdjbGlja1Rocm91Z2hFbmFibGVkJyk7XG5cbiAgICBpZiAoZXh0ZW5zaW9uWm9uZUlkID09PSB1bmRlZmluZWQgfHwgZXh0ZW5zaW9uWm9uZUlkIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnRXh0ZW5zaW9uIElkIGlzIGludmFsaWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uWm9uZUlkXTogZXh0ZW5zaW9uWm9uZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLkNsaWNrVGhyb3VnaEVuYWJsZWRdOiBjbGlja1Rocm91Z2hFbmFibGVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRDbGlja1Rocm91Z2gsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFVJU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvVUlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZXR0aW5nc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVUlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG59XG4iLCJleHBvcnQgY29uc3QgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgPSAwO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvQXNrRGF0YUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRGV2aWNlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgVGFibGVhdUV2ZW50VHlwZSBhcyBFbWJlZGRpbmdUYWJsZWF1RXZlbnRUeXBlLFxuICBGaWxlRm9ybWF0cyxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBQdWxzZUxheW91dCxcbiAgU2hlZXRTaXplQmVoYXZpb3IsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXdFdmVudCxcbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgYXMgRW1iZWRkaW5nQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQsXG4gIEZpbHRlckNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdGaWx0ZXJDaGFuZ2VkRXZlbnQsXG4gIE1hcmtzU2VsZWN0ZWRFdmVudCBhcyBFbWJlZGRpbmdNYXJrU2VsZWN0ZWRFdmVudCxcbiAgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ1BhcmFtZXRlckNoYW5nZWRFdmVudCxcbiAgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQsXG4gIFRhYmxlYXVTaGVldEV2ZW50IGFzIEVtYmVkZGluZ1RhYmxlYXVTaGVldEV2ZW50LFxuICBUYWJsZWF1V29ya3NoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVdvcmtzaGVldEV2ZW50LFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nVG9vbGJhclN0YXRlQ2hhbmdlZEV2ZW50LFxuICBGaXJzdFZpelNpemVLbm93bkV2ZW50LFxuICBTdG9yeVBvaW50U3dpdGNoZWRFdmVudCxcbiAgVGFiU3dpdGNoZWRFdmVudCxcbiAgVXJsQWN0aW9uRXZlbnQsXG4gIFZpekxvYWRFcnJvckV2ZW50LFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzRXZlbnQsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFBhcmFtZXRlciBhcyBFbWJlZGRpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5LFxuICBBdXRob3JpbmdXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya3NoZWV0LFxuICBEYXNoYm9hcmQgYXMgRW1iZWRkaW5nRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRW1iZWRkaW5nRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFbWJlZGRpbmdTaGVldCxcbiAgRW1iZWRkaW5nVml6U3RhdGVXaXRoRGF0YU1vZGVsLFxuICBXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nV29ya3NoZWV0LFxuICBIaWVyYXJjaGljYWxMZXZlbHMsXG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeSwgU3RvcnlQb2ludCwgU3RvcnlQb2ludEluZm8gfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXcsXG4gIEF1dGhvcmluZ1dvcmtib29rIGFzIEVtYmVkZGluZ0F1dGhvcmluZ1dvcmtib29rLFxuICBXb3JrYm9vayBhcyBFbWJlZGRpbmdXb3JrYm9vayxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Xb3JrYm9va0ludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL0V2ZW50SW50ZXJmYWNlJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmV4cG9ydCB7XG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCB7IFdvcmtzaGVldENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwLFxuICBEYXNoYm9hcmQgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IFdvcmtib29rIGFzIEV4dGVuc2lvbldvcmtib29rIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvV29ya2Jvb2tJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsImltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXNrLWRhdGE+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZW51bSBBc2tEYXRhQXR0cmlidXRlcyB7XG4gIE9yaWdpbiA9ICdvcmlnaW4nLFxuICBTaG93RW1iZWQgPSAnc2hvdy1lbWJlZCcsXG4gIFNob3dQaW4gPSAnc2hvdy1waW4nLFxuICBTaG93U2F2ZSA9ICdzaG93LXNhdmUnLFxuICBTaG93U2hhcmUgPSAnc2hvdy1zaGFyZScsXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc2tEYXRhU2V0dGluZ3MgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCwgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1iZWQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctZW1iZWQ+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBpbiBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1waW4+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1Bpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzYXZlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXNhdmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2hhcmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2hhcmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NoYXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogIFVzZWQgZm9yIHRlbGVtZXRyeVxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIG9yaWdpbj1cImVtYmVkZGluZ1NpdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICBvcmlnaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBc2tEYXRhIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGEgZXh0ZW5kcyBBc2tEYXRhU2V0dGluZ3Mge31cbiIsIi8vIEFsbCBlbnVtIHZhbHVlcyBtYWRlIGF2YWlsYWJsZSB0byBFbWJlZGRpbmcgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cbi8vIE1vc3Qgb2YgdGhlbSBzaG91bGQgbWF0Y2ggYW4gZW51bSBvbiB0aGUgc2VydmVyIGRlZmluZWQgYXRcbi8vIHdvcmtncm91cC92cWx3ZWIvc2NyaXB0c2hhcnAvc3JjL0FwaVNoYXJlZC9QdWJsaWNFbnVtcy5jcyNMMzk4OjE3XG5cbi8qKlxuICogQ3Jvc3N0YWIgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgVml6LmV4cG9ydENyb3NzdGFiQXN5bmN9XG4gKi9cbmV4cG9ydCBlbnVtIENyb3NzdGFiRmlsZUZvcm1hdCB7XG4gIENTViA9ICdjc3YnLFxuICBFeGNlbCA9ICd4bHN4Jyxcbn1cblxuLyoqXG4gKiBEZXZpY2UgdHlwZXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZGV2aWNlfVxuICovXG5leHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgVGFibGV0ID0gJ3RhYmxldCcsXG4gIFBob25lID0gJ3Bob25lJyxcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIHJlcXVlc3QgdG8gdGhlIGF1dGggZW5kcG9pbnQgZmFpbHMuXG4gICAqL1xuICBBdXRoRmFpbGVkID0gJ2F1dGgtZmFpbGVkJyxcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGlzIG5vdCBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIFRhYmxlYXUgRW1iZWRkaW5nIEFQSVxuICAgKi9cbiAgQnJvd3Nlck5vdENhcGFibGUgPSAnYnJvd3Nlci1ub3QtY2FwYWJsZScsXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgb24gYSB3b3JrYm9vayBvciBhIHZpZXcgZG8gbm90IGFsbG93IGRvd25sb2FkaW5nIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIERvd25sb2FkV29ya2Jvb2tOb3RBbGxvd2VkID0gJ2Rvd25sb2FkLXdvcmtib29rLW5vdC1hbGxvd2VkJyxcbiAgLyoqXG4gICAqIFRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJLiBDb250YWN0IFRhYmxlYXUgU3VwcG9ydC5cbiAgICovXG4gIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEVpdGhlciBhIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLCBvciB0aGUgdmFsdWUgc3VwcGxpZWRcbiAgICogaW4gdGhlIGZpbHRlciBvcGVyYXRpb24gaXMgdGhlIHdyb25nIGRhdGEgdHlwZSBvciBmb3JtYXQuXG4gICAqL1xuICBpbnZhbGlkRmlsdGVyRmllbGROYW1lT3JWYWx1ZSA9ICdpbnZhbGlkLWZpbHRlci1maWVsZC1uYW1lJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZVxuICAgKiBmaWVsZC5cbiAgICovXG4gIEludmFsaWRQYXJhbWV0ZXIgPSAnaW52YWxpZC1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQSBuZWdhdGl2ZSBzaXplIHdhcyBzcGVjaWZpZWQgb3IgdGhlIG1heFNpemUgdmFsdWUgaXMgbGVzcyB0aGFuIG1pblNpemUgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkuXG4gICAqL1xuICBJbnZhbGlkU2l6ZSA9ICdpbnZhbGlkLXNpemUnLFxuICAvKipcbiAgICogQXR0ZW1wdGVkIHRvIGdldCBhbiBhdXRob3Jpbmcgd29ya3NoZWV0IHdoZW4gdGhlIGN1cnJlbnQgc2hlZXQgaXMgbm90IGEgd29ya3NoZWV0LlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBJbnZhbGlkU2hlZXRUeXBlID0gJ2ludmFsaWQtc2hlZXQtdHlwZScsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIHZhbHVlIHdhcyBmb3VuZCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgU2hlZXRTaXplQmVoYXZpb3IgZW51bS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3IgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yJyxcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb3RoZXIgdGhhbiBTaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMgd2FzIHNwZWNpZmllZCBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHRoZSBzaGVldCBpcyBhXG4gICAqIFdvcmtzaGVldCBpbnN0YW5jZS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCA9ICdpbnZhbGlkLXNpemUtYmVoYXZpb3Itb24td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIFRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBWaXogY2xhc3MgY29uc3RydWN0b3IgaXMgbm90IHZhbGlkLlxuICAgKi9cbiAgSW52YWxpZFVybCA9ICdpbnZhbGlkLXVybCcsXG4gIC8qKlxuICAgKiBUaGUgbWF4U2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QuXG4gICAqL1xuICBNaXNzaW5nTWF4U2l6ZSA9ICdtaXNzaW5nLW1heC1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QuXG4gICAqL1xuICBNaXNzaW5nTWluU2l6ZSA9ICdtaXNzaW5nLW1pbi1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIG9yIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UuXG4gICAqL1xuICBNaXNzaW5nTWluTWF4U2l6ZSA9ICdtaXNzaW5nLW1pbi1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIGVtYmVkZGluZyBhcHAgaW50ZXJhY3RzIHdpdGggYSBwYXJhbWV0ZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldC5cbiAgICovXG4gIE1pc3NpbmdQYXJhbWV0ZXIgPSAnbWlzc2luZy1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIHJhbmdlTiBmaWVsZCBpcyBtaXNzaW5nIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIHR5cGUgTEFTVE4gb3IgTkVYVE4uXG4gICAqL1xuICBNaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyA9ICdtaXNzaW5nLXJhbmdlLW4tZm9yLXJlbGF0aXZlLWRhdGUtZmlsdGVycycsXG4gIC8qKlxuICAgKiBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyBTaGVldC5nZXRVcmwoKSBvbiBhIGhpZGRlbiBzaGVldC4gSGlkZGVuIHNoZWV0cyBkbyBub3QgaGF2ZSBVUkxzLlxuICAgKi9cbiAgTm9VcmxGb3JIaWRkZW5Xb3Jrc2hlZXQgPSAnbm8tdXJsLWZvci1oaWRkZW4td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIE9uZSBvciBib3RoIG9mIHRoZSBwYXJlbnRFbGVtZW50IG9yIHRoZSBVUkwgcGFyYW1ldGVycyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBOb1VybE9yUGFyZW50RWxlbWVudE5vdEZvdW5kID0gJ25vLXVybC1vci1wYXJlbnQtZWxlbWVudC1ub3QtZm91bmQnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGlzIG5vdCBhY3RpdmUgb3IgZW1iZWRkZWQgd2l0aGluIHRoZSBhY3RpdmUgZGFzaGJvYXJkLlxuICAgKi9cbiAgTm90QWN0aXZlU2hlZXQgPSAnbm90LWFjdGl2ZS1zaGVldCcsXG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IHNwZWNpZmllZCwgbnVsbCwgb3IgYW4gZW1wdHkgc3RyaW5nL2FycmF5LlxuICAgKi9cbiAgTnVsbE9yRW1wdHlQYXJhbWV0ZXIgPSAnbnVsbC1vci1lbXB0eS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIFNoZWV0Tm90SW5Xb3JrYm9vayA9ICdzaGVldC1ub3QtaW4td29ya2Jvb2snLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBhIEN1c3RvbVZpZXcgb2JqZWN0IHRoYXQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpdCBoYXMgYmVlbiByZW1vdmVkKS5cbiAgICovXG4gIFN0YWxlRGF0YVJlZmVyZW5jZSA9ICdzdGFsZS1kYXRhLXJlZmVyZW5jZScsXG4gIC8qKlxuICAgKiBVbmtub3duIGVycm9yIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGF1dGggZmxvdy5cbiAgICovXG4gIFVua25vd25BdXRoRXJyb3IgPSAndW5rbm93bi1hdXRoLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIFZpei5hZGRFdmVudExpc3RlbmVyIG9yIFZpei5yZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gIC8qKlxuICAgKiBBIFZpeiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudEVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBWaXpBbHJlYWR5SW5NYW5hZ2VyID0gJ3Zpei1hbHJlYWR5LWluLW1hbmFnZXInLFxuICAvKipcbiAgICogRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW1iZWRkaW5nIGFwaS5cbiAgICovXG4gIEltcGxlbWVudGF0aW9uRXJyb3IgPSAnd3JvbmctaW1wbGVtZW50YXRpb24nLFxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqL1xuICBOb3RJbXBsZW1lbnRlZCA9ICdub3QtaW1wbGVtZW50ZWQnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciBkdXJpbmcgZXZlbnQgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIEV2ZW50SW5pdGlhbGl6YXRpb25FcnJvciA9ICdldmVudC1pbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBlbWJlZGRpbmcgYXBpIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgdGFibGVhdVxuICAgKi9cbiAgSW5jb21wYXRpYmxlVmVyc2lvbkVycm9yID0gJ2luY29tcGF0aWJsZS12ZXJzaW9uLWVycm9yJyxcblxuICAvKipcbiAgICogVW5rbm93biB7QGxpbmsgVGFibGVhdURpYWxvZ1R5cGV9IHBhc3NlZCBpbiB0byBWaXouZGlzcGxheURpYWxvZ0FzeW5jLlxuICAgKi9cbiAgVW5rbm93bkRpYWxvZ1R5cGUgPSAndW5rbm93bi1kaWFsb2ctdHlwZScsXG5cbiAgLyoqXG4gICAqIENhbiBvY2N1ciBpZiB0aGUgQVBJIGludGVyYWN0cyB3aXRoIGEgZmlsdGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAqIENhbiBhbHNvIG9jY3VycyBpZiBhIHtAbGluayBGaWx0ZXJUeXBlfSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQuXG4gICAqL1xuICBGaWx0ZXJNaXNzaW5nT3JOb3RJbXBsZW1lbnRlZCA9ICdmaWx0ZXItbWlzc2luZy1ub3QtaW1wbGVtZW50ZWQnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgc3RvcnkgcG9pbnQgaWRzIG5vIGxvbmdlciBtYXRjaC5cbiAgICovXG4gIFN0b3J5UG9pbnRJZE1pc21hdGNoID0gJ3N0b3J5cG9pbnQtaWQtbWlzbWF0Y2gnLFxufVxuXG4vKipcbiAqIEZvcm1hdHMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIGRpc3BsYXlTdGF0aWNJbWFnZSBpbiBAVml6SW50ZXJmYWNlc1xuICovXG5leHBvcnQgZW51bSBGaWxlRm9ybWF0cyB7XG4gIFBERiA9ICdwZGYnLFxuICBQTkcgPSAncG5nJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRPcmllbnRhdGlvbiB7XG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50UGFnZVNpemUge1xuICBMZXR0ZXIgPSAnbGV0dGVyJyxcbiAgTGVnYWwgPSAnbGVnYWwnLFxuICBOb3RlID0gJ25vdGUnLFxuICBGb2xpbyA9ICdmb2xpbycsXG4gIFRhYmxvaWQgPSAndGFibG9pZCcsXG4gIExlZGdlciA9ICdsZWRnZXInLFxuICBTdGF0ZW1lbnQgPSAnc3RhdGVtZW50JyxcbiAgRXhlY3V0aXZlID0gJ2V4ZWN1dGl2ZScsXG4gIEEzID0gJ0EzJyxcbiAgQTQgPSAnQTQnLFxuICBBNSA9ICdBNScsXG4gIEI0ID0gJ0I0JyxcbiAgQjUgPSAnQjUnLFxuICBRdWFydG8gPSAncXVhcnRvJyxcbiAgVW5zcGVjaWZpZWQgPSAndW5zcGVjaWZpZWQnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFNjYWxpbmcge1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgUGVyYzI1ID0gJzI1JScsXG4gIFBlcmM1MCA9ICc1MCUnLFxuICBQZXJjNjAgPSAnNjAlJyxcbiAgUGVyYzc1ID0gJzc1JScsXG4gIFBlcmM4MCA9ICc4MCUnLFxuICBQZXJjOTAgPSAnOTAlJyxcbiAgUGVyYzEwMCA9ICcxMDAlJyxcbiAgUGVyYzIwMCA9ICcyMDAlJyxcbiAgUGVyYzQwMCA9ICc0MDAlJyxcbiAgQXRNb3N0MVBhZ2VIaWdoID0gJ2F0LW1vc3QtMS1wYWdlLWhpZ2gnLFxuICBBdE1vc3QyUGFnZXNIaWdoID0gJ2F0LW1vc3QtMi1wYWdlcy1oaWdoJyxcbiAgQXRNb3N0MVBhZ2VXaWRlID0gJ2F0LW1vc3QtMS1wYWdlLXdpZGUnLFxuICBBdE1vc3QyUGFnZXNXaWRlID0gJ2F0LW1vc3QtMi1wYWdlcy13aWRlJyxcbn1cblxuZXhwb3J0IGVudW0gUmV2ZXJ0Vml6U2VsZWN0aW9uIHtcbiAgQWxsID0gJ2FsbCcsXG4gIEF4ZXMgPSAnYXhlcycsXG4gIEZpbHRlcnMgPSAnZmlsdGVycycsXG4gIFNvcnRzID0gJ3NvcnRzJyxcbiAgU2hlbHZlcyA9ICdzaGVsdmVzJyxcbn1cblxuZXhwb3J0IGVudW0gVG9vbGJhckJ1dHRvbnMge1xuICBBbGVydHMgPSAnYWxlcnRzJyxcbiAgQXNrRGF0YSA9ICdhc2tEYXRhJyxcbiAgQ3VzdG9tVmlld3MgPSAnY3VzdG9tVmlld3MnLFxuICBEYXRhRGV0YWlscyA9ICdkYXRhRGV0YWlscycsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU3Vic2NyaWJlID0gJ3N1YnNjcmliZScsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXIge1xuICBUb3AgPSAndG9wJyxcbiAgQm90dG9tID0gJ2JvdHRvbScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFNpemVCZWhhdmlvciB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBFeGFjdGx5ID0gJ2V4YWN0bHknLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIEF0TGVhc3QgPSAnYXRsZWFzdCcsXG4gIEF0TW9zdCA9ICdhdG1vc3QnLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUxheW91dCB7XG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXG4gIENhcmQgPSAnY2FyZCcsXG4gIEJhbiA9ICdiYW4nLFxufVxuXG4vKipcbiAqIEJlIGNhcmVmdWwgd2hlbiBhZGRpbmcgbmV3IGV2ZW50IHR5cGVzLiBFeHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgZm9sbG93IHR3byBkaWZmZXJlbnQgcGF0dGVybnMgb24gaG93IGV2ZW50cyBhcmUgbmFtZWQuXG4gKiBFdmVudHMgc2hvdWxkIGJlIGFsbCBsb3dlciBjYXNlIGFuZCB3aXRob3V0IGh5cGhlbnMgb3IgdW5kZXJzY29yZXMuXG4gKi9cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB0eXBlIG9mIHRhYmxlYXUgZW1iZWRkaW5nIGV2ZW50IHRoYXQgY2FuIGJlIGxpc3RlbmVkIGZvci5cbiAqL1xuZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBmaW5pc2hlZCBsb2FkaW5nLiBUaGlzIGV2ZW50IGlzIHJhaXNlZCBhZnRlciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHtAbGluayBGaXJzdEludGVyYWN0aXZlfSAoaWYgYW55KSBoYXMgYmVlbiBjYWxsZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3TG9hZGVkID0gJ2N1c3RvbXZpZXdsb2FkZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b212aWV3cmVtb3ZlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2F2ZWQgKG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3U2F2ZWQgPSAnY3VzdG9tdmlld3NhdmVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQgYXMgdGhlIGRlZmF1bHQgdmlldyBmb3IgYSB3b3JrYm9vay5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ2N1c3RvbXZpZXdzZXRkZWZhdWx0JyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEJ1dHRvbi5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEVkaXRCdXR0b25DbGlja2VkID0gJ2VkaXRidXR0b25jbGlja2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBFZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdlZGl0aW5kZXNrdG9wYnV0dG9uY2xpY2tlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyY2hhbmdlZCcsXG5cbiAgLyoqIEZpcmVkIHdoZW4gdml6IHNpemUgaXMga25vd25cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3R2aXpzaXpla25vd24nLFxuXG4gIC8qKiBGaXJlZCB3aGVuIGEgdml6IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmVcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRmlyc3RJbnRlcmFjdGl2ZSA9ICdmaXJzdGludGVyYWN0aXZlJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ2N1c3RvbW1hcmtjb250ZXh0bWVudScsXG5cbiAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrc2VsZWN0aW9uY2hhbmdlZCcsXG5cbiAgLyoqIEEgcGFyYW1ldGVyIGhhcyBoYWQgaXRzIHZhbHVlIG1vZGlmaWVkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBbW1BhcmFtZXRlcl1dIG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlcmNoYW5nZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIHRvb2xiYXIgYnV0dG9uIG9yIGNvbnRyb2wgYmVjb21lcyBhdmFpbGFibGUgb3IgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhcnN0YXRlY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2tyZWFkeXRvY2xvc2UnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9va3B1Ymxpc2hlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2twdWJsaXNoZWRhcycsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgVVJMIGFjdGlvbiBvY2N1cnMuIFNlZSB0aGUge0BsaW5rIFVybEFjdGlvbkV2ZW50fSBjbGFzcy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFVybEFjdGlvbiA9ICd1cmxhY3Rpb24nLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVGFiU3dpdGNoZWQgPSAndGFic3dpdGNoZWQnLFxuICAvKipcbiAgICpcbiAgICogUmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5cG9pbnRzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudHMgb2YgdGhlIHdlYmNvbXBvbmVudC5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgVml6TG9hZEVycm9yID0gJ3ZpemxvYWRlcnJvcicsXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgdGhlIGlmcmFtZSBzcmMgYXR0cmlidXRlIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgSWZyYW1lU3JjVXBkYXRlZCA9ICdpZnJhbWVzcmN1cGRhdGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSB0byBzdW1tYXJ5IGRhdGEuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeWRhdGFjaGFuZ2VkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gdGFibGVhdSAodml6LWNsaWVudCkgaXMgcmVhZHkgdG8gcmVjZWl2ZSBhbiBhdXRoIHRva2VuLlxuICAgKiBVc2VkIGZvciBhdXRoZW50aWNhdGlvbiBpbiBzYWxlc2ZvcmNlIG5hdGl2ZSBtb2RlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsXG4gICAqL1xuICBSZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdyZWFkeXRvcmVjZWl2ZWF1dGh0b2tlbicsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgYSBjb250ZXh0IG1lbnUgd2hlcmUgdXNlcnMgY2FuIGFkZCBleHRlcm5hbCBtZW51IGl0ZW1zLlxuICovXG5leHBvcnQgZW51bSBBcGlNZW51VHlwZSB7XG4gIC8qKiBFeHRlcm5hbCBtZW51IGl0ZW0gd2lsbCBiZSBpbmplY3RlZCBpbiB1YmVydGlwIGRpYWxvZyAqL1xuICBVYmVydGlwID0gJ3ViZXJ0aXAnLFxufVxuXG4vKiogWW91IGNhbiB1c2UgdGhpcyB0eXBlIHdpdGggYSB7QGxpbmsgVml6fSBvYmplY3QuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RGlhbG9nVHlwZSB7XG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBERiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRQREYgPSAnZXhwb3J0LXBkZicsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBvd2VyUG9pbnQgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UG93ZXJQb2ludCA9ICdleHBvcnQtcG93ZXJwb2ludCcsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIERhdGEgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIENyb3NzVGFiIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydENyb3NzVGFiID0gJ2V4cG9ydC1jcm9zcy10YWInLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBXb3JrYm9vayBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRXb3JrYm9vayA9ICdleHBvcnQtd29ya2Jvb2snLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBTaGFyZSBkaWFsb2cuXG4gICAqL1xuICBTaGFyZSA9ICdzaGFyZScsXG59XG4iLCJpbXBvcnQgeyBQdWxzZUxheW91dCB9IGZyb20gJy4vRW51bXMnO1xuaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXB1bHNlPiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBQdWxzZUF0dHJpYnV0ZXMge1xuICBEaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlLWV4cGxvcmUtZmlsdGVyJyxcbiAgTGF5b3V0ID0gJ2xheW91dCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGN1c3RvbSBsYXlvdXQgb2YgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgbGF5b3V0PVwiY2FyZFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGxheW91dD86IFB1bHNlTGF5b3V0O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AtbGV2ZWwgUHVsc2Ugb2JqZWN0LlxuICoqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZSBleHRlbmRzIFB1bHNlU2V0dGluZ3Mge31cbiIsImltcG9ydCB7XG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRGV2aWNlVHlwZSxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBUYWJsZWF1RGlhbG9nVHlwZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVG9vbGJhcixcbn0gZnJvbSAnLi9FbnVtcyc7XG5pbXBvcnQgeyBTaGVldFNpemUgfSBmcm9tICcuL1NoZWV0SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4vV29ya2Jvb2tJbnRlcmZhY2UnO1xuXG4vKipcbiAqIFRoZSBzaGFyZWQgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS12aXo+IGFuZCA8dGFibGVhdS1hdXRob3Jpbmctdml6PiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBWaXpTaGFyZWRBdHRyaWJ1dGVzIHtcbiAgVG91Y2hPcHRpbWl6ZSA9ICd0b3VjaC1vcHRpbWl6ZScsXG4gIEhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uID0gJ2hpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbicsXG4gIFN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvciA9ICdzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3InLFxuICBEaXNhYmxlVmVyc2lvbkNoZWNrID0gJ2Rpc2FibGUtdmVyc2lvbi1jaGVjaycsXG4gIE9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCcsXG4gIE9uRmlyc3RWaXpTaXplS25vd24gPSAnb25GaXJzdFZpelNpemVLbm93bicsXG4gIE9uRmlyc3RJbnRlcmFjdGl2ZSA9ICdvbkZpcnN0SW50ZXJhY3RpdmUnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF0dHJpYnV0ZXMge1xuICBEaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9ICdkaXNhYmxlLXVybC1hY3Rpb25zJyxcbiAgSGlkZVRhYnMgPSAnaGlkZS10YWJzJyxcbiAgVG9vbGJhciA9ICd0b29sYmFyJyxcbiAgSW5zdGFuY2VJZFRvQ2xvbmUgPSAnaW5zdGFuY2UtaWQtdG8tY2xvbmUnLFxuICBEZXZpY2UgPSAnZGV2aWNlJyxcbiAgSGlkZUVkaXRCdXR0b24gPSAnaGlkZS1lZGl0LWJ1dHRvbicsXG4gIE9uRWRpdEJ1dHRvbkNsaWNrZWQgPSAnb25FZGl0QnV0dG9uQ2xpY2tlZCcsXG4gIE9uRmlsdGVyQ2hhbmdlZCA9ICdvbkZpbHRlckNoYW5nZWQnLFxuICBPbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ29uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQnLFxuICBPbk1hcmtTZWxlY3Rpb25DaGFuZ2VkID0gJ29uTWFya1NlbGVjdGlvbkNoYW5nZWQnLFxuICBPblBhcmFtZXRlckNoYW5nZWQgPSAnb25QYXJhbWV0ZXJDaGFuZ2VkJyxcbiAgT25Ub29sYmFyU3RhdGVDaGFuZ2VkID0gJ29uVG9vbGJhclN0YXRlQ2hhbmdlZCcsXG4gIE9uVXJsQWN0aW9uID0gJ29uVXJsQWN0aW9uJyxcbiAgT25UYWJTd2l0Y2hlZCA9ICdvblRhYlN3aXRjaGVkJyxcbiAgT25DdXN0b21WaWV3TG9hZGVkID0gJ29uQ3VzdG9tVmlld0xvYWRlZCcsXG4gIE9uQ3VzdG9tVmlld1JlbW92ZWQgPSAnb25DdXN0b21WaWV3UmVtb3ZlZCcsXG4gIE9uQ3VzdG9tVmlld1NhdmVkID0gJ29uQ3VzdG9tVmlld1NhdmVkJyxcbiAgT25DdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdvbkN1c3RvbVZpZXdTZXREZWZhdWx0JyxcbiAgT25TdG9yeVBvaW50U3dpdGNoZWQgPSAnb25TdG9yeVBvaW50U3dpdGNoZWQnLFxuICBPblN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdvblN1bW1hcnlEYXRhQ2hhbmdlZCcsXG4gIE9uUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4gPSAnb25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbicsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpekF1dGhvcmluZ0F0dHJpYnV0ZXMge1xuICBPbldvcmtib29rUHVibGlzaGVkID0gJ29uV29ya2Jvb2tQdWJsaXNoZWQnLFxuICBPbldvcmtib29rUHVibGlzaGVkQXMgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZEFzJyxcbiAgT25Xb3JrYm9va1JlYWR5VG9DbG9zZSA9ICdvbldvcmtib29rUmVhZHlUb0Nsb3NlJyxcbiAgSGlkZUNsb3NlQnV0dG9uID0gJ2hpZGUtY2xvc2UtYnV0dG9uJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiBhbmQgVGFibGVhdUF1dGhvcmluZ1ZpeiBjdXN0b20gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGZpbHRlciBwYXJhbWV0ZXJzLiBBdmFpbGFibGUgb25seSBpbiB2aWV3aW5nIG1vZGUuXG4gICAqL1xuICBWaXpGaWx0ZXIgPSAndml6LWZpbHRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbmFtZSBhbmQgdmFsdWUgZm9yIGEgcGFyYW1ldGVyLiBBdmFpbGFibGUgb25seSBpbiB2aWV3aW5nIG1vZGUuXG4gICAqL1xuICBWaXpQYXJhbWV0ZXIgPSAndml6LXBhcmFtZXRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcbn1cblxuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AgbGV2ZWwgVml6IG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6IGV4dGVuZHMgVml6U2V0dGluZ3MsIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogT25lIFdvcmtib29rIGlzIHN1cHBvcnRlZCBwZXIgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rPzogV29ya2Jvb2s7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEF1dGhvcmluZyBWaXogb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcmluZ1ZpeiBleHRlbmRzIFZpekF1dGhvcmluZ1NldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgLSBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgdml6XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6QWN0aW9ucyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhdXRvbWF0aWMgdXBkYXRlcyBhcmUgY3VycmVudGx5IHBhdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF1dG9tYXRpY1VwZGF0ZXNBcmVQYXVzZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdXNlIGxheW91dCB1cGRhdGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlc2l6aW5nIHRoZSB2aXN1YWxpemF0aW9uIG9yIHBlcmZvcm1pbmcgbXVsdGlwbGUgY2FsbHMgdGhhdCBjb3VsZCBhZmZlY3QgdGhlIGxheW91dC5cbiAgICovXG4gIHBhdXNlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBsYXlvdXQgdXBkYXRlcy5cbiAgICovXG4gIHJlc3VtZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICB0b2dnbGVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiB0aGUgUmV2ZXJ0IEFsbCB0b29sYmFyIGJ1dHRvbiwgd2hpY2ggcmVzdG9yZXMgdGhlIHdvcmtib29rIHRvIGl0cyBzdGFydGluZyBzdGF0ZS5cbiAgICovXG4gIHJldmVydEFsbEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJlZnJlc2ggRGF0YSB0b29sYmFyIGJ1dHRvbi5cbiAgICovXG4gIHJlZnJlc2hEYXRhQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBjbGlja2luZyBvbiBEb3dubG9hZCA+IEltYWdlIGZyb20gdGhlIHRvb2xiYXIsIHdoaWNoIGNyZWF0ZXMgYSBQTkcgZmlsZSBvZiB0aGUgY3VycmVudCB2aXN1YWxpemF0aW9uLlxuICAgKi9cbiAgZXhwb3J0SW1hZ2VBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBjcm9zc3RhYiBvZiBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3IHRvIGFcbiAgICogc3BlY2lmaWVkIGZvcm1hdCAoQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKS5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzaGVldCBuYW1lIGRvZXMgbm90IG1hdGNoIGFueSB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgYWN0aXZlIHNoZWV0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNyb3NzdGFiIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydENyb3NzdGFiQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogdml6LmV4cG9ydENyb3NzdGFiQXN5bmMoJ1NhbGVzIGJ5IFNlZ21lbnQnLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRDcm9zc3RhYkFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIHN1bW1hcnkgZGF0YSBzaG93biBpbiB0aGUgVmlldyBEYXRhIHdpbmRvd1xuICAgKiAoc2hvd24gd2hlbiB5b3UgY2xpY2sgRG93bmxvYWQgPiBEYXRhIGZyb20gdGhlIHRvb2xiYXIgZm9yIGFueSBnaXZlbiB3b3Jrc2hlZXQgd2l0aGluIHRoZSBjdXJyZW50IHZpZXcpLlxuICAgKiBUaGUgY3VycmVudCBmaWxlIGZvcm1hdCBpcyBDU1YuIFRoZXJlIGlzIG5vIGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCBvZiBzdW1tYXJ5IGRhdGEgeW91IGNhbiBleHBvcnQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZC5cbiAgICogTm90ZTogZXhwb3J0RGF0YUFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gdml6Lndvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAqICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IGFjdGl2ZVNoZWV0LmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk7XG4gICAqICAgLy8gR2V0dGluZyBmaWVsZElkJ3MgZm9yIExhdGl0dWRlIGFuZCBMb25naXR1ZGUgY29sdW1uc1xuICAgKiAgIGNvbnN0IGNvbHVtbnNUb0luY2x1ZGVCeUlkID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgKiAgICAgaWYgKGNvbHVtbi5maWVsZE5hbWUgPT09ICdMYXRpdHVkZScgfHwgY29sdW1uLmZpZWxkTmFtZSA9PT0gJ0xvbmdpdHVkZScpIHtcbiAgICogICAgICAgcmV0dXJuIGNvbHVtbi5maWVsZElkO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMoYWN0aXZlU2hlZXQubmFtZSwgeyBjb2x1bW5zVG9JbmNsdWRlQnlJZCB9KTtcbiAgICogfVxuICAgKiBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgaW4gdGhlIGRhc2hib2FyZCB3aGlsZSBhbHNvIGlnbm9yaW5nIGFsaWFzZXNcbiAgICogICBmb3IgKGNvbnN0IHdvcmtzaGVldCBvZiBhY3RpdmVTaGVldC53b3Jrc2hlZXRzKSB7XG4gICAqICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKHdvcmtzaGVldC5uYW1lLCB7IGlnbm9yZUFsaWFzZXM6IHRydWUgfSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGVsc2VcbiAgICoge1xuICAgKiAgIC8vIGFjdGl2ZVNoZWV0IGlzIGEgU3RvcnkgYW5kIHdlIHdhbnQgdG8gZXhwb3J0IHdvcmtzaGVldHMgd2l0aGluIHRoZSBjdXJyZW50IHZpZXdcbiAgICogICBjb25zdCBjb250YWluZWRTaGVldCA9IGFjdGl2ZVNoZWV0LmFjdGl2ZVN0b3J5UG9pbnQuY29udGFpbmVkU2hlZXQ7XG4gICAqICAgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgc3VtbWFyeSBkYXRhIG9mIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgYWN0aXZlIHN0b3J5IHBvaW50XG4gICAqICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGNvbnRhaW5lZFNoZWV0Lm5hbWUpO1xuICAgKiAgIH0gZWxzZSBpZiAoY29udGFpbmVkU2hlZXQgIT09IHVuZGVmaW5lZCAmJiBjb250YWluZWRTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICAgIC8vIEV4cG9ydGluZyB0aGUgc3VtbWFyeSBkYXRhIGZvciBlYWNoIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgY29udGFpbmVkU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKHdvcmtzaGVldC5uYW1lKTtcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBleHBvcnREYXRhQXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBFeHBvcnREYXRhT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGxpc3Qgb2Ygc2hlZXRzIHRvIGEgUG93ZXJQb2ludCBmaWxlLiBJZiBubyBzaGVldHMgYXJlIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2hlZXQgaXMgZXhwb3J0ZWQuXG4gICAqIFRoZSBvcmRlciB0aGUgc2hlZXRzIGFwcGVhciBpbiB0aGUgbGlzdCBpcyB0aGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIFBvd2VyUG9pbnQgZmlsZS5cbiAgICogVGhlIGxpc3Qgb2Ygc2hlZXRzIGNhbiBlaXRoZXIgZXhjbHVzaXZlbHkgaW5jbHVkZSB0aGUgd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgb3IgZXhjbHVzaXZlbHkgaW5jbHVkZSB0aGUgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBsaXN0IG9mIHNoZWV0cyBjb250YWlucyBib3RoIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIGFuZCBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIFBvd2VyUG9pbnQgZmlsZSBmYWlscyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBOb3RlOiBleHBvcnRQb3dlclBvaW50QXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCk7XG4gICAqIH0gZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSAgU2hlZXRUeXBlLkRhc2hib2FyZCkge1xuICAgKiAgIGNvbnN0IHdvcmtzaGVldE5hbWVzID0gYWN0aXZlU2hlZXQud29ya3NoZWV0cy5tYXAoKHdvcmtzaGVldCkgPT4gd29ya3NoZWV0Lm5hbWUpO1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQb3dlclBvaW50QXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUG93ZXJQb2ludFxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHB1Ymxpc2hlZFNoZWV0TmFtZXMpO1xuICAgKiBgYGBcbiAgICovXG4gIGV4cG9ydFBvd2VyUG9pbnRBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGxpc3Qgb2Ygc2hlZXRzIHdpdGggdGhlIGdpdmVuIHtAbGluayBFeHBvcnRQREZPcHRpb25zfSBvcHRpb25zLiBJZiBubyBzaGVldHMgYXJlIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2hlZXQgaXMgZXhwb3J0ZWQuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIElmIG5vIEV4cG9ydFBERk9wdGlvbnMgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXJlOiBTY2FsaW5nID0gQXV0b21hdGljLCBQYWdlU2l6ZSA9IExldHRlciwgYW5kIE9yaWVudGF0aW9uID0gUG9ydHJhaXQuXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQREYgZmlsZSBmYWlscyB0byBiZSBjcmVhdGVkLlxuICAgKlxuICAgKiBOb3RlOiBleHBvcnRQREZBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCB3b3JrYm9vayA9IHZpei53b3JrYm9vaztcbiAgICogY29uc3QgYWN0aXZlU2hlZXQgPSB3b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCB8fCBhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5TdG9yeSkge1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQREZBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUERGXG4gICAqIGNvbnN0IHB1Ymxpc2hlZFNoZWV0TmFtZXMgPSB3b3JrYm9vay5wdWJsaXNoZWRTaGVldHNJbmZvLm1hcCgocHVibGlzaGVkU2hlZXRJbmZvKSA9PiBwdWJsaXNoZWRTaGVldEluZm8ubmFtZSk7XG4gICAqIGF3YWl0IHZpei5leHBvcnRQREZBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQREZBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPiwgb3B0aW9ucz86IEV4cG9ydFBERk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG9uZSBvZiB0aGUgZXhwb3J0IGRpYWxvZ3MgYmFzZWQgb24gdGhlIGRpYWxvZ1R5cGUgcGFyYW1ldGVyXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBkaWFsb2dUeXBlIGlzIGludmFsaWRcbiAgICovXG4gIGRpc3BsYXlEaWFsb2dBc3luYyhkaWFsb2dUeXBlOiBUYWJsZWF1RGlhbG9nVHlwZSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFJlZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICByZWRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5kb2VzIHRoZSBsYXN0IGFjdGlvbiBwZXJmb3JtZWQgb24gYSBzaGVldC5cbiAgICovXG4gIHVuZG9Bc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqXG4gICAqIGBgYFxuICAgKiBhc3luYyBmdW5jdGlvbiBnZXRTZWxlY3RlZE1hcmtzKGV2ZW50KSB7XG4gICAqICAgICBjb25zdCBtYXJrc1NlbGVjdGVkID0gYXdhaXQgZXZlbnQuZGV0YWlsLmdldE1hcmtzQXN5bmMoKTtcbiAgICogICAgIGNvbnN0IG51bU1hcmtzID0gbWFya3NTZWxlY3RlZC5kYXRhWzBdLmRhdGEubGVuZ3RoO1xuICAgKiAgICAgY29uc29sZS5sb2coYCR7bnVtTWFya3N9IG1hcmtzIFNlbGVjdGVkYCk7XG4gICAqIH1cbiAgICpcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5hZGRFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5yZW1vdmVFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIHZpeiBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSB2aXouXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDx2aXotZmlsdGVyPmAgZWxlbWVudCBpbiB0aGUgYDx0YWJsZWF1LXZpej5gIHdlYiBjb21wb25lbnQsXG4gICAqIHlvdSBtaWdodCBleHBlcmllbmNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlIFNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiB2aXouYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXpTaXplIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNoZWV0U2l6ZSByZWNvcmQgZm9yIHRoZSBjdXJyZW50IHNoZWV0XG4gICAqL1xuICByZWFkb25seSBzaGVldFNpemU6IFNoZWV0U2l6ZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBUYWJsZWF1IFVJIGVsZW1lbnRzICh0aGUgY2hyb21lKSBzdXJyb3VuZGluZyB0aGUgdmlldy5cbiAgICovXG4gIHJlYWRvbmx5IGNocm9tZUhlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGUuXG4gKi9cbmludGVyZmFjZSBWaXpTZXR0aW5nc1NoYXJlZCBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHRvdWNoIG9wdGltaXplIHZpeiBjb250cm9scy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRvdWNoLW9wdGltaXplIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG91Y2hPcHRpbWl6ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogYGBgXG4gICAqL1xuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGVkaXQgYmVoYXZpb3IgaXMgc3VwcHJlc3NlZC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIG5vdCBzdXBwcmVzc2VkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHN1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIGBgYFxuICAgKi9cbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPVwib25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzaXplIG9mIHRoZSB2aXogaXMga25vd24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gcGVyZm9ybSB0YXNrcyBzdWNoIGFzIHJlc2l6aW5nXG4gICAqIHRoZSBlbGVtZW50cyBzdXJyb3VuZGluZyB0aGUgVml6IG9iamVjdCBvbmNlIHRoZSBvYmplY3QncyBzaXplIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdFZpelNpemVLbm93blwiPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlyc3RWaXpTaXplS25vd249XCJvbkZpcnN0Vml6U2l6ZUtub3duSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdFZpelNpemVLbm93bj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIFZpeiBvYmplY3QgZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZS4gVGhpcyBpcyBvbmx5IHJhaXNlZCBvbmNlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdEludGVyYWN0aXZlXCI9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0SW50ZXJhY3RpdmU9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpcnN0SW50ZXJhY3RpdmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIHZpZXcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHN1cHByZXNzIHRoZSBleGVjdXRpb24gb2YgVVJMIGFjdGlvbnMuIFRoaXMgb3B0aW9uIGRvZXMgbm90IHByZXZlbnQgdGhlIFVSTCBhY3Rpb25cbiAgICogZXZlbnQgZnJvbSBiZWluZyByYWlzZWQuIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBJZiBzZXRcbiAgICogdG8gdHJ1ZSBhbmQgeW91IGNyZWF0ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIFVSTF9BQ1RJT04gZXZlbnQsIHlvdSBjYW4gdXNlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqIGhhbmRsZXIgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRpc2FibGUtdXJsLWFjdGlvbnMgLz5cbiAgICogYGBgXG4gICAqL1xuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYnMgYXJlIGhpZGRlbiBvciBzaG93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgaGlkZS10YWJzIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZVRhYnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sYmFyLCBpZiBpdCBpcyBzaG93bi4gVGhlIHZhbHVlcyBjYW4gYmUgVG9vbGJhci5Ub3AsXG4gICAqIFRvb2xiYXIuQm90dG9tIG9yIFRvb2xiYXIuSGlkZGVuLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBUb29sYmFyLkJvdHRvbS5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgdG9vbGJhcj1cImhpZGRlblwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9vbGJhcj86IFRvb2xiYXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGRldmljZSBsYXlvdXQgZm9yIGEgZGFzaGJvYXJkLCBpZiBpdCBleGlzdHMuXG4gICAqIFZhbHVlcyBjYW4gYmUgZGVmYXVsdCwgZGVza3RvcCwgdGFibGV0LCBvciBwaG9uZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gbG9hZGluZyBhIGxheW91dCBiYXNlZCBvbiB0aGVcbiAgICogc21hbGxlc3QgZGltZW5zaW9uIG9mIHRoZSBob3N0aW5nIGlmcmFtZSBlbGVtZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBkZXZpY2U9XCJkZXNrdG9wXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBkZXZpY2U/OiBEZXZpY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIElEIG9mIGFuIGV4aXN0aW5nIGluc3RhbmNlIHRvIG1ha2UgYSBjb3B5IChjbG9uZSkgb2YuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlIGFuYWx5c2lzIG9mIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb25cbiAgICogd2l0aG91dCBsb3NpbmcgdGhlIHN0YXRlIG9mIHRoZSBvcmlnaW5hbC4gSWYgdGhlIElEIGRvZXMgbm90IHJlZmVyIHRvIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb24sXG4gICAqIHRoZSBjbG9uZWQgdmVyc2lvbiBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGluc3RhbmNlLWlkLXRvLWNsb25lPVwiaWQxXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpbnN0YW5jZUlkVG9DbG9uZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEVkaXQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25FZGl0QnV0dG9uQ2xpY2tlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlsdGVyQ2hhbmdlZD1cIm9uRmlsdGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlsdGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50PVwib25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD1cIm9uTWFya1NlbGVjdGlvbkNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIHBhcmFtZXRlciBoYXMgaGFkIGl0cyB2YWx1ZSBtb2RpZmllZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tQYXJhbWV0ZXJdXSBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uUGFyYW1ldGVyQ2hhbmdlZD1cIm9uUGFyYW1ldGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uUGFyYW1ldGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSB0b29sYmFyIGJ1dHRvbiBvciBjb250cm9sIGJlY29tZXMgYXZhaWxhYmxlIG9yIGJlY29tZXMgdW5hdmFpbGFibGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPVwib25Ub29sYmFyU3RhdGVDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBTZWUgdGhlIHtAbGluayBVcmxBY3Rpb25FdmVudH0gY2xhc3MuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25VcmxBY3Rpb249XCJvblVybEFjdGlvbkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVXJsQWN0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVGFiU3dpdGNoZWQ9XCJvblRhYlN3aXRjaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25UYWJTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrXG4gICAqIGZ1bmN0aW9uIGZvciB7QGxpbmsgRmlyc3RJbnRlcmFjdGl2ZX0gKGlmIGFueSkgaGFzIGJlZW4gY2FsbGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld0xvYWRlZD1cIm9uQ3VzdG9tVmlld0xvYWRlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld0xvYWRlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiByZW1vdmVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1JlbW92ZWQ9XCJvbkN1c3RvbVZpZXdSZW1vdmVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3UmVtb3ZlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdTYXZlZD1cIm9uQ3VzdG9tVmlld1NhdmVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2F2ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0IGFzIHRoZSBkZWZhdWx0IHZpZXcgZm9yIGEgd29ya2Jvb2suXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2V0RGVmYXVsdD1cIm9uQ3VzdG9tVmlld1NldERlZmF1bHRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdTZXREZWZhdWx0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSBuZXcgc3RvcnkgcG9pbnQgYmVjb21lcyBhY3RpdmUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdG9yeVBvaW50U3dpdGNoZWQ9XCJvblN0b3J5UG9pbnRTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3RvcnlQb2ludFN3aXRjaGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc3VtbWFyeSBkYXRhIG9uIGEgdmlzdWFsaXphdGlvbiBoYXZlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblN1bW1hcnlEYXRhQ2hhbmdlZD1cIm9uU3VtbWFyeURhdGFDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25TdW1tYXJ5RGF0YUNoYW5nZWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogKEJldGEpIFJlcHJlc2VudHMgdGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIGF1dGhvcmluZyBtb2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekF1dGhvcmluZ1NldHRpbmdzIGV4dGVuZHMgVml6U2V0dGluZ3NTaGFyZWQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIENsb3NlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgQ2xvc2UgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtY2xvc2UtYnV0dG9uIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUNsb3NlQnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGhhcyBiZWVuIHB1Ymxpc2hlZC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZD1cIm9uV29ya2Jvb2tQdWJsaXNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUHVibGlzaGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBcInB1Ymxpc2ggYXNcIiBpcyBzdWNjZXNzZnVsLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbldvcmtib29rUHVibGlzaGVkQXM9XCJvbldvcmtib29rUHVibGlzaGVkQXNIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUHVibGlzaGVkQXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT1cIm9uV29ya2Jvb2tSZWFkeVRvQ2xvc2VIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbldvcmtib29rUmVhZHlUb0Nsb3NlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlclBhcmFtZXRlcnMge1xuICBmaWVsZDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZpelBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gc2V0IFBhcmFtZXRlciB2YWx1ZXMgb24gdGhlIHZpei5cbiAqXG4gKiAqIGBgYFxuICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICogIDx2aXotcGFyYW1ldGVyIG5hbWU9XCJwYXJhbWV0ZXItbmFtZVwiIHZhbHVlPVwicGFyYW1ldGVyLXZhbHVlXCI+PC92aXotcGFyYW1ldGVyPlxuICogPC90YWJsZWF1LXZpej5cbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpQYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDdXN0b21QYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHBhc3MgYWxvbmcgc2V0dGluZ3MsIGluZm9ybWF0aW9uLCBldGMuLCB0aGF0IGFyZW4ndCBleHBvc2VkIG9uIHRoZVxuICogdGFibGVhdS12aXogZWxlbWVudC4gQ3VzdG9tUGFyYW1ldGVycyB3aWxsIG92ZXJyaWRlIGF0dHJpYnV0ZXMsIG9yIGZpbHRlcnMsIHNldCBvbiB0aGUgdGFibGVhdS12aXogZWxlbWVudC5cbiAqXG4gKiAqIGBgYFxuICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiPlxuICogIDxjdXN0b20tcGFyYW1ldGVyIG5hbWU9XCJwYXJhbWV0ZXItbmFtZVwiIHZhbHVlPVwicGFyYW1ldGVyLXZhbHVlXCI+PC9jdXN0b20tcGFyYW1ldGVyPlxuICogPC90YWJsZWF1LXZpej5cbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21QYXJhbWV0ZXIge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgZXhwb3J0aW5nIGRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0RGF0YU9wdGlvbnMge1xuICAvKipcbiAgICogRG8gbm90IHVzZSBhbGlhc2VzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBzb3VyY2UgaW4gVGFibGVhdS4gRGVmYXVsdCBpcyBmYWxzZS5cbiAgICovXG4gIGlnbm9yZUFsaWFzZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGNvbHVtbnMgdG8gaW5jbHVkZSBzcGVjaWZpZWQgYnkgZmllbGQgaWQsIGluY2x1ZGVzIGFsbCBieSBkZWZhdWx0LlxuICAgKiBUaGUgb3JkZXIgb2YgdGhlIGNvbHVtbiBpZHMgaW4gdGhlIGFycmF5IGRldGVybWluZXMgdGhlIGNvbHVtbiBvcmRlciBzaG93biBpbiB0aGUgc3VtbWFyeSBkYXRhIHRhYmxlLlxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFBERk9wdGlvbnMge1xuICBzY2FsaW5nOiBQcmludFNjYWxpbmc7XG4gIHBhZ2VTaXplOiBQcmludFBhZ2VTaXplO1xuICBvcmllbnRhdGlvbjogUHJpbnRPcmllbnRhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50IHtcbiAgY3VycmVudFNoZWV0TmFtZTogc3RyaW5nO1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21EYXNoYm9hcmQ6IEFycmF5PHN0cmluZz47XG4gIGV4cG9ydGFibGVTaGVldE5hbWVzRnJvbVdvcmtib29rOiBBcnJheTxzdHJpbmc+O1xufVxuIiwiLyoqXG4gKiBVc2VyIHN1cHBsaWVkIG9wdGlvbnMgdGhhdCBkbyBub3QgZ2V0IHBhc3NlZCBhcyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gbG9hZCBhIFRhYmxlYXUgdml6LCBUYWJsZWF1IGFza2RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFRoZSB2aXogc3JjXG4gICAqL1xuICBzcmM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHdpZHRoIGluIHBpeGVsc1xuICAgKiBDYW4gYmUgYW55IHZhbGlkIENTUyBzaXplIHNwZWNpZmllci4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHB1Ymxpc2hlZCB3aWR0aCBvZiB0aGUgdmlldy5cbiAgICovXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGhlaWdodCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgaGVpZ2h0IG9mIHRoZSB2aWV3LlxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHdlYmNvbXBvbmVudCB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdml6IGFuZCBhc2tkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbiB1c2VkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vbi1taW5pZmllZCB2ZXJzaW9uIG9mIEphdmFTY3JpcHQgaXMgbG9hZGVkLiBJZiBzcGVjaWZpZWQgKG9yIHNldCB0byB0cnVlKSwgdGhlXG4gICAqIG5vbi1taW5pZmllZCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGJvdGggdGhlIGxvY2FsIGNvbXBvbmVudCBhbmQgdGhlIFRhYmxlYXUgU2VydmVyIHZpc3VhbGl6YXRpb24gKGlmIGVuYWJsZWQpLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkIChvciBzZXQgdG8gZmFsc2UpLCB0aGUgbWluaWZpZWQgdmVyc2lvbiBvZiB0aGUgSmF2YVNjcmlwdCBmaWxlcyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgZGVidWcgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIGRlYnVnIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgdGhlIG9sZCBhdXRoIG1lY2hhbmlzbSBmb3IgYXV0aGVudGljYXRpb24gd2hpY2ggaGFwcGVucyBpbnNpZGUgdGhlIGlmcmFtZS4gSWYgc3BlY2lmaWVkLCBWaXpMb2FkRXJyb3JFdmVudHNcbiAgICogdHJpZ2dlcmVkIGR1ZSB0byBhdXRoIGZhaWx1cmVzIHdpbGwgbm90IGJlIHRocm93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdXRoIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF1dGg/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgY29tbW9uIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgdGFibGVhdSB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRBdHRyaWJ1dGVzIHtcbiAgU3JjID0gJ3NyYycsXG4gIFdpZHRoID0gJ3dpZHRoJyxcbiAgSGVpZ2h0ID0gJ2hlaWdodCcsXG4gIFRva2VuID0gJ3Rva2VuJyxcbiAgRGVidWcgPSAnZGVidWcnLFxuICBJZnJhbWVBdXRoID0gJ2lmcmFtZS1hdXRoJyxcbiAgT25WaXpMb2FkRXJyb3IgPSAnb252aXpsb2FkZXJyb3InLFxuICBGb3JjZVRva2VuU3luYyA9ICdmb3JjZS10b2tlbi1zeW5jJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIEV4dGVuc2lvbnMgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAqL1xuICBleHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgICBWaWV3aW5nID0gJ3ZpZXdpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdG8gYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWVcbi8vICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHlhcm4gcHVibGlzaDpidW1wIHZpYSBzY3JpcHRzL3B1Ymxpc2gtY2hlY2sudHNcbi8vICB1cGRhdGVJbnRlcm5hbENvbnRyYWN0UnVudGltZVZlcnNpb24gaW4gdGhlIG1vbm9yZXBvIHJvb3QuXG5pbXBvcnQgKiBhcyBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiBmcm9tICcuLi9pbnRlcm5hbC1jb250cmFjdC12ZXJzaW9uLmpzb24nO1xuZXhwb3J0IGNvbnN0IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04gPSBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjtcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1BhcmFtZXRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9WZXJicyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9JbnRlcm5hbEFwaURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuXG4vLyBFeHBvcnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIG1lc3NhZ2luZyBmb3IgY29uc3VtZXJzIHRvIHVzZS5cbi8vIEJlIHZlcnkgY2FyZWZ1bCBtYWtpbmcgYW55IHVwZGF0ZXMgdG8gdGhpcyBjb250cmFjdCB3aGljaCBicmVhayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgTUVTU0FHSU5HX1ZFUlNJT04gPSB7XG4gIG1ham9yOiAxLFxuICBtaW5vcjogMCxcbiAgZml4OiAwLFxufTtcbiIsImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9FbnVtcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVHlwZUNvbnZlcnRlciB7XG4gIHByaXZhdGUgc3RhdGljIGlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBQcmlvciB0byBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyBjb21lIHRvIHVzIGFzXG4gICAgLy8gJyVudWxsJScsICclYWxsJScsICcld2lsZGNhcmQlJywgJyVtaXNzaW5nJScuLi5cbiAgICAvLyBXaGlsZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIHRydWUgZm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29udmVyc2lvbixcbiAgICAvLyBpdCBpcyBhcyBjaGVhcCBhcyBwYXNzaW5nIGFyb3VuZCBhIHZlcnNpb24gYW5kIGNoZWNraW5nIHRoYXQuXG4gICAgLy8gKFNlZSBEYXRhVmFsdWVGb3JtYXR0ZXIuY3BwKVxuXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcubGVuZ3RoID4gMiAmJiB2YWx1ZUFzU3RyaW5nWzBdID09PSAnJScgJiYgdmFsdWVBc1N0cmluZ1t2YWx1ZUFzU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnJScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzcGVjaWFsVmFsdWVJbmRpY2F0b3IgPSAnJW51bGwlJztcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlQm9vbGVhbihib29sZWFuU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHtcbiAgICAvLyBib29sZWFuIHZhbHVlcyBjb21lIHRvIHVzIGFzICd0cnVlJ3wnZmFsc2UnXG4gICAgY29uc3Qgbm9ybWFsaXplZEJvb2xlYW46IHN0cmluZyA9IGJvb2xlYW5TdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZEJvb2xlYW4gIT09ICd0cnVlJyAmJiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ2ZhbHNlJyA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogbm9ybWFsaXplZEJvb2xlYW4gPT09ICd0cnVlJztcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VOdW1iZXIodmFsdWVBc1N0cmluZzogc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcih2YWx1ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZShkYXRlQXNTdHJpbmc6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBOb3RlIHRoYXQgd2l0aG91dCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDXG4gICAgLy8gSW5wdXQgb2YgMjAyMC0wMy0yNSBpcyBwcmludGVkIGFzOiBNYXIgMjQgMjAyMCAxNzowMDowMCBHTVQtMDcwMFxuICAgIC8vIFRoaXMgbWF0Y2hlcyBzdHlsZSB1c2VkIGluIGV4aXN0aW5nIGNvbnZlcnRGaWx0ZXJWYWx1ZVByZXNNb2RlbFxuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZGF0ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGVUaW1lKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIFdpdGggYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQy5cbiAgICAvLyBPdXIgZGF0ZSBmb3JtYXQgaXMgYWx3YXlzOiB5eXl5LW1tLWRkIGhoOm1tOnNzXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgSUUxMSBjYW4ndCBwYXJzZSB0aGF0IGZvcm1hdCBzbyB3ZSBhZGQgYSBUIGJldHdlZW4gdGhlIGRheSBhbmQgdGltZS5cbiAgICAvLyBXZSBhbHNvIGFkZCBhIFogc28gdGhhdCBpdCBpcyBVVEMuIChXaXRob3V0IHRoZSBaLCBzb21lIGJyb3dzZXJzIGFzc3VtZSBsb2NhbCwgYW5kIG90aGVycyBVVEMpXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0ZVN0cmluZzogc3RyaW5nID0gZGF0ZUFzU3RyaW5nLnJlcGxhY2UoJyAnLCAnVCcpLmNvbmNhdCgnWicpO1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZm9ybWF0dGVkRGF0ZVN0cmluZyk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xuICB9XG5cbiAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZXJnZSB0aGlzIGFuZCB0aGUgbWV0aG9kIEZpbHRlckNvbnZlcnRlcjo6Y29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsIGluIGFwaS1wbGF0Zm9ybS1qc1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyBpcyBib3RoIERhdGFEaWN0aW9uYXJ5IGFuZCBTaG93RGF0YVRhYmxlUHJlc01vZGVsIGNvbXBhdGlibGUuXG4gICAgLy8gSW4gdGhlIERhdGFEaWN0aW9uYXJ5LCB2YWx1ZUFzU3RyaW5nIGNhbiBiZSAnJW51bGwlJyBvciAnJW1pc3NpbmclJywgd2hpbGUgaW5cbiAgICAvLyBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCB3ZSBjYW4gZ2V0ICdudWxsJyBvciAnbWlzc2luZycsIG9yICclbnVsbCUnIGZvciBzdHJpbmcgc3BlY2lhbCB2YWx1ZXMuXG4gICAgLy8gRm9yIGVpdGhlciBvZiB0aGVzZSBjYXNlcywgd2UgcmV0dXJuIHNwZWNpYWxWYWx1ZUluZGljYXRvciAob3IgdGhlIG9yaWdpbmFsIHNwZWNpYWwgc3RyaW5nKS5cbiAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbHR5LCB0aGlzIGNvbnZlcnRlcjpcbiAgICAvLyAxLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgc3BlY2lhbCB2YWx1ZXNcbiAgICAvLyAyLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgZGF0ZVxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggdmFsdWVzIGNhbiBiZSB1bmRlZmluZWQsIHNvIHJlc3VsdCBpcyBhbHNvIHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZUFzU3RyaW5nID09PSB1bmRlZmluZWQgfHwgdmFsdWVBc1N0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NwZWNpYWwodmFsdWVBc1N0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJvb2xlYW4odmFsdWVBc1N0cmluZyk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgLy8gUmV0dXJuIHNwZWNpYWwgdmFsdWUgJyVudWxsJScgZm9yIGFueSBmYWlsdXJlIGluIHBhcnNpbmcuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgd2lsbCBnaXZlIHVzIHN0cmluZ3MgbGlrZSAnbnVsbCdcbiAgICAgICAgLy8gZm9yIHNwZWNpYWwgdmFsdWVzLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAvLyBGb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgd2lsbCBiZSBcIm51bGxcIiB3aGljaCB3aWxsIGZhaWwgdG8gcGFyc2UuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuICclbnVsbCUnLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWVBc1N0cmluZykgPT09IG51bGwgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlQXNTdHJpbmc7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJSdcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlVGltZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWVBc1N0cmluZztcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBjb252ZXJ0cyBmcm9tIG91ciAxLjIgQVBJIHRoYXQgcmV0dXJucyBzdHJpbmdzIGZvciBzcGVjaWFscywgYW5kIGRhdGVzIGFzIHN0cmluZ3MuXG4gICAgLy8gSXQgdGFrZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiAnJW51bGwlJyBhbmQgcmV0dXJucyBhIG51bGwuXG4gICAgLy8gRm9yIGRhdGVzLCBpdCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcuXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBzaG91bGQgYmUgdXNlZCB0byBidWlsZCBhIERhdGFWYWx1ZS5uYXRpdmVWYWx1ZSBmaWVsZC5cblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IGNhbiBiZSB1bmRlZmluZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG5hdGl2ZVZhbHVlIGlzIHRyZWF0ZWQgbGlrZSBhIHNwZWNpYWxcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBEYXRlIG9iamVjdCAob3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzIC4uLiB3ZSBhc3N1bWUgc3BlY2lhbClcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3BlY2lhbCh2YWx1ZSkgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3BhdGlhbDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGRpcmVjdGx5IHRvIG5hdGl2ZSB2YWx1ZSBmb3IgYWxsIHR5cGVzXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh0aGlzLmNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZSwgdHlwZSksIHR5cGUpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBFeHRlbnNpb25Db250ZXh0IHtcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgU2VydmVyID0gJ3NlcnZlcicsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgVmlld2luZyA9ICd2aWV3aW5nJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gQW5ub3RhdGVFbnVtIHtcbiAgTWFyayA9ICdtYXJrJyxcbiAgUG9pbnQgPSAncG9pbnQnLFxuICBBcmVhID0gJ2FyZWEnLFxufVxuXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcbiAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG5leHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgQmxhbmsgPSAnYmxhbmsnLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgUXVpY2tGaWx0ZXIgPSAncXVpY2stZmlsdGVyJyxcbiAgUGFyYW1ldGVyQ29udHJvbCA9ICdwYXJhbWV0ZXItY29udHJvbCcsXG4gIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICBMZWdlbmQgPSAnbGVnZW5kJyxcbiAgVGl0bGUgPSAndGl0bGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBJbWFnZSA9ICdpbWFnZScsXG4gIFdlYlBhZ2UgPSAnd2ViLXBhZ2UnLFxuICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbn1cblxuZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgSW50ID0gJ2ludCcsXG4gIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgQm9vbCA9ICdib29sJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgU3BhdGlhbCA9ICdzcGF0aWFsJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICBXaW5kb3cgPSAnd2luZG93JyxcbiAgTW9kYWwgPSAnbW9kYWwnLFxuICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG59XG5cbmV4cG9ydCBlbnVtIEVuY29kZWREYXRhVHlwZSB7XG4gIE51bWJlciA9ICdudW1iZXInLFxuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgQm9vbGVhbiA9ICdib29sZWFuJyxcbn1cblxuZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gIElOSVRJQUxJWkFUSU9OX0VSUk9SID0gJ2luaXRpYWxpemF0aW9uLWVycm9yJyxcbiAgSU5URVJOQUxfRVJST1IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICBNSVNTSU5HX0VOVU1fTUFQUElORyA9ICdtaXNzaW5nLWVudW0tbWFwcGluZycsXG4gIE1JU1NJTkdfUEFSQU1FVEVSID0gJ21pc3NpbmctcGFyYW1ldGVyJyxcbiAgUEVSTUlTU0lPTl9ERU5JRUQgPSAncGVybWlzc2lvbi1kZW5pZWQnLFxuICBQUkVTX01PREVMX1BBUlNJTkdfRVJST1IgPSAncHJlcy1tb2RlbC1wYXJzaW5nLWVycm9yJyxcbiAgVkVSU0lPTl9OT1RfQ09ORklHVVJFRCA9ICd2ZXJzaW9uLW5vdC1jb25maWd1cmVkJyxcbiAgVklTSUJJTElUWV9FUlJPUiA9ICd2aXNpYmlsaXR5LWVycm9yJyxcbiAgVU5LTk9XTl9WRVJCX0lEID0gJ3Vua25vd24tdmVyYi1pZCcsXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgU3VtID0gJ3N1bScsXG4gIEF2ZyA9ICdhdmcnLFxuICBNaW4gPSAnbWluJyxcbiAgTWF4ID0gJ21heCcsXG4gIFN0ZGV2ID0gJ3N0ZGV2JyxcbiAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gIFZhciA9ICd2YXInLFxuICBWYXJwID0gJ3ZhcnAnLFxuICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICBDb3VudCA9ICdjb3VudCcsXG4gIENvdW50ZCA9ICdjb3VudGQnLFxuICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgQXR0ciA9ICdhdHRyJyxcbiAgTm9uZSA9ICdub25lJyxcbiAgWWVhciA9ICd5ZWFyJyxcbiAgUXRyID0gJ3F0cicsXG4gIE1vbnRoID0gJ21vbnRoJyxcbiAgRGF5ID0gJ2RheScsXG4gIEhvdXIgPSAnaG91cicsXG4gIE1pbnV0ZSA9ICdtaW51dGUnLFxuICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgV2VlayA9ICd3ZWVrJyxcbiAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICBNZHkgPSAnbWR5JyxcbiAgRW5kID0gJ2VuZCcsXG4gIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICBRdWFydDEgPSAncXVhcnQxJyxcbiAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICBJbk91dCA9ICdpbi1vdXQnLFxuICBVc2VyID0gJ3VzZXInLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZFJvbGVUeXBlIHtcbiAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gIE1lYXN1cmUgPSAnbWVhc3VyZScsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbi8qKlxuICogIFRoZSBkaWZmZXJlbnQgdXBkYXRlIHR5cGVzIGZvciBhcHBseWluZyBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlclVwZGF0ZVR5cGUge1xuICBBZGQgPSAnYWRkJyxcbiAgQWxsID0gJ2FsbCcsXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG4gIFJlbW92ZSA9ICdyZW1vdmUnLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFR5cGUge1xuICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgU3RvcnkgPSAnc3RvcnknLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0Jyxcbn1cblxuZXhwb3J0IGVudW0gRG9tYWluUmVzdHJpY3Rpb25UeXBlIHtcbiAgQWxsID0gJ2FsbCcsXG4gIExpc3QgPSAnbGlzdCcsXG4gIFJhbmdlID0gJ3JhbmdlJyxcbn1cblxuZXhwb3J0IGVudW0gRGF0ZVN0ZXBQZXJpb2Qge1xuICBZZWFycyA9ICd5ZWFycycsXG4gIFF1YXJ0ZXJzID0gJ3F1YXJ0ZXJzJyxcbiAgTW9udGhzID0gJ21vbnRocycsXG4gIFdlZWtzID0gJ3dlZWtzJyxcbiAgRGF5cyA9ICdkYXlzJyxcbiAgSG91cnMgPSAnaG91cnMnLFxuICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICBTZWNvbmRzID0gJ3NlY29uZHMnLFxufVxuXG4vKipcbiAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZy5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gIE51bGxWYWx1ZXMgPSAnbnVsbHZhbHVlcycsXG4gIE5vbk51bGxWYWx1ZXMgPSAnbm9ubnVsbHZhbHVlcycsXG4gIEFsbFZhbHVlcyA9ICdhbGx2YWx1ZXMnLFxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGZpbHRlciBkb21haW5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyRG9tYWluVHlwZSB7XG4gIFJlbGV2YW50ID0gJ3JlbGV2YW50JyxcbiAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdGlvbiB0eXBlIGZvciBzZWxlY3QgbWFya3MgYXBpLlxuICovXG5leHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgUmVwbGFjZSA9ICdzZWxlY3QtcmVwbGFjZScsXG4gIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBzZWxlY3QgdHVwbGVzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0T3B0aW9ucyB7XG4gIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICBUb2dnbGUgPSAnc2VsZWN0LW9wdGlvbnMtdG9nZ2xlJyxcbiAgTWVudSA9ICdzZWxlY3Qtb3B0aW9ucy1tZW51JywgLy8gbm90IGltcGxlbWVudGVkIGluIHRoZSBleHRlcm5hbCBjb250cmFjdFxuICBSYW5nZSA9ICdzZWxlY3Qtb3B0aW9ucy1yYW5nZScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgU2VhcmNoID0gJ3NlbGVjdC1vcHRpb25zLXNlYXJjaCcsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3Rcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBpbmNsdWRlZCB2YWx1ZXMgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcyB7XG4gIEluY2x1ZGVOdWxsID0gJ2luY2x1ZGUtbnVsbCcsXG4gIEluY2x1ZGVOb25OdWxsID0gJ2luY2x1ZGUtbm9uLW51bGwnLFxuICBJbmNsdWRlQWxsID0gJ2luY2x1ZGUtYWxsJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIGEgaGllcmFyY2hpY2FsIGxldmVsIHNlbGVjdGlvbiBzdGF0ZS5cbiAqL1xuZXhwb3J0IGVudW0gSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gIEFsbFNlbGVjdGVkID0gJ2FsbC1zZWxlY3RlZCcsXG4gIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgU29tZVNlbGVjdGVkID0gJ3NvbWUtc2VsZWN0ZWQnLFxuICBVbmtub3duU2VsZWN0ZWQgPSAndW5rbm93bi1zZWxlY3RlZCcsXG59XG5cbi8qKlxuICogVHlwZSBvZiBtYXJrIGZvciBhIGdpdmVuIG1hcmtzIGNhcmQgaW4gYSB2aXouXG4gKi9cbmV4cG9ydCBlbnVtIE1hcmtUeXBlIHtcbiAgQmFyID0gJ2JhcicsXG4gIExpbmUgPSAnbGluZScsXG4gIEFyZWEgPSAnYXJlYScsXG4gIFNxdWFyZSA9ICdzcXVhcmUnLFxuICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBNYXAgPSAnbWFwJyxcbiAgUGllID0gJ3BpZScsXG4gIEdhbnR0QmFyID0gJ2dhbnR0LWJhcicsXG4gIFBvbHlnb24gPSAncG9seWdvbicsXG4gIEhlYXRtYXAgPSAnaGVhdG1hcCcsXG4gIFZpekV4dGVuc2lvbiA9ICd2aXotZXh0ZW5zaW9uJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGZpbHRlclxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgQ2F0ZWdvcmljYWwgPSAnY2F0ZWdvcmljYWwnLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZURhdGUnLFxuICBIaWVyYXJjaGljYWwgPSAnaGllcmFyY2hpY2FsJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBEYXRlUmFuZ2VUeXBlIG9mIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZVJhbmdlVHlwZSB7XG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGxhc3QgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0ID0gJ2xhc3QnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0TiA9ICdsYXN0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIG5leHQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0ID0gJ25leHQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0TiA9ICduZXh0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBDdXJyZW50ID0gJ2N1cnJlbnQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIGV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY3VycmVudCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIFRvRGF0ZSA9ICd0b0RhdGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsYXVuY2hpbmcgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICovXG5leHBvcnQgZW51bSBFeHRlbnNpb25EaWFsb2dSZXN1bHQge1xuICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgSW52YWxpZERvbWFpbiA9ICdpbnZhbGlkLWRvbWFpbicsXG4gIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG59XG5cbi8vIEVudW1lcmF0aW9uIGZvciBBcGlTaG93RGF0YSB0YWJsZSBpZCBzZW50aW5lbHMuXG5leHBvcnQgZW51bSBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwge1xuICAvLyBmaW5kIHRoZSBvbmUgbG9naWNhbCB0YWJsZSAtIHVzZWQgaW4gdmVyc2lvbiBjb21wYXRpYmlsaXR5IGNoZWNrIGZvciBnZXRVbmRlcmx5aW5nRGF0YVRhYmxlIGFuZCBnZXRMb2dpY2FsRGF0YVRhYmxlIGNvbW1hbmRzXG4gIFNpbmdsZVRhYmxlSWQgPSAnc2luZ2xlLXRhYmxlLWlkLXNlbnRpbmVsJyxcbiAgU2luZ2xlVGFibGVDYXB0aW9uID0gJ1NpbmdsZSB0YWJsZSBpZCBzZW50aW5lbCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBvcHRpbWl6ZSB0aGUgZ2V0U3VtbWFyeURhdGEvZ2V0VW5kZXJseWluZ1RhYmxlRGF0YSByZXN1bHRzXG4gKiBNYXBwZWQgZnJvbSBleHRlcm5hbCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvblxuICovXG5leHBvcnQgZW51bSBBcGlTaG93RGF0YVRhYmxlRm9ybWF0IHtcbiAgTmF0aXZlVmFsdWVzT25seSA9ICduYXRpdmUtdmFsdWVzLW9ubHknLFxuICBGb3JtYXR0ZWRWYWx1ZXNPbmx5ID0gJ2Zvcm1hdHRlZC12YWx1ZXMtb25seScsXG4gIE5hdGl2ZUFuZEZvcm1hdHRlZFZhbHVlcyA9ICduYXRpdmUtYW5kLWZvcm1hdHRlZC12YWx1ZXMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gZGVub3RlIHRoZSBzZWN0aW9ucyBvZiBmb3JtYXR0aW5nIHdpdGhpbiB0YWJsZWF1XG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIENsYXNzTmFtZUtleSB7XG4gIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgV29ya3NoZWV0ID0gJ3RhYmxlYXUtd29ya3NoZWV0JyxcbiAgVG9vbHRpcCA9ICd0YWJsZWF1LXRvb2x0aXAnLFxuICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICBEYXNoYm9hcmRUaXRsZSA9ICd0YWJsZWF1LWRhc2hib2FyZC10aXRsZScsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgcGFnZSBzaXplIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTaXplT3B0aW9uIHtcbiAgTGV0dGVyID0gJ2xldHRlcicsXG4gIExlZ2FsID0gJ2xlZ2FsJyxcbiAgTm90ZSA9ICdub3RlJyxcbiAgRm9saW8gPSAnZm9saW8nLFxuICBUYWJsb2lkID0gJ3RhYmxvaWQnLFxuICBMZWRnZXIgPSAnbGVkZ2VyJyxcbiAgU3RhdGVtZW50ID0gJ3N0YXRlbWVudCcsXG4gIEV4ZWN1dGl2ZSA9ICdleGVjdXRpdmUnLFxuICBBMyA9ICdhMycsXG4gIEE0ID0gJ2E0JyxcbiAgQTUgPSAnYTUnLFxuICBCNCA9ICdiNCcsXG4gIEI1ID0gJ2I1JyxcbiAgUXVhcnRvID0gJ3F1YXJ0bycsXG4gIFVuc3BlY2lmaWVkID0gJ3Vuc3BlY2lmaWVkJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIHNldCB0aGUgcGFnZSBvcmllbnRhdGlvbiBtb2RlIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VPcmllbnRhdGlvbiB7XG4gIFByaW50ZXIgPSAncHJpbnRlcicsXG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgc2NhbGUgbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBTY2FsZU1vZGUge1xuICBTY2FsZUF1dG8gPSAnYXV0bycsXG4gIFNjYWxlUGVyY2VudGFnZSA9ICdwZXJjZW50JyxcbiAgU2NhbGVGaXRQYWdlcyA9ICdmaXQtcGFnZXMnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgcGVyY2VudCB2YWx1ZXNcbiAqL1xuZXhwb3J0IGVudW0gUGFnZVNjYWxpbmdPcHRpb24ge1xuICBTY2FsZVBjdEF1dG8gPSAnYXV0bycsXG4gIFNjYWxlUGN0NDAwID0gJ3BjdDQwMCcsXG4gIFNjYWxlUGN0MjAwID0gJ3BjdDIwMCcsXG4gIFNjYWxlUGN0MTAwID0gJ3BjdDEwMCcsXG4gIFNjYWxlUGN0OTAgPSAncGN0OTAnLFxuICBTY2FsZVBjdDgwID0gJ3BjdDgwJyxcbiAgU2NhbGVQY3Q3NSA9ICdwY3Q3NScsXG4gIFNjYWxlUGN0NjAgPSAncGN0NjAnLFxuICBTY2FsZVBjdDUwID0gJ3BjdDUwJyxcbiAgU2NhbGVQY3QyNSA9ICdwY3QyNScsXG59XG5cbi8qKlxuICogVXNlZCBieSBzZXRGaXRBbmRTY2FsZVZhbHVlcyB0byBzY2FsZSBmaXQgcGFnZSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGVudW0gRml0UGFnZXMge1xuICBGaXRPbmVIaWdoID0gJ2ZpdDB4MScsXG4gIEZpdFR3b0hpZ2ggPSAnZml0MHgyJyxcbiAgRml0T25lV2lkZSA9ICdmaXQxeDAnLFxuICBGaXRUd29XaWRlID0gJ2ZpdDJ4MCcsXG59XG5cbi8qKlxuICogVXNlZCBieSBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmNcbiAqL1xuZXhwb3J0IGVudW0gRW5jb2RpbmdUeXBlIHtcbiAgQ29sb3IgPSAnY29sb3InLFxuICBTaXplID0gJ3NpemUnLFxuICBMYWJlbCA9ICdsYWJlbCcsXG4gIERldGFpbCA9ICdkZXRhaWwnLFxuICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICBTaGFwZSA9ICdzaGFwZScsXG4gIFBhdGggPSAncGF0aCcsXG4gIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgR2VvbWV0cnkgPSAnZ2VvbWV0cnknLFxuICBDdXN0b20gPSAnY3VzdG9tJyxcbn1cbiIsImV4cG9ydCBlbnVtIE5vdGlmaWNhdGlvbklkIHtcbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51Q2xpY2tlZCA9ICdjdXN0b20tbWFyay1jb250ZXh0LW1lbnUtY2xpY2tlZCcsXG4gIENvbnRleHRNZW51Q2xpY2sgPSAnY29udGV4dC1tZW51LWNsaWNrJyxcbiAgQ3VzdG9tVmlld1JlbW92ZWQgPSAnY3VzdG9tLXZpZXctcmVtb3ZlZCcsXG4gIEN1c3RvbVZpZXdTYXZlZCA9ICdjdXN0b20tdmlldy1zYXZlZCcsXG4gIEN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ2N1c3RvbS12aWV3LXNldC1kZWZhdWx0JyxcbiAgQ3VzdG9tVmlld3NMb2FkZWQgPSAnY3VzdG9tLXZpZXdzLWxvYWRlZCcsXG4gIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcbiAgRWRpdEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1idXR0b24tY2xpY2tlZCcsXG4gIEVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ2VkaXQtaW4tZGVza3RvcC1idXR0b24tY2xpY2tlZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSA9ICdleHRlbnNpb24tZGlhbG9nLXVwZGF0ZScsXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyLWNoYW5nZWQnLFxuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdC12aXotc2l6ZS1rbm93bicsXG4gIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyLWNoYW5nZWQnLFxuICBTZWxlY3RlZE1hcmtzQ2hhbmdlZCA9ICdzZWxlY3RlZC1tYXJrcy1jaGFuZ2VkJyxcbiAgU2V0dGluZ3NDaGFuZ2VkID0gJ3NldHRpbmdzLWNoYW5nZWQnLFxuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeS1kYXRhLWNoYW5nZWQnLFxuICBUZXN0Q29udmVyc2lvbk5vdGlmaWNhdGlvbiA9ICd0ZXN0LWNvbnZlcnNpb24tbm90aWZpY2F0aW9uJyxcbiAgVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICd0b29sYmFyLXN0YXRlLWNoYW5nZWQnLFxuICBWaXpJbnRlcmFjdGl2ZSA9ICd2aXotaW50ZXJhY3RpdmUnLFxuICBBc2tEYXRhSW50ZXJhY3RpdmUgPSAnYXNrLWRhdGEtaW50ZXJhY3RpdmUnLFxuICBXb3JrYm9va1JlYWR5VG9DbG9zZSA9ICd3b3JrYm9vay1yZWFkeS10by1jbG9zZScsXG4gIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgV29ya2Jvb2tQdWJsaXNoZWQgPSAnd29ya2Jvb2stcHVibGlzaGVkJyxcbiAgV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICd3b3JrYm9vay1wdWJsaXNoZWQtYXMnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwID0gJ2V4cG9ydC1jcm9zc3RhYi1zaGVldC1tYXAnLFxuICBFeHBvcnRGaWxlID0gJ2V4cG9ydC1maWxlJyxcbiAgRXhwb3J0T3JpZ2luVXJsID0gJ2V4cG9ydC1vcmlnaW4tdXJsJyxcbiAgRXhwb3J0UGRmT3B0aW9ucyA9ICdleHBvcnQtcGRmLW9wdGlvbnMnLFxuICBFeHRlbnNpb25Cb290c3RyYXBJbmZvID0gJ2V4dGVuc2lvbi1ib290c3RyYXAtaW5mbycsXG4gIEV4dGVuc2lvbkNvbnRleHRNZW51SWRzID0gJ2V4dGVuc2lvbi1jb250ZXh0LW1lbnUtaWRzJyxcbiAgRXh0ZW5zaW9uRGlhbG9nSCA9ICdleHRlbnNpb24tZGlhbG9nLWhlaWdodCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1BheWxvYWQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1wYXlsb2FkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0ID0gJ2V4dGVuc2lvbi1kaWFsb2ctcmVzdWx0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nU3R5bGUgPSAnZXh0ZW5zaW9uLWRpYWxvZy1zdHlsZScsXG4gIEV4dGVuc2lvbkRpYWxvZ1VybCA9ICdleHRlbnNpb24tZGlhbG9nLXVybCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1cgPSAnZXh0ZW5zaW9uLWRpYWxvZy13aWR0aCcsXG4gIEV4dGVuc2lvbkxvY2F0b3IgPSAnZXh0ZW5zaW9uLWxvY2F0b3InLFxuICBFeHRlbnNpb25TZXR0aW5nc0luZm8gPSAnZXh0ZW5zaW9uLXNldHRpbmdzLWluZm8nLFxuICBFeHRlbnNpb25ab25lSWQgPSAnZXh0ZW5zaW9uLXpvbmUtaWQnLFxuICBFeHRlcm5hbE1lbnVEZXNjcmlwdGlvbiA9ICdleHRlcm5hbC1tZW51LWRlc2NyaXB0aW9uJyxcbiAgRXh0ZXJuYWxNZW51SGVhZGVyID0gJ2V4dGVybmFsLW1lbnUtaGVhZGVyJyxcbiAgRXh0ZXJuYWxNZW51SXRlbURpc3BsYXlOYW1lID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1kaXNwbGF5LW5hbWUnLFxuICBFeHRlcm5hbE1lbnVJdGVtSWQgPSAnZXh0ZXJuYWwtbWVudS1pdGVtLWlkJyxcblxuICBGaWVsZCA9ICdmaWVsZCcsXG4gIEZpZWxkSWQgPSAnZmllbGQtaWQnLFxuICBGaWVsZE5hbWUgPSAnZmllbGQtbmFtZScsXG4gIEZpbHRlckxldmVscyA9ICdmaWx0ZXItbGV2ZWxzJyxcbiAgRmlsdGVyUmFuZ2VNYXggPSAnZmlsdGVyLXJhbmdlLW1heCcsXG4gIEZpbHRlclJhbmdlTWluID0gJ2ZpbHRlci1yYW5nZS1taW4nLFxuICBGaWx0ZXJSYW5nZU51bGxPcHRpb24gPSAnZmlsdGVyLXJhbmdlLW51bGwtb3B0aW9uJyxcbiAgRmlsdGVyVXBkYXRlVHlwZSA9ICdmaWx0ZXItdXBkYXRlLXR5cGUnLFxuICBGaWx0ZXJWYWx1ZXMgPSAnZmlsdGVyLXZhbHVlcycsXG4gIEZvbnROYW1lTGlzdEl0ZW1zID0gJ2ZvbnQtbmFtZS1saXN0LWl0ZW1zJyxcbiAgRm9ybWF0dGVkVGV4dCA9ICdmb3JtYXR0ZWQtdGV4dCcsXG4gIEZ1bmN0aW9uTmFtZSA9ICdmdW5jdGlvbi1uYW1lJyxcblxuICBIaWVyVmFsU2VsZWN0aW9uTW9kZWxzID0gJ2hpZXJhcmNoaWNhbFZhbHVlU2VsZWN0aW9uTW9kZWxzJyxcbiAgSGlnaGxpZ2h0ZWREYXRhID0gJ2hpZ2hsaWdodGVkLWRhdGEnLFxuICBIb3ZlclR1cGxlSW50ZXJhY3Rpb24gPSAnaG92ZXItdHVwbGUtaW50ZXJhY3Rpb24nLFxuXG4gIElnbm9yZUFsaWFzZXMgPSAnaWdub3JlLWFsaWFzZXMnLFxuICBJZ25vcmVTZWxlY3Rpb24gPSAnaWdub3JlLXNlbGVjdGlvbicsXG4gIEluY2x1ZGVBbGxDb2x1bW5zID0gJ2luY2x1ZGUtYWxsLWNvbHVtbnMnLFxuICBJbnZhbGlkQWdnRmllbGROYW1lID0gJ2ludmFsaWQtYWdnLWZpZWxkLW5hbWUnLFxuICBJbnZhbGlkRGF0ZXMgPSAnaW52YWxpZC1kYXRlcycsXG4gIEludmFsaWRGaWVsZENhcHRpb24gPSAnaW52YWxpZC1maWVsZC1jYXB0aW9uJyxcbiAgSW52YWxpZEZpZWxkcyA9ICdpbnZhbGlkLWZpZWxkcycsXG4gIEludmFsaWRWYWx1ZXMgPSAnaW52YWxpZC12YWx1ZXMnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXhIZWlnaHQgPSAnbWF4LWhlaWdodCcsXG4gIE1heFJvd3MgPSAnbWF4LXJvd3MnLFxuICBNYXhXaWR0aCA9ICdtYXgtd2lkdGgnLFxuICBNaW5IZWlnaHQgPSAnbWluLWhlaWdodCcsXG4gIE1pbldpZHRoID0gJ21pbi13aWR0aCcsXG5cbiAgUGFnZVJvd0NvdW50ID0gJ3BhZ2Utcm93LWNvdW50JyxcbiAgUGFyYW1ldGVyQ2FwdGlvbiA9ICdwYXJlbWV0ZXItY2FwdGlvbicsXG4gIFBhcmFtZXRlckVycm9yID0gJ3BhcmFtZXRlci1lcnJvcicsXG4gIFBhcmFtZXRlckZpZWxkTmFtZSA9ICdwYXJhbWV0ZXItZmllbGQtbmFtZScsXG4gIFBhcmFtZXRlckluZm8gPSAncGFyYW1ldGVyLWluZm8nLFxuICBQYXJhbWV0ZXJJbmZvcyA9ICdwYXJhbWV0ZXItaW5mb3MnLFxuICBQYXJhbWV0ZXJWYWx1ZSA9ICdwYXJhbWV0ZXItdmFsdWUnLFxuICBQZXJpb2RUeXBlID0gJ3BlcmlvZC10eXBlJyxcblxuICBRdWFudGl0YXRpdmVEb21haW4gPSAncXVhbnRpdGF0aXZlLWRtYWluJyxcbiAgUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVscyA9ICdxdWFudGF0aXZlUmFuZ2VTZWxlY3Rpb25Nb2RlbHMnLFxuXG4gIFJhbmdlTiA9ICdyYW5nZS1uJyxcbiAgUmVwbGF5U3BlZWQgPSAncmVwbGF5LXNwZWVkJyxcblxuICBTZWxlY3RlZERhdGEgPSAnc2VsZWN0ZWQtZGF0YScsXG4gIFNlbGVjdGVkU2hlZXROYW1lcyA9ICdzZWxlY3RlZC1zaGVldC1uYW1lcycsXG4gIFNlbGVjdGlvbiA9ICdzZWxlY3Rpb24nLFxuICBTZWxlY3Rpb25MaXN0ID0gJ3NlbGVjdGlvbi1saXN0JyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSA9ICdzZWxlY3Rpb25VcGRhdGVUeXBlJyxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24gPSAnc2VsZWN0LXR1cGxlcy1pbnRlcmFjdGlvbicsXG4gIFNlbmROb3RpZmljYXRpb25zID0gJ3NlbmQtbm90aWZpY2F0aW9ucycsXG4gIFNldHRpbmdzVmFsdWVzID0gJ3NldHRpbmdzLXZhbHVlcycsXG4gIFNoYXJlZEZpbHRlclNoZWV0cyA9ICdzaGFyZWQtZmlsdGVyLXNoZWV0cycsXG4gIFNoYXJlZEZpbHRlcnNJbmZvID0gJ3NoYXJlZC1maWx0ZXJzLWluZm8nLFxuICBTaGVldElkZW50aWZpZXIgPSAnc2hlZXQtaWRlbnRpZmllcicsXG4gIFNoZWV0TmFtZSA9ICdzaGVldC1uYW1lJyxcbiAgU2hlZXRQYXRoID0gJ3NoZWV0LXBhdGgnLFxuICBTaG91bGRSZWZyZXNoRFMgPSAnc2hvdWxkLXJlZnJlc2gtZHMnLFxuICBTaG93RGF0YVRhYmxlRm9ybWF0ID0gJ3Nob3ctZGF0YS10YWJsZS1mb3JtYXQnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb29sdGlwQ29udGV4dCA9ICd0b29sdGlwLWNvbnRleHQnLFxuICBUb29sdGlwVGV4dFJlcXVlc3QgPSAndG9vbHRpcC10ZXh0LXJlcXVlc3QnLFxuICBUb29sdGlwVGV4dCA9ICd0b29sdGlwLXRleHQnLFxuXG4gIFVuZGVybHlpbmdEYXRhVGFibGUgPSAndW5kZXJseWluZy1kYXRhLXRhYmxlJyxcbiAgVW5kZXJseWluZ1N1bW1hcnlEYXRhVGFibGUgPSAndW5kZXJseWluZy1zdW1tYXJ5LWRhdGEtdGFibGUnLFxuICBVcmwgPSAndXJsJyxcbiAgVXNlVGFiRGVsaW1pdGVycyA9ICd1c2UtdGFiLWRlbGltaXRlcnMnLFxuXG4gIFZpZXdEYXRhVGFibGVDYWNoZUlkID0gJ3ZpZXctZGF0YS10YWJsZS1jYWNoZS1pZCcsXG4gIFZpZXdEYXRhVGFibGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtaWQnLFxuICBWaXN1YWxJZCA9ICd2aXN1YWwtaWQnLFxuICBWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ3Zpc3VhbC1zcGVjaWZpY2F0aW9uJyxcbiAgVml6QVBJSW5wdXRKc29uID0gJ3ZpemFwaS1pbnB1dC1qc29uJyxcbiAgVml6QVBJU3RhdGVXaXRoRGF0YU1vZGVsID0gJ3ZpemFwaS1zdGF0ZS13aXRoLWRhdGEtbW9kZWwnLFxuICBWaXpBUElTdGF0ZVdhcm5pbmdNc2cgPSAndml6YXBpLXN0YXRlLXdhcm5pbmctbXNnJyxcbiAgVml6QVBJU1ZHID0gJ3ZpemFwaS1zdmcnLFxuXG4gIFdvcmtzaGVldE5hbWUgPSAnd29ya3NoZWV0LW5hbWUnLFxuICBXb3Jrc2hlZXRGaWx0ZXJzID0gJ3dvcmtzaGVldC1maWx0ZXJzJyxcblxuICBab25lSWRzVmlzaWJpbGl0eU1hcCA9ICd6b25lLWlkcy12aXNpYmlsaXR5LW1hcCcsXG59XG4iLCIvLyBEZWNsYXJlIHRoaXMga2V5IHR5cGUgYW5kIGV4cG9ydCB0aGUgTm90aWZpY2F0aW9uSWQgdG8gbWFrZSB0aGlzIGJlaGF2ZSBsaWtlIGEgc3RyaW5nIGVudW0uXG4vL1xuLy8gUExFQVNFIEtFRVAgSU4gQUxQSEFCRVRJQ0FMIE9SREVSLiBUaGlzIGhlbHBzIHdpdGggdmlzdWFsbHkgZmluZGluZyBlbnRyaWVzLCBrbm93aW5nIHdoZXJlIHRvIHB1dFxuLy8gbmV3IG9uZXMsIGFuZCBtZXJnZSBjb25mbGljdHMuXG5leHBvcnQgZW51bSBWZXJiSWQge1xuICBBY3RpdmF0ZU5leHRTdG9yeVBvaW50ID0gJ2FjdGl2YXRlLW5leHQtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1wcmV2aW91cy1zdG9yeS1wb2ludCcsXG4gIEFjdGl2YXRlU2hlZXQgPSAnYWN0aXZhdGVTaGVldCcsXG4gIEFjdGl2YXRlU3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1zdG9yeS1wb2ludCcsXG4gIEFwcGVuZEV4dGVybmFsTWVudUl0ZW0gPSAnYXBwZW5kLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIEFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXIgPSAnY2F0ZWdvcmljYWwtZmlsdGVyJyxcbiAgQXBwbHlSYW5nZUZpbHRlciA9ICdyYW5nZS1maWx0ZXInLFxuICBBcHBseVJlbGF0aXZlRGF0ZUZpbHRlciA9ICdhcHBseS1yZWxhdGl2ZS1kYXRlLUZpbHRlcicsXG4gIEF1dGhlbnRpY2F0ZSA9ICdhdXRoZW50aWNhdGUnLFxuXG4gIEJsb2NrRXh0ZW5zaW9uID0gJ2Jsb2NrLWV4dGVuc2lvbicsXG5cbiAgQ2hhbmdlUGFyYW1ldGVyVmFsdWUgPSAnY2hhbmdlLXBhcmFtZXRlci12YWx1ZScsXG4gIENoYW5nZVNoYXJlZEZpbHRlciA9ICdjaGFuZ2Utc2hhcmVkLWZpbHRlcicsXG4gIENsZWFyRmlsdGVyID0gJ2NsZWFyLWZpbHRlcicsXG4gIENsZWFyU2VsZWN0ZWRNYXJrcyA9ICdjbGVhci1zZWxlY3RlZC1tYXJrcycsXG4gIENsb3NlRGlhbG9nID0gJ2Nsb3NlLWRpYWxvZycsXG4gIENyZWF0ZUFubm90YXRpb24gPSAnY3JlYXRlLWFubm90YXRpb24nLFxuXG4gIERhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyID0gJ2Rhc2hib2FyZC1jYXRlZ29yaWNhbC1maWx0ZXInLFxuICBEaXNwbGF5RGlhbG9nID0gJ2Rpc3BsYXktZGlhbG9nJyxcbiAgRG93bmxvYWRXb3JrYm9vayA9ICdkb3dubG9hZC13b3JrYm9vaycsXG5cbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRSYW5nZURvbWFpbiA9ICdnZXQtcmFuZ2UtZG9tYWluJyxcbiAgR2V0U2VsZWN0ZWRNYXJrcyA9ICdnZXQtc2VsZWN0ZWQtbWFya3MnLFxuICBHZXRTaGFyZWRGaWx0ZXIgPSAnZ2V0LXNoYXJlZC1maWx0ZXInLFxuICBHZXRUb29sdGlwVGV4dCA9ICdnZXQtdG9vbHRpcC10ZXh0JyxcbiAgR2V0VW5kZXJseWluZ0RhdGEgPSAnZ2V0LXVuZGVybHlpbmctZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGEgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRVbmRlcmx5aW5nVGFibGVzID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlcycsXG5cbiAgSGllcmFyY2hpY2FsRmlsdGVyID0gJ2hpZXJhY2hpY2FsLWZpbHRlcicsXG5cbiAgSW5pdGlhbGl6ZUV4dGVuc2lvbiA9ICdpbml0aWFsaXplLWV4dGVuc2lvbicsXG5cbiAgTW92ZUFuZFJlc2l6ZVpvbmVzID0gJ21vdmUtYW5kLXJlc2l6ZS16b25lcycsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmV2ZXJ0U3RvcnlQb2ludCA9ICdyZXZlcnQtc3RvcnktcG9pbnQnLFxuICBSZXZlcnRXb3JrYm9vayA9ICdyZXZlcnQtd29ya2Jvb2snLFxuXG4gIFNhdmVFeHRlbnNpb25TZXR0aW5ncyA9ICdzYXZlLWV4dGVuc2lvbi1zZXR0aW5ncycsXG4gIFNhdmVXb3JrYm9va0FzQ3VzdG9tVmlldyA9ICdzYXZlLXdvcmtib29rLWFzLWN1c3RvbS12aWV3JyxcbiAgU2VsZWN0QnlWYWx1ZSA9ICdzZWxlY3QtYnktdmFsdWUnLFxuICBTZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0ID0gJ3NldC1hY3RpdmUtY3VzdG9tLXZpZXctYXMtZGVmYXVsdCcsXG4gIFNldEF1dG9VcGRhdGUgPSAnc2V0LWF1dG8tdXBkYXRlJyxcbiAgU2V0Q2xpY2tUaHJvdWdoID0gJ3NldC1jbGljay10aHJvdWdoJyxcbiAgU2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ3NldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgU2V0U2hlZXRTaXplID0gJ3NldC1zaGVldC1zaXplJyxcbiAgU2V0Wm9uZVZpc2liaWxpdHkgPSAnc2V0LXpvbmUtdmlzaWJpbGl0eScsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU2hvd0N1c3RvbVZpZXcgPSAnc2hvdy1jdXN0b20tdmlldycsXG5cbiAgVGVzdENvbnZlcnNpb25WZXJiID0gJ3Rlc3QtY29udmVyc2lvbi12ZXJiJyxcblxuICBVbmRvID0gJ3VuZG8nLFxuICBVcGRhdGVDdXN0b21WaWV3ID0gJ3VwZGF0ZS1jdXN0b20tdmlldycsXG5cbiAgVml6QVBJID0gJ3Zpei1hcGknLFxufVxuIiwiZXhwb3J0IGVudW0gQXNrRGF0YU9wdGlvbk5hbWVzIHtcbiAgdG9rZW4gPSAndG9rZW4nLFxuICBvcmlnaW4gPSAnb3JpZ2luJyxcbiAgc2hvd0VtYmVkID0gJ3Nob3dFbWJlZCcsXG4gIHNob3dQaW4gPSAnc2hvd1BpbicsXG4gIHNob3dTYXZlID0gJ3Nob3dTYXZlJyxcbiAgc2hvd1NoYXJlID0gJ3Nob3dTaGFyZScsXG4gIGRlYnVnID0gJzpqc2RlYnVnJyxcbiAgQXBpSUQgPSAnOmFwaUlEJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIEFza0RhdGFXZWJDb21wb25lbnQgPSAnOmFza0RhdGFXZWJDb21wb25lbnQnLFxufVxuIiwiZXhwb3J0IGVudW0gUHVsc2VPcHRpb25OYW1lcyB7XG4gIGVtYmVkID0gJ2VtYmVkJyxcbiAgdG9rZW4gPSAndG9rZW4nLFxuICBkaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlRXhwbG9yZUZpbHRlcicsXG4gIGxheW91dCA9ICdlbWJlZF9sYXlvdXQnLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgUHVsc2VXZWJDb21wb25lbnQgPSAnOnB1bHNlV2ViQ29tcG9uZW50Jyxcbn1cbiIsIi8qKlxuICogVGhlc2Ugc3RyaW5ncyB3ZXJlICptYW51YWxseSBjb3BpZWQqIGZyb20gdGhlIHNlcnZlcixcbiAqIHdvcmtncm91cC9zcmMvc2lsb3MvdGFibGVhdS1zZXJ2ZXIvbGlicmFyaWVzL3RhYi1jb250cm9sbGVyLXZpenFsL3NyYy9jb20vdGFibGVhdXNvZnR3YXJlL1xuICogY29udHJvbGxlci92aXpxbC9jb25zdGFudHMvUGFyYW1ldGVyS2V5cy5qYXZhI0w5XG4gKiBzaG91bGQgYmUgZXhwb3J0ZWQgaW5zdGVhZFxuICogcGFyYW1ldGVycyB0aGF0IHZpenFsIHdpbGwgYWNjZXB0IGluIGFuIGVtYmVkZGluZyBVUkxcbiAqKi9cbmVudW0gVnFsUGFyYW1ldGVyTmFtZXMge1xuICBPTkUgPSAnMScsXG4gIEFMRVJUUyA9ICc6YWxlcnRzJyxcbiAgQUxJQVMgPSAnYWxpYXMnLFxuICBBTExPV19ERUZFUlJFRF9CT09UU1RSQVAgPSAnOmFsbG93RGVmZXJyZWRCb290c3RyYXAnLFxuICBBTExPV19BVVRPR0VOX1dPUktTSEVFVF9QSE9ORV9MQVlPVVRTID0gJ2FsbG93QXV0b2dlbldvcmtzaGVldFBob25lTGF5b3V0cycsXG4gIEFQSV9JRCA9ICc6YXBpSUQnLFxuICBBUFAgPSAnOmFwcCcsXG4gIEFUVEFDSE1FTlQgPSAnYXR0YWNobWVudCcsXG4gIElTX0lQQURfQVBQID0gJ2FwcCcsXG4gIEFOSU1BVEVfVFJBTlNJVElPTiA9ICc6YW5pbWF0ZV90cmFuc2l0aW9uJyxcbiAgQVNDRU5ESU5HID0gJ2FzY2VuZGluZycsXG4gIEFVVEhFTlRJQ0FUSU9OID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQVRUUklCVVRFUyA9ICdhdHRyaWJ1dGVzJyxcbiAgQVVUSE9SSU5HX1NIRUVUID0gJzphdXRoU2hlZXQnLFxuICBBWElTID0gJ2F4aXMnLFxuICBCT09UU1RSQVBfV0hFTl9OT1RJRklFRCA9ICc6Ym9vdHN0cmFwV2hlbk5vdGlmaWVkJyxcbiAgQlJPV1NFUl9CQUNLX0JVVFRPTl9VTkRPID0gJzpicm93c2VyQmFja0J1dHRvblVuZG8nLFxuICBCUk9XU0VSX1JFTkRFUklOR19PTiA9ICdpc0Jyb3dzZXJSZW5kZXJpbmcnLFxuICBCUk9XU0VSX1JFTkRFUklOR19USFJFU0hPTEQgPSAnYnJvd3NlclJlbmRlcmluZ1RocmVzaG9sZCcsXG4gIENIQVJTRVQgPSAnY2hhcnNldCcsXG4gIENMSUVOVF9ESU1FTlNJT04gPSAnY2xpZW50RGltZW5zaW9uJyxcbiAgQ0xJRU5UX0lQID0gJ2NsaWVudF9pcCcsXG4gIENMSUVOVF9OVU0gPSAnY2xpZW50TnVtJyxcbiAgQ09MT05fRU1CRURERUQgPSAnOmVtYmVkZGVkJyxcbiAgQ09MT05fTU9CSUxFID0gJzptb2JpbGUnLFxuICBDT0xPTl9ERUVQX0xJTktJTkdfRElTQUJMRUQgPSAnOmRlZXBMaW5raW5nRGlzYWJsZWQnLFxuICBDT0xPTl9XQVRFUk1BUksgPSAnOndhdGVybWFyaycsXG4gIENPTU1FTlRTID0gJzpjb21tZW50cycsXG4gIENPTU1FTlRJTkdfRU5BQkxFRCA9ICc6Y29tbWVudGluZ0VuYWJsZWQnLFxuICBDT01NRU5USU5HX01FTlRJT05TX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdNZW50aW9ucycsXG4gIENPTk5FQ1RJT04gPSAnY29ubmVjdGlvbicsXG4gIENSRUFURURfQllfRkVBVFVSRSA9ICdjcmVhdGVkQnlGZWF0dXJlJyxcbiAgQ1JZUFRFRF9QQVNTV09SRCA9ICdjcnlwdGVkJyxcbiAgQ1NTREVCVUcgPSAnOmNzc2RlYnVnJyxcbiAgQ1NWID0gJ2NzdicsXG4gIENVU1RPTV9WSUVXUyA9ICc6Y3VzdG9tVmlld3MnLFxuICBDViA9ICc6Y3YnLFxuICBDVl9JRCA9ICdjdklkJyxcbiAgREFTSEJPQVJEX1BPUlRfU0laRSA9ICdkYXNoYm9hcmRQb3J0U2l6ZScsXG4gIERBVEFfREVUQUlMUyA9ICc6ZGF0YURldGFpbHMnLFxuICBEQVRBU09VUkNFID0gJ2RhdGFzb3VyY2UnLFxuICBERUJVRyA9ICc6ZGVidWcnLFxuICBERUxBWSA9ICc6ZGVsYXknLFxuICBERVBUSCA9ICdkZXB0aCcsXG4gIERFVklDRV9UWVBFID0gJzpkZXZpY2UnLFxuICBERVZJQ0VfUElYRUxfUkFUSU8gPSAnZGV2aWNlUGl4ZWxSYXRpbycsXG4gIERFVklDRV9QUkVWSUVXX01PREUgPSAnOmRldmljZXByZXZpZXdtb2RlJyxcbiAgRElNRU5TSU9OUyA9ICc6ZGltZW5zaW9ucycsXG4gIERJU0FCTEVfU0hBUkVEX1NFU1NJT05TID0gJzpkaXNhYmxlX3NoYXJlZF9zZXNzaW9ucycsXG4gIERJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTID0gJzpkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcycsXG4gIERJUkVDVElPTiA9ICdkaXJlY3Rpb24nLFxuICBESVNQTEFZX09WRVJMQVkgPSAnOmRpc3BsYXlfb3ZlcmxheScsXG4gIERJU1BMQVlfU0hBUkUgPSAnOmRpc3BsYXlfc2hhcmUnLFxuICBESVNQTEFZX1NQSU5ORVIgPSAnOmRpc3BsYXlfc3Bpbm5lcicsXG4gIERJU1BMQVlfU1RBVElDX0lNQUdFID0gJzpkaXNwbGF5X3N0YXRpY19pbWFnZScsXG4gIERJU1BMQVlfVEFCUyA9ICdkaXNwbGF5X3RhYnMnLFxuICBESVNQTEFZX1ZJRVdfQ09VTlQgPSAnOmRpc3BsYXlfY291bnQnLFxuICBJR05PUkVfU1RJQ0tZX1NFU1NJT04gPSAnOmlnbm9yZV9zdGlja3lfc2Vzc2lvbicsXG4gIElOQ1JFTUVOVF9WSUVXX0NPVU5UID0gJzppbmNyZW1lbnRfdmlld19jb3VudCcsXG4gIERPQ01PREUgPSAnZG9jbW9kZScsXG4gIERPTUFJTiA9ICdkb21haW4nLFxuICBET19XT1JLID0gJ2RvX3dvcmsnLFxuICBEWCA9ICdkeCcsXG4gIERZID0gJ2R5JyxcbiAgRURJVF9EQVRBX0FMRVJUID0gJzplZGl0RGF0YUFsZXJ0JyxcbiAgRU1CRUQgPSAnOmVtYmVkJyxcbiAgRU1CRURERUQgPSAnZW1iZWRkZWQnLFxuICBFTkNSWVBURUQgPSAnZW5jcnlwdGVkJyxcbiAgQVBJX0VYVEVSTkFMX1ZFUlNJT04gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFQSV9JTlRFUk5BTF9WRVJTSU9OID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBFWENMVURFID0gJ2V4Y2x1ZGUnLFxuICBFWFBPUlRfRk9STUFUID0gJzpleHBvcnRfZm9ybWF0JyxcbiAgRklFTEROQU1FID0gJ2ZpZWxkbmFtZScsXG4gIEZJRUxEX05BTUUgPSAnZmllbGRfbmFtZScsXG4gIEZJRUxEX1NFUCA9ICdmaWVsZF9zZXAnLFxuICBGSUxFID0gJ2ZpbGUnLFxuICBGSUxURVJfVElMRV9TSVpFID0gJ2ZpbHRlclRpbGVTaXplJyxcbiAgRk4gPSAnZm4nLFxuICBGT0NVUyA9ICdmb2N1cycsXG4gIEZPUkNFX0NBQ0hFID0gJ2ZvcmNlX2NhY2hlJyxcbiAgRk9STUFUID0gJ2Zvcm1hdCcsXG4gIEZPUk1BVF9EQVRBX1ZBTFVFX0xPQ0FMTFkgPSAnZm9ybWF0RGF0YVZhbHVlTG9jYWxseScsXG4gIEZST01fV0cgPSAnOmZyb21fd2cnLFxuICBHUkFQSFFMX0RBVEFCQVNFX0lEID0gJzpncmFwaFFMRGF0YWJhc2VJZCcsXG4gIEdSQVBIUUxfVEFCTEVfSUQgPSAnOmdyYXBoUUxUYWJsZUlkJyxcbiAgR1VJRCA9ICc6Z3VpZCcsXG4gIEggPSAnaCcsXG4gIEhJRERFTiA9ICdoaWRkZW4nLFxuICBISURFX0NMT1NFX0JVVFRPTiA9ICc6aGlkZUNsb3NlQnV0dG9uJyxcbiAgSElERV9FRElUX0JVVFRPTiA9ICc6aGlkZUVkaXRCdXR0b24nLFxuICBISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04gPSAnOmhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uJyxcbiAgSElHSF9EUEkgPSAnOmhpZ2hkcGknLFxuICBJTUFHRV9TSVpFX0xJTUlUID0gJ2ltYWdlU2l6ZUxpbWl0JyxcbiAgVFJBTlNQQVJFTlRfTElORV9NQVJLU19MSU1JVCA9ICd0cmFuc3BhcmVudExpbmVNYXJrTGltaXQnLFxuICBDTElFTlRfUkVOREVSX1BJWEVMX0xJTUlUID0gJ2NsaWVudFJlbmRlclBpeGVsTGltaXQnLFxuICBJTiA9ICdpbicsXG4gIElOU1RBTkNFX0lEID0gJzppaWQnLFxuICBJU19HVUVTVF9SRURJUkVDVF9GUk9NX1ZJWlBPUlRBTCA9ICc6aXNHdWVzdFJlZGlyZWN0RnJvbVZpenBvcnRhbCcsXG4gIElTX01BUktfQU5JTUFUSU9OX0VOQUJMRUQgPSAnaXNNYXJrQW5pbWF0aW9uRW5hYmxlZCcsXG4gIElTX1ZJWlBPUlRBTCA9ICc6aXNWaXpQb3J0YWwnLFxuICBJTlBVVF8gPSAnaW5wdXRfc3RyaW5nJyxcbiAgSlNERUJVRyA9ICc6anNkZWJ1ZycsXG4gIEpTT04gPSAnanNvbicsXG4gIEpTT05fT05MWSA9ICc6anNvbk9ubHknLFxuICBLRUVQRklMRSA9ICdrZWVwZmlsZScsXG4gIEtFWSA9ICdrZXknLFxuICBMQU5HVUFHRSA9ICdsYW5ndWFnZScsXG4gIExBTkdVQUdFX1JFUVVFU1RFRCA9ICc6bGFuZ3VhZ2UnLFxuICBMSU5LVEFSR0VUID0gJzpsaW5rdGFyZ2V0JyxcbiAgTE9BRF9PUkRFUl9JRCA9ICc6bG9hZE9yZGVySUQnLCAvLyB1c2VkIGZvciBQdWJsaWNcbiAgTE9BRF9ORVdFU1RfUkVWSVNJT04gPSAnOmxvYWROZXdlc3RSZXZpc2lvbicsXG4gIExPQ0FMX1BBVEhTID0gJzpsb2NhbFBhdGhzJyxcbiAgTE9DQUxFID0gJ2xvY2FsZScsXG4gIExPQ0FUSU9OX0lEID0gJ2xvY2F0aW9uaWQnLFxuICBMT0NBVElPTl9UWVBFID0gJ2xvY2F0aW9udHlwZScsXG4gIFdPUktCT09LX0xPQ0FMRSA9ICd3b3JrYm9va0xvY2FsZScsXG4gIE1BWFJPV1MgPSAnbWF4cm93cycsXG4gIE1BWF9BR0UgPSAnbWF4QWdlJyxcbiAgTUFYX1JPV1MgPSAnbWF4Um93cycsXG4gIE1FVEhPRCA9ICdtZXRob2QnLFxuICBNT0JJTEUgPSAnbW9iaWxlJyxcbiAgTU9ESUZJRVIgPSAnbW9kaWZpZXInLFxuICBOQU1FID0gJ25hbWUnLFxuICBOQVZfVFlQRSA9ICduYXZUeXBlJyxcbiAgTkFWX1NSQyA9ICduYXZTcmMnLFxuICBOT0FUVEFDSE1FTlQgPSAnbm8tYXR0YWNobWVudCcsXG4gIE5PX09WRVJXUklURSA9ICdub19vdmVyd3JpdGUnLFxuICBPUEVOX0FVVEhPUklOR19JTl9UT1BfV0lORE9XID0gJzpvcGVuQXV0aG9yaW5nSW5Ub3BXaW5kb3cnLFxuICBPUEVOSURfSEQgPSAnOm9wZW5pZF9oZCcsXG4gIE9QRU5JRF9MT0dJTl9ISU5UID0gJzpvcGVuaWRfbG9naW5faGludCcsXG4gIE9BVVRIUkVRVUVTVCA9ICdvYXV0aHJlcXVlc3QnLFxuICBPQVVUSF9DUkVERU5USUFMX0lEUyA9ICdvYXV0aF9jcmVkZW50aWFsX2lkcycsXG4gIE9GRkxJTkVfTU9ERSA9ICc6b2ZmbGluZW1vZGUnLFxuICBPUklHSU4gPSAnOm9yaWdpbicsXG4gIE9WRVJMQVkgPSAnOm92ZXJsYXknLFxuICBQID0gJ3AnLFxuICBQQVRIID0gJ3BhdGgnLFxuICBQQU5FX1JFU09MVkVSX1ggPSAncGFuZVJlc29sdmVyWCcsXG4gIFBBTkVfUkVTT0xWRVJfWSA9ICdwYW5lUmVzb2x2ZXJZJyxcbiAgUEFSQU0gPSAncGFyYW0nLFxuICBQQVJFTlRfSUQgPSAncGFyZW50X2lkJyxcbiAgUEFTU1dPUkQgPSAncGFzc3dvcmQnLFxuICBQQVRURVJOID0gJ3BhdHRlcm4nLFxuICBQSVhFTF9SQVRJTyA9ICc6cGl4ZWxyYXRpbycsXG4gIFBSRUZJWCA9ICc6cHJlZml4JyxcbiAgUFJFVklFVyA9ICc6cHJldmlldycsXG4gIFBSSU1BUllfQ09OVEVOVF9VUkwgPSAncHJpbWFyeV9jb250ZW50X3VybCcsXG4gIFBST0pFQ1QgPSAncHJvamVjdCcsXG4gIFBST1RPQ09MID0gJ3Byb3RvY29sJyxcbiAgUFNFVURPID0gJzpwc2V1ZG8nLFxuICBRVUVSWSA9ICdxdWVyeScsXG4gIFIgPSAncicsXG4gIFJBTkdFX1RZUEUgPSAncmFuZ2VfdHlwZScsXG4gIFJFQ09SRF9TRVAgPSAncmVjb3JkX3NlcCcsXG4gIFJFQ09SRF9DTElFTlRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9jbGllbnRfcGVyZm9ybWFuY2UnLFxuICBSRUNPUkRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9wZXJmb3JtYW5jZScsXG4gIFJFQ09WRVJfT0xEX1NFU1NJT05fSUQgPSAnOnJlY292ZXJfb2xkX3Nlc3Npb25faWQnLFxuICBSRUNPVkVSX1NFU1NJT05fU1RBVEVfVElDS0VUUyA9ICc6cmVjb3Zlcl9zZXNzaW9uX3N0YXRlX3RpY2tldHMnLFxuICBSRUZSRVNIID0gJzpyZWZyZXNoJyxcbiAgUkVGUkVTSFVOTU9ESUZJRUQgPSAnOnJlZnJlc2h1bm1vZGlmaWVkJyxcbiAgUkVHSU9OID0gJ3JlZ2lvbicsXG4gIFJFTE9BRF9PTl9DVVNUT01fVklFV19TQVZFID0gJzpyZWxvYWRPbkN1c3RvbVZpZXdTYXZlJyxcbiAgUkVOREVSID0gJzpyZW5kZXInLFxuICBSRU5ERVJfTUFQU19DTElFTlRfU0lERSA9ICdyZW5kZXJNYXBzQ2xpZW50U2lkZScsXG4gIFJFVFJZID0gJzpyZXRyeScsXG4gIFJFVVNFID0gJ3JldXNlJyxcbiAgUkVVU0VfRk9SRVZFUiA9ICdyZXVzZV9mb3JldmVyJyxcbiAgUkVWRVJUID0gJzpyZXZlcnQnLFxuICBTQVZFX0RCX1BBU1NXT1JEUyA9ICdzYXZlX2RiX3Bhc3N3b3JkcycsXG4gIFNFTEVDVF9YID0gJ3NlbGVjdF94JyxcbiAgU0VMRUNUX1kgPSAnc2VsZWN0X3knLFxuICBTRVNTSU9OX0ZFQVRVUkVfUFJFRklYID0gJzpmZl8nLFxuICBTRVNTSU9OX0ZMQUdTID0gJzpzZXNzaW9uX2ZlYXR1cmVfZmxhZ3MnLFxuICBTSEFSRV9CVVRUT04gPSAnc2hhcmVfYnV0dG9uJyxcbiAgU0hFRVRfSUQgPSAnc2hlZXRfaWQnLFxuICBTSEFSRUQgPSAnc2hhcmVkJyxcbiAgU0hPV0FMTCA9ICdzaG93YWxsJyxcbiAgU0hPV19BUFBfQkFOTkVSID0gJzpzaG93QXBwQmFubmVyJyxcbiAgU0hPV19BU0tfREFUQSA9ICc6c2hvd0Fza0RhdGEnLFxuICBTSE9XX1BBUkFNUyA9ICdzaG93UGFyYW1zJyxcbiAgU0hPV19TSEFSRV9PUFRJT05TID0gJzpzaG93U2hhcmVPcHRpb25zJyxcbiAgU0laRSA9ICc6c2l6ZScsXG4gIFNPVVJDRSA9ICdzb3VyY2UnLFxuICBTVEFURSA9ICdzdGF0ZScsXG4gIFNUSUNLWV9TRVNTSU9OX0tFWSA9ICdzdGlja3lTZXNzaW9uS2V5JyxcbiAgU1VCU0NSSVBUSU9OUyA9ICc6c3Vic2NyaXB0aW9ucycsXG4gIFNVTU1BUlkgPSAnc3VtbWFyeScsXG4gIFNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUiA9ICc6c3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yJyxcbiAgU1lOQ19TRVNTSU9OID0gJzpzeW5jX3Nlc3Npb24nLFxuICBTWU5DX1NFU1NJT05fU1RBVEUgPSAnc3luY19zZXNzaW9uX3N0YXRlJyxcbiAgVEFCUyA9ICc6dGFicycsXG4gIFRBUkdFVCA9ICd0YXJnZXQnLFxuICBUQVJHRVRfU0lURSA9ICd0YXJnZXRfc2l0ZScsXG4gIFRPT0xCQVIgPSAnOnRvb2xiYXInLFxuICBUT09MVElQID0gJzp0b29sdGlwJyxcbiAgVFMgPSAndHMnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0lEID0gJ3VuZGVybHlpbmdfdGFibGVfaWQnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0NBUFRJT04gPSAndW5kZXJseWluZ190YWJsZV9jYXB0aW9uJyxcbiAgVVBEQVRFX1RZUEUgPSAndXBkYXRlX3R5cGUnLFxuICBVU0VfR1VFU1QgPSAnOnVzZUd1ZXN0JyxcbiAgVVNFX0lOTElORV9JTUFHRVMgPSAndXNlX2lubGluZV9pbWFnZXMnLFxuICBVU0VSQUdFTlQgPSAndXNlcmFnZW50JyxcbiAgVVNFUk5BTUUgPSAndXNlcm5hbWUnLFxuICBWQUxVRSA9ICd2YWx1ZScsXG4gIFZFUkJPU0VfTU9ERSA9ICd2ZXJib3NlTW9kZScsXG4gIFZJRVdfSUQgPSAndmlld3NfaWQnLFxuICBWSVpfU05BUFNIT1RfSUQgPSAndml6X3NuYXBzaG90X2lkJyxcbiAgVlcgPSAnOnZ3JyxcbiAgVyA9ICd3JyxcbiAgV09SS1NIRUVUX1BPUlRfU0laRSA9ICd3b3Jrc2hlZXRQb3J0U2l6ZScsXG4gIFdBVEVSTUFSSyA9ICd3YXRlcm1hcmsnLFxuICBXQVRFUk1BUktfTUFSR0lOID0gJzp3YXRlcm1hcmtfbWFyZ2luJyxcbiAgV0IgPSAnOndiJyxcbiAgV0hJQ0ggPSAnd2hpY2gnLFxuICBYID0gJ3gnLFxuICBZID0gJ3knLFxuICBaSUQgPSAnemlkJyxcbiAgWk9ORV9JRCA9ICd6b25lX2lkJyxcbiAgS0VZQ0hBSU5fVkVSU0lPTiA9ICdrZXljaGFpbl92ZXJzaW9uJyxcbiAgREFUQVNPVVJDRV9JRCA9ICdkYXRhc291cmNlX2lkJyxcbiAgREFUQVNPVVJDRV9OQU1FID0gJ2RhdGFzb3VyY2VfbmFtZScsXG4gIExFTlNfSUQgPSAnbGVuc19pZCcsXG4gIFdJRFRIID0gJ3dpZHRoJyxcbiAgSEVJR0hUID0gJ2hlaWdodCcsXG5cbiAgLy8gRGVmYXVsdCBMYXlvdXQgcGFyYW1zXG4gIExBWU9VVF9WSUVXUyA9ICd2aWV3cycsXG4gIExBWU9VVF9NRU5VUyA9ICdtZW51cycsXG4gIExBWU9VVF9HRU9NRVRSWSA9ICdnZW9tZXRyeScsXG4gIExBWU9VVF9QQUdFUyA9ICdwYWdlcycsXG4gIExBWU9VVF9DQUNIRVVSTCA9ICdjYWNoZXVybCcsXG4gIExBWU9VVF9TSEVFVCA9ICdzaGVldCcsXG4gIExBWU9VVF9ERVBUSCA9ICdkZXB0aCcsXG59XG5cbi8qKlxuICogcGFyYW1ldGVycyB0aGF0IGFyZSBvbmx5IHJlbGV2YW50IHdoZW4gd29ya2luZyB3aXRoIFRhYmxlYXUgUHVibGljXG4gKiBtYXliZSBub3QgcmVhbGx5IG5lY2Vzc3J5IHRvIHNwbGl0IHRoZW0gb3V0XG4gKi9cbmVudW0gUHVibGljUGFyYW1ldGVyTmFtZXMge1xuICBTSE9XX1ZJWl9IT01FID0gJzpzaG93Vml6SG9tZScsXG4gIC8vIGRpc3BsYXkgdmlldyBjb3VudFxufVxuXG4vKipcbiAqIE1hcCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFzIHVzZWQgaW4gdGhlIHVybCB0byB3aGF0IHdlIGNhbGwgdGhlbSBwdWJsaWNseSBpbiB0aGUgZW1iZWRkaW5nIGxpYnJhcnkuXG4gKiBUaGUgb25seSBwYXJhbWV0ZXJzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSB0aGUgb25lcyB0aGF0IGdldCBzZW50IHRvIHZpenFsXG4gKiAgLSB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJmYWNlIGF0IGV4dGVybmFsLWNvbnRyYWN0OlZpekludGVyZmFjZXM6Vml6U2V0dGluZ3NcbiAqL1xuZXhwb3J0IGVudW0gVml6T3B0aW9uTmFtZXMge1xuICAvLyBwdWJsaWNOYW1lID0gaW50ZXJuYWxTdHJpbmdWYWx1ZVxuICBTaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuU0laRSxcbiAgRW1iZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5FTUJFRCxcbiAgQXBpSW50ZXJuYWxWZXJzaW9uID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0lOVEVSTkFMX1ZFUlNJT04sXG4gIEFwaUV4dGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9FWFRFUk5BTF9WRVJTSU9OLFxuICBTaG93Vml6SG9tZSA9IFB1YmxpY1BhcmFtZXRlck5hbWVzLlNIT1dfVklaX0hPTUUsXG4gIEpzZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBCb290c3RyYXBXaGVuTm90aWZpZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5CT09UU1RSQVBfV0hFTl9OT1RJRklFRCxcbiAgTmF2VHlwZSA9IFZxbFBhcmFtZXRlck5hbWVzLk5BVl9UWVBFLFxuICBOYXZTcmMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfU1JDLFxuICBkZWJ1ZyA9IFZxbFBhcmFtZXRlck5hbWVzLkpTREVCVUcsXG4gIEFwaUlEID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0lELFxuXG4gIGRpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gVnFsUGFyYW1ldGVyTmFtZXMuRElTQUJMRV9VUkxfQUNUSU9OU19QT1BVUFMsXG4gIGhpZGVUYWJzID0gVnFsUGFyYW1ldGVyTmFtZXMuVEFCUyxcbiAgdG9vbGJhciA9IFZxbFBhcmFtZXRlck5hbWVzLlRPT0xCQVIsXG4gIGRldmljZSA9IFZxbFBhcmFtZXRlck5hbWVzLkRFVklDRV9UWVBFLFxuICBpbnN0YW5jZUlkVG9DbG9uZSA9IFZxbFBhcmFtZXRlck5hbWVzLklOU1RBTkNFX0lELFxuICB0b3VjaE9wdGltaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuTU9CSUxFLFxuICBoaWRlRWRpdEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9CVVRUT04sXG4gIGhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OLFxuICBzdXBwcmVzc0RlZmF1bHRFZGl0QmVoYXZpb3IgPSBWcWxQYXJhbWV0ZXJOYW1lcy5TVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IsXG4gIGhpZGVDbG9zZUJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfQ0xPU0VfQlVUVE9OLFxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmltcG9ydCB7IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL0Nyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgaXNDb21tYW5kTWVzc2FnZSxcbiAgaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBpc0hhbmRzaGFrZU1lc3NhZ2UsXG4gIGlzSW5pdE1lc3NhZ2UsXG4gIGlzTWVzc2FnZSxcbiAgaXNOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL01lc3NhZ2VUeXBlQ2hlY2tzJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlSGFuZGxlcixcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIsXG4gIEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyLFxuICBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlTGlzdGVuZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IE1lc3NlbmdlciB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vKipcbiAqIFRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGlzIHRoZSBwcmltYXJ5IGV4cG9ydCBmcm9tIHRoZSBhcGktbWVzc2FnaW5nIG1vZHVsZS4gQW4gaW5zdGFuY2Ugb2ZcbiAqIHRoaXMgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZCBvbiBib3RoIHNpZGVzIG9mIGEgZnJhbWUgYm91bmRhcnkgdG8gZmFjaWxpdGF0ZSBjb21tdW5pY2F0aW9uXG4gKiBpbiBib3RoIGRpcmVjdGlvbnMgYmV0d2VlbiB0aGUgZnJhbWVzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYm90aCB0aGUgZGlzcGF0Y2hlciBhbmQgdGhlIGxpc3RlbmVyXG4gKiBwb3J0aW9ucywgYnV0IGRvZXNuJ3QgcmVxdWlyZSBjYWxsZXJzIHRvIGNhcmUgYWJvdXQgYm90aC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVNZXNzZW5nZXIgaW1wbGVtZW50cyBNZXNzZW5nZXIge1xuICBwcml2YXRlIHVucmVnaXN0ZXJGdW5jdGlvbj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZE1lc3NhZ2VIYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lTWVzc2VuZ2VyLiBJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgYXMgYSBNZXNzYWdlTGlzdGVuZXIsXG4gICAqIGJlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZyBhbmQgcmVnaXN0ZXIgbWVzc2FnZSBoYW5kbGVycy5cbiAgICogQHBhcmFtIHRoaXNXaW5kb3cgVGhlIHdpbmRvdyBvYmplY3Qgd2hpY2ggdGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgbGl2ZXMuIEFuIG9uTWVzc2FnZSBsaXN0ZW5lciB3aWxsIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3ddIE9wdGlvbmFsIG90aGVyV2luZG93IHdoaWNoIG1lc3NhZ2VzIHdpbGwgYmUgcG9zdGVkIHRvLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiBkZWZpbmVkLCBpbmNvbWluZyBtZXNzYWdlcyBtdXN0IG9yaWdpbmF0ZSBmcm9tIG90aGVyV2luZG93IHRvIGJlIHBhc3NlZCBvblxuICAgKiBAcGFyYW0gW290aGVyV2luZG93T3JpZ2luXSBUaGUgdGFyZ2V0IG9yaWdpbiB3aGljaCBvdGhlcldpbmRvdyBtdXN0IGhhdmUgaW4gb3JkZXIgdG8gcmVjZWl2ZSBkaXNwYXRjaGVkIG1lc3NhZ2VzLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgc2VudCBhcyB0aGUgdGFyZ2V0T3JpZ2luIG9mIGEgcG9zdE1lc3NhZ2VcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvcG9zdE1lc3NhZ2UpXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSB0aGlzV2luZG93OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3c/OiBXaW5kb3csIHByaXZhdGUgb3RoZXJXaW5kb3dPcmlnaW4/OiBzdHJpbmcpIHtcbiAgICAvLyBNYWtlIHN1cmUgdG8gY2FsbCBTdGFydExpc3RlbmluZ1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZUxpc3RlbmVyIEltcGxlbWVudGF0aW9uXG5cbiAgcHVibGljIHN0YXJ0TGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgYXJlIGxpc3RlbmluZywgaWYgbm90LCBob29rIHVwIGEgbWVzc2FnZSBsaXN0ZW5lclxuICAgIGlmICghdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IGJvdW5kSGFuZGxlciA9IHRoaXMub25NZXNzYWdlUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudGhpc1dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gKCkgPT4gdGhpcy50aGlzV2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdG9wTGlzdGVuaW5nKCk6IHZvaWQge1xuICAgIC8vIFN0b3AgbGlzdGVuaW5nIGlmIHdlIGhhdmUgc3RhcnRlZCBsaXN0ZW5pbmdcbiAgICBpZiAodGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKCk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0SW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tbWFuZE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0SGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvLy8vLyBNZXNzYWdlRGlzcGF0Y2hlciBJbXBsZW1lbnRhdGlvblxuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXBpVmVyc2lvbiBhcGktaW50ZXJuYWwtY29udHJhY3QtanMgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIGNyb3NzRnJhbWVWZXJzaW9uIGNyb3NzZnJhbWUgbWVzc2FnaW5nIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBvcHRpb25zIGFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXQgaW5pdGlhbGl6YXRpb24gKGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mXG4gICAqICAgICAgICAgICAgICAgIGV4dGVybmFsIGJlaW5nIHVzZWQgZm9yIGV4YW1wbGUpXG4gICAqL1xuICBwdWJsaWMgcHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShcbiAgICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gICk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBjcm9zc0ZyYW1lVmVyc2lvbixcbiAgICAgIGFwaVZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZE1lc3NhZ2UodmVyYklkOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgICAgdmVyYklkOiB2ZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShjb21tYW5kR3VpZDogc3RyaW5nLCBkYXRhOiBNb2RlbCB8IHVuZGVmaW5lZCwgZXJyb3I6IE1vZGVsIHwgdW5kZWZpbmVkKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICAgIGNvbW1hbmRHdWlkOiBjb21tYW5kR3VpZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgfTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgLy8gc3RyaW5naWZ5IGVycm9yIG9iamVjdCB0byByZW1vdmUgdW5zZXJpYWxpemFibGUgZmllbGRzIGxpa2UgZnVuY3Rpb25zIGFuZCBwcmV2ZW50IHNlcmlhbGl6YXRpb24gZXJyb3JzXG4gICAgICBtZXNzYWdlLmVycm9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVOb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZCwgZGF0YTogTW9kZWwpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLFxuICAgICAgbm90aWZpY2F0aW9uSWQ6IG5vdGlmaWNhdGlvbklkLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUFja01lc3NhZ2UoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkFjayxcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYSBwZW5kaW5nIG1lc3NhZ2UgZm9yIHNlbmRpbmcgYW5kIHJldHVybnMgdGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICpcbiAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBiZSBzZW50IHRvIHRoaXMub3RoZXJXaW5kb3dcbiAgICogQHJldHVybnMgVGhlIHByZXBhcmVkIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgcHJlcGFyZU1lc3NhZ2UobXNnOiBNZXNzYWdlKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBpZiAoIXRoaXMub3RoZXJXaW5kb3cgfHwgIXRoaXMub3RoZXJXaW5kb3dPcmlnaW4pIHtcbiAgICAgIHRocm93ICdPdGhlciB3aW5kb3cgbm90IGluaXRpYWxpemVkLCBjYW5ub3QgZGlzcGF0Y2ggbWVzc2FnZXMnO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXBhcmVkTWVzc2FnZSA9IG5ldyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlKG1zZywgdGhpcy5vdGhlcldpbmRvdywgdGhpcy5vdGhlcldpbmRvd09yaWdpbik7XG4gICAgcmV0dXJuIHByZXBhcmVkTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuIERvZXMgc29tZSB2YWxpZGF0aW9uIG9mIHRoZSBtZXNzYWdlLCBhbmQgdGhlblxuICAgKiBjYWxscyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGhhbmRsZXIgaWYgb25lIGlzIGRlZmluZWRcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBpbmNvbWluZyBNZXNzYWdlRXZlbnRcbiAgICovXG4gIHByaXZhdGUgb25NZXNzYWdlUmVjZWl2ZWQoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gb3RoZXJXaW5kb3cgZGVmaW5lZCwgbWFrZSBzdXJlIHRoZSBtZXNzYWdlIGlzIGNvbWluZyBmcm9tIHRoZXJlXG4gICAgaWYgKHRoaXMub3RoZXJXaW5kb3cgJiYgZXZlbnQuc291cmNlICE9PSB0aGlzLm90aGVyV2luZG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG8gc29tZSB2YWxpZGF0aW9uIG9uIGV2ZW50LmRhdGEgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhIHJlYWwgbWVzc2FnZVxuICAgIGlmICghZXZlbnQuZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhO1xuICAgIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIG1lc3NhZ2UgdHlwZSwgdmFsaWRhdGUgdGhlIG1lc3NhZ2UsIGFuZCBjYWxsIGFuIGFwcHJvcHJpYXRlIGhhbmRlciBpZiBvbmUgZXhpc3RzXG4gICAgc3dpdGNoIChtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZToge1xuICAgICAgICBpZiAoIWlzSW5pdE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZToge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkNvbW1hbmQ6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb246IHtcbiAgICAgICAgaWYgKCFpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5IYW5kc2hha2U6IHtcbiAgICAgICAgaWYgKCFpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIEp1c3QgaWdub3JlIHRoaXMgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBtZXNzYWdlIHR5cGVcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3cob3RoZXJXaW5kb3c6IFdpbmRvdyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3cgPSBvdGhlcldpbmRvdztcbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvd09yaWdpbihvcmlnaW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4gPSBvcmlnaW47XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJlcGFyZWRNZXNzYWdlIGludGVyZmFjZSB1c2VkIHRvIHBvc3QgbWVzc2FnZXMgYmV0d2VlblxuICogdHdvIGZyYW1lcyB1c2luZyB3aW5kb3cucG9zdE1lc3NhZ2VcbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UgaW1wbGVtZW50cyBQcmVwYXJlZE1lc3NhZ2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLlxuICAgKiBAcGFyYW0gX21lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudFxuICAgKiBAcGFyYW0gX3RhcmdldCBUaGUgdGFyZ2V0IHdpbmRvdyB3aGVyZSB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnRcbiAgICogQHBhcmFtIF9vcmlnaW4gVGhlIHRhcmdldE9yaWdpbiB3aGVyZSB0aGlzIG1lc3NhZ2UgY2FuIGJlIHJlY2VpdmVkXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWVzc2FnZTogTWVzc2FnZSwgcHJpdmF0ZSBfdGFyZ2V0OiBXaW5kb3csIHByaXZhdGUgX29yaWdpbjogc3RyaW5nKSB7fVxuXG4gIHB1YmxpYyBnZXQgbWVzc2FnZUd1aWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZS5tc2dHdWlkO1xuICB9XG5cbiAgcHVibGljIHNlbmQoKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICB0aGlzLl90YXJnZXQucG9zdE1lc3NhZ2UodGhpcy5fbWVzc2FnZSwgdGhpcy5fb3JpZ2luKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgZ3VpZCBmcm9tICdndWlkJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlL1ZlcnNpb25OdW1iZXInO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2UsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEhhbmRzaGFrZU1lc3NhZ2UsXG4gIEluaXRpYWxpemVNZXNzYWdlLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlVHlwZSxcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcblxuY29uc3QgZXhwZWN0ZWRFbXB0eU5vdGlmaWNhdGlvbnMgPSBuZXcgU2V0KFtcbiAgTm90aWZpY2F0aW9uSWQuRWRpdEJ1dHRvbkNsaWNrZWQsXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va1B1Ymxpc2hlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tSZWFkeVRvQ2xvc2UsXG4gIE5vdGlmaWNhdGlvbklkLlJlYWR5VG9SZWNlaXZlQXV0aFRva2VuLFxuXSk7XG5cbi8qIHRzbGludDpkaXNhYmxlIG5vLWFueSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWVzc2FnZShkYXRhOiBNZXNzYWdlIHwgYW55KTogZGF0YSBpcyBNZXNzYWdlIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGRhdGEgYXMgTWVzc2FnZTtcbiAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLm1zZ0d1aWQgfHwgIW1lc3NhZ2UubXNnVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQobWVzc2FnZS5tc2dHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbWVzc2FnZS5tc2dUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2VUeXBlczogQXJyYXk8c3RyaW5nPiA9IFtcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kLFxuICAgIE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSxcbiAgICBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLFxuICAgIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICBNZXNzYWdlVHlwZS5IYW5kc2hha2UsXG4gIF07XG5cbiAgaWYgKG1lc3NhZ2VUeXBlcy5pbmRleE9mKG1lc3NhZ2UubXNnVHlwZSkgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnNpb24odmVyc2lvbk51bWJlcjogVmVyc2lvbk51bWJlciB8IGFueSk6IHZlcnNpb25OdW1iZXIgaXMgVmVyc2lvbk51bWJlciB7XG4gIGlmICghdmVyc2lvbk51bWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHYgPSB2ZXJzaW9uTnVtYmVyIGFzIFZlcnNpb25OdW1iZXI7XG5cbiAgaWYgKHR5cGVvZiB2ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygdi5maXggIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1pbm9yICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5tYWpvciAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5pdE1lc3NhZ2UobWVzc2FnZTogSW5pdGlhbGl6ZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEluaXRpYWxpemVNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpbml0TWVzc2FnZSA9IG1lc3NhZ2UgYXMgSW5pdGlhbGl6ZU1lc3NhZ2U7XG4gIGlmIChpbml0TWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5hcGlWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uIHx8ICFpc1ZlcnNpb24oaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3JNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlO1xuICBpZiAoY3JNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmRSZXNwb25zZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZ3VpZC5pc0d1aWQoY3JNZXNzYWdlLmNvbW1hbmRHdWlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY3JNZXNzYWdlLmRhdGEgJiYgIWNyTWVzc2FnZS5lcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgQ29tbWFuZE1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmRNZXNzYWdlID0gbWVzc2FnZSBhcyBDb21tYW5kTWVzc2FnZTtcbiAgaWYgKGNvbW1hbmRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkNvbW1hbmQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnBhcmFtZXRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS52ZXJiSWQgfHwgdHlwZW9mIGNvbW1hbmRNZXNzYWdlLnZlcmJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBOb3RpZmljYXRpb25NZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0gbWVzc2FnZSBhcyBOb3RpZmljYXRpb25NZXNzYWdlO1xuICBpZiAobm90aWZpY2F0aW9uTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2UuZGF0YSAmJiAhZXhwZWN0ZWRFbXB0eU5vdGlmaWNhdGlvbnMuaGFzKG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkIHx8IHR5cGVvZiBub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIEhhbmRzaGFrZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRzaGFrZU1lc3NhZ2UgPSBtZXNzYWdlIGFzIEhhbmRzaGFrZU1lc3NhZ2U7XG4gIGlmIChoYW5kc2hha2VNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkhhbmRzaGFrZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBOb3RpZmljYXRpb25JZCwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuXG4vKipcbiAqIEVudW0gZGVmaW5pbmcgdGhlIDQgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzIHdlIGhhdmUgZGVmaW5lZFxuICovXG5leHBvcnQgZW51bSBNZXNzYWdlVHlwZSB7XG4gIEluaXRpYWxpemUgPSAnaW5pdGlhbGl6ZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24nLFxuICBDb21tYW5kID0gJ2NvbW1hbmQnLFxuICBDb21tYW5kUmVzcG9uc2UgPSAnY29tbWFuZC1yZXNwb25zZScsXG4gIEhhbmRzaGFrZSA9ICd2LWhhbmRzaGFrZScsXG4gIEFjayA9ICd2LWFjaycsXG59XG5cbi8qKlxuICogVGhlIE1lc3NhZ2UgaW50ZXJmYWNlIGlzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIHRoZSBvdGhlclxuICogbWVzc2FnZSB0eXBlIGludGVyZmFjZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlXG4gICAqL1xuICBtc2dHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnVHlwZTogTWVzc2FnZVR5cGU7XG59XG5cbi8qKlxuICogVGhlIGluaXRpYWxpemUgbWVzc2FnZSBpcyB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHNlbnRcbiAqIGZyb20gdGhlIGphdmFzY3JpcHQgdG8gc2V0IHVwIGNvbW11bmljYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6ZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcGkgd2hpY2ggdGhlIHNlbmRlciB3YW50cyB0byB1c2VcbiAgICovXG4gIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoaXMgbWVzc2FnaW5nIGNvbnRyYWN0IHRvIGJlIHVzZWQuIEZvciBub3csIHRoZXJlXG4gICAqIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHZlcnNpb24gYnV0IHNlbmRpbmcgdGhpcyBhbG9uZyBzaG91bGQgaGVscFxuICAgKiBpZiB3ZSBuZWVkIHRvIGFkZCBhIG5ldyB2ZXJzaW9uIGluIGEgZnV0dXJlIHJlbGVhc2VcbiAgICovXG4gIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IHRoZSB0aW1lIG9mIGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IHdoZW4gYSBub3RpZmljYXRpb24gb2NjdXJzIGZyb20gdGhlIHByZXNsYXllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbk1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBmb3IgdGhpcyB0eXBlIG9mIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgbm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB3aGljaCBjYW1lIGFsb25nIHdpdGggdGhlIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgZGF0YTogTW9kZWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBjYWxsaW5nIGFuIGludGVybmFsIGNvbnRyYWN0IGNvbW1hbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBjb21tYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZFxuICAgKi9cbiAgdmVyYklkOiBWZXJiSWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZFxuICAgKi9cbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnM7XG59XG5cbi8qKlxuICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBDb21tYW5kTWVzc2FnZSB3aXRoIHRoZVxuICogcmVzdWx0IG9mIHRoYXQgY29tbWFuZHMgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEd1aWQgb2YgdGhlIENvbW1hbmRNZXNzYWdlIHdoaWNoIHRoaXMgaXMgaW4gcmVzcG9uc2UgdG9cbiAgICovXG4gIGNvbW1hbmRHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRoZXJlIHdhcyBhbiBlcnJvciByZXR1cm5lZCBmcm9tIHRoZSBjb21tYW5kLCB0aGlzIHdpbGwgYmUgZGVmaW5lZFxuICAgKiBhbmQgY29udGFpbiB0aGUgZXJyb3JcbiAgICovXG4gIGVycm9yPzogTW9kZWw7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBjb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGNvbW1hbmQgcmVzdWx0XG4gICAqL1xuICBkYXRhPzogTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZHNoYWtlTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogSW50ZXJuYWwgQVBJIGNvbnRyYWN0IHZlcnNpb25cbiAgICovXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgaW50ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyYjogdmVyYiBhcyBWZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIGFzIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhlIG9ubHlcbiAqIG1vZGUgaXQgc3VwcG9ydHMgaXMgZXh0ZXJuYWwncyB2ZXJzaW9uIDw9IHBsYXRmb3JtJ3MgdmVyc2lvbi4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIHVwZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIGRvd25ncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LiBTaW1pbGFybHkgZm9yIG5vdGlmaWNhdGlvbnMsIGl0IGNhblxuICogZG93bmdyYWRlIHRob3NlIG9uIHRoZSB3YXkgZnJvbSBwbGF0Zm9ybSB0byBleHRlcm5hbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1WZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApOiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIge1xuICAgIHJldHVybiBuZXcgdGhpcyhcbiAgICAgIGV4dGVybmFsVmVyc2lvbi5tYWpvcixcbiAgICAgIHBsYXRmb3JtVmVyc2lvbi5tYWpvcixcbiAgICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybU1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2V4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbiA+IHRoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IGJldHdlZW4gZXh0ZXJuYWwgdmVyc2lvbiAke3RoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9ufSBhbmQgJHt0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgdXBncmFkZWQgPSB7IHZlcmI6IHZlcmIsIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQudmVyYiwgdXBncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIERvd25ncmFkZSB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gZXhlY3V0ZVJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCBkb3duZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlELCBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyB9IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGxocy5taW5vciA8IHJocy5taW5vcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGhzLm1ham9yID09PSByaHMubWFqb3IgJiYgbGhzLm1pbm9yID09PSByaHMubWlub3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHtcbiAgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTtcbn1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IE5vdGlmaWNhdGlvbk1pbm9yRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0ge1xuICAxOiB7XG4gICAgOTogW10sXG4gICAgMTA6IFtEb3duZ3JhZGVGbGlwYm9hcmRab25lSURdLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMsXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlVXBncmFkZXMsXG4gICAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24gPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBjb25zdCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpKTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGV4dGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoaXMgY29udmVydGVyXG4gKiBzdXBwb3J0cyBleHRlcm5hbCdzIHZlcnNpb24obWlub3IpID49IHBsYXRmb3JtJ3MgdmVyc2lvbihtaW5vcikuIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byBkb3duZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIHVwZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gZG93bmdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZCBpcyBleGVjdXRlZFxuICAgKiBAcGFyYW0gX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHVwZ3JhZGUgbm90ZmljYXRpb25zIHRvIHBlcmZvcm0gb24gZXZlbnRzXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3IgPiB0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxWZXJzaW9uLm1ham9yfVxuICAgICAgYW5kICR7dGhpcy5fcGxhdGZvcm1WZXJzaW9uLm1ham9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSBkb3duZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkLnZlcmIsIGRvd25ncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgdXBncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVOb3RpZmljYXRpb24gb2YgdGhpcy5fdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlTm90aWZpY2F0aW9uKHVwZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgR2V0TWF4aW11bU1pbm9ySW5kZXgsIE1ham9yTWlub3JUcmFuc2xhdG9ycywgVmVyc2lvbkVxdWFsVG8gfSBmcm9tICcuLi9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNFeHRlcm5hbCBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQge1xuICBEb3duZ3JhZGVMb2dpY2FsVGFibGVEYXRhQXN5bmMsXG4gIERvd25ncmFkZVVuZGVybHlpbmdUYWJsZURhdGFBc3luYyxcbiAgVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zLFxuICBVcGdyYWRlRGF0YVRhYmxlVHlwZXMsXG59IGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gICAgMTM6IFtEb3duZ3JhZGVVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMsIERvd25ncmFkZUxvZ2ljYWxUYWJsZURhdGFBc3luY10sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW1VwZ3JhZGVEYXRhVGFibGVUeXBlc10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICAgIDI5OiBbVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zXSwgLy8gMjAyMS4xIHdhcyByZWxlYXNlZCB3aXRoIDEuMjkuIFVwZ3JhZGUgZnJvbSAxLjI5IGluIHRoZSBbMV1bMjldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCJpbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwsXG4gIERhdGFIZWFkZXIsXG4gIERhdGFUYWJsZSxcbiAgRGF0YVR5cGVDb252ZXJ0ZXIsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEludGVybmFsVGFibGVhdUVycm9yLFxuICBOb3RpZmljYXRpb24sXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbn0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgbmV3ZXIgdmVyc2lvbiBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb25cbiAqICBUaGUgdmVyYiBhbmQgcGFyYW1ldGVycyBwcm92aWRlIGEgY29udGV4dCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlUmV0dXJuID0gKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiBFeGVjdXRlUmVzcG9uc2U7XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byB1cGdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgVXBncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyAxLjIgLT4gMS4wIFRyYW5zbGF0aW9uc1xuLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBpbXBvcnQgZnJvbSB0aGUgVjEgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4vLyBpbXBvcnQgKiBhcyBWMSBmcm9tICdAdGFibGVhdS1hcGktaW50ZXJuYWwtY29udHJhY3QtanNfdjEnO1xuXG4vKipcbiAqIFByaW9yIHRvIDIwMTkuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuOSksIERhdGFWYWx1ZS52YWx1ZSB3ZXJlIGFsbCBzdHJpbmdzLlxuICogR28gdGhyb3VnaCBhbGwgRGF0YVZhbHVlIG9iamVjdHMuIElmIHdlIGhhdmUgYSBzdHJpbmcsIGJ1dCB0aGUgdHlwZSBzaG91bGQgbm90IGJlIGEgc3RyaW5nLFxuICogY29udmVydCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLiBUaGUgdHlwZSBvZiBEYXRhVmFsdWUudmFsdWUgaXMgJ2FueScgaW4gdGhlIGNvbnRyYWN0LCBzb1xuICogdGhpcyBjaGFuZ2UgZG9lc24ndCBuZWVkIGFueSB1cGRhdGVzIHRvIGNsYXNzZXMgb3IgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVcGdyYWRlRGF0YVRhYmxlVHlwZXMoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoIWV4ZWN1dGVSZXNwb25zZSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCBvbGRVbmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAob2xkVW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2xkVW5kZXJseWluZ0RhdGFUYWJsZS5pc1N1bW1hcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnZlcnREYXRhVmFsdWVzKG9sZFVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSk7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IG9sZFNlbGVjdGVkTWFya3NUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICBpZiAob2xkU2VsZWN0ZWRNYXJrc1RhYmxlLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhKSkge1xuICAgIG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhLmZvckVhY2goKG1hcmtzVGFibGUpID0+IHtcbiAgICAgIGNvbnZlcnREYXRhVmFsdWVzKG1hcmtzVGFibGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vKipcbiAqIFByaW9yIHRvIDIwMjAuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuMTMgYW5kIG9sZGVyKSwgd29ya3NoZWV0LmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXRVbmRlcmx5aW5nRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlVW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gIH07XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMC4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4xMyBhbmQgb2xkZXIpLCBkYXRhc291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyBkb2Vzbid0IGV4aXN0LlxuICogTWFwIGl0IHRvIHRoZSBvbGRlciBHZXREYXRhU291cmNlRGF0YSB2ZXJiIGFuZCB2YWxpZGF0ZSB0aGUgdGhlIGxvZ2ljYWwgdGFibGUgSWQuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gRG93bmdyYWRlTG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKToge1xuICB2ZXJiOiBWZXJiSWQ7XG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufSB7XG4gIGlmICh2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSkge1xuICAgIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIHZlcmIgPSBWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2ZXJiOiB2ZXJiLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhVmFsdWVzKHRhYmxlOiBEYXRhVGFibGUpOiB2b2lkIHtcbiAgLy8gZGF0YVRhYmxlIGlzIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IG9mIGRhdGEuIEZpcnN0IGluZGV4IGlzIHRoZSByb3csIHNlY29uZCBpcyB0aGUgY29sdW1uLlxuICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCB8fCB0YWJsZS5kYXRhVGFibGUgPT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheSh0YWJsZS5kYXRhVGFibGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFibGUuZGF0YVRhYmxlLmZvckVhY2goKHJvdykgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChkYXRhVmFsdWUsIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFWYWx1ZS52YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBkYXRhVmFsdWUudmFsdWUgPSBEYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVBc1N0cmluZ1RvVmFsdWUodmFsdWUsIHRhYmxlLmhlYWRlcnNbY29sdW1uSW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIFRvRG86IFRGUzEwNjkwMjcgUmVmYWN0b3IgaW5wdXQgdmVyYnMgJiBwYXJhbWV0ZXJzIGluIGFwaS1pbnRlcm5hbC1jb250cmFjdCBVcGdyYWRlL0Rvd25ncmFkZSBmcmFtZXdvcmtcbmZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1ldGVyc0Zvck9iamVjdE1vZGVsKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiB2b2lkIHtcbiAgaWYgKHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdICE9PSBBcGlTaG93RGF0YVRhYmxlU2VudGluZWwuU2luZ2xlVGFibGVJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2dpY2FsIHRhYmxlIGlkIHBhc3NlZCB0byAke3ZlcmJ9LmApIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJpb3IgdG8gMjAyMS4yIChpbnRlcm5hbC1jb250cmFjdCB2MS4yOSBhbmQgYmVsb3cpLCBnZXRTdW1tYXJ5RGF0YUFzeW5jIGRpZCBub3Qgc3VwcG9ydCBtYXhSb3dzLFxuICogYW5kIGFueSBnZXQuLi5EYXRhQXN5bmMgZGlkIG5vdCBzdXBwb3J0IGNvbHVtbnNUb0luY2x1ZGVCeUlkLlxuICogVHJpbSByZXN1bHQgdG8gbWF4Um93cyBpZiBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgZ2V0U3VtbWFyeURhdGFBc3luY1xuICogVHJpbSBjb2x1bW5zIHRvIGNvbHVtbnNUb0luY2x1ZGUgaWYgaW5jbHVkZWQgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBnZXQuLi5EYXRhQXN5bmNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVwZ3JhZGVEYXRhVGFibGVSb3dzQW5kQ29sdW1ucyhcbiAgZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsXG4gIHZlcmI6IFZlcmJJZCxcbiAgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMsXG4pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoaXNHZXRTdW1tYXJ5RGF0YVZlcmIodmVyYikgJiYgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSkge1xuICAgIGV4ZWN1dGVSZXNwb25zZSA9IGFkanVzdERhdGFSb3dMZW5ndGgoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLk1heFJvd3NdIGFzIG51bWJlcik7XG4gIH1cblxuICBpZiAoaXNHZXRUYWJsZURhdGFWZXJiKHZlcmIpICYmIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdKSB7XG4gICAgZXhlY3V0ZVJlc3BvbnNlID0gYWRqdXN0RGF0YUNvbHVtbnMoZXhlY3V0ZVJlc3BvbnNlLCBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSBhcyBzdHJpbmdbXSk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc0dldFN1bW1hcnlEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGE7XG59XG5cbmZ1bmN0aW9uIGlzR2V0VGFibGVEYXRhVmVyYih2ZXJiOiBWZXJiSWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhIHx8XG4gICAgdmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEgfHxcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXREYXRhU291cmNlRGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YVxuICApO1xufVxuXG5mdW5jdGlvbiBhZGp1c3REYXRhUm93TGVuZ3RoKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBtYXhSb3dzOiBudW1iZXIpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBpZiAobWF4Um93cyA+IDAgJiYgbWF4Um93cyA8IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUubGVuZ3RoKSB7XG4gICAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZS5sZW5ndGggPSBtYXhSb3dzO1xuICB9XG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGFkanVzdERhdGFDb2x1bW5zKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCBjb2x1bW5zVG9JbmNsdWRlOiBzdHJpbmdbXSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIGlmIChjb2x1bW5zVG9JbmNsdWRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICAvLyB2ZXJpZnkgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgVW5kZXJseWluZ0RhdGFUYWJsZVxuICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAoIXVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlKSB8fCAhQXJyYXkuaXNBcnJheSh1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycykpIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgLy8gMS4gZmlsdGVyIHRoZSBoZWFkZXJzIHRvIG9ubHkgY29sdW1uc1RvSW5jbHVkZVxuICAvLyAyLiB1c2UgdGhlIG5ldyBoZWFkZXJzIHRvIGZpbHRlciBhbGwgcm93c1xuICAvLyAzLiB1cGRhdGUgdGhlIGluZGljZXMgaW4gb3VyIG5ldyBoZWFkZXJzXG4gIGNvbnN0IG5ld0hlYWRlcnM6IERhdGFIZWFkZXJbXSA9IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5oZWFkZXJzLmZpbHRlcigoaGVhZGVyLCBpbmRleCkgPT5cbiAgICBjb2x1bW5zVG9JbmNsdWRlLmZpbmQoKG5hbWUpID0+IG5hbWUgPT09IGhlYWRlci5maWVsZE5hbWUpLFxuICApO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlW2luZGV4XSA9IHJvdy5maWx0ZXIoXG4gICAgICAodmFsdWUsIHZhbHVlSW5kZXgpID0+IG5ld0hlYWRlcnMuZmluZEluZGV4KChoZWFkZXIpID0+IGhlYWRlci5pbmRleCA9PT0gdmFsdWVJbmRleCkgIT09IC0xLFxuICAgICk7XG4gIH0pO1xuICBsZXQgbmV3SW5kZXggPSAwO1xuICB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycyA9IG5ld0hlYWRlcnMubWFwKChoZWFkZXIpID0+IHtcbiAgICBoZWFkZXIuaW5kZXggPSBuZXdJbmRleCsrO1xuICAgIHJldHVybiBoZWFkZXI7XG4gIH0pO1xuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uTW9kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc01vZGUsIEV4dGVybmFsRXh0ZW5zaW9uc01vZGU+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZyxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNvbHVtblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENvbHVtblR5cGUsIEV4dGVybmFsQ29sdW1uVHlwZT4oe1xuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuQ29udGludW91c106IEV4dGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuRGlzY3JldGVdOiBFeHRlcm5hbENvbHVtblR5cGUuRGlzY3JldGUsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxDb2x1bW5UeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3Npc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDFdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3MsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZFJvbGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZFJvbGVUeXBlLCBFeHRlcm5hbEZpZWxkUm9sZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb24sXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmUsXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxTaGVldFR5cGUsIEV4dGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0ludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEV4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFUeXBlLCBFeHRlcm5hbERhdGFUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YVR5cGUuQm9vbF06IEV4dGVybmFsRGF0YVR5cGUuQm9vbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVUaW1lXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlVGltZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5GbG9hdF06IEV4dGVybmFsRGF0YVR5cGUuRmxvYXQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuSW50XTogRXh0ZXJuYWxEYXRhVHlwZS5JbnQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3BhdGlhbF06IEV4dGVybmFsRGF0YVR5cGUuU3BhdGlhbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBhbGxvd2FibGVWYWx1ZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZSwgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuQWxsXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5MaXN0XTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuUmFuZ2VdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVJhbmdlVHlwZSwgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBlcnJvckNvZGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEVycm9yQ29kZXMsIEV4dGVybmFsRXJyb3JDb2Rlcz4oXG4gICAge1xuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTklUSUFMSVpBVElPTl9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX0VOVU1fTUFQUElOR106IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX1BBUkFNRVRFUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QUkVTX01PREVMX1BBUlNJTkdfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVU5LTk9XTl9WRVJCX0lEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZJU0lCSUxJVFlfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuVmlzaWJpbGl0eUVycm9yLFxuICAgIH0sXG4gICAgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJUeXBlLCBFeHRlcm5hbEZpbHRlclR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmFuZ2VdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGVdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjbGFzc05hbWVLZXkgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENsYXNzTmFtZUtleSwgRXh0ZXJuYWxDbGFzc05hbWVLZXk+KHtcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXBdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgLy8gVGVtcG9yYXJ5IHVudGlsIHdlIGZpeCAxMzE3MjY2IC0gUGxhdGZvcm0gaGFzbid0IGJlZW4gdXBkYXRlZCBjdXJyZW50bHkgYmVjYXVzZSBuZWFyIGJyYW5jaCBpcyBjbG9zZWRcbiAgICBbJ2Rhc2hib2FyZC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbJ3N0b3J5LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgWyd0b29sdGlwJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgWyd3b3Jrc2hlZXQnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFsnd29ya3NoZWV0LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgPSBuZXcgRW51bUNvbnZlcnRlcjxcbiAgICBJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gICAgRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlXG4gID4oe1xuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Ob25lU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuU29tZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlVua25vd25TZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYW5ub3RhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEFubm90YXRpb25UeXBlLCBFeHRlcm5hbEFubm90YXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYV06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrXTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrLFxuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLlBvaW50XTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBtYXJrVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsTWFya1R5cGUsIEV4dGVybmFsTWFya1R5cGU+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+LCByZWdpc3RyeUlkOiBudW1iZXIpOiBTaGVldEltcGwge1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SWR4ID0gLTE7XG5cbiAgICBjb25zdCBwdWJsaXNoZWRTaGVldEluZm8gPSBTaGVldFV0aWxzLmdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShjb250YWluZWRTaGVldEluZm8ubmFtZSwgc2hlZXRJbmZvcyk7XG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRTaXplID0gU2hlZXRVdGlscy5jcmVhdGVBdXRvbWF0aWNTaXplKCk7XG4gICAgY29uc3QgaXNDb250YWluZWRTaGVldEhpZGRlbiA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0VXJsID0gcHVibGlzaGVkU2hlZXRJbmZvID8gcHVibGlzaGVkU2hlZXRJbmZvLnVybCA6ICcnO1xuICAgIC8vIENvbnRhaW5lZCBzaGVldHMgYXJlbid0IGFjdGl2ZSAtIHRoZSBjb250YWluaW5nIHNoZWV0IGlzIGFjdGl2ZS5cbiAgICBjb25zdCBjb250YWluZWRTaGVldEFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsXG4gICAgICBTaGVldFV0aWxzLmdldFNoZWV0VHlwZUVudW0oY29udGFpbmVkU2hlZXRJbmZvLnNoZWV0VHlwZSksXG4gICAgICBjb250YWluZWRTaGVldFNpemUsXG4gICAgICBjb250YWluZWRTaGVldElkeCxcbiAgICAgIGNvbnRhaW5lZFNoZWV0QWN0aXZlLFxuICAgICAgaXNDb250YWluZWRTaGVldEhpZGRlbixcbiAgICAgIGNvbnRhaW5lZFNoZWV0VXJsLFxuICAgICk7XG5cbiAgICBsZXQgc2hlZXRJbXBsOiBTaGVldEltcGw7XG4gICAgc3dpdGNoIChjb250YWluZWRTaGVldEluZm9JbXBsLnNoZWV0VHlwZSkge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0OiB7XG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCByZWdpc3RyeUlkLCB2aXpJZCwgbnVsbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkOiB7XG4gICAgICAgIGNvbnN0IHNoZWV0UGF0aDogU2hlZXRQYXRoID0ge1xuICAgICAgICAgIHNoZWV0TmFtZTogY29udGFpbmVkU2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIGlzRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNoZWV0SW1wbCA9IG5ldyBEYXNoYm9hcmRJbXBsKGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwsIGNvbnRhaW5lZFNoZWV0SW5mby5kYXNoYm9hcmRab25lcywgc2hlZXRQYXRoLCByZWdpc3RyeUlkLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoZWV0SW1wbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlQb2ludEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NhcHRpb246IHN0cmluZyxcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FjdGl2ZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cGRhdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5SW1wbDogU3RvcnlJbXBsLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIHNldCBjYXB0aW9uKGNhcHRpb246IHN0cmluZykge1xuICAgIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgc2V0IGluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9pbmRleCA9IGluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FjdGl2ZSA9IGlzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCB1cGRhdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKGlzVXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3VwZGF0ZWQgPSBpc1VwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeUltcGw7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXb3JrYm9va0ltcGwge31cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlNZW51VHlwZSxcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgVG9vbHRpcENvbnRleHQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLCBWaXN1YWxJZCwgV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVmlzdWFsTW9kZWxTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5RmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuUmFuZ2VGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmlsdGVyT3B0aW9ucywgJ2ZpbHRlck9wdGlvbnMnKTtcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlck51bGxPcHRpb24+KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbiwgRmlsdGVyTnVsbE9wdGlvbiwgJ0ZpbHRlck51bGxPcHRpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVJhbmdlUGFyYW1UeXBlKGZpbHRlck9wdGlvbnMubWluLCBmaWx0ZXJPcHRpb25zLm1heCk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSYW5nZUZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4gfCBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbHMsXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZXMsICd2YWx1ZXMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykgJiYgIXZhbHVlcy5sZXZlbHMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheSBvciBjb250YWluIGEgbGV2ZWxzIGtleScsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhckZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxQZXJpb2RUeXBlPihvcHRpb25zLnBlcmlvZFR5cGUsIFBlcmlvZFR5cGUsICdQZXJpb2RUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXRlUmFuZ2VUeXBlPihvcHRpb25zLnJhbmdlVHlwZSwgRGF0ZVJhbmdlVHlwZSwgJ0RhdGVSYW5nZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhdGFTb3VyY2VzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvOiBXb3Jrc2hlZXREYXRhU291cmNlSW5mbyA9IGRhdGFTY2hlbWEud29ya3NoZWV0RGF0YVNjaGVtYU1hcFt0aGlzLm5hbWVdO1xuXG4gICAgICBjb25zdCBkYXRhU291cmNlczogQXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4gPSBbXTtcblxuICAgICAgLy8gRmlyc3QsIGFkZCB0aGUgcHJpbWFyeSBkYXRhc291cmNlLiAgQnkgY29udmVudGlvbiwgaXQgY29tZXMgZmlyc3QgaW4gdGhlIHJldHVybmVkIGFycmF5LlxuICAgICAgY29uc3QgcHJpbWFyeUlkOiBzdHJpbmcgPSB3b3Jrc2hlZXREYXRhU291cmNlSW5mby5wcmltYXJ5RGF0YVNvdXJjZTtcbiAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1twcmltYXJ5SWRdKSk7XG5cbiAgICAgIC8vIFRoZW4sIGxvb3AgdGhyb3VnaCBhbnkgc2Vjb25kYXJ5IGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBmb3IgKGNvbnN0IHNlY29uZGFyeUlkIG9mIHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnJlZmVyZW5jZWREYXRhU291cmNlTGlzdCkge1xuICAgICAgICBpZiAoc2Vjb25kYXJ5SWQgIT09IHByaW1hcnlJZCkge1xuICAgICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1tzZWNvbmRhcnlJZF0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmlsdGVyc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTZWxlY3RlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5TdW1tYXJ5LFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSwgLy8gaW5jbHVkZUFsbENvbHVtbnMgKGNhbiBiZSBvdmVycmlkZGVuIGJ5IGNvbHVtbnNUb0luY2x1ZGVCeUlkKVxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuVW5kZXJseWluZyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHRoaXMudmlzdWFsSWQpLnRoZW48QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4oKGxvZ2ljYWxUYWJsZUluZm9zKSA9PiB7XG4gICAgICByZXR1cm4gbG9naWNhbFRhYmxlSW5mb3MubWFwKChsb2dpY2FsVGFibGVJbmZvKSA9PiBuZXcgTG9naWNhbFRhYmxlKGxvZ2ljYWxUYWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhclNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5SWRBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIobWFyaywgJ21hcmsnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYW5ub3RhdGVNYXJrQXN5bmModGhpcy52aXN1YWxJZCwgbWFyaywgYW5ub3RhdGlvblRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBbm5vdGF0aW9uc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKSB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhbm5vdGF0aW9uLCAnYW5ub3RhdGlvbicpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVBbm5vdGF0aW9uQXN5bmModGhpcy52aXN1YWxJZCwgYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgY29uZmlnOiBDb250ZXh0TWVudU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBlbmRDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBjb25maWcpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbmFtZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVIZWFkZXIsIG1lbnVEZXNjcmlwdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGhvdmVyVHVwbGVBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuaG92ZXJUdXBsZUFzeW5jKHRoaXMudmlzdWFsSWQsIGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBzZWxlY3RUdXBsZXNBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0VHVwbGVzQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkOiBudW1iZXIpOiBQcm9taXNlPFN0cmluZz4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBnZXRUb29sdGlwVGV4dEFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRUb29sdGlwVGV4dEFzeW5jKHRoaXMudmlzdWFsSWQsIHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgICAgIGBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFjY2Vzc2liaWxpdHlTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eSk7XG4gICAgcmV0dXJuIHNlcnZpY2UubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNvdXJjZUluZm86IERhdGFTb3VyY2VJbmZvKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZUltcGwgPSBuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZUluZm8sIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlBY3RpdmVTaGVldCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVXb3Jrc2hlZXQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQoKTtcbiAgICBjb25zdCBpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLmlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpO1xuXG4gICAgaWYgKCFpc1Jvb3RBbmRBY3RpdmVXb3Jrc2hlZXQgJiYgIWlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkICYmICFpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsICYmIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgJiYgdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsICE9PSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBsb2dpY2FsIHRhYmxlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgTG9naWNhbFRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuTG9naWNhbFRhYmxlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ2ljYWxUYWJsZTogTG9naWNhbFRhYmxlSW5mbykge31cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuY2FwdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0LCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCBpbXBsZW1lbnRzIFRvb2x0aXBUZXh0UmVxdWVzdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLCBwdWJsaWMgdHVwbGVJZDogbnVtYmVyKSB7fVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUsIEZpbHRlckRvbWFpblR5cGUsIEZpbHRlclR5cGUsIFBlcmlvZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9saWIvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF93b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcHJvdGVjdGVkIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJUeXBlKCk6IEZpbHRlclR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmllbGRBc3luYyh0aGlzLl9maWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+KTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhcHBseVRvV29ya3NoZWV0cywgJ2FwcGx5VG9Xb3Jrc2hlZXRzJyk7XG4gICAgY29uc3QgdW5pcXVlV29ya3NoZWV0cyA9IG5ldyBTZXQoYXBwbHlUb1dvcmtzaGVldHMpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZE5hbWUsIHRoaXMuX2ZpZWxkSWQsIEFycmF5LmZyb20odW5pcXVlV29ya3NoZWV0cykpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0V4Y2x1ZGVNb2RlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ/OiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4Y2x1ZGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0V4Y2x1ZGVNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGlmICghZG9tYWluVHlwZSkge1xuICAgICAgZG9tYWluVHlwZSA9IEZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQ7XG4gICAgfVxuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJEb21haW5UeXBlPihkb21haW5UeXBlLCBGaWx0ZXJEb21haW5UeXBlLCAnRmlsdGVyRG9tYWluVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWU6IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfaGllcmFyY2hpY2FsUGF0aDogc3RyaW5nLCBwcml2YXRlIF9sZXZlbDogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoaWNhbFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2hpY2FsUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsIGltcGxlbWVudHMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmFtZTogc3RyaW5nLCBwcml2YXRlIF9sZXZlbFNlbGVjdGlvblN0YXRlOiBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbFNlbGVjdGlvblN0YXRlKCk6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbFNlbGVjdGlvblN0YXRlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9kaW1lbnNpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaGllcmFyY2h5Q2FwdGlvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgX251bWJlck9mTGV2ZWxzOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4sXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0FsbFNlbGVjdGVkOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBDb250cmFjdC5GaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGltZW5zaW9uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaW1lbnNpb25OYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWVyYXJjaHlDYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZXJhcmNoeUNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IG51bWJlck9mTGV2ZWxzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbERldGFpbHMoKTogQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNBbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBwbGllZFZhbHVlcygpOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGllZFZhbHVlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2luY2x1ZGVOdWxsVmFsdWVzOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5jbHVkZU51bGxWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVOdWxsVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRSYW5nZURvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hbmNob3JEYXRlOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfcGVyaW9kVHlwZTogUGVyaW9kVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZVR5cGU6IERhdGVSYW5nZVR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VOOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFuY2hvckRhdGUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVyaW9kVHlwZSgpOiBQZXJpb2RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyaW9kVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VUeXBlKCk6IERhdGVSYW5nZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmdlTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZU47XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LCBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhbmdlRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4KCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCBNYXJrVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVGFibGUge1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2RhdGE6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+LFxuICAgIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgcHJpdmF0ZSBfdG90YWxSb3dDb3VudDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2lzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNTdW1tYXJ5RGF0YTogYm9vbGVhbixcbiAgICBwcml2YXRlIF9tYXJrc0luZm8/OiBBcnJheTxNYXJrSW5mbz4sXG4gICkge1xuICAgIHRoaXMuX25hbWUgPSBfaXNTdW1tYXJ5RGF0YSA/ICdTdW1tYXJ5IERhdGEgVGFibGUnIDogJ1VuZGVybHlpbmcgRGF0YSBUYWJsZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8Q29udHJhY3QuQ29sdW1uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hcmtzSW5mbygpOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tYXJrc0luZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvdGFsUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxSb3dDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNUb3RhbFJvd0NvdW50TGltaXRlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNUb3RhbFJvd0NvdW50TGltaXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTdW1tYXJ5RGF0YSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdW1tYXJ5RGF0YTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFya0luZm8gaW1wbGVtZW50cyBDb250cmFjdC5NYXJrSW5mbyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF90eXBlOiBNYXJrVHlwZSwgcHJpdmF0ZSBfY29sb3I6IHN0cmluZywgcHJpdmF0ZSBfdHVwbGVJZD86IG51bWJlcikge31cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogTWFya1R5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHVwbGVJZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90dXBsZUlkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW4gaW1wbGVtZW50cyBDb250cmFjdC5Db2x1bW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZmllbGROYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgX2RhdGFUeXBlOiBEYXRhVHlwZSxcbiAgICBwcml2YXRlIF9pc1JlZmVyZW5jZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1JlZmVyZW5jZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVmZXJlbmNlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gIC8qIHRzbGludDpkaXNhYmxlOm5vLWFueSAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWU6IGFueSwgcHJpdmF0ZSBfbmF0aXZlVmFsdWU6IGFueSwgcHJpdmF0ZSBfZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmcpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmF0aXZlVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlZFZhbHVlO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVhZGVyIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlUmVhZGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaWQ6IHN0cmluZywgcHJvdGVjdGVkIF90b3RhbFJvd0NvdW50OiBudW1iZXIsIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlQ291bnQgPSBNYXRoLmNlaWwoX3RvdGFsUm93Q291bnQgLyBfcGFnZVJvd0NvdW50KTtcbiAgfVxuICBwcm90ZWN0ZWQgX3BhZ2VDb3VudDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZShwYWdlTnVtYmVyLCAwLCB0aGlzLl9wYWdlQ291bnQpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYWdlQXN5bmModGhpcy5faWQsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsUGFnZXNBc3luYyhtYXhSb3dzPzogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBmaXJzdFBhZ2U6IENvbnRyYWN0LkRhdGFUYWJsZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKDApO1xuICAgIG1heFJvd3MgPSBtYXhSb3dzIHx8IHRoaXMudG90YWxSb3dDb3VudDtcbiAgICBjb25zdCByb3dzUmVxdWVzdGVkID0gTWF0aC5taW4obWF4Um93cywgdGhpcy50b3RhbFJvd0NvdW50KTtcbiAgICBjb25zdCBwYWdlc1JlcXVlc3RlZCA9IE1hdGguY2VpbChyb3dzUmVxdWVzdGVkIC8gdGhpcy5fcGFnZVJvd0NvdW50KTtcblxuICAgIC8vIEZldGNoIHVwIHRvIDQwMCBwYWdlcywgd2l0aCBhIGRlZmF1bHQgb2YgMTAsMDAwIHBhZ2VSb3dDb3VudCB0aGF0IGdpdmVzIHVzIDQsMDAwLDAwMCByb3dzXG4gICAgY29uc3QgcGFnZXNUb0ZldGNoID0gTWF0aC5taW4ocGFnZXNSZXF1ZXN0ZWQsIDQwMCk7XG4gICAgY29uc3QgaXNEYXRhTGltaXRlZCA9IHBhZ2VzVG9GZXRjaCA8IHBhZ2VzUmVxdWVzdGVkO1xuICAgIGxldCByZW1haW5pbmdEYXRhOiBBcnJheTxBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+Pj4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhZ2VzVG9GZXRjaDsgaSsrKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoaSk7XG4gICAgICByZW1haW5pbmdEYXRhLnB1c2gocGFnZS5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgZnVsbERhdGEgPSBmaXJzdFBhZ2UuZGF0YS5jb25jYXQoLi4ucmVtYWluaW5nRGF0YSk7XG4gICAgLy8gVGhpcyBzbGljZXMgdGhlIGFycmF5IG9ubHkgaWYgbWF4Um93cyBoYXMgYmVlbiBzZXQgYW5kIGlzIGxlc3MgdGhhbiB0b3RhbFJvd0NvdW50XG4gICAgZnVsbERhdGEubGVuZ3RoID0gcm93c1JlcXVlc3RlZDtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmaXJzdFBhZ2UubmFtZSxcbiAgICAgIGRhdGE6IGZ1bGxEYXRhLFxuICAgICAgY29sdW1uczogZmlyc3RQYWdlLmNvbHVtbnMsXG4gICAgICB0b3RhbFJvd0NvdW50OiBpc0RhdGFMaW1pdGVkID8gcGFnZXNUb0ZldGNoICogdGhpcy5fcGFnZVJvd0NvdW50IDogcm93c1JlcXVlc3RlZCxcbiAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGlzRGF0YUxpbWl0ZWQsXG4gICAgICBpc1N1bW1hcnlEYXRhOiBmaXJzdFBhZ2UuaXNTdW1tYXJ5RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVsZWFzZUFzeW5jKHRoaXMuX2lkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcENvbnRleHQgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSG92ZXJUdXBsZUludGVyYWN0aW9uLCBTZWxlY3RPcHRpb25zLCBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG5cbi8qKlxuICogUmFuZ2UgYmFzZWQgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgbWluVmFsdWU6IHN0cmluZztcbiAgcHVibGljIG1heFZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBpbmNsdWRlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuLyoqXG4gKiBUdXBsZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0aW9uVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgb2JqZWN0SWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGNsYXNzIHRvIHBvcHVsYXRlIGFsbCB0aGUgc2VsZWN0aW9uIG1vZGVscyB3aGVuIHBhcnNpbmcgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gIHB1YmxpYyBoaWVyTW9kZWxBcnI6IEFycmF5PEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgZGltTW9kZWxBcnI6IEFycmF5PERpbWVuc2lvblNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgcXVhbnRNb2RlbEFycjogQXJyYXk8UmFuZ2VTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbjogVHVwbGVTZWxlY3Rpb25Nb2RlbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgIHB1YmxpYyBzZWxlY3RPcHRpb25zOiBTZWxlY3RPcHRpb25zLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0LFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCBpbXBsZW1lbnRzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIHB1YmxpYyBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4sXG4gICkge31cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb2ludCBpbXBsZW1lbnRzIENvbnRyYWN0LlBvaW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6IG51bWJlciwgcHJpdmF0ZSBfeTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl94O1xuICB9XG5cbiAgcHVibGljIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3k7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGVudW0gR2V0RGF0YVR5cGUge1xuICBTdW1tYXJ5ID0gJ3N1bW1hcnknLFxuICBVbmRlcmx5aW5nID0gJ3VuZGVybHlpbmcnLFxufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGltcGxlbWVudGluZyB0aGUgbG9naWMgZm9yIHZhcmlvdXMgZ2V0RGF0YSBjYWxsc1xuICpcbiAqIEBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2VcbiAqIEBleHRlbmRzIHtBcGlTZXJ2aWNlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaW1pdCBvZiByb3dzIGZvciBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jXG4gICAqL1xuICBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge0dldERhdGFUeXBlfSBnZXRUeXBlICBUaGUgdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgb3Igbm90IGFsaWFzZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgb3Igbm90IHNlbGVjdGlvbiBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj59ICBEYXRhIHRhYmxlIHJlYWRlciB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgZGF0YVxuICAgKi9cbiAgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgICovXG4gIGdldFNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgICovXG4gIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICovXG4gIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKiBAcGFyYW0gcGFnZU51bWJlciAgVGhlIHBhZ2UgbnVtYmVyICh6ZXJvLWJhc2VkKS5cbiAgICogQHBhcmFtIHBhZ2VTaXplICAgIFRoZSBwYWdlIHNpemUgb2YgdGhlIG93bmluZyBEYXRhVGFibGVSZWFkZXJcbiAgICogQHJldHVybnMgICAgICAgICAgIEEgRGF0YVRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBwYWdlLiBUaGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSBsZXNzIHRoYW4gcmVxdWVzdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEuXG4gICAqL1xuICBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKi9cbiAgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIFZlcnNpb25OdW1iZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5ub3RhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRXhwb3J0U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1Zpc3VhbE1vZGVsU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVml6U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVml6U2VydmljZUltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1pvbmVTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyLCBwbGF0Zm9ybVZlcnNpb24/OiBWZXJzaW9uTnVtYmVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbmltYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBEYXRhU291cmNlU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCwgcGxhdGZvcm1WZXJzaW9uKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHBvcnRTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBHZXREYXRhU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRmlsdGVyU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgTm90aWZpY2F0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgUGFyYW1ldGVyc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNlbGVjdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFubm90YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBab25lU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2l6ZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFZpc3VhbE1vZGVsU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVml6U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQmFzZSBpbnRlcmZhY2UgZm9yIGFuIGFwaSBzZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYW1lIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3Rpb24gb2Ygc2VydmljZSBuYW1lIHdoaWNoIHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgYXBpLXNoYXJlZCBwcm9qZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFNlcnZpY2VOYW1lcyB7XG4gIEFjY2Vzc2liaWxpdHkgPSAnYWNjZXNzaWJpbGl0eScsXG4gIEF1dGhlbnRpY2F0aW9uID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQ2xpZW50SW5mbyA9ICdjbGllbnQtaW5mby1zZXJ2aWNlJyxcbiAgRGF0YVNvdXJjZVNlcnZpY2UgPSAnZGF0YS1zb3VyY2Utc2VydmljZScsXG4gIEdldERhdGEgPSAnZ2V0LWRhdGEtc2VydmljZScsXG4gIEZpbHRlciA9ICdmaWx0ZXItc2VydmljZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24tc2VydmljZScsXG4gIFBhcmFtZXRlcnMgPSAncGFyYW1ldGVycy1zZXJ2aWNlJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbi1zZXJ2aWNlJyxcbiAgQW5ub3RhdGlvbiA9ICdhbm5vdGF0aW9uLXNlcnZpY2UnLFxuICBab25lID0gJ3pvbmUtc2VydmljZScsXG4gIEFuaW1hdGlvbiA9ICdhbmltYXRpb24tc2VydmljZScsXG4gIFZpeiA9ICd2aXotc2VydmljZScsXG4gIEV4dGVybmFsQ29udGV4dE1lbnUgPSAnZXh0ZXJuYWwtY29udGV4dC1tZW51LXNlcnZpY2UnLFxuICBJbml0aWFsaXphdGlvbiA9ICdpbml0aWFsaXphdGlvbi1zZXJ2aWNlJyxcbiAgU3RvcnlBY3RpdmF0aW9uID0gJ3N0b3J5LWFjdGl2YXRpb24tc2VydmljZScsXG4gIFNpemUgPSAnc2l6ZS1zZXJ2aWNlJyxcbiAgRXhwb3J0ID0gJ2V4cG9ydC1zZXJ2aWNlJyxcbiAgVmlzdWFsTW9kZWwgPSAndmlzdWFsLW1vZGVsLXNlcnZpY2UnLFxufVxuXG4vKipcbiAqIERvIHNvbWUgZ2xvYmFsIGRlY2xhcmF0aW9ucyBzbyB3ZSBjYW4gY3JlYXRlIGEgc2luZ2xldG9uIG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5OiB7IFtyZWdpc3RyeUlkOiBudW1iZXJdOiBTZXJ2aWNlUmVnaXN0cnkgfTtcbiAgfVxufVxuXG53aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCB7fTtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgaW50byB0aGUgc2VydmljZSByZWdpc3RyeS4gQW55IGV4aXN0aW5nIG9uZSB3aWxsXG4gICAqIGJlIG92ZXJ3cml0dGVuLiB0aGUgc2VydmljZSBpcyByZWdpc3RlcmVkIHVuZGVyIHNlcnZpY2Uuc2VydmljZU5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlIFRoZSBzZXJ2aXZlIHRvIHJlZ2lzdGVyXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlcmUgaXMgbm90IGFcbiAgICogc2VydmljZSByZWdpc3RlcmVkIHVuZGVyIHRoYXQgbmFtZSwgdGhyb3dzIGFuZCBlcnJvclxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgcmVxdWVzdGVkIHNlcnZpY2VcbiAgICovXG4gIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUO1xufVxuXG5jbGFzcyBTZXJ2aWNlUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfc2VydmljZXM6IHsgW3NlcnZpY2VOYW1lOiBzdHJpbmddOiBBcGlTZXJ2aWNlIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlLnNlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fc2VydmljZXMuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7c2VydmljZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2VOYW1lXSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2VcbiAqIG9mIHRoZSBBcGlTZXJ2aWNlUmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeUlkLlxuICpcbiAqIEV4dGVuc2lvbnMgYnkgZGVzaWduIGRvbid0IG5lZWQgdG8gc3RvcmUvYWNjZXNzIG11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcy4gVGhlaXIgc2luZ2xlIGluc3RhbmNlIG9mIFNlcnZpY2VSZWdpc3RyeSBpc1xuICogc3RvcmVkL2FjY2VzcyB3aXRoIHJlZ2lzdHJ5SWQgPSAwLlxuICpcbiAqIFdoZXJlYXMgRW1iZWRkaW5nIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHdoaWNoIFNlcnZpY2VSZWdpc3RyeSB0byB1c2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdml6emVzIGVtYmVkZGVkLlxuICogQW4gZXhhbXBsZSBvZiBob3cgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB3aWxsIGxvb2sgd2hlbiB0aGVyZSBhcmUgdHdvIHZpenplczogeyAwIDogU2VydmljZVJlZ2lzdHJ5LCAxIDogU2VydmljZVJlZ2lzdHJ5fVxuICogd2hlcmUgcmVnaXN0cnkgSUQgb2YgMCAmIDEgcmVmZXJzIHRvIHZpeidzIGludGVybmFsIGlkZW50aWZpZXIgKHdoaWNoIGlzIGdlbmVyYXRlZCBieSBWaXpNYW5hZ2VyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VSZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQocmVnaXN0cnlJZDogbnVtYmVyKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwgIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShyZWdpc3RyeUlkLCBuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgc2V0cyB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnlJZC4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2UocmVnaXN0cnlJZDogbnVtYmVyLCBzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdID0gc2VydmljZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSB0byBhdm9pZCBhbnlvbmUgY29uc3RydWN0aW5nIHRoaXNcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvQWNjZXNzaWJpbGl0eU1vZGVscyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgbGV0IHRvb2x0aXBUZXh0UmVxdWVzdCA9IG5ldyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCh2aXN1YWxJZCwgdHVwbGVJZCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VG9vbHRpcFRleHRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVG9vbHRpcFRleHRSZXF1ZXN0XTogdG9vbHRpcFRleHRSZXF1ZXN0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRUb29sdGlwVGV4dCwgcGFyYW1ldGVycykudGhlbjxTdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBsYXlTcGVlZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5pbWF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFuaW1hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBc3luYyhyZXBsYXlTcGVlZDogUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF06IDEuMCxcbiAgICB9O1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxSZXBsYXlTcGVlZFR5cGU+KHJlcGxheVNwZWVkLCBSZXBsYXlTcGVlZFR5cGUsICdSZXBsYXlTcGVlZFR5cGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRSZXBsYXlTcGVlZFR5cGUuY29udmVydChyZXBsYXlTcGVlZCk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZXBsYXlBbmltYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBbm5vdGF0ZUVudW0sIEFubm90YXRpb24sIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciwgVHVwbGVTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFubm90YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYW5ub3RhdGUgYSBtYXJrIG9uIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gbWFya1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblRleHRcbiAgICovXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VNYXJrU2VsZWN0aW9uSWRzKFttYXJrXSk7XG4gICAgY29uc3QgZHVtbXlUYXJnZXRQb2ludCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IGZvcm1hdHRlZFRleHQgPSBgPGZvcm1hdHRlZC10ZXh0PjxydW4+JHthbm5vdGF0aW9uVGV4dH08L3J1bj48L2Zvcm1hdHRlZC10ZXh0PmA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYW5ub3RhdGVNYXJrQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuQW5ub3RhdGVFbnVtXTogQW5ub3RhdGVFbnVtLk1hcmssXG4gICAgICBbUGFyYW1ldGVySWQuVGFyZ2V0UG9pbnRdOiBkdW1teVRhcmdldFBvaW50LFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Gb3JtYXR0ZWRUZXh0XTogZm9ybWF0dGVkVGV4dCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNyZWF0ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbm5vdGF0aW9ucyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEFubm90YXRpb24+Pn1cbiAgICovXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QW5ub3RhdGlvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFubm90YXRpb25zLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zTGlzdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxBbm5vdGF0aW9uPjtcbiAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25GaWx0ZXJNYXAoYW5ub3RhdGlvbnNMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmVtb3ZlIGFuIGFubm90YXRpb24gZnJvbSBhIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgYW5ub3RhdGlvbjogQ29udHJhY3QuQW5ub3RhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhbYW5ub3RhdGlvbl0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUFubm90YXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25MaXN0XTogW3NlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbl0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVBbm5vdGF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlTWFya1NlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmsudHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCAmJiB0dXBsZUlkID4gMCkge1xuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCB0dXBsZUlkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhhbm5vdGF0aW9uczogQXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBhbm5vdGF0aW9uLmFubm90YXRpb25JZDtcbiAgICAgIGlmIChhbm5vdGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uSWQgIT09IG51bGwgJiYgYW5ub3RhdGlvbklkID49IDApIHtcbiAgICAgICAgaWRzLnB1c2goYW5ub3RhdGlvbklkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSBhbm5vdGF0aW9uIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIGFubm90YXRpb25JZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBhbm5vdGF0aW9uIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ2Fubm90YXRpb25zJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtYXAgQW5ub3RhdGlvbiB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICogQHJldHVybnMge0Fubm90YXRpb259XG4gICAqL1xuICBwcml2YXRlIG1hcEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbik6IENvbnRyYWN0LkFubm90YXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uSFRNTDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVGV4dCxcbiAgICAgIGFubm90YXRpb25JZDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uSWQsXG4gICAgICBhbm5vdGF0aW9uVGV4dDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uUGxhaW5UZXh0LFxuICAgICAgYW5ub3RhdGlvblR5cGU6IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbm5vdGF0aW9uVHlwZS5jb252ZXJ0KGFubm90YXRpb24uYW5ub3RhdGVFbnVtKSxcbiAgICAgIHR1cGxlSWQ6IGFubm90YXRpb24udHVwbGVJZCEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIEFubm90YXRpb25zIHRvIE1hcmsgQW5ub3RhdGlvbnMsIGFuZCBtYXAgdGhlbSB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxBbm5vdGF0aW9uPn1cbiAgICovXG4gIHByaXZhdGUgYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj4pOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkluZm9zID0gYW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiB0aGlzLm1hcEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuXG4gICAgcmV0dXJuIGFubm90YXRpb25JbmZvcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbywgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQ2xpZW50SW5mb1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQ2xpZW50SW5mb1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldENsaWVudEluZm9Bc3luYygpOiBQcm9taXNlPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEVtYmVkZGluZ0NsaWVudEluZm87XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENsaWVudEluZm9Bc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFbWJlZGRpbmdCb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudEluZm8gPSByZXNwb25zZS5yZXN1bHQgYXMgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbztcbiAgICAgIHJldHVybiBjbGllbnRJbmZvO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9GaWVsZEltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNvbnN0IFNFTlRJTkVMX0xPR0lDQUxfVEFCTEVfSU5GTzogTG9naWNhbFRhYmxlSW5mbyA9IHtcbiAgaWQ6IEludGVybmFsQ29udHJhY3QuQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsLlNpbmdsZVRhYmxlSWQsXG4gIGNhcHRpb246IEludGVybmFsQ29udHJhY3QuQXBpU2hvd0RhdGFUYWJsZVNlbnRpbmVsLlNpbmdsZVRhYmxlQ2FwdGlvbixcbn07XG5cbi8vIFRoZSBtaW5pbXVtIHBsYXRmb3JtIHZlcnNpb24gd2hlbiBPYmplY3QgTW9kZWwgd2FzIHN1cHBvcnRlZFxuY29uc3QgcGxhdGZvcm1WZXJzaW9uT2JqZWN0TW9kZWxTdXBwb3J0ID0geyBtYWpvcjogMSwgbWlub3I6IDIwLCBmaXg6IDEgfTtcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIERhdGFTb3VyY2VTZXJ2aWNlIHtcbiAgLy8gU2luY2UgT2JqZWN0IE1vZGVsIGlzIHN1cHBvcnRlZCBzaW5jZSBUYWJsZWF1IDIwMjAuMiwgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIHRoZVxuICAvLyBwbGF0Zm9ybSB2ZXJzaW9uIHdoZW4gT00gd2FzIHN1cHBvcnRlZC4gT25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIFRhYmxlYXUgdmVyc2lvbnMgPD0gMjAyMC4xLCBhbGwgYWRkaXRpb25hbFxuICAvLyBjb2RlIGluIGhlcmUgZm9yIE9iamVjdCBNb2RlbCBjYW4gYmUgcmVtb3ZlZC5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBJbnRlcm5hbENvbnRyYWN0LlZlcnNpb25OdW1iZXIgPSBwbGF0Zm9ybVZlcnNpb25PYmplY3RNb2RlbFN1cHBvcnQsXG4gICkge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVmcmVzaEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy8gT24gc2VydmVyOiBOb3QgcGFzc2luZyB0aGUgZGF0YXNvdXJjZSBpZCB3aWxsIHJlZnJlc2ggYWxsIGRhdGFzb3VyY2VzLlxuICAgIGlmIChkYXRhU291cmNlSWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXSA9IGRhdGFTb3VyY2VJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IGpvaW5QYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWN0aXZlVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWN0aXZlVGFibGVzLCBqb2luUGFyYW1ldGVycykudGhlbjxBcnJheTxUYWJsZUluZm8+Pigoam9pblJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUluZm9zID0gam9pblJlc3BvbnNlLnJlc3VsdCBhcyBUYWJsZUluZm9zO1xuXG4gICAgICAvLyBnZXRBY3RpdmVUYWJsZXMgaXMgdW5zdXBwb3J0ZWQgZm9yIGN1YmVzIGFuZCBHQS4gV2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uIHR5cGUgcHJvcGVydHlcbiAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHRoZSBwbGF0Zm9ybSAoaW50ZW50aW9uYWxseSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYXMgbmV3IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCkuXG4gICAgICAvLyBJbnN0ZWFkLGp1c3QgY2hlY2sgaWYgYW55IHRhYmxlcyBhcmUgcmV0dXJuZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3IgYW55IG5vbi10YWJsZSBiYXNlZCBkYXRhc291cmNlLlxuICAgICAgaWYgKHRhYmxlSW5mb3MudGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRNZXRob2RGb3JEYXRhU291cmNlVHlwZSwgYGdldEFjdGl2ZVRhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGZvcjogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZUluZm9zLnRhYmxlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbGxEYXRhU291cmNlc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFsbERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzLCBwYXJhbXMpLnRoZW48Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uU3VtbWFyaWVzID0gcmVzcG9uc2UucmVzdWx0IGFzIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblN1bW1hcmllcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKGdsb2JhbGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmllbGRBbmREYXRhU291cmNlO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWVsZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlXSBhcyBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2U7XG4gICAgICBjb25zdCBmaWVsZCA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5GaWVsZF0gYXMgRmllbGQ7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmllbGQoZmllbGQsIHRoaXMuY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBpZiAoIXRoaXMuaXNPYmplY3RNb2RlbFN1cHBvcnRlZEJ5UGxhdGZvcm0oKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIHNlbnRpbmVsIElEIGNhbiBiZSBwYXNzZWQgdG8gZGF0YXNvdXJjZS5nZXRMb2dpY2FsVGFibGVEYXRhLlxuICAgICAgICogT25jZSB0aGUgZGVza3RvcCBpcyB1cGdyYWRlZCB0byBhIHZlcnNpb24gdGhhdCBzdXBwb3J0cyBvYmplY3QgbW9kZWwsXG4gICAgICAgKiB0aGUgc2VudGluZWwgSUQgd2lsbCBhdXRvbWF0aWNhbGx5IGZldGNoIHRoZSB1cGdyYWRlZCB0YWJsZS5cbiAgICAgICAqICovXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNvbHZlKSA9PiByZXNvbHZlKFtTRU5USU5FTF9MT0dJQ0FMX1RBQkxFX0lORk9dKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGlmICghdGhpcy5pc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgc2VudGluZWwgSUQgY2FuIGJlIHBhc3NlZCB0byB3b3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YS5cbiAgICAgICAqIE9uY2UgdGhlIGRlc2t0b3AgaXMgdXBncmFkZWQgdG8gYSB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgb2JqZWN0IG1vZGVsLFxuICAgICAgICogdGhlIHNlbnRpbmVsIElEIHdpbGwgYXV0b21hdGljYWxseSBmZXRjaCB0aGUgdXBncmFkZWQgdGFibGUuXG4gICAgICAgKiAqL1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbU0VOVElORUxfTE9HSUNBTF9UQUJMRV9JTkZPXSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmllbGQoZmllbGQ6IEludGVybmFsQ29udHJhY3QuRmllbGQsIGRhdGFTb3VyY2U6IENvbnRyYWN0LkRhdGFTb3VyY2UpOiBDb250cmFjdC5GaWVsZCB7XG4gICAgcmV0dXJuIG5ldyBGaWVsZChuZXcgRmllbGRJbXBsKGZpZWxkLCBkYXRhU291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRhU291cmNlKGRhdGFTb3VyY2U6IEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZSwgdGhpcy5fcmVnaXN0cnlJZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09iamVjdE1vZGVsU3VwcG9ydGVkQnlQbGF0Zm9ybSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwbGF0Zm9ybVZlcnNpb25Ob09iamVjdE1vZGVsU3VwcG9ydCA9IHsgbWFqb3I6IDEsIG1pbm9yOiAxMywgZml4OiAwIH07XG4gICAgcmV0dXJuIEludGVybmFsQ29udHJhY3QuVmVyc2lvbkxlc3NUaGFuKHBsYXRmb3JtVmVyc2lvbk5vT2JqZWN0TW9kZWxTdXBwb3J0LCB0aGlzLl9wbGF0Zm9ybVZlcnNpb24pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCxcbiAgRXhwb3J0RmlsZSxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFNoZWV0VHlwZSBhcyBFeHRlcm5hbFNoZWV0VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRXhwb3J0SGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0V4cG9ydEhlbHBlcnMnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4uL0V4cG9ydFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHBvcnRTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRXhwb3J0O1xuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYyhjdXJyZW50U2hlZXRUeXBlOiBFeHRlcm5hbFNoZWV0VHlwZSk6IFByb21pc2U8RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXJyZW50U2hlZXRUeXBlXTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNoZWV0VHlwZS5jb252ZXJ0KGN1cnJlbnRTaGVldFR5cGUpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEV4cG9ydENyb3NzdGFiU2hlZXRNYXA+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydENyb3NzdGFiU2hlZXRNYXA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydENyb3NzdGFiQXN5bmMoXG4gICAgc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gICAgZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlLFxuICApOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVXb3Jrc2hlZXROYW1lcywgc2hlZXROYW1lKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENyb3NzdGFiRmlsZUZvcm1hdD4oZm9ybWF0LCBDcm9zc3RhYkZpbGVGb3JtYXQsICdDcm9zc3RhYkZpbGVGb3JtYXQnKTtcblxuICAgIC8vIFRoZSBwcmVzIGxheWVyIGNvbW1hbmQgZm9yIGV4cG9ydGluZyBDcm9zc3RhYiB1c2VzIFNpbXBsZVNoZWV0SWRlbnRpZmllcnMgaW5zdGVhZCBvZiBzaGVldCBuYW1lcy5cbiAgICAvLyBUaGUgZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaSBjdXJyZW50IGRvZXMgbm90IHN0b3JlIHJlZmVyZW5jZXMgdG8gdGhlIFNpbXBsZVNoZWV0SWRlbnRpZmllcnMgb2YgaXRzIHNoZWV0c1xuICAgIC8vIHNvIHdlIGNhbGwgYSBwcmVzIGxheWVyIGNvbW1hbmQgdGhhdCBnaXZlcyB1cyB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVyIGZvciBlYWNoIHNoZWV0IG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZVxuICAgIC8vIGV4cG9ydCBDcm9zc3RhYiBkaWFsb2cgcG9wdXAuXG4gICAgY29uc3Qgc2hlZXROYW1lVG9JZE1hcCA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGUpO1xuICAgIGlmICghc2hlZXROYW1lVG9JZE1hcFtzaGVldE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ21pc3Npbmcgc2hlZXQgZG9jIGlkIGZyb20gc2hlZXRNYXAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0Q3Jvc3N0YWJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXRJZGVudGlmaWVyXTogc2hlZXROYW1lVG9JZE1hcFtzaGVldE5hbWVdLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbmROb3RpZmljYXRpb25zXTogdHJ1ZSwgLy8gc2VuZCBub3RpZmljYXRpb24gb24gcHJlcyBsYXllciB0aGF0IHRyaWdnZXJzIGZpbGUgZG93bmxvYWRcbiAgICB9O1xuXG4gICAgLy8gcHJlcyBsYXllciBjb21tYW5kIGludm9rZWQgZGVwZW5kcyBvbiB0aGUgY3Jvc3N0YWIgZmlsZSBmb3JtYXRcbiAgICBsZXQgdmVyYjtcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiQ3N2RG93bmxvYWQ7XG4gICAgICAgIC8vIENTViBvbmx5IHBhcmFtZXRlcjogc2VlIGJyb3dzZXItY2xpZW50cy9leHBvcnQtY3Jvc3N0YWItb3B0aW9ucy1kaWFsb2cgcmVwb1xuICAgICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlVzZVRhYkRlbGltaXRlcnNdID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbDpcbiAgICAgICAgdmVyYiA9IFZlcmJJZC5FeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICd1bnN1cHBvcnRlZCBDcm9zc3RhYiBmaWxlIGZvcm1hdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkNyb3NzdGFiQ3JlYXRpb25FcnJvciwgJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnQuJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnREYXRhQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIC8vIFJlbW92ZSBhbnkgZHVwbGljYXRlcyBmcm9tIHRoZSBpbnB1dCBhcnJheVxuICAgIGNvbnN0IGNvbHVtbnNBc1NldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQpO1xuICAgIGNvbnN0IGNvbHVtbnNUb0luY2x1ZGVCeUlkID0gQXJyYXkuZnJvbShjb2x1bW5zQXNTZXQpO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnREYXRhRG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydERhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogb3B0aW9ucy5pZ25vcmVBbGlhc2VzID8/IGZhbHNlLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogY29sdW1uc1RvSW5jbHVkZUJ5SWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPHZvaWQ+KCgpID0+IHt9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkRhdGFDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydFBvd2VyUG9pbnRBc3luYyhzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQpOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lc0ZvclBERkFuZFBQVChzaGVldE5hbWVzLCBleHBvcnRTY2VuYXJpb3MpO1xuXG4gICAgLy8gTm90ZTogdGhlIEV4cG9ydE9yaWdpblVybCBwYXJhbSBpcyBsaXN0ZWQgYXMgb3B0aW9uYWwgZm9yIHRoZSBwcmVzIGxheWVyIGNvbW1hbmQgd2UgYXJlIGludm9raW5nOyBob3dldmVyLFxuICAgIC8vIHJlY2VudCBjaGFuZ2VzIHdlcmUgbWFkZSB0aGF0IGVuZm9yY2VkIHRoZSB1c2Ugb2YgdGhlIGVtcHR5IHN0cmluZyB3aGVuIGludm9raW5nIHRoaXMgY29tbWFuZCB3aXRoIG5vIEV4cG9ydE9yaWdpblVybC5cbiAgICAvLyBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wb3dlcnBvaW50LW9wdGlvbnMtZGlhbG9nIHJlcG8uXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnRQb3dlcnBvaW50RG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydFBvd2VyUG9pbnRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0T3JpZ2luVXJsXTogJycsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0ZWRTaGVldE5hbWVzXTogc2hlZXROYW1lcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5Qb3dlclBvaW50Q3JlYXRpb25FcnJvcixcbiAgICAgICAgICAnQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIHRoZSBQb3dlclBvaW50IGZpbGUuJyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydFBERkFzeW5jKFxuICAgIHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gICAgZXhwb3J0U2NlbmFyaW9zOiBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICApOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RXhwb3J0UERGT3B0aW9ucyhleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICBjb25zdCBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk7XG4gICAgRXhwb3J0SGVscGVycy51cGRhdGVJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIHNoZWV0TmFtZXMpO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnRQZGZEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UERGQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4cG9ydFBkZk9wdGlvbnNdOiBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuUERGQ3JlYXRpb25FcnJvciwgJ1VuYWJsZSB0byBjcmVhdGUgUERGIGJlY2F1c2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcuIFRyeSBhZ2Fpbi4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydFBERk9wdGlvbnNBc3luYygpOiBQcm9taXNlPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RXhwb3J0UGRmT3B0aW9ucztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RXhwb3J0UGRmT3B0aW9uc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFwaU1lbnVUeXBlLCBDb250ZXh0TWVudU9wdGlvbnMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIGFwcGVuZENvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBlbmRFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBlbmRDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZV06IGNvbmZpZy5kaXNwbGF5TmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBuZXdNZW51SXRlbUlkID0gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIHJldHVybiBuZXdNZW51SXRlbUlkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbW92ZUV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeGVjdXRlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZW5hbWVFeHRlcm5hbE1lbnU7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbmFtZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SGVhZGVyXTogbWVudUhlYWRlcixcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVEZXNjcmlwdGlvbl06IG1lbnVEZXNjcmlwdGlvbixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRmlsdGVyVHlwZSwgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBJbnRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsRG9tYWluLFxuICBDYXRlZ29yaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsRGF0YVZhbHVlLFxuICBIaWVyYXJjaGljYWxGaWx0ZXIsXG4gIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsLFxuICBSYW5nZURvbWFpbixcbiAgUmFuZ2VGaWx0ZXIsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlcixcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL0ZpbHRlck1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEZpbHRlclNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5GaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5RmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID1cbiAgICAgIGZpbHRlck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSYW5nZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSYW5nZUZpbHRlckFzeW5jJyxcbiAgICB9O1xuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5taW4gIT09IG51bGwpIHtcbiAgICAgIGxldCBtaW46IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWluID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbiA9IGZpbHRlck9wdGlvbnMubWluO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1pbl0gPSBtaW47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5tYXggIT09IG51bGwpIHtcbiAgICAgIGxldCBtYXg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWF4ID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9IGZpbHRlck9wdGlvbnMubWF4O1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1heF0gPSBtYXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIG51bGwgb3B0aW9uIGlzIHVzZWQgd2l0aCBtaW4rbWF4IGZvciAnaW5jbHVkZS1yYW5nZScgb3IgJ2luY2x1ZGUtcmFuZ2Utb3ItbnVsbCdcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTnVsbE9wdGlvbl0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIubnVsbE9wdGlvbnMuY29udmVydChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihyZXNwb25zZS5yZXN1bHQgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG5cbiAgICBjb25zdCBoaWVyYXJjaGljYWxMZXZlbHMgPSAodmFsdWVzIGFzIENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscykubGV2ZWxzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGllcmFyY2hpY2FsTGV2ZWxzKSAmJiBoaWVyYXJjaGljYWxMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJMZXZlbHNdID0gaGllcmFyY2hpY2FsTGV2ZWxzO1xuICAgIH0gZWxzZSBpZiAoKHZhbHVlcyBhcyBBcnJheTxTdHJpbmc+KS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBzZXJ2ZXIgY29tbWFuZCBleHBlY3RzIGVtcHR5IGxpc3QgZm9yIGNsZWFyaW5nIHRoZSBmaWx0ZXJcbiAgICAgIC8vIGl0IGFsc28gZXhwZWN0cyBlaXRoZXJzIEZpbHRlckxldmVscyBvciBGaWx0ZXJWYWx1ZXMgdG8gYmUgc2V0XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID0gZmlsdGVyT3B0aW9ucyAmJiAhIWZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2xlYXJGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3Bvc25lKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucykge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QZXJpb2RUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5wZXJpb2RUeXBlLmNvbnZlcnQob3B0aW9ucy5wZXJpb2RUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRhdGVSYW5nZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChvcHRpb25zLnJhbmdlVHlwZSk7XG4gICAgaWYgKG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLkxhc3ROIHx8IG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLk5leHROKSB7XG4gICAgICBpZiAob3B0aW9ucy5yYW5nZU4gPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnJhbmdlTiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIEVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMsXG4gICAgICAgICAgJ01pc3NpbmcgcmFuZ2VOIGZpZWxkIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIExBU1ROIG9yIE5FWFROLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJhbmdlTl0gPSBvcHRpb25zLnJhbmdlTjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbmNob3JEYXRlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hbmNob3JEYXRlICE9PSBudWxsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkFuY2hvckRhdGVdID0gdGhpcy5jb252ZXJ0QW5jaG9yRGF0ZShvcHRpb25zLmFuY2hvckRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmlsdGVycztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RmlsdGVyc0FzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0Q2F0ZWdvcmljYWxEb21haW47XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENhdGVnb3JpY2FsRG9tYWluQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRG9tYWluVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyRG9tYWluVHlwZS5jb252ZXJ0KGRvbWFpblR5cGUpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJhbmdlRG9tYWluQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcsIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRSYW5nZURvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UmFuZ2VEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlJhbmdlRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXREYXNoYm9hcmRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5EYXNoYm9hcmRDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYycpO1xuICAgIGNvbnN0IHdvcmtzaGVldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHM/Lm1hcCgod29ya3NoZWV0SW5mbzogSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbCkgPT4ge1xuICAgICAgaWYgKHdvcmtzaGVldEluZm8uaXNTZWxlY3RlZCkge1xuICAgICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldEluZm8ud29ya3NoZWV0TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdvcmtzaGVldE5hbWVzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBhcHBseVRvV29ya3NoZWV0czogQXJyYXk8c3RyaW5nPixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luY0ludGVybmFsJyk7XG4gICAgaWYgKCFzaGFyZWRGaWx0ZXJNb2RlbCB8fCAhc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdUaGlzIGZpbHRlciBkb2VzIG5vdCBhcHBseSB0byBtdWx0aXBsZSB3b3Jrc2hlZXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dlZFdvcmtzaGVldHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGFjdGl2ZVdvcmtzaGVldCA9ICcnO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHMuZm9yRWFjaCgod29ya3NoZWV0KSA9PiB7XG4gICAgICAvLyBHZXQgYWN0aXZlIHdvcmtzaGVldFxuICAgICAgaWYgKHdvcmtzaGVldC5pc0FjdGl2ZSkge1xuICAgICAgICBhY3RpdmVXb3Jrc2hlZXQgPSB3b3Jrc2hlZXQud29ya3NoZWV0TmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gUG9wdWxhdGUgYWxsb3dlZCB3b3Jrc2hlZXRzXG4gICAgICBpZiAod29ya3NoZWV0LmlzU2VsZWN0ZWQgfHwgd29ya3NoZWV0LmlzRW5hYmxlZCkge1xuICAgICAgICBhbGxvd2VkV29ya3NoZWV0cy5wdXNoKHdvcmtzaGVldC53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhY3RpdmVXb3Jrc2hlZXQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ05vIGFjdGl2ZSB3b3Jrc2hlZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwcGx5VG9Xb3Jrc2hlZXRzLmluY2x1ZGVzKGFjdGl2ZVdvcmtzaGVldCkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthY3RpdmVXb3Jrc2hlZXR9IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFwcGxpZWQgd29ya3NoZWV0c2ApO1xuICAgIH1cblxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzLmZvckVhY2goKHNoZWV0KSA9PiB7XG4gICAgICAvLyBjaGVjayBpZiBpdCdzIHByZXNlbnQgd2l0aGluIGNvbXBhdGlibGUgc2hlZXRzXG4gICAgICBpZiAoIWFsbG93ZWRXb3Jrc2hlZXRzLmluY2x1ZGVzKHNoZWV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFRoZSBmaWVsZCAke2ZpZWxkTmFtZX0gaXNuJ3QgYXBwbGljYWJsZSB0byB0aGUgd29ya3NoZWV0ICR7c2hlZXR9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkNoYW5nZVNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9ICdzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hhcmVkRmlsdGVyU2hlZXRzXSA9IGFwcGx5VG9Xb3Jrc2hlZXRzO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZ1tdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBhcHBseVRvV29ya3NoZWV0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgcHJpdmF0ZSBleGVjdXRlR2V0QXBwbGllZFdvcmtzaGVldHMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRTaGFyZWRGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV0gPSB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZEZpbHRlck1vZGVsID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgICByZXR1cm4gc2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREb21haW5GaWx0ZXJzKGRvbWFpbkZpbHRlcnM6IEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPik6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4ge1xuICAgIGNvbnN0IGZpbHRlcnM6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4gPSBbXTtcbiAgICBkb21haW5GaWx0ZXJzLmZvckVhY2goKGRvbWFpbkZpbHRlcikgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBDYXRlZ29yaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuSGllcmFyY2hpY2FsOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRIaWVyYXJjaGljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIaWVyYXJjaGljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJhbmdlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydFJhbmdlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmFuZ2UgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZToge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmVsYXRpdmUgRGF0ZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcik6IENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGR2KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNFeGNsdWRlLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyKTogQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGhpZXJhcmNoaWNhbERhdGFWYWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxEYXRhVmFsdWUoXG4gICAgICAgIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShoaWVyYXJjaGljYWxEYXRhVmFsdWUudmFsdWUpLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUuaGllcmFyY2hpY2FsUGF0aCxcbiAgICAgICAgaGllcmFyY2hpY2FsRGF0YVZhbHVlLmxldmVsLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxldmVsRGV0YWlsczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWw+ID0gZG9tYWluRmlsdGVyLmxldmVsSW5mby5tYXAoKGFMZXZlbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxMZXZlbERldGFpbChcbiAgICAgICAgYUxldmVsLm5hbWUsXG4gICAgICAgIEludGVybmFsRW51bUNvbnZlcnRlci5oaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLmNvbnZlcnQoYUxldmVsLmxldmVsU2VsZWN0aW9uU3RhdGUpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgSGllcmFyY2hpY2FsRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgZG9tYWluRmlsdGVyLmRpbWVuc2lvbk5hbWUsXG4gICAgICBkb21haW5GaWx0ZXIuaGllcmFyY2h5Q2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5sZXZlbHMsXG4gICAgICBsZXZlbERldGFpbHMsXG4gICAgICBhcHBsaWVkVmFsdWVzLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJhbmdlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcik6IENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgICBjb25zdCBtaW5WYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5taW4pO1xuICAgIGNvbnN0IG1heFZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1heCk7XG4gICAgcmV0dXJuIG5ldyBSYW5nZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIpOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICAgIGNvbnN0IGFuY2hvckRhdGVWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5hbmNob3JEYXRlKTtcbiAgICByZXR1cm4gbmV3IFJlbGF0aXZlRGF0ZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYW5jaG9yRGF0ZVZhbHVlLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQoZG9tYWluRmlsdGVyLnBlcmlvZFR5cGUpLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChkb21haW5GaWx0ZXIucmFuZ2VUeXBlKSxcbiAgICAgIGRvbWFpbkZpbHRlci5yYW5nZU4sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT4gPSBkb21haW4udmFsdWVzLm1hcCgoZG9tYWluRHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRHYpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxEb21haW4odmFsdWVzLCBkb21haW5UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJhbmdlRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5SYW5nZURvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LlJhbmdlRG9tYWluIHtcbiAgICBjb25zdCBtaW46IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWluKTtcbiAgICBjb25zdCBtYXg6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRG9tYWluKG1pbiwgbWF4LCBkb21haW5UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEFuY2hvckRhdGUoYW5jaG9yRGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgLy8gQ29udmVydHMgYSBEYXRlIG9iamVjdCBpbnRvIGEgc3RyaW5nIGZvcm1hdCB0aGF0IHRoZSBzZXJ2ZXIgZXhwZWN0cyBmb3IgZGF0ZS90aW1lIHZhbHVlcy5cbiAgICAvLyBJZiBhbmNob3JEYXRlIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgRGF0ZSBvYmplY3QsIGFueSBvZiB0aGVzZSB3b3VsZCBiZSBOYU4uXG4gICAgY29uc3QgeWVhciA9IGFuY2hvckRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IGFuY2hvckRhdGUuZ2V0VVRDTW9udGgoKSArIDE7XG4gICAgY29uc3QgZGF5ID0gYW5jaG9yRGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGggPSBhbmNob3JEYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgY29uc3QgbW0gPSBhbmNob3JEYXRlLmdldFVUQ01pbnV0ZXMoKTtcbiAgICBjb25zdCBzZWMgPSBhbmNob3JEYXRlLmdldFVUQ1NlY29uZHMoKTtcblxuICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkgfHwgaXNOYU4oZGF5KSB8fCBpc05hTihoaCkgfHwgaXNOYU4obW0pIHx8IGlzTmFOKHNlYykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkRGF0ZVBhcmFtZXRlciwgJ0ludmFsaWQgZGF0ZSBwYXJhbWV0ZXI6IGFuY2hvckRhdGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtoaH06JHttbX06JHtzZWN9YDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3Ioc2VydmVyUG06IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuUGFyYW1ldGVyRXJyb3JdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEZpbHRlckZpZWxkTmFtZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRDYXB0aW9uXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEZpbHRlckZpZWxkVmFsdWUsIHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkQWdnRmllbGROYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRBZ2dyZWdhdGlvbkZpZWxkTmFtZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkQWdnRmllbGROYW1lXSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ1NlcnZlciBFcnJvcicpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCxcbiAgRGF0YVRhYmxlIGFzIERhdGFUYWJsZUludGVybmFsQ29udHJhY3QsXG4gIERhdGFUYWJsZVJlYWRlciBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0LFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSGlnaGxpZ2h0ZWRNYXJrc1RhYmxlLFxuICBQYXJhbWV0ZXJJZCxcbiAgU2VsZWN0ZWRNYXJrc1RhYmxlLFxuICBVbmRlcmx5aW5nRGF0YVRhYmxlLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBDb2x1bW4sIERhdGFUYWJsZSwgTWFya0luZm8gfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVGFibGVSZWFkZXIgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YVRhYmxlUmVhZGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBHZXREYXRhU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBHZXREYXRhU2VydmljZSB7XG4gIC8vIFRoZSBleHRlbnNpb24vZW1iZWRkaW5nIGluc3RhbmNlIHVzZXMgdGhlIHNhbWUgY2FjaGUgZm9yIGFsbCBEYXRhVGFibGVSZWFkZXJzLlxuICBwcml2YXRlIHZpZXdEYXRhVGFibGVDYWNoZUlkOiBzdHJpbmcgPSB1dWlkdjQoKTtcblxuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5HZXREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldE1heFJvd0xpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDEwMDAwO1xuICB9XG5cbiAgcHVibGljIGdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmlld0RhdGFUYWJsZUNhY2hlSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldExpbWl0ZWRNYXhSb3dzKHJlcXVlc3RlZFJvd3M6IG51bWJlciwgcm93Q291bnRMaW1pdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmVxdWVzdGVkUm93cyA+IDAgJiYgcmVxdWVzdGVkUm93cyA8IHJvd0NvdW50TGltaXQgPyByZXF1ZXN0ZWRSb3dzIDogcm93Q291bnRMaW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSkgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgcmVzcG9uc2VEYXRhLmlzU3VtbWFyeSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlBhZ2VSb3dDb3VudF06IHBhZ2VSb3dDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhO1xuICAgICAgY29uc3QgY29sdW1ucyA9IGRhdGFUYWJsZS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0U2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0SGlnaGxpZ2h0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBwYWdlUm93Q291bnQgPSB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKHBhZ2VSb3dDb3VudCwgdGhpcy5nZXRNYXhSb3dMaW1pdCgpKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDEpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcGFnZVJvd0NvdW50ID0gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhwYWdlUm93Q291bnQsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSk7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZVJlYWRlcj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlUmVhZGVySW50ZXJuYWxDb250cmFjdDtcblxuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWFkZXIocmVzcG9uc2VEYXRhLmlkLCByZXNwb25zZURhdGEudG90YWxSb3dDb3VudCwgcGFnZVJvd0NvdW50LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN1bW1hcnlUYWJsZUlkID0gJyc7XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyh0YWJsZUlkOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhZ2VBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUlkXTogdGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhUm93SW5kZXhdOiBwYWdlTnVtYmVyICogcGFnZVNpemUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFUYWJsZVJlYWRlclBhZ2UsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+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+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdG9yeVBvaW50TW9kZWw7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQsIFZpc3VhbFNwZWNpZmljYXRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVmlzdWFsTW9kZWxTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFZpc3VhbFNwZWNpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgVmlzdWFsU3BlY2lmaWNhdGlvbjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vVml6U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYyksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlZpekFQSSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU2hlZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Td2l0Y2hUb1NoZWV0TmFtZV06IG5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFjdGl2YXRlU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbVZpZXdzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDdXN0b21WaWV3SW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VzdG9tVmlld3NBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1c3RvbVZpZXdzLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3cyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxDdXN0b21WaWV3TW9kZWw+O1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdzLm1hcCgoY3VzdG9tVmlldzogQ3VzdG9tVmlld01vZGVsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lPzogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2hvd0N1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSB8fCAnJywgLy8gYSBmYWxzZXkgdmFsdWUgbWVhbnMgXCJzaG93IG9yaWdpbmFsIHZpZXdcIlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TaG93Q3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbCB8IHVuZGVmaW5lZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3Py5sdWlkID8gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUN1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICAvLyBDdXN0b21WaWV3SXNEZWZhdWx0IGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyLCBidXQgb3VyIEFQSSBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byBhbGxvdyBpdCB0byBiZSBzcGVjaWZpZWQgeWV0LlxuICAgIC8vIFdlIHNob3VsZCBhZGQgYSAnZGVmYXVsdCcgcGFyYW1ldGVyIHRvIHRoZSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NhdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzRGVmYXVsdF06IGZhbHNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdJbXBsKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdMdWlkXTogY3VzdG9tVmlldy5sdWlkLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlldy5uYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBjdXN0b21WaWV3LmlzRGVmYXVsdCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNQdWJsaWNdOiBjdXN0b21WaWV3LnNoYXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVXBkYXRlQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNyY0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1cnJlbnRTcmNBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1cnJlbnRTcmMsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogc3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0VmlzaWJpbGl0eUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdOiB7fSxcbiAgICB9O1xuXG4gICAgLy8gem9uZVZpc2liaWxpdHlNYXAgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYSBNYXAgLSBjb252ZXJ0IGl0IHRvIGEgTWFwXG4gICAgY29uc3QgcGFyYW1ldGVyQXNNYXAgPSBQYXJhbS5jb252ZXJ0UGFyYW1ldGVyVG9NYXAoem9uZVZpc2liaWxpdHlNYXAsICd6b25lVmlzaWJpbGl0eU1hcCcpO1xuXG4gICAgcGFyYW1ldGVyQXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXAsIE51bWJlci5wYXJzZUludChrZXksIDEwKSk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlPih2YWx1ZSwgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsICdEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZScpO1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF1ba2V5XSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRWaXNpYmlsaXR5VHlwZS5jb252ZXJ0KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFpvbmVWaXNpYmlsaXR5LCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3RdOiBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgICB9O1xuXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkuZm9yRWFjaCgoZGFzaGJvYXJkT2JqZWN0OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXAsIGRhc2hib2FyZE9iamVjdC5kYXNoYm9hcmRPYmplY3RJRCk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5V2lkdGhBbmRIZWlnaHRPZkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZShkYXNoYm9hcmRPYmplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZUFuZFJlc2l6ZVpvbmVzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRhYmxlIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZVN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZVN1bW1hcnkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFibGVJbmZvOiBUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY29ubmVjdGlvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXN0b21TUUwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmN1c3RvbVNRTDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqIFRoaXMgYWxsb3dzIHVzIHRvIHByb3ZpZGUgYSBmaWVsZCB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBtb3JlIGVhc2lseSBwcm9ncmFtbWF0aWNhbGx5IHJlc3BvbmRcbiAqIHRvIGVycm9yIHNjZW5hcmlvcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlYXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgJHtfZXJyb3JDb2RlfTogJHttZXNzYWdlfWApO1xuXG4gICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIC8vIEVycm9yIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgcHJvcGVydGx5IHdoZW4gY29tcGlsaW5nIHRvIEVTNSwgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2VcbiAgICAvLyB0aGUgcHJvdG8gY2hhaW4gdG8gYmUgYnVpbHQgY29ycmVjdGx5LiAgU2VlIHRoZSBnaXRodWIgbGluayBhYm92ZSBmb3IgZGV0YWlscy5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVGFibGVhdUVycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yQ29kZSgpOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcyB8IFNoYXJlZEVycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSksXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlRmlsdGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRmlsdGVycyBhbHJlYWR5IGhhdmUgbmF0aXZlIHR5cGUgaW4gdmFsdWUsIGp1c3QgdXNlIHRoYXQgZm9yIG5hdGl2ZVZhbHVlIGFsc29cbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZVRhYmxlRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIERhdGFUYWJsZXMgY29udGFpbiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgZGF0ZSBhcyBzdHJpbmcgfCAnJW51bGwlXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBjb252ZXJ0cyBkYXRlcyBhcyBzdHJpbmcgdG8gZGF0ZXMsIGFuZCBhbnkgc3BlY2lhbCB0byBudWxsXG4gICAgLy8gKGJvb2xlYW4sIG51bWJlcnMsIHN0cmluZ3MgYXJlIHBhc3NlZCB0aHJvdWdoKVxuICAgIC8vIEJlY2F1c2Ugb2YgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gLSB3ZSBjYW4gaGF2ZSB1bmRlZmluZWQgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IHRoYW4gYW55IHNwZWNpYWxcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgZGF0YVR5cGUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUsXG4gICAgKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBBIFByb21pc2Ugd3JhcHBlciBjbGFzcyBhbGxvd2luZyBmb3IgcmVzb2x2aW5nL3JlamVjdGluZyB0aGUgUHJvbWlzZSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGl0cyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgRGVmZXJyZWRcbiAqIEB0ZW1wbGF0ZSBUUmVzb2x2ZSBUaGUgdHlwZSB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2UuXG4gKiBAdGVtcGxhdGUgVFJlamVjdCBUaGUgdHlwZSB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZS4gRGVmYXVsdHMgdG8gYW55LlxuICogQGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM0NjM3NDM2XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdCA9IGFueT4ge1xuICBwcml2YXRlIF9wcm9taXNlOiBQcm9taXNlPFRSZXNvbHZlPjtcbiAgcHJpdmF0ZSBfcmVzb2x2ZTogKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPikgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfcmVqZWN0OiAocmVhc29uPzogVFJlamVjdCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEZWZlcnJlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZTxUUmVzb2x2ZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgUHJvbWlzZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtQcm9taXNlPFRSZXNvbHZlPn1cbiAgICovXG4gIGdldCBwcm9taXNlKCk6IFByb21pc2U8VFJlc29sdmU+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgd3JhcHBlZCBQcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0geyhUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPil9IHJlc3BvbnNlIFRoZSBhcmd1bWVudCB0byBiZSByZXNvbHZlZCBieSB0aGUgUHJvbWlzZS5cbiAgICogQHJldHVybnMgeyp9ICB7dm9pZH1cbiAgICovXG4gIHJlc29sdmUocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZXNvbHZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb2x2ZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtUUmVqZWN0fSBbcmVhc29uXSBUaGUgcmVhc29uIHdoeSB0aGUgUHJvbWlzZSByZWplY3RlZC5cbiAgICogQHJldHVybnMgeyp9ICB7dm9pZH1cbiAgICovXG4gIHJlamVjdChyZWFzb24/OiBUUmVqZWN0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZWplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWplY3QocmVhc29uKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IDMwMDAwO1xuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgY29udmVydHMgZnJvbSBhIHNvdXJjZSBlbnVtIHZhbHVlIHRvIGRlc3RpbmF0aW9uIGVudW1cbiAqIHZhbHVlIGdpdmVuIGEgbWFwcGluZyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aGVuIGNvbnN0cnVjdGVkLlxuICpcbiAqIE5vdGU6IFRoaXMgZXhhY3Qgc2FtZSBjbGFzcyBpcyBkZWZpbmVkIGluIGFwaS1jb3JlLiAgR2l2ZW4gaXRzIHNtYWxsXG4gKiBuYXR1cmUsIGl0IGlzIG5vdCB3b3J0aCBoYXZpbmcgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHRvIHNoYXJlIHRoaXMgYmV0d2VlblxuICogYXBpLWNvcmUgYW5kIGFwaS1zaGFyZWQuICBJZiBtb3JlIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSBpcyBhZGRlZCB0aGF0IGlzIHVzZWQgYnkgYXBpLWNvcmVcbiAqIGFuZCBhcGktc2hhcmVkIGJ1dCBoYXMgbm8gb3RoZXIgZGVwZW5kZWNpZXMsIGEgdXRpbHRpdHkgcHJvamVjdCBtaWdodCBiZSBtZXJpdGVkLFxuICogYW5kIHRoaXMgY2xhc3MgY291bGQgYmUgbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnVtQ29udmVydGVyPFRTb3VyY2VUeXBlIGV4dGVuZHMgc3RyaW5nLCBURGVzdGluYXRpb25UeXBlPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tYXBwaW5nczogeyBbZW51bVZhbDogc3RyaW5nXTogVERlc3RpbmF0aW9uVHlwZSB9LCBwcml2YXRlIF9kZWZhdWx0VmFsPzogVERlc3RpbmF0aW9uVHlwZSkge31cblxuICBwdWJsaWMgY29udmVydChlbnVtVmFsOiBUU291cmNlVHlwZSwgdGhyb3dJZk1pc3Npbmc6IFNob3VsZFRocm93ID0gU2hvdWxkVGhyb3cuWWVzKTogVERlc3RpbmF0aW9uVHlwZSB7XG4gICAgaWYgKHRoaXMuX21hcHBpbmdzLmhhc093blByb3BlcnR5KGVudW1WYWwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwcGluZ3NbZW51bVZhbCBhcyBzdHJpbmddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZhdWx0VmFsICE9PSB1bmRlZmluZWQgJiYgdGhyb3dJZk1pc3NpbmcgIT09IFNob3VsZFRocm93Llllcykge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWw7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBFbnVtIE1hcHBpbmcgbm90IGZvdW5kIGZvcjogJHtlbnVtVmFsfWApO1xuICB9XG59XG5cbmV4cG9ydCBlbnVtIFNob3VsZFRocm93IHtcbiAgWWVzID0gJ3llcycsXG4gIE5vID0gJ25vJyxcbn1cbiIsImltcG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi4vSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4vUGFyYW0nO1xuXG5pbnRlcmZhY2UgRW51bUxpa2Uge1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBjb21tb24gZXJyb3JzIHRocm91Z2hvdXQgdGhlIGV4dGVybmFsXG4gKiBwcm9qZWN0cyAoYXBpLXNoYXJlZCwgZXh0ZW5zaW9ucy1hcGksIGV0Yy4pLiAgSXQgaGFzIHNvbWUgZHVwbGljYXRpb24gd2l0aFxuICogdGhlIEVycm9ySGVscGVycyBjbGFzcyBpbiBhcGktY29yZSwgYnV0IGlzIHNlcGFyYXRlIGR1ZSB0byB0aGUgbmVlZCB0byB0aHJvd1xuICogYW4gZXh0ZXJuYWwgVGFibGVhdUVycm9yIHZzLiBhbiBJbnRlcm5hbFRhYmxlYXVFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVycm9ySGVscGVycyB7XG4gIC8qKlxuICAgKiBUaHJvd3Mgd2l0aCBjb2RlIEludGVybmFsRXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcGlOYW1lIG5hbWUgb2YgYXBpIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXBpTm90SW1wbGVtZW50ZWQoYXBpTmFtZTogc3RyaW5nKTogVGFibGVhdUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FwaU5hbWV9IEFQSSBub3QgeWV0IGltcGxlbWVudGVkLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBpbnRlcm5hbCBlcnJvciBpZiBhcmd1bWVudCBpcyBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5SW50ZXJuYWxWYWx1ZShhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3I6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyKGFyZ3VtZW50VmFsdWU6IGFueSwgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBub3QgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgKiBGb3Igb2JqZWN0cywgaXQganVzdCB0ZXN0cyB0aGF0IGl0IGlzIGFuIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBleHBlY3RlZCByZXN1bHQgb2YgdHlwZW9mXG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyVHlwZShhcmd1bWVudFZhbHVlOiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRWYWx1ZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaGFzIGludmFsaWQgdHlwZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIGVtcHR5IHN0cmluZywgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVN0cmluZ1BhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBzdHJpbmcsIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGFyZ3VtZW50VmFsdWUgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW10ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhlbnVtVHlwZSkuZm9yRWFjaCgoZW51bUtleSkgPT4ge1xuICAgICAgaWYgKGVudW1UeXBlW2VudW1LZXldID09PSBlbnVtVmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IGFueSwgbWF4OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIW1pbiAmJiAhbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgYXQgbGVhc3Qgb25lIG9mIG1pbiBvciBtYXggaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKG1pbiAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1pbikgJiYgIVBhcmFtLmlzVHlwZURhdGUobWluKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1pbi4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWF4ICYmICFQYXJhbS5pc1R5cGVOdW1iZXIobWF4KSAmJiAhUGFyYW0uaXNUeXBlRGF0ZShtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIG9ubHkgRGF0ZSBhbmQgbnVtYmVyIGFyZSBhbGxvd2VkIGZvciBwYXJhbWV0ZXIgbWF4LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtaW4gJiYgbWF4ICYmIHR5cGVvZiBtaW4gIT09IHR5cGVvZiBtYXgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgcGFyYW1ldGVycyBtaW4gYW5kIG1heCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZS4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgem9uZUlkIGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZFpvbmVNYXAgQSBtYXAgb2Ygem9uZUlkJ3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGFzaGJvYXJkIG9iamVjdC5cbiAgICogQHBhcmFtIHpvbmVJRCBab25lSWQgdG8gYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+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+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdjM1IGZyb20gJy4vdjM1LmpzJztcbmltcG9ydCBtZDUgZnJvbSAnLi9tZDUuanMnO1xudmFyIHYzID0gdjM1KCd2MycsIDB4MzAsIG1kNSk7XG5leHBvcnQgZGVmYXVsdCB2MzsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgc2hhMSBmcm9tICcuL3NoYTEuanMnO1xudmFyIHY1ID0gdjM1KCd2NScsIDB4NTAsIHNoYTEpO1xuZXhwb3J0IGRlZmF1bHQgdjU7IiwiaW1wb3J0IFJFR0VYIGZyb20gJy4vcmVnZXguanMnO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZSh1dWlkKSB7XG4gIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgJiYgUkVHRVgudGVzdCh1dWlkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGU7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZmluZCc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvYXJyYXkvZnJvbSc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbWFwJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtaW50ZWdlcic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvbnVtYmVyL3BhcnNlLWZsb2F0JztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtaW50JztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvZW50cmllcyc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL3Byb21pc2UnO1xuLy8gRHVlIHRvIHRoZSB3YXkgd2UgY29uZmlndXJlZCB3ZWJwYWNrLCB3ZSBzaG91bGQgYmUgZXhwb3J0aW5nIHRoaW5ncyB3aGljaCB3aWxsIGJlIHVuZGVyXG4vLyBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQgXCJ0YWJsZWF1XCIuIEV4cG9ydCBldmVyeXRoaW5nIHdlIHdhbnQgdG8gYmUgdmlzaWJsZSB1bmRlciB0YWJsZWF1XG4vLyBmcm9tIHRoaXMgZmlsZS5cbmltcG9ydCB7IEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuXG5kZWNsYXJlIGxldCBWRVJTSU9OX0lTX0FMUEhBOiBib29sZWFuO1xuY29uc3QgaXNBbHBoYTogYm9vbGVhbiA9IHR5cGVvZiBWRVJTSU9OX0lTX0FMUEhBICE9PSAndW5kZWZpbmVkJyA/IFZFUlNJT05fSVNfQUxQSEEgOiBmYWxzZTtcblxuZGVjbGFyZSBsZXQgQVBJX1ZFUlNJT05fTlVNQkVSOiBzdHJpbmc7XG5BcGlWZXJzaW9uLlNldFZlcnNpb25OdW1iZXIodHlwZW9mIEFQSV9WRVJTSU9OX05VTUJFUiAhPT0gJ3VuZGVmaW5lZCcgPyBBUElfVkVSU0lPTl9OVU1CRVIgOiAnMC4wLjAnLCBpc0FscGhhKTtcblxuY29uc3QgZXh0ZW5zaW9uSW1wbCA9IG5ldyBFeHRlbnNpb25zSW1wbCgpO1xuZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSBuZXcgRXh0ZW5zaW9ucyhleHRlbnNpb25JbXBsKTtcblxuLy8gRXhwb3J0IEVudW1zXG4vLyBUaGVzZSBzaG93IHVwIHVuZGVyIHRoZSB0YWJsZWF1IG9iamVjdC4gSS5lLiB0YWJsZWF1LkV4dGVuc2lvbkNvbnRleHQuU2VydmVyXG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlck9wdGlvbnMsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ 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 fd2bda4a..a31e85ba 100644 --- a/lib/tableau.extensions.1.latest.min.js +++ b/lib/tableau.extensions.1.latest.min.js @@ -1,2 +1,2 @@ -(()=>{var e={3e3:(e,t,r)=>{r(5092);var n=r(7880);e.exports=n("Array","find")},8315:(e,t,r)=>{r(8504),r(5684);var n=r(340);e.exports=n.Array.from},80:(e,t,r)=>{r(3924),r(472),r(7912),r(8504);var n=r(340);e.exports=n.Map},5668:(e,t,r)=>{r(1300);var n=r(340);e.exports=n.Number.isInteger},5816:(e,t,r)=>{r(3656);var n=r(340);e.exports=n.Number.isNaN},3680:(e,t,r)=>{r(6544);var n=r(340);e.exports=n.Number.parseFloat},9308:(e,t,r)=>{r(7972);var n=r(340);e.exports=n.Number.parseInt},8824:(e,t,r)=>{r(6368);var n=r(340);e.exports=n.Object.assign},8512:(e,t,r)=>{r(8292);var n=r(340);e.exports=n.Object.entries},9232:(e,t,r)=>{r(920);var n=r(340);e.exports=n.Object.setPrototypeOf},9336:(e,t,r)=>{r(6140),r(3924),r(7912),r(7448),r(3936),r(5428),r(1517),r(8504);var n=r(340);e.exports=n.Promise},1381:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a function")}},6372:(e,t,r)=>{var n=r(1600),i=r(5220),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a constructor")}},4040:(e,t,r)=>{var n=r(1600),i=r(984),o=n.String,a=n.TypeError;e.exports=function(e){if("object"==typeof e||i(e))return e;throw a("Can't set "+o(e)+" as a prototype")}},5868:(e,t,r)=>{var n=r(3668),i=r(124),o=r(7072),a=n("unscopables"),s=Array.prototype;null==s[a]&&o.f(s,a,{configurable:!0,value:i(null)}),e.exports=function(e){s[a][e]=!0}},2932:(e,t,r)=>{var n=r(1600),i=r(2408),o=n.TypeError;e.exports=function(e,t){if(i(t,e))return e;throw o("Incorrect invocation")}},3736:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.String,a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not an object")}},8208:(e,t,r)=>{"use strict";var n=r(1600),i=r(5616),o=r(3032),a=r(3848),s=r(3140),u=r(4064),l=r(5220),c=r(9183),p=r(4135),d=r(4944),f=r(8132),y=n.Array;e.exports=function(e){var t=a(e),r=l(this),n=arguments.length,h=n>1?arguments[1]:void 0,m=void 0!==h;m&&(h=i(h,n>2?arguments[2]:void 0));var g,v,b,I,S,_,T=f(t),P=0;if(!T||this==y&&u(T))for(g=c(t),v=r?new this(g):y(g);g>P;P++)_=m?h(t[P],P):t[P],p(v,P,_);else for(S=(I=d(t,T)).next,v=r?new this:[];!(b=o(S,I)).done;P++)_=m?s(I,h,[b.value,P],!0):b.value,p(v,P,_);return v.length=P,v}},6024:(e,t,r)=>{var n=r(3068),i=r(7920),o=r(9183),a=function(e){return function(t,r,a){var s,u=n(t),l=o(u),c=i(a,l);if(e&&r!=r){for(;l>c;)if((s=u[c++])!=s)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===r)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},9560:(e,t,r)=>{var n=r(5616),i=r(604),o=r(3188),a=r(3848),s=r(9183),u=r(1220),l=i([].push),c=function(e){var t=1==e,r=2==e,i=3==e,c=4==e,p=6==e,d=7==e,f=5==e||p;return function(y,h,m,g){for(var v,b,I=a(y),S=o(I),_=n(h,m),T=s(S),P=0,A=g||u,E=t?A(y,T):r||d?A(y,0):void 0;T>P;P++)if((f||P in S)&&(b=_(v=S[P],P,I),e))if(t)E[P]=b;else if(b)switch(e){case 3:return!0;case 5:return v;case 6:return P;case 2:l(E,v)}else switch(e){case 4:return!1;case 7:l(E,v)}return p?-1:i||c?c:E}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},6100:(e,t,r)=>{var n=r(604);e.exports=n([].slice)},4096:(e,t,r)=>{var n=r(1600),i=r(5240),o=r(5220),a=r(9952),s=r(3668)("species"),u=n.Array;e.exports=function(e){var t;return i(e)&&(t=e.constructor,(o(t)&&(t===u||i(t.prototype))||a(t)&&null===(t=t[s]))&&(t=void 0)),void 0===t?u:t}},1220:(e,t,r)=>{var n=r(4096);e.exports=function(e,t){return new(n(e))(0===t?0:t)}},3140:(e,t,r)=>{var n=r(3736),i=r(1792);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){i(e,"throw",t)}}},6344:(e,t,r)=>{var n=r(3668)("iterator"),i=!1;try{var o=0,a={next:function(){return{done:!!o++}},return:function(){i=!0}};a[n]=function(){return this},Array.from(a,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var r=!1;try{var o={};o[n]=function(){return{next:function(){return{done:r=!0}}}},e(o)}catch(e){}return r}},4108:(e,t,r)=>{var n=r(604),i=n({}.toString),o=n("".slice);e.exports=function(e){return o(i(e),8,-1)}},1248:(e,t,r)=>{var n=r(1600),i=r(7796),o=r(984),a=r(4108),s=r(3668)("toStringTag"),u=n.Object,l="Arguments"==a(function(){return arguments}());e.exports=i?a:function(e){var t,r,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=u(e),s))?r:l?a(t):"Object"==(n=a(t))&&o(t.callee)?"Arguments":n}},5032:(e,t,r)=>{var n=r(604),i=r(6100),o=n("".replace),a=n("".split),s=n([].join),u=String(Error("zxcasd").stack),l=/\n\s*at [^:]*:[^\n]*/,c=l.test(u),p=/@[^\n]*\n/.test(u)&&!/zxcasd/.test(u);e.exports=function(e,t){if("string"!=typeof e)return e;if(c)for(;t--;)e=o(e,l,"");else if(p)return s(i(a(e,"\n"),t),"\n");return e}},9920:(e,t,r)=>{"use strict";var n=r(7072).f,i=r(124),o=r(7431),a=r(5616),s=r(2932),u=r(9928),l=r(2648),c=r(9688),p=r(2828),d=r(8756).fastKey,f=r(7932),y=f.set,h=f.getterFor;e.exports={getConstructor:function(e,t,r,l){var c=e((function(e,n){s(e,f),y(e,{type:t,index:i(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=n&&u(n,e[l],{that:e,AS_ENTRIES:r})})),f=c.prototype,m=h(t),g=function(e,t,r){var n,i,o=m(e),a=v(e,t);return a?a.value=r:(o.last=a={index:i=d(t,!0),key:t,value:r,previous:n=o.last,next:void 0,removed:!1},o.first||(o.first=a),n&&(n.next=a),p?o.size++:e.size++,"F"!==i&&(o.index[i]=a)),e},v=function(e,t){var r,n=m(e),i=d(t);if("F"!==i)return n.index[i];for(r=n.first;r;r=r.next)if(r.key==t)return r};return o(f,{clear:function(){for(var e=m(this),t=e.index,r=e.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete t[r.index],r=r.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,r=m(t),n=v(t,e);if(n){var i=n.next,o=n.previous;delete r.index[n.index],n.removed=!0,o&&(o.next=i),i&&(i.previous=o),r.first==n&&(r.first=i),r.last==n&&(r.last=o),p?r.size--:t.size--}return!!n},forEach:function(e){for(var t,r=m(this),n=a(e,arguments.length>1?arguments[1]:void 0);t=t?t.next:r.first;)for(n(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!v(this,e)}}),o(f,r?{get:function(e){var t=v(this,e);return t&&t.value},set:function(e,t){return g(this,0===e?0:e,t)}}:{add:function(e){return g(this,e=0===e?0:e,e)}}),p&&n(f,"size",{get:function(){return m(this).size}}),c},setStrong:function(e,t,r){var n=t+" Iterator",i=h(t),o=h(n);l(e,t,(function(e,t){y(this,{type:n,target:e,state:i(e),kind:t,last:void 0})}),(function(){for(var e=o(this),t=e.kind,r=e.last;r&&r.removed;)r=r.previous;return e.target&&(e.last=r=r?r.next:e.state.first)?"keys"==t?{value:r.key,done:!1}:"values"==t?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),r?"entries":"values",!r,!0),c(t)}}},6064:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(604),a=r(4232),s=r(5028),u=r(8756),l=r(9928),c=r(2932),p=r(984),d=r(9952),f=r(7004),y=r(6344),h=r(9540),m=r(7692);e.exports=function(e,t,r){var g=-1!==e.indexOf("Map"),v=-1!==e.indexOf("Weak"),b=g?"set":"add",I=i[e],S=I&&I.prototype,_=I,T={},P=function(e){var t=o(S[e]);s(S,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return v&&!d(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:function(e,r){return t(this,0===e?0:e,r),this})};if(a(e,!p(I)||!(v||S.forEach&&!f((function(){(new I).entries().next()})))))_=r.getConstructor(t,e,g,b),u.enable();else if(a(e,!0)){var A=new _,E=A[b](v?{}:-0,1)!=A,w=f((function(){A.has(1)})),O=y((function(e){new I(e)})),D=!v&&f((function(){for(var e=new I,t=5;t--;)e[b](t,t);return!e.has(-0)}));O||((_=t((function(e,t){c(e,S);var r=m(new I,e,_);return null!=t&&l(t,r[b],{that:r,AS_ENTRIES:g}),r}))).prototype=S,S.constructor=_),(w||D)&&(P("delete"),P("has"),g&&P("get")),(D||E)&&P(b),v&&S.clear&&delete S.clear}return T[e]=_,n({global:!0,forced:_!=I},T),h(_,e),v||r.setStrong(_,e,g),_}},4640:(e,t,r)=>{var n=r(9180),i=r(4092),o=r(2920),a=r(7072);e.exports=function(e,t){for(var r=i(t),s=a.f,u=o.f,l=0;l{var n=r(7004);e.exports=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},9292:(e,t,r)=>{"use strict";var n=r(804).IteratorPrototype,i=r(124),o=r(364),a=r(9540),s=r(2204),u=function(){return this};e.exports=function(e,t,r){var l=t+" Iterator";return e.prototype=i(n,{next:o(1,r)}),a(e,l,!1,!0),s[l]=u,e}},4768:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(364);e.exports=n?function(e,t,r){return i.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},364:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},4135:(e,t,r)=>{"use strict";var n=r(4061),i=r(7072),o=r(364);e.exports=function(e,t,r){var a=n(t);a in e?i.f(e,a,o(0,r)):e[a]=r}},2648:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(7408),a=r(8492),s=r(984),u=r(9292),l=r(6232),c=r(3440),p=r(9540),d=r(4768),f=r(5028),y=r(3668),h=r(2204),m=r(804),g=a.PROPER,v=a.CONFIGURABLE,b=m.IteratorPrototype,I=m.BUGGY_SAFARI_ITERATORS,S=y("iterator"),_="keys",T="values",P="entries",A=function(){return this};e.exports=function(e,t,r,a,y,m,E){u(r,t,a);var w,O,D,x=function(e){if(e===y&&k)return k;if(!I&&e in N)return N[e];switch(e){case _:case T:case P:return function(){return new r(this,e)}}return function(){return new r(this)}},F=t+" Iterator",C=!1,N=e.prototype,M=N[S]||N["@@iterator"]||y&&N[y],k=!I&&M||x(y),R="Array"==t&&N.entries||M;if(R&&(w=l(R.call(new e)))!==Object.prototype&&w.next&&(o||l(w)===b||(c?c(w,b):s(w[S])||f(w,S,A)),p(w,F,!0,!0),o&&(h[F]=A)),g&&y==T&&M&&M.name!==T&&(!o&&v?d(N,"name",T):(C=!0,k=function(){return i(M,this)})),y)if(O={values:x(T),keys:m?k:x(_),entries:x(P)},E)for(D in O)(I||C||!(D in N))&&f(N,D,O[D]);else n({target:t,proto:!0,forced:I||C},O);return o&&!E||N[S]===k||f(N,S,k,{name:y}),h[t]=k,O}},2828:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},7300:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},4532:e=>{e.exports="object"==typeof window},264:(e,t,r)=>{var n=r(5316),i=r(1600);e.exports=/ipad|iphone|ipod/i.test(n)&&void 0!==i.Pebble},1588:(e,t,r)=>{var n=r(5316);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},3640:(e,t,r)=>{var n=r(4108),i=r(1600);e.exports="process"==n(i.process)},7888:(e,t,r)=>{var n=r(5316);e.exports=/web0s(?!.*chrome)/i.test(n)},5316:(e,t,r)=>{var n=r(6532);e.exports=n("navigator","userAgent")||""},2592:(e,t,r)=>{var n,i,o=r(1600),a=r(5316),s=o.process,u=o.Deno,l=s&&s.versions||u&&u.version,c=l&&l.v8;c&&(i=(n=c.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!i&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(i=+n[1]),e.exports=i},7880:(e,t,r)=>{var n=r(1600),i=r(604);e.exports=function(e,t){return i(n[e].prototype[t])}},8675:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},4464:(e,t,r)=>{var n=r(7004),i=r(364);e.exports=!n((function(){var e=Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",i(1,7)),7!==e.stack)}))},7248:(e,t,r)=>{var n=r(1600),i=r(2920).f,o=r(4768),a=r(5028),s=r(2984),u=r(4640),l=r(4232);e.exports=function(e,t){var r,c,p,d,f,y=e.target,h=e.global,m=e.stat;if(r=h?n:m?n[y]||s(y,{}):(n[y]||{}).prototype)for(c in t){if(d=t[c],p=e.noTargetGet?(f=i(r,c))&&f.value:r[c],!l(h?c:y+(m?".":"#")+c,e.forced)&&void 0!==p){if(typeof d==typeof p)continue;u(d,p)}(e.sham||p&&p.sham)&&o(d,"sham",!0),a(r,c,d,e)}}},7004:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},1748:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},9756:e=>{var t=Function.prototype,r=t.apply,n=t.bind,i=t.call;e.exports="object"==typeof Reflect&&Reflect.apply||(n?i.bind(r):function(){return i.apply(r,arguments)})},5616:(e,t,r)=>{var n=r(604),i=r(1381),o=n(n.bind);e.exports=function(e,t){return i(e),void 0===t?e:o?o(e,t):function(){return e.apply(t,arguments)}}},3032:e=>{var t=Function.prototype.call;e.exports=t.bind?t.bind(t):function(){return t.apply(t,arguments)}},8492:(e,t,r)=>{var n=r(2828),i=r(9180),o=Function.prototype,a=n&&Object.getOwnPropertyDescriptor,s=i(o,"name"),u=s&&"something"===function(){}.name,l=s&&(!n||n&&a(o,"name").configurable);e.exports={EXISTS:s,PROPER:u,CONFIGURABLE:l}},604:e=>{var t=Function.prototype,r=t.bind,n=t.call,i=r&&r.bind(n);e.exports=r?function(e){return e&&i(n,e)}:function(e){return e&&function(){return n.apply(e,arguments)}}},6532:(e,t,r)=>{var n=r(1600),i=r(984);e.exports=function(e,t){return arguments.length<2?(r=n[e],i(r)?r:void 0):n[e]&&n[e][t];var r}},8132:(e,t,r)=>{var n=r(1248),i=r(8808),o=r(2204),a=r(3668)("iterator");e.exports=function(e){if(null!=e)return i(e,a)||i(e,"@@iterator")||o[n(e)]}},4944:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(1381),a=r(3736),s=r(1532),u=r(8132),l=n.TypeError;e.exports=function(e,t){var r=arguments.length<2?u(e):t;if(o(r))return a(i(r,e));throw l(s(e)+" is not iterable")}},8808:(e,t,r)=>{var n=r(1381);e.exports=function(e,t){var r=e[t];return null==r?void 0:n(r)}},1600:(e,t,r)=>{var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof r.g&&r.g)||function(){return this}()||Function("return this")()},9180:(e,t,r)=>{var n=r(604),i=r(3848),o=n({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return o(i(e),t)}},6632:e=>{e.exports={}},5651:(e,t,r)=>{var n=r(1600);e.exports=function(e,t){var r=n.console;r&&r.error&&(1==arguments.length?r.error(e):r.error(e,t))}},2960:(e,t,r)=>{var n=r(6532);e.exports=n("document","documentElement")},2339:(e,t,r)=>{var n=r(2828),i=r(7004),o=r(7300);e.exports=!n&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},3188:(e,t,r)=>{var n=r(1600),i=r(604),o=r(7004),a=r(4108),s=n.Object,u=i("".split);e.exports=o((function(){return!s("z").propertyIsEnumerable(0)}))?function(e){return"String"==a(e)?u(e,""):s(e)}:s},7692:(e,t,r)=>{var n=r(984),i=r(9952),o=r(3440);e.exports=function(e,t,r){var a,s;return o&&n(a=t.constructor)&&a!==r&&i(s=a.prototype)&&s!==r.prototype&&o(e,s),e}},1727:(e,t,r)=>{var n=r(604),i=r(984),o=r(6376),a=n(Function.toString);i(o.inspectSource)||(o.inspectSource=function(e){return a(e)}),e.exports=o.inspectSource},7660:(e,t,r)=>{var n=r(9952),i=r(4768);e.exports=function(e,t){n(t)&&"cause"in t&&i(e,"cause",t.cause)}},8756:(e,t,r)=>{var n=r(7248),i=r(604),o=r(6632),a=r(9952),s=r(9180),u=r(7072).f,l=r(4880),c=r(7316),p=r(6536),d=r(1748),f=!1,y=p("meta"),h=0,m=Object.isExtensible||function(){return!0},g=function(e){u(e,y,{value:{objectID:"O"+h++,weakData:{}}})},v=e.exports={enable:function(){v.enable=function(){},f=!0;var e=l.f,t=i([].splice),r={};r[y]=1,e(r).length&&(l.f=function(r){for(var n=e(r),i=0,o=n.length;i{var n,i,o,a=r(8736),s=r(1600),u=r(604),l=r(9952),c=r(4768),p=r(9180),d=r(6376),f=r(280),y=r(6632),h="Object already initialized",m=s.TypeError,g=s.WeakMap;if(a||d.state){var v=d.state||(d.state=new g),b=u(v.get),I=u(v.has),S=u(v.set);n=function(e,t){if(I(v,e))throw new m(h);return t.facade=e,S(v,e,t),t},i=function(e){return b(v,e)||{}},o=function(e){return I(v,e)}}else{var _=f("state");y[_]=!0,n=function(e,t){if(p(e,_))throw new m(h);return t.facade=e,c(e,_,t),t},i=function(e){return p(e,_)?e[_]:{}},o=function(e){return p(e,_)}}e.exports={set:n,get:i,has:o,enforce:function(e){return o(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!l(t)||(r=i(t)).type!==e)throw m("Incompatible receiver, "+e+" required");return r}}}},4064:(e,t,r)=>{var n=r(3668),i=r(2204),o=n("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||a[o]===e)}},5240:(e,t,r)=>{var n=r(4108);e.exports=Array.isArray||function(e){return"Array"==n(e)}},984:e=>{e.exports=function(e){return"function"==typeof e}},5220:(e,t,r)=>{var n=r(604),i=r(7004),o=r(984),a=r(1248),s=r(6532),u=r(1727),l=function(){},c=[],p=s("Reflect","construct"),d=/^\s*(?:class|function)\b/,f=n(d.exec),y=!d.exec(l),h=function(e){if(!o(e))return!1;try{return p(l,c,e),!0}catch(e){return!1}};e.exports=!p||i((function(){var e;return h(h.call)||!h(Object)||!h((function(){e=!0}))||e}))?function(e){if(!o(e))return!1;switch(a(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return y||!!f(d,u(e))}:h},4232:(e,t,r)=>{var n=r(7004),i=r(984),o=/#|\.prototype\./,a=function(e,t){var r=u[s(e)];return r==c||r!=l&&(i(t)?n(t):!!t)},s=a.normalize=function(e){return String(e).replace(o,".").toLowerCase()},u=a.data={},l=a.NATIVE="N",c=a.POLYFILL="P";e.exports=a},992:(e,t,r)=>{var n=r(9952),i=Math.floor;e.exports=Number.isInteger||function(e){return!n(e)&&isFinite(e)&&i(e)===e}},9952:(e,t,r)=>{var n=r(984);e.exports=function(e){return"object"==typeof e?null!==e:n(e)}},7408:e=>{e.exports=!1},1836:(e,t,r)=>{var n=r(1600),i=r(6532),o=r(984),a=r(2408),s=r(7216),u=n.Object;e.exports=s?function(e){return"symbol"==typeof e}:function(e){var t=i("Symbol");return o(t)&&a(t.prototype,u(e))}},9928:(e,t,r)=>{var n=r(1600),i=r(5616),o=r(3032),a=r(3736),s=r(1532),u=r(4064),l=r(9183),c=r(2408),p=r(4944),d=r(8132),f=r(1792),y=n.TypeError,h=function(e,t){this.stopped=e,this.result=t},m=h.prototype;e.exports=function(e,t,r){var n,g,v,b,I,S,_,T=r&&r.that,P=!(!r||!r.AS_ENTRIES),A=!(!r||!r.IS_ITERATOR),E=!(!r||!r.INTERRUPTED),w=i(t,T),O=function(e){return n&&f(n,"normal",e),new h(!0,e)},D=function(e){return P?(a(e),E?w(e[0],e[1],O):w(e[0],e[1])):E?w(e,O):w(e)};if(A)n=e;else{if(!(g=d(e)))throw y(s(e)+" is not iterable");if(u(g)){for(v=0,b=l(e);b>v;v++)if((I=D(e[v]))&&c(m,I))return I;return new h(!1)}n=p(e,g)}for(S=n.next;!(_=o(S,n)).done;){try{I=D(_.value)}catch(e){f(n,"throw",e)}if("object"==typeof I&&I&&c(m,I))return I}return new h(!1)}},1792:(e,t,r)=>{var n=r(3032),i=r(3736),o=r(8808);e.exports=function(e,t,r){var a,s;i(e);try{if(!(a=o(e,"return"))){if("throw"===t)throw r;return r}a=n(a,e)}catch(e){s=!0,a=e}if("throw"===t)throw r;if(s)throw a;return i(a),r}},804:(e,t,r)=>{"use strict";var n,i,o,a=r(7004),s=r(984),u=r(124),l=r(6232),c=r(5028),p=r(3668),d=r(7408),f=p("iterator"),y=!1;[].keys&&("next"in(o=[].keys())?(i=l(l(o)))!==Object.prototype&&(n=i):y=!0),null==n||a((function(){var e={};return n[f].call(e)!==e}))?n={}:d&&(n=u(n)),s(n[f])||c(n,f,(function(){return this})),e.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:y}},2204:e=>{e.exports={}},9183:(e,t,r)=>{var n=r(1868);e.exports=function(e){return n(e.length)}},3104:(e,t,r)=>{var n,i,o,a,s,u,l,c,p=r(1600),d=r(5616),f=r(2920).f,y=r(5952).set,h=r(1588),m=r(264),g=r(7888),v=r(3640),b=p.MutationObserver||p.WebKitMutationObserver,I=p.document,S=p.process,_=p.Promise,T=f(p,"queueMicrotask"),P=T&&T.value;P||(n=function(){var e,t;for(v&&(e=S.domain)&&e.exit();i;){t=i.fn,i=i.next;try{t()}catch(e){throw i?a():o=void 0,e}}o=void 0,e&&e.enter()},h||v||g||!b||!I?!m&&_&&_.resolve?((l=_.resolve(void 0)).constructor=_,c=d(l.then,l),a=function(){c(n)}):v?a=function(){S.nextTick(n)}:(y=d(y,p),a=function(){y(n)}):(s=!0,u=I.createTextNode(""),new b(n).observe(u,{characterData:!0}),a=function(){u.data=s=!s})),e.exports=P||function(e){var t={fn:e,next:void 0};o&&(o.next=t),i||(i=t,a()),o=t}},3459:(e,t,r)=>{var n=r(1600);e.exports=n.Promise},3880:(e,t,r)=>{var n=r(2592),i=r(7004);e.exports=!!Object.getOwnPropertySymbols&&!i((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},8736:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1727),a=n.WeakMap;e.exports=i(a)&&/native code/.test(o(a))},8071:(e,t,r)=>{"use strict";var n=r(1381),i=function(e){var t,r;this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n})),this.resolve=n(t),this.reject=n(r)};e.exports.f=function(e){return new i(e)}},5744:(e,t,r)=>{var n=r(748);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:n(e)}},6016:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=o("".charAt),c=n.parseFloat,p=n.Symbol,d=p&&p.iterator,f=1/c(u+"-0")!=-1/0||d&&!i((function(){c(Object(d))}));e.exports=f?function(e){var t=s(a(e)),r=c(t);return 0===r&&"-"==l(t,0)?-0:r}:c},6556:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=n.parseInt,c=n.Symbol,p=c&&c.iterator,d=/^[+-]?0x/i,f=o(d.exec),y=8!==l(u+"08")||22!==l(u+"0x16")||p&&!i((function(){l(Object(p))}));e.exports=y?function(e,t){var r=s(a(e));return l(r,t>>>0||(f(d,r)?16:10))}:l},6984:(e,t,r)=>{"use strict";var n=r(2828),i=r(604),o=r(3032),a=r(7004),s=r(9880),u=r(2128),l=r(5988),c=r(3848),p=r(3188),d=Object.assign,f=Object.defineProperty,y=i([].concat);e.exports=!d||a((function(){if(n&&1!==d({b:1},d(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach((function(e){t[e]=e})),7!=d({},e)[r]||s(d({},t)).join("")!=i}))?function(e,t){for(var r=c(e),i=arguments.length,a=1,d=u.f,f=l.f;i>a;)for(var h,m=p(arguments[a++]),g=d?y(s(m),d(m)):s(m),v=g.length,b=0;v>b;)h=g[b++],n&&!o(f,m,h)||(r[h]=m[h]);return r}:d},124:(e,t,r)=>{var n,i=r(3736),o=r(1904),a=r(8675),s=r(6632),u=r(2960),l=r(7300),c=r(280),p="prototype",d="script",f=c("IE_PROTO"),y=function(){},h=function(e){return"<"+d+">"+e+""},m=function(e){e.write(h("")),e.close();var t=e.parentWindow.Object;return e=null,t},g=function(){try{n=new ActiveXObject("htmlfile")}catch(e){}var e,t,r;g="undefined"!=typeof document?document.domain&&n?m(n):(t=l("iframe"),r="java"+d+":",t.style.display="none",u.appendChild(t),t.src=String(r),(e=t.contentWindow.document).open(),e.write(h("document.F=Object")),e.close(),e.F):m(n);for(var i=a.length;i--;)delete g[p][a[i]];return g()};s[f]=!0,e.exports=Object.create||function(e,t){var r;return null!==e?(y[p]=i(e),r=new y,y[p]=null,r[f]=e):r=g(),void 0===t?r:o(r,t)}},1904:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(3736),a=r(3068),s=r(9880);e.exports=n?Object.defineProperties:function(e,t){o(e);for(var r,n=a(t),u=s(t),l=u.length,c=0;l>c;)i.f(e,r=u[c++],n[r]);return e}},7072:(e,t,r)=>{var n=r(1600),i=r(2828),o=r(2339),a=r(3736),s=r(4061),u=n.TypeError,l=Object.defineProperty;t.f=i?l:function(e,t,r){if(a(e),t=s(t),a(r),o)try{return l(e,t,r)}catch(e){}if("get"in r||"set"in r)throw u("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},2920:(e,t,r)=>{var n=r(2828),i=r(3032),o=r(5988),a=r(364),s=r(3068),u=r(4061),l=r(9180),c=r(2339),p=Object.getOwnPropertyDescriptor;t.f=n?p:function(e,t){if(e=s(e),t=u(t),c)try{return p(e,t)}catch(e){}if(l(e,t))return a(!i(o.f,e,t),e[t])}},7316:(e,t,r)=>{var n=r(4108),i=r(3068),o=r(4880).f,a=r(6100),s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&"Window"==n(e)?function(e){try{return o(e)}catch(e){return a(s)}}(e):o(i(e))}},4880:(e,t,r)=>{var n=r(9912),i=r(8675).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,i)}},2128:(e,t)=>{t.f=Object.getOwnPropertySymbols},6232:(e,t,r)=>{var n=r(1600),i=r(9180),o=r(984),a=r(3848),s=r(280),u=r(1040),l=s("IE_PROTO"),c=n.Object,p=c.prototype;e.exports=u?c.getPrototypeOf:function(e){var t=a(e);if(i(t,l))return t[l];var r=t.constructor;return o(r)&&t instanceof r?r.prototype:t instanceof c?p:null}},2408:(e,t,r)=>{var n=r(604);e.exports=n({}.isPrototypeOf)},9912:(e,t,r)=>{var n=r(604),i=r(9180),o=r(3068),a=r(6024).indexOf,s=r(6632),u=n([].push);e.exports=function(e,t){var r,n=o(e),l=0,c=[];for(r in n)!i(s,r)&&i(n,r)&&u(c,r);for(;t.length>l;)i(n,r=t[l++])&&(~a(c,r)||u(c,r));return c}},9880:(e,t,r)=>{var n=r(9912),i=r(8675);e.exports=Object.keys||function(e){return n(e,i)}},5988:(e,t)=>{"use strict";var r={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,i=n&&!r.call({1:2},1);t.f=i?function(e){var t=n(this,e);return!!t&&t.enumerable}:r},3440:(e,t,r)=>{var n=r(604),i=r(3736),o=r(4040);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,r={};try{(e=n(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(r,[]),t=r instanceof Array}catch(e){}return function(r,n){return i(r),o(n),t?e(r,n):r.__proto__=n,r}}():void 0)},5556:(e,t,r)=>{var n=r(2828),i=r(604),o=r(9880),a=r(3068),s=i(r(5988).f),u=i([].push),l=function(e){return function(t){for(var r,i=a(t),l=o(i),c=l.length,p=0,d=[];c>p;)r=l[p++],n&&!s(i,r)||u(d,e?[r,i[r]]:i[r]);return d}};e.exports={entries:l(!0),values:l(!1)}},2816:(e,t,r)=>{"use strict";var n=r(7796),i=r(1248);e.exports=n?{}.toString:function(){return"[object "+i(this)+"]"}},7540:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(984),a=r(9952),s=n.TypeError;e.exports=function(e,t){var r,n;if("string"===t&&o(r=e.toString)&&!a(n=i(r,e)))return n;if(o(r=e.valueOf)&&!a(n=i(r,e)))return n;if("string"!==t&&o(r=e.toString)&&!a(n=i(r,e)))return n;throw s("Can't convert object to primitive value")}},4092:(e,t,r)=>{var n=r(6532),i=r(604),o=r(4880),a=r(2128),s=r(3736),u=i([].concat);e.exports=n("Reflect","ownKeys")||function(e){var t=o.f(s(e)),r=a.f;return r?u(t,r(e)):t}},340:(e,t,r)=>{var n=r(1600);e.exports=n},2699:e=>{e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},9467:(e,t,r)=>{var n=r(3736),i=r(9952),o=r(8071);e.exports=function(e,t){if(n(e),i(t)&&t.constructor===e)return t;var r=o.f(e);return(0,r.resolve)(t),r.promise}},7431:(e,t,r)=>{var n=r(5028);e.exports=function(e,t,r){for(var i in t)n(e,i,t[i],r);return e}},5028:(e,t,r)=>{var n=r(1600),i=r(984),o=r(9180),a=r(4768),s=r(2984),u=r(1727),l=r(7932),c=r(8492).CONFIGURABLE,p=l.get,d=l.enforce,f=String(String).split("String");(e.exports=function(e,t,r,u){var l,p=!!u&&!!u.unsafe,y=!!u&&!!u.enumerable,h=!!u&&!!u.noTargetGet,m=u&&void 0!==u.name?u.name:t;i(r)&&("Symbol("===String(m).slice(0,7)&&(m="["+String(m).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!o(r,"name")||c&&r.name!==m)&&a(r,"name",m),(l=d(r)).source||(l.source=f.join("string"==typeof m?m:""))),e!==n?(p?!h&&e[t]&&(y=!0):delete e[t],y?e[t]=r:a(e,t,r)):y?e[t]=r:s(t,r)})(Function.prototype,"toString",(function(){return i(this)&&p(this).source||u(this)}))},1840:(e,t,r)=>{var n=r(1600).TypeError;e.exports=function(e){if(null==e)throw n("Can't call method on "+e);return e}},2984:(e,t,r)=>{var n=r(1600),i=Object.defineProperty;e.exports=function(e,t){try{i(n,e,{value:t,configurable:!0,writable:!0})}catch(r){n[e]=t}return t}},9688:(e,t,r)=>{"use strict";var n=r(6532),i=r(7072),o=r(3668),a=r(2828),s=o("species");e.exports=function(e){var t=n(e),r=i.f;a&&t&&!t[s]&&r(t,s,{configurable:!0,get:function(){return this}})}},9540:(e,t,r)=>{var n=r(7072).f,i=r(9180),o=r(3668)("toStringTag");e.exports=function(e,t,r){e&&!i(e=r?e:e.prototype,o)&&n(e,o,{configurable:!0,value:t})}},280:(e,t,r)=>{var n=r(4624),i=r(6536),o=n("keys");e.exports=function(e){return o[e]||(o[e]=i(e))}},6376:(e,t,r)=>{var n=r(1600),i=r(2984),o="__core-js_shared__",a=n[o]||i(o,{});e.exports=a},4624:(e,t,r)=>{var n=r(7408),i=r(6376);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.19.0",mode:n?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},7171:(e,t,r)=>{var n=r(3736),i=r(6372),o=r(3668)("species");e.exports=function(e,t){var r,a=n(e).constructor;return void 0===a||null==(r=n(a)[o])?t:i(r)}},5160:(e,t,r)=>{var n=r(604),i=r(9824),o=r(748),a=r(1840),s=n("".charAt),u=n("".charCodeAt),l=n("".slice),c=function(e){return function(t,r){var n,c,p=o(a(t)),d=i(r),f=p.length;return d<0||d>=f?e?"":void 0:(n=u(p,d))<55296||n>56319||d+1===f||(c=u(p,d+1))<56320||c>57343?e?s(p,d):n:e?l(p,d,d+2):c-56320+(n-55296<<10)+65536}};e.exports={codeAt:c(!1),charAt:c(!0)}},1688:(e,t,r)=>{var n=r(604),i=r(1840),o=r(748),a=r(5320),s=n("".replace),u="["+a+"]",l=RegExp("^"+u+u+"*"),c=RegExp(u+u+"*$"),p=function(e){return function(t){var r=o(i(t));return 1&e&&(r=s(r,l,"")),2&e&&(r=s(r,c,"")),r}};e.exports={start:p(1),end:p(2),trim:p(3)}},5952:(e,t,r)=>{var n,i,o,a,s=r(1600),u=r(9756),l=r(5616),c=r(984),p=r(9180),d=r(7004),f=r(2960),y=r(6100),h=r(7300),m=r(1588),g=r(3640),v=s.setImmediate,b=s.clearImmediate,I=s.process,S=s.Dispatch,_=s.Function,T=s.MessageChannel,P=s.String,A=0,E={},w="onreadystatechange";try{n=s.location}catch(e){}var O=function(e){if(p(E,e)){var t=E[e];delete E[e],t()}},D=function(e){return function(){O(e)}},x=function(e){O(e.data)},F=function(e){s.postMessage(P(e),n.protocol+"//"+n.host)};v&&b||(v=function(e){var t=y(arguments,1);return E[++A]=function(){u(c(e)?e:_(e),void 0,t)},i(A),A},b=function(e){delete E[e]},g?i=function(e){I.nextTick(D(e))}:S&&S.now?i=function(e){S.now(D(e))}:T&&!m?(a=(o=new T).port2,o.port1.onmessage=x,i=l(a.postMessage,a)):s.addEventListener&&c(s.postMessage)&&!s.importScripts&&n&&"file:"!==n.protocol&&!d(F)?(i=F,s.addEventListener("message",x,!1)):i=w in h("script")?function(e){f.appendChild(h("script"))[w]=function(){f.removeChild(this),O(e)}}:function(e){setTimeout(D(e),0)}),e.exports={set:v,clear:b}},7920:(e,t,r)=>{var n=r(9824),i=Math.max,o=Math.min;e.exports=function(e,t){var r=n(e);return r<0?i(r+t,0):o(r,t)}},3068:(e,t,r)=>{var n=r(3188),i=r(1840);e.exports=function(e){return n(i(e))}},9824:e=>{var t=Math.ceil,r=Math.floor;e.exports=function(e){var n=+e;return n!=n||0===n?0:(n>0?r:t)(n)}},1868:(e,t,r)=>{var n=r(9824),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},3848:(e,t,r)=>{var n=r(1600),i=r(1840),o=n.Object;e.exports=function(e){return o(i(e))}},2312:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(9952),a=r(1836),s=r(8808),u=r(7540),l=r(3668),c=n.TypeError,p=l("toPrimitive");e.exports=function(e,t){if(!o(e)||a(e))return e;var r,n=s(e,p);if(n){if(void 0===t&&(t="default"),r=i(n,e,t),!o(r)||a(r))return r;throw c("Can't convert object to primitive value")}return void 0===t&&(t="number"),u(e,t)}},4061:(e,t,r)=>{var n=r(2312),i=r(1836);e.exports=function(e){var t=n(e,"string");return i(t)?t:t+""}},7796:(e,t,r)=>{var n={};n[r(3668)("toStringTag")]="z",e.exports="[object z]"===String(n)},748:(e,t,r)=>{var n=r(1600),i=r(1248),o=n.String;e.exports=function(e){if("Symbol"===i(e))throw TypeError("Cannot convert a Symbol value to a string");return o(e)}},1532:(e,t,r)=>{var n=r(1600).String;e.exports=function(e){try{return n(e)}catch(e){return"Object"}}},6536:(e,t,r)=>{var n=r(604),i=0,o=Math.random(),a=n(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++i+o,36)}},7216:(e,t,r)=>{var n=r(3880);e.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3668:(e,t,r)=>{var n=r(1600),i=r(4624),o=r(9180),a=r(6536),s=r(3880),u=r(7216),l=i("wks"),c=n.Symbol,p=c&&c.for,d=u?c:c&&c.withoutSetter||a;e.exports=function(e){if(!o(l,e)||!s&&"string"!=typeof l[e]){var t="Symbol."+e;s&&o(c,e)?l[e]=c[e]:l[e]=u&&p?p(t):d(t)}return l[e]}},5320:e=>{e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},6140:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(2408),a=r(6232),s=r(3440),u=r(4640),l=r(124),c=r(4768),p=r(364),d=r(5032),f=r(7660),y=r(9928),h=r(5744),m=r(4464),g=i.Error,v=[].push,b=function(e,t){var r=o(I,this)?this:l(I),n=arguments.length>2?arguments[2]:void 0;s&&(r=s(new g(void 0),a(r))),c(r,"message",h(t,"")),m&&c(r,"stack",d(r.stack,1)),f(r,n);var i=[];return y(e,v,{that:i}),c(r,"errors",i),r};s?s(b,g):u(b,g);var I=b.prototype=l(g.prototype,{constructor:p(1,b),message:p(1,""),name:p(1,"AggregateError")});n({global:!0},{AggregateError:b})},5092:(e,t,r)=>{"use strict";var n=r(7248),i=r(9560).find,o=r(5868),a="find",s=!0;a in[]&&Array(1)[a]((function(){s=!1})),n({target:"Array",proto:!0,forced:s},{find:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),o(a)},5684:(e,t,r)=>{var n=r(7248),i=r(8208);n({target:"Array",stat:!0,forced:!r(6344)((function(e){Array.from(e)}))},{from:i})},3924:(e,t,r)=>{"use strict";var n=r(3068),i=r(5868),o=r(2204),a=r(7932),s=r(2648),u="Array Iterator",l=a.set,c=a.getterFor(u);e.exports=s(Array,"Array",(function(e,t){l(this,{type:u,target:n(e),index:0,kind:t})}),(function(){var e=c(this),t=e.target,r=e.kind,n=e.index++;return!t||n>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==r?{value:n,done:!1}:"values"==r?{value:t[n],done:!1}:{value:[n,t[n]],done:!1}}),"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},472:(e,t,r)=>{"use strict";r(6064)("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r(9920))},1300:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isInteger:r(992)})},3656:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},6544:(e,t,r)=>{var n=r(7248),i=r(6016);n({target:"Number",stat:!0,forced:Number.parseFloat!=i},{parseFloat:i})},7972:(e,t,r)=>{var n=r(7248),i=r(6556);n({target:"Number",stat:!0,forced:Number.parseInt!=i},{parseInt:i})},6368:(e,t,r)=>{var n=r(7248),i=r(6984);n({target:"Object",stat:!0,forced:Object.assign!==i},{assign:i})},8292:(e,t,r)=>{var n=r(7248),i=r(5556).entries;n({target:"Object",stat:!0},{entries:function(e){return i(e)}})},920:(e,t,r)=>{r(7248)({target:"Object",stat:!0},{setPrototypeOf:r(3440)})},7912:(e,t,r)=>{var n=r(7796),i=r(5028),o=r(2816);n||i(Object.prototype,"toString",o,{unsafe:!0})},3936:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(1381),a=r(8071),s=r(2699),u=r(9928);n({target:"Promise",stat:!0},{allSettled:function(e){var t=this,r=a.f(t),n=r.resolve,l=r.reject,c=s((function(){var r=o(t.resolve),a=[],s=0,l=1;u(e,(function(e){var o=s++,u=!1;l++,i(r,t,e).then((function(e){u||(u=!0,a[o]={status:"fulfilled",value:e},--l||n(a))}),(function(e){u||(u=!0,a[o]={status:"rejected",reason:e},--l||n(a))}))})),--l||n(a)}));return c.error&&l(c.value),r.promise}})},5428:(e,t,r)=>{"use strict";var n=r(7248),i=r(1381),o=r(6532),a=r(3032),s=r(8071),u=r(2699),l=r(9928),c="No one promise resolved";n({target:"Promise",stat:!0},{any:function(e){var t=this,r=o("AggregateError"),n=s.f(t),p=n.resolve,d=n.reject,f=u((function(){var n=i(t.resolve),o=[],s=0,u=1,f=!1;l(e,(function(e){var i=s++,l=!1;u++,a(n,t,e).then((function(e){l||f||(f=!0,p(e))}),(function(e){l||f||(l=!0,o[i]=e,--u||d(new r(o,c)))}))})),--u||d(new r(o,c))}));return f.error&&d(f.value),n.promise}})},1517:(e,t,r)=>{"use strict";var n=r(7248),i=r(7408),o=r(3459),a=r(7004),s=r(6532),u=r(984),l=r(7171),c=r(9467),p=r(5028);if(n({target:"Promise",proto:!0,real:!0,forced:!!o&&a((function(){o.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=l(this,s("Promise")),r=u(e);return this.then(r?function(r){return c(t,e()).then((function(){return r}))}:e,r?function(r){return c(t,e()).then((function(){throw r}))}:e)}}),!i&&u(o)){var d=s("Promise").prototype.finally;o.prototype.finally!==d&&p(o.prototype,"finally",d,{unsafe:!0})}},7448:(e,t,r)=>{"use strict";var n,i,o,a,s=r(7248),u=r(7408),l=r(1600),c=r(6532),p=r(3032),d=r(3459),f=r(5028),y=r(7431),h=r(3440),m=r(9540),g=r(9688),v=r(1381),b=r(984),I=r(9952),S=r(2932),_=r(1727),T=r(9928),P=r(6344),A=r(7171),E=r(5952).set,w=r(3104),O=r(9467),D=r(5651),x=r(8071),F=r(2699),C=r(7932),N=r(4232),M=r(3668),k=r(4532),R=r(3640),V=r(2592),j=M("species"),z="Promise",L=C.get,U=C.set,B=C.getterFor(z),H=d&&d.prototype,W=d,G=H,Y=l.TypeError,q=l.document,K=l.process,Q=x.f,Z=Q,X=!!(q&&q.createEvent&&l.dispatchEvent),J=b(l.PromiseRejectionEvent),$="unhandledrejection",ee=!1,te=N(z,(function(){var e=_(W),t=e!==String(W);if(!t&&66===V)return!0;if(u&&!G.finally)return!0;if(V>=51&&/native code/.test(e))return!1;var r=new W((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(r.constructor={})[j]=n,!(ee=r.then((function(){}))instanceof n)||!t&&k&&!J})),re=te||!P((function(e){W.all(e).catch((function(){}))})),ne=function(e){var t;return!(!I(e)||!b(t=e.then))&&t},ie=function(e,t){if(!e.notified){e.notified=!0;var r=e.reactions;w((function(){for(var n=e.value,i=1==e.state,o=0;r.length>o;){var a,s,u,l=r[o++],c=i?l.ok:l.fail,d=l.resolve,f=l.reject,y=l.domain;try{c?(i||(2===e.rejection&&ue(e),e.rejection=1),!0===c?a=n:(y&&y.enter(),a=c(n),y&&(y.exit(),u=!0)),a===l.promise?f(Y("Promise-chain cycle")):(s=ne(a))?p(s,a,d,f):d(a)):f(n)}catch(e){y&&!u&&y.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},oe=function(e,t,r){var n,i;X?((n=q.createEvent("Event")).promise=t,n.reason=r,n.initEvent(e,!1,!0),l.dispatchEvent(n)):n={promise:t,reason:r},!J&&(i=l["on"+e])?i(n):e===$&&D("Unhandled promise rejection",r)},ae=function(e){p(E,l,(function(){var t,r=e.facade,n=e.value;if(se(e)&&(t=F((function(){R?K.emit("unhandledRejection",n,r):oe($,r,n)})),e.rejection=R||se(e)?2:1,t.error))throw t.value}))},se=function(e){return 1!==e.rejection&&!e.parent},ue=function(e){p(E,l,(function(){var t=e.facade;R?K.emit("rejectionHandled",t):oe("rejectionhandled",t,e.value)}))},le=function(e,t,r){return function(n){e(t,n,r)}},ce=function(e,t,r){e.done||(e.done=!0,r&&(e=r),e.value=t,e.state=2,ie(e,!0))},pe=function(e,t,r){if(!e.done){e.done=!0,r&&(e=r);try{if(e.facade===t)throw Y("Promise can't be resolved itself");var n=ne(t);n?w((function(){var r={done:!1};try{p(n,t,le(pe,r,e),le(ce,r,e))}catch(t){ce(r,t,e)}})):(e.value=t,e.state=1,ie(e,!1))}catch(t){ce({done:!1},t,e)}}};if(te&&(G=(W=function(e){S(this,G),v(e),p(n,this);var t=L(this);try{e(le(pe,t),le(ce,t))}catch(e){ce(t,e)}}).prototype,(n=function(e){U(this,{type:z,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=y(G,{then:function(e,t){var r=B(this),n=r.reactions,i=Q(A(this,W));return i.ok=!b(e)||e,i.fail=b(t)&&t,i.domain=R?K.domain:void 0,r.parent=!0,n[n.length]=i,0!=r.state&&ie(r,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new n,t=L(e);this.promise=e,this.resolve=le(pe,t),this.reject=le(ce,t)},x.f=Q=function(e){return e===W||e===o?new i(e):Z(e)},!u&&b(d)&&H!==Object.prototype)){a=H.then,ee||(f(H,"then",(function(e,t){var r=this;return new W((function(e,t){p(a,r,e,t)})).then(e,t)}),{unsafe:!0}),f(H,"catch",G.catch,{unsafe:!0}));try{delete H.constructor}catch(e){}h&&h(H,G)}s({global:!0,wrap:!0,forced:te},{Promise:W}),m(W,z,!1,!0),g(z),o=c(z),s({target:z,stat:!0,forced:te},{reject:function(e){var t=Q(this);return p(t.reject,void 0,e),t.promise}}),s({target:z,stat:!0,forced:u||te},{resolve:function(e){return O(u&&this===o?W:this,e)}}),s({target:z,stat:!0,forced:re},{all:function(e){var t=this,r=Q(t),n=r.resolve,i=r.reject,o=F((function(){var r=v(t.resolve),o=[],a=0,s=1;T(e,(function(e){var u=a++,l=!1;s++,p(r,t,e).then((function(e){l||(l=!0,o[u]=e,--s||n(o))}),i)})),--s||n(o)}));return o.error&&i(o.value),r.promise},race:function(e){var t=this,r=Q(t),n=r.reject,i=F((function(){var i=v(t.resolve);T(e,(function(e){p(i,t,e).then(r.resolve,n)}))}));return i.error&&n(i.value),r.promise}})},8504:(e,t,r)=>{"use strict";var n=r(5160).charAt,i=r(748),o=r(7932),a=r(2648),s="String Iterator",u=o.set,l=o.getterFor(s);a(String,"String",(function(e){u(this,{type:s,string:i(e),index:0})}),(function(){var e,t=l(this),r=t.string,i=t.index;return i>=r.length?{value:void 0,done:!0}:(e=n(r,i),t.index+=e.length,{value:e,done:!1})}))},1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._type=e}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),e}();t.TableauEvent=r},3248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t)||this;return n._sheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"sheet",{get:function(){return this._sheet},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.TableauSheetEvent=o},4144:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n._worksheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),t}(r(3248).TableauSheetEvent);t.TableauWorksheetEvent=o},4164:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=function(e){function t(t){var r=e.call(this,o.TableauEventType.WorkbookFormattingChanged)||this;return r._formatting=t,r}return i(t,e),Object.defineProperty(t.prototype,"formatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.WorkbookFormattingChangedEvent=a},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=n}return Object.defineProperty(e.prototype,"userId",{get:function(){return this._userId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteId",{get:function(){return this._siteId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteNamespace",{get:function(){return this._siteNamespace},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookId",{get:function(){return this._workbookId},enumerable:!0,configurable:!0}),e}();t.ConnectedServer=r},5920:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(5136),a=r(1468),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t.prototype.getAllDataSourcesAsync=function(){var e=this;return o.ApiServiceRegistry.get(a.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((function(t){var r=t,n=[];return Object.values(r.dataSources).forEach((function(t){n.push(e.createDataSourceFromInfo(t))})),n}))},t.prototype.createDataSourceFromInfo=function(e){var t=new o.DataSourceImpl(e,a.ExtensionsRegistryId),r=new o.DataSource(t);return t.initializeWithPublicInterfaces(r),r},t}(o.WorkbookImpl);t.ExtensionWorkbookImpl=s},976:function(e,t,r){"use strict";var n=this&&this.__spreadArrays||function(){for(var e=0,t=0,r=arguments.length;t0;)r.deleteRule(r.cssRules.length-1);e.formattingSheets.map((function(e){t.applyFormattingSheetToStyleSheet(e,r)}))}},e.prototype.applyFormattingSheetToStyleSheet=function(e,t){var r="",n=e.cssProperties;n.fontFamily&&(r+="font-family: "+n.fontFamily.toString()+"; "),n.fontSize&&(r+="font-size: "+n.fontSize.toString()+"; "),n.fontWeight&&(r+="font-weight: "+n.fontWeight.toString()+"; "),n.fontStyle&&(r+="font-style: "+n.fontStyle.toString()+"; "),n.textDecoration&&(r+="text-decoration: "+n.textDecoration.toString()+"; "),n.color&&(r+="color: "+n.color+"; ");var i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)},e.prototype.initializeWorkbookFormattingChangedEventCallback=function(e){var t=this;a.ApiServiceRegistry.get(m.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(r){r&&(t.initializeTableauFonts(e,r),t.applyAllFormatting(r))}))},e.prototype.initializeTableauFonts=function(e,t){var r,i=this,a=n(g.SupportedBentonSansFontFaces,S.SupportedTableauFontFaces);if(t.formattingSheets.forEach((function(e){e.cssProperties.fontFamily&&a.push(e.cssProperties.fontFamily)})),a.length>0){var s=((r={})[o.ParameterId.FontNameListItems]=a,r);e.execute(o.VerbId.GetFonts,s).then((function(e){i.loadFonts(e.result)})).catch()}},e.prototype.loadFonts=function(e){var t=this;e.forEach((function(e){S.SupportedTableauFontFaces.includes(e.fontName)?t.loadTableauFonts(e):g.SupportedBentonSansFontFaces.includes(e.fontName)?t.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))},e.prototype.initializeDashboardContent=function(e,t){var r=new a.SheetInfoImpl(e.name,i.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),n=new a.DashboardImpl(r,e.zones,t,m.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(n);return new c.DashboardContent(o)},e.prototype.initializeWorksheetContent=function(e){var t=new a.SheetInfoImpl(e.visualId.worksheet,i.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new a.WorksheetImpl(t,m.ExtensionsRegistryId,e.visualId,null,null),n=new l.Worksheet(r);return new y.WorksheetContent(n)},e.prototype.initializeSettings=function(e){var t=new I.SettingsImpl(e);return new d.Settings(t)},e.prototype.initializeContextMenuCallbacks=function(e){a.ApiServiceRegistry.get(m.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.ContextMenuClick,(function(){return!0}),(function(t){if(e){if(!e[t.id])throw new a.TableauError(i.ErrorCodes.InternalError,"Received unexpected context menu Id from event: "+t.id);e[t.id]()}}))},e.prototype.loadTableauFonts=function(e){switch(e.fontName){case S.TableauBookFontFaceName:document.fonts.add(new FontFace(S.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauLightFontFaceName:document.fonts.add(new FontFace(S.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauRegularFontFaceName:document.fonts.add(new FontFace(S.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(S.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case S.TableauBoldFontFaceName:document.fonts.add(new FontFace(S.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case S.TableauMediumFontFaceName:document.fonts.add(new FontFace(S.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e.prototype.loadBentonSansFonts=function(e){switch(e.fontName){case g.BentonSansBookFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case g.BentonSansLightFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case g.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case g.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case g.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case g.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e}();t.ExtensionsImpl=T},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((function(e){e(n.INTERNAL_CONTRACT_VERSION).execute(n.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(7112),l=r(1468),c=function(e){function t(t){var r=e.call(this,o.TableauEventType.SettingsChanged)||this;return r._newSettings=t,r}return i(t,e),Object.defineProperty(t.prototype,"newSettings",{get:function(){return this._newSettings},enumerable:!0,configurable:!0}),t}(u.TableauEvent),p=function(){function e(e){this._saveInProgress=!1,this.initializeSettings(e)}return e.prototype.erase=function(e){s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)},e.prototype.get=function(e){return s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]},e.prototype.getAll=function(){return Object.assign({},this._currentSettings)},Object.defineProperty(e.prototype,"isModified",{get:function(){return this._isModified},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){var e=this;return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((function(t){return e._saveInProgress=!1,e._isModified=!1,void 0===e._currentSettings?e._currentSettings=t:Object.assign(e._currentSettings,t),t}),(function(t){return e._saveInProgress=!1,Promise.reject(t)}))):Promise.resolve(this._currentSettings)},e.prototype.set=function(e,t){s.ErrorHelpers.verifyStringParameter(e,"key"),s.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0},e.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.SettingsChanged);return e.registerHandler(a.NotificationId.SettingsChanged,(function(){return!0}),(function(e){t._currentSettings=e.newSettings,n.triggerEvent((function(){return new c(e.newSettings)}))})),r.push(n),r},e.prototype.initializeSettings=function(e){s.ErrorHelpers.verifyParameter(e,"settingsInfo"),s.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1},e.prototype.verifySettingsAreUnlocked=function(){if(this._saveInProgress)throw new s.TableauError(o.ErrorCodes.SettingSaveInProgress,e.ASYNC_SAVE_IN_PROGRESS)},e.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed.",e}();t.SettingsImpl=p},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(7419),o=r(3448),a=r(5136),s=r(1468),u=function(){function e(){}return e.prototype.displayDialogAsync=function(e,t,r){var u=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService"),l=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("notification-service");return new Promise((function(s,c){u.displayDialogAsync(e,t||"",r).then((function(){var e=l.registerHandler(o.NotificationId.ExtensionDialogUpdate,(function(){return!0}),(function(t){if(t.isCloseEvent){if(void 0===t.closePayload)throw new a.TableauError(n.ErrorCodes.InternalError,"closePayload is undefined");s(t.closePayload)}else c(new a.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((function(e){c(e)}))}))},e.prototype.closeDialog=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService").closeDialog(e)},e}();t.UIImpl=u},4252:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(6416),l=r(4164),c=r(1468),p=r(3192),d=r(6132),f=r(5548),y=function(e){function t(t){var r=e.call(this,t)||this;return r._dashboardImpl=t,t.initializeWithPublicInterfaces(),r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"worksheets",{get:function(){return this._dashboardImpl.worksheetsImpl.map((function(e){return new f.Worksheet(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._dashboardImpl.objects.map((function(e){return new p.DashboardObject(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._dashboardImpl.activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._dashboardImpl.activeDashboardName},enumerable:!0,configurable:!0}),t.prototype.setZoneVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.setDashboardObjectVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.getDashboardObjectById=function(e){var t=this._dashboardImpl.getDashboardObjectById(e);return t&&new p.DashboardObject(t)},t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(c.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.DashboardLayoutChanged);e.registerHandler(a.NotificationId.DashboardLayoutChanged,(function(){return!0}),(function(e){var r=t._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);n.triggerEvent((function(){return new u.DashboardLayoutChangedEvent(r)}))})),r.push(n);var i=new s.SingleEventManagerImpl(o.TableauEventType.WorkbookFormattingChanged);return e.registerHandler(a.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(e){i.triggerEvent((function(){return new l.WorkbookFormattingChangedEvent(e)}))})),r.push(i),r},t.prototype.moveAndResizeDashboardObjectsAsync=function(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)},t.prototype.replayAnimationAsync=function(e){return this._dashboardImpl.replayAnimationAsync(e)},t.prototype.getFiltersAsync=function(){return this._dashboardImpl.getFiltersAsync()},t.prototype.applyFilterAsync=function(e,t,r,n){return this._dashboardImpl.applyFilterAsync(e,t,r,n)},t}(d.Sheet);t.Dashboard=y},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4252),i=r(5548),o=function(){function e(e){this._dashboardObjectImpl=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return new n.Dashboard(this._dashboardObjectImpl.dashboardImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._dashboardObjectImpl.type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._dashboardObjectImpl.position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._dashboardObjectImpl.size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheet",{get:function(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._dashboardObjectImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._dashboardObjectImpl.isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._dashboardObjectImpl.isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dashboardObjectImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._dashboardObjectImpl.fieldId},enumerable:!0,configurable:!0}),e}();t.DashboardObject=o},4592:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(864),l=r(1468),c=function(e){function t(t,r){var n=e.call(this)||this;return n.parameterImpl=t,n.initializeEvents(r).forEach((function(e){return n.addNewEventType(e)})),n}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this.parameterImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentValue",{get:function(){return this.parameterImpl.currentValue},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dataType",{get:function(){return this.parameterImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"allowableValues",{get:function(){return this.parameterImpl.allowableValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this.parameterImpl.id},enumerable:!0,configurable:!0}),t.prototype.changeValueAsync=function(e){return this.parameterImpl.changeValueAsync(e)},t.prototype.initializeEvents=function(e){var t=this;s.ErrorHelpers.verifyInternalValue(e,"sheet");var r,n=new Array;try{r=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return n}var i=new s.SingleEventManagerImpl(o.TableauEventType.ParameterChanged);return r.registerHandler(a.NotificationId.ParameterChanged,(function(e){return e===t.parameterImpl.id}),(function(t){i.triggerEvent((function(){return new u.ParameterChangedEvent(t,e)}))})),n.push(i),n},t}(s.EventListenerManager);t.Parameter=c},6132:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(5136),s=r(4592),u=function(e){function t(t){var r=e.call(this)||this;return r._sheetImpl=t,r}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this._sheetImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"sheetType",{get:function(){return this._sheetImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new a.TableauError(o.EmbeddingErrorCodes.ImplementationError,"Size not implemented")},enumerable:!0,configurable:!0}),t.prototype.isValidSize=function(e){var t=e;return void 0!==t.width&&void 0!==t.height},t.prototype.findParameterAsync=function(e){var t=this;return this._sheetImpl.findParameterAsync(e).then((function(e){return new Promise(e?function(r){return r(new s.Parameter(e,t))}:function(e){return e(void 0)})}))},t.prototype.getParametersAsync=function(){var e=this;return this._sheetImpl.getParametersAsync().then((function(t){return t.map((function(t){return new s.Parameter(t,e)}))}))},t}(a.EventListenerManager);t.Sheet=u},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._workbookImpl=e}return e.prototype.getAllDataSourcesAsync=function(){return this._workbookImpl.getAllDataSourcesAsync()},e}();t.Workbook=r},5548:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(5136),l=r(1672),c=r(5572),p=r(3464),d=r(1468),f=r(4252),y=function(e){function t(t){var r=e.call(this,t)||this;return r._worksheetImpl=t,r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){if(null==this._worksheetImpl.parentDashboard)throw new u.TableauError(o.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new f.Dashboard(this._worksheetImpl.parentDashboard)},enumerable:!0,configurable:!0}),t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=u.ApiServiceRegistry.get(d.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new u.SingleEventManagerImpl(a.TableauEventType.MarkSelectionChanged);e.registerHandler(s.NotificationId.SelectedMarksChanged,(function(e){var r=e;return t.visualIdsAreEqual(r,t._worksheetImpl.visualId)}),(function(){return n.triggerEvent((function(){return new c.MarksSelectedEvent(t)}))}));var i=new u.SingleEventManagerImpl(a.TableauEventType.FilterChanged);e.registerHandler(s.NotificationId.FilterChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){i.triggerEvent((function(){return new l.FilterChangedEvent(t,e.fieldName,e.fieldId)}))}));var o=new u.SingleEventManagerImpl(a.TableauEventType.SummaryDataChanged);return e.registerHandler(s.NotificationId.SummaryDataChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){o.triggerEvent((function(){return new p.SummaryDataChangedEvent(t)}))})),r.push(n),r.push(i),r.push(o),r},t.prototype.applyFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyFilterAsync(e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,n)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)},t.prototype.clearFilterAsync=function(e){return this._worksheetImpl.clearFilterAsync(e)},t.prototype.getDataSourcesAsync=function(){return this._worksheetImpl.getDataSourcesAsync()},t.prototype.getFiltersAsync=function(){return this._worksheetImpl.getFiltersAsync()},t.prototype.getSelectedMarksAsync=function(){return this._worksheetImpl.getSelectedMarksAsync()},t.prototype.getHighlightedMarksAsync=function(){return this._worksheetImpl.getHighlightedMarksAsync()},t.prototype.getSummaryDataAsync=function(e){return this._worksheetImpl.getSummaryDataAsync(e)},t.prototype.getSummaryDataReaderAsync=function(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)},t.prototype.getSummaryColumnsInfoAsync=function(){return this._worksheetImpl.getSummaryColumnsInfoAsync()},t.prototype.getUnderlyingDataAsync=function(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)},t.prototype.getUnderlyingTablesAsync=function(){return this._worksheetImpl.getUnderlyingTablesAsync()},t.prototype.getUnderlyingTableDataAsync=function(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)},t.prototype.getUnderlyingTableDataReaderAsync=function(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)},t.prototype.getVisualSpecificationAsync=function(){return this._worksheetImpl.getVisualSpecificationAsync()},t.prototype.clearSelectedMarksAsync=function(){return this._worksheetImpl.clearSelectedMarksAsync()},t.prototype.selectMarksByIDAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.selectMarksByValueAsync=function(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)},t.prototype.selectMarksByIdAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.annotateMarkAsync=function(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)},t.prototype.getAnnotationsAsync=function(){return this._worksheetImpl.getAnnotationsAsync()},t.prototype.removeAnnotationAsync=function(e){return this._worksheetImpl.removeAnnotationAsync(e)},t.prototype.hoverTupleAsync=function(e,t,r){return void 0===r&&(r=!0),this._worksheetImpl.hoverTupleAsync(e,t,r)},t.prototype.selectTuplesAsync=function(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)},t.prototype.getTooltipTextAsync=function(e){return this._worksheetImpl.getTooltipTextAsync(e)},t.prototype.leaveMarkNavigationAsync=function(){return this._worksheetImpl.leaveMarkNavigationAsync()},t.prototype.visualIdsAreEqual=function(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID},t}(r(6132).Sheet);t.Worksheet=y},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dashboard=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return this._dashboard},enumerable:!0,configurable:!0}),e}();t.DashboardContent=r},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(8396),o=r(8012),a=function(){function e(e){this._apiVersion=n.ApiVersion.Instance&&n.ApiVersion.Instance.formattedValue,this._context=n.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=o.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=n.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}return Object.defineProperty(e.prototype,"apiVersion",{get:function(){return this._apiVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this._context},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookFormatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"language",{get:function(){return this._language},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"country",{get:function(){return this._country},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"locale",{get:function(){return this._locale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mode",{get:function(){return this._mode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"operatingSystem",{get:function(){return this._operatingSystem},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tableauVersion",{get:function(){return this._tableauVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"uniqueUserId",{get:function(){return this._uniqueUserId},enumerable:!0,configurable:!0}),e}();t.Environment=a},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.extensionImpl=e,this.extensionImpl=e}return Object.defineProperty(e.prototype,"dashboardContent",{get:function(){return this.extensionImpl.dashboardContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetContent",{get:function(){return this.extensionImpl.worksheetContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"environment",{get:function(){return this.extensionImpl.environment},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"settings",{get:function(){return this.extensionImpl.settings},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ui",{get:function(){return this.extensionImpl.ui},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbook",{get:function(){return this.extensionImpl.workbook},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dashboardObjectId",{get:function(){return this.extensionImpl.extensionZoneId},enumerable:!0,configurable:!0}),e.prototype.initializeAsync=function(e){return this.extensionImpl.initializeAsync(!1,e).then()},e.prototype.initializeDialogAsync=function(){return this.extensionImpl.initializeAsync(!0)},e.prototype.createVizImageAsync=function(e){return this.extensionImpl.createVizImageAsync(e)},e.prototype.setClickThroughAsync=function(e){return this.extensionImpl.setClickThroughAsync(e)},e}();t.Extensions=r},652:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var r=e.call(this)||this;return r._settingsImpl=t,r._settingsImpl.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),t.prototype.erase=function(e){this._settingsImpl.erase(e)},t.prototype.get=function(e){return this._settingsImpl.get(e)},t.prototype.getAll=function(){return this._settingsImpl.getAll()},Object.defineProperty(t.prototype,"isModified",{get:function(){return this._settingsImpl.isModified},enumerable:!0,configurable:!0}),t.prototype.saveAsync=function(){return this._settingsImpl.saveAsync()},t.prototype.set=function(e,t){this._settingsImpl.set(e,t)},t}(r(5136).EventListenerManager);t.Settings=o},1964:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._impl=e}return e.prototype.displayDialogAsync=function(e,t,r){return this._impl.displayDialogAsync(e,t,r)},e.prototype.closeDialog=function(e){this._impl.closeDialog(e)},e}();t.UI=r},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(){}return e.convertToWorkbookFormatting=function(e){return e?{formattingSheets:e.formattingSheets.map((function(e){return{classNameKey:n.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:{fontFamily:e.cssProperties.fontFamily,fontSize:e.cssProperties.fontSize,fontWeight:e.cssProperties.fontWeight,fontStyle:e.cssProperties.fontStyle,textDecoration:e.cssProperties.textDecoration,color:e.cssProperties.color}}}))}:void 0},e}();t.WorkbookFormattingEnvUtil=i},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._worksheet=e}return Object.defineProperty(e.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),e}();t.WorksheetContent=r},6336:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"InitializationService"},enumerable:!0,configurable:!0}),t.prototype.initializeDashboardExtensionsAsync=function(e,t){var r,n=((r={})[o.ParameterId.FunctionName]="initializeDashboardExtensionsAsync",r[o.ParameterId.ExtensionContextMenuIds]=t,r[o.ParameterId.IsExtensionDialog]=e,r);return this.execute(o.VerbId.InitializeExtension,n).then((function(e){return e.result}))},t}(r(5136).ServiceImplBase);t.InitializationServiceImpl=a},5432:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"SettingsService"},enumerable:!0,configurable:!0}),t.prototype.saveSettingsAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="saveSettingsAsync",t[a.ParameterId.SettingsValues]=e,t);return this.execute(a.VerbId.SaveExtensionSettings,r).then((function(e){var t=e.result;if(!t||!t.settingsValues)throw new s.TableauError(o.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))},t}(s.ServiceImplBase);t.SettingsServiceImpl=u},752:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=o.DialogStyle.Window,l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"UIService"},enumerable:!0,configurable:!0}),t.prototype.displayDialogAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="displayDialogAsync",n[a.ParameterId.ExtensionDialogUrl]=e,n[a.ParameterId.ExtensionDialogPayload]=t,n),l=r&&r.height?r.height:400,c=r&&r.width?r.width:600,p=r&&r.dialogStyle?r.dialogStyle:u;if(l<=0||c<=0)throw new s.TableauError(o.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return i[a.ParameterId.ExtensionDialogH]=l,i[a.ParameterId.ExtensionDialogW]=c,s.ErrorHelpers.verifyEnumValue(p,o.DialogStyle,"DialogStyle"),i[a.ParameterId.ExtensionDialogStyle]=s.ExternalToInternalEnumMappings.dialogStyles.convert(p),this.execute(a.VerbId.DisplayDialog,i).then((function(e){switch(e.result){case a.ExtensionDialogResult.DialogAlreadyOpen:throw new s.TableauError(o.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case a.ExtensionDialogResult.InvalidDomain:throw new s.TableauError(o.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))},t.prototype.closeDialog=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="closeDialog",t);return e&&(r[a.ParameterId.ExtensionDialogPayload]=e),this.execute(a.VerbId.CloseDialog,r).then((function(){}))},t.prototype.setClickThroughAsync=function(e,t){var r;if(s.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new s.TableauError(o.ErrorCodes.InternalError,"Extension Id is invalid.");var n=((r={})[a.ParameterId.ExtensionZoneId]=t,r[a.ParameterId.ClickThroughEnabled]=e,r);return this.execute(a.VerbId.SetClickThrough,n).then((function(){}))},t}(s.ServiceImplBase);t.UIServiceImpl=l},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(6336),o=r(5432),a=r(752),s=r(1468);t.registerAllExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new o.SettingsServiceImpl(e,s.ExtensionsRegistryId)),n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new a.UIServiceImpl(e,s.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,s.ExtensionsRegistryId))}},1468:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.PulseLayout=i.PulseLayout,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,n(r(828)),n(r(3432)),n(r(1480)),n(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4744);t.ErrorCodes=n.ErrorCodes,t.ExtensionContext=n.ExtensionContext,t.ExtensionMode=n.ExtensionMode,t.TableauEventType=n.TableauEventType,t.VizImageEncodingType=n.VizImageEncodingType,t.VizImagePaletteType=n.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=n.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=n.VizImageSizeSettingType,t.VizImageSortDirectionType=n.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(268)),n(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,y,h;Object.defineProperty(t,"__esModule",{value:!0}),(h=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",h.Excel="xlsx",(y=t.DeviceType||(t.DeviceType={})).Default="default",y.Desktop="desktop",y.Tablet="tablet",y.Phone="phone",(f=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",f.BrowserNotCapable="browser-not-capable",f.DownloadWorkbookNotAllowed="download-workbook-not-allowed",f.FilterCannotBePerformed="filter-cannot-be-performed",f.IndexOutOfRange="index-out-of-range",f.InternalError="internal-error",f.InvalidCustomViewName="invalid-custom-view-name",f.InvalidDateParameter="invalid-date-parameter",f.invalidFilterFieldNameOrValue="invalid-filter-field-name",f.InvalidParameter="invalid-parameter",f.InvalidSize="invalid-size",f.InvalidSheetType="invalid-sheet-type",f.InvalidSizeBehavior="invalid-size-behavior",f.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",f.InvalidUrl="invalid-url",f.MissingMaxSize="missing-max-size",f.MissingMinSize="missing-min-size",f.MissingMinMaxSize="missing-min-max-size",f.MissingParameter="missing-parameter",f.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",f.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",f.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",f.NotActiveSheet="not-active-sheet",f.NullOrEmptyParameter="null-or-empty-parameter",f.SheetNotInWorkbook="sheet-not-in-workbook",f.StaleDataReference="stale-data-reference",f.UnknownAuthError="unknown-auth-error",f.UnsupportedEventName="unsupported-event-name",f.VizAlreadyInManager="viz-already-in-manager",f.ImplementationError="wrong-implementation",f.NotImplemented="not-implemented",f.EventInitializationError="event-initialization-error",f.IncompatibleVersionError="incompatible-version-error",f.UnknownDialogType="unknown-dialog-type",f.FilterMissingOrNotImplemented="filter-missing-not-implemented",f.StoryPointIdMismatch="storypoint-id-mismatch",(d=t.FileFormats||(t.FileFormats={})).PDF="pdf",d.PNG="png",(p=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",p.Landscape="landscape",(c=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",c.Legal="legal",c.Note="note",c.Folio="folio",c.Tabloid="tabloid",c.Ledger="ledger",c.Statement="statement",c.Executive="executive",c.A3="A3",c.A4="A4",c.A5="A5",c.B4="B4",c.B5="B5",c.Quarto="quarto",c.Unspecified="unspecified",(l=t.PrintScaling||(t.PrintScaling={})).Automatic="automatic",l.Perc25="25%",l.Perc50="50%",l.Perc60="60%",l.Perc75="75%",l.Perc80="80%",l.Perc90="90%",l.Perc100="100%",l.Perc200="200%",l.Perc400="400%",l.AtMost1PageHigh="at-most-1-page-high",l.AtMost2PagesHigh="at-most-2-pages-high",l.AtMost1PageWide="at-most-1-page-wide",l.AtMost2PagesWide="at-most-2-pages-wide",(u=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",u.Axes="axes",u.Filters="filters",u.Sorts="sorts",u.Shelves="shelves",(s=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",s.AskData="askData",s.CustomViews="customViews",s.DataDetails="dataDetails",s.Share="share",s.Subscribe="subscribe",(a=t.Toolbar||(t.Toolbar={})).Top="top",a.Bottom="bottom",a.Hidden="hidden",(o=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",o.Exactly="exactly",o.Range="range",o.AtLeast="atleast",o.AtMost="atmost",(i=t.PulseLayout||(t.PulseLayout={})).Default="default",i.Card="card",i.Ban="ban",(n=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",n.CustomViewRemoved="customviewremoved",n.CustomViewSaved="customviewsaved",n.CustomViewSetDefault="customviewsetdefault",n.EditButtonClicked="editbuttonclicked",n.EditInDesktopButtonClicked="editindesktopbuttonclicked",n.FilterChanged="filterchanged",n.FirstVizSizeKnown="firstvizsizeknown",n.FirstInteractive="firstinteractive",n.CustomMarkContextMenuEvent="custommarkcontextmenu",n.MarkSelectionChanged="markselectionchanged",n.ParameterChanged="parameterchanged",n.ToolbarStateChanged="toolbarstatechanged",n.WorkbookReadyToClose="workbookreadytoclose",n.WorkbookPublished="workbookpublished",n.WorkbookPublishedAs="workbookpublishedas",n.UrlAction="urlaction",n.TabSwitched="tabswitched",n.StoryPointSwitched="storypointswitched",n.VizLoadError="vizloaderror",n.IframeSrcUpdated="iframesrcupdated",n.SummaryDataChanged="summarydatachanged",n.ReadyToReceiveAuthToken="readytoreceiveauthtoken",(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;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter",r.Layout="layout"},3432:(e,t)=>{"use strict";var r,n,i,o,a;Object.defineProperty(t,"__esModule",{value:!0}),(a=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",a.HideEditInDesktopButton="hide-edit-in-desktop-button",a.SuppressDefaultEditBehavior="suppress-default-edit-behavior",a.DisableVersionCheck="disable-version-check",a.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",a.OnFirstVizSizeKnown="onFirstVizSizeKnown",a.OnFirstInteractive="onFirstInteractive",(o=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",o.HideTabs="hide-tabs",o.Toolbar="toolbar",o.InstanceIdToClone="instance-id-to-clone",o.Device="device",o.HideEditButton="hide-edit-button",o.OnEditButtonClicked="onEditButtonClicked",o.OnFilterChanged="onFilterChanged",o.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",o.OnMarkSelectionChanged="onMarkSelectionChanged",o.OnParameterChanged="onParameterChanged",o.OnToolbarStateChanged="onToolbarStateChanged",o.OnUrlAction="onUrlAction",o.OnTabSwitched="onTabSwitched",o.OnCustomViewLoaded="onCustomViewLoaded",o.OnCustomViewRemoved="onCustomViewRemoved",o.OnCustomViewSaved="onCustomViewSaved",o.OnCustomViewSetDefault="onCustomViewSetDefault",o.OnStoryPointSwitched="onStoryPointSwitched",o.OnSummaryDataChanged="onSummaryDataChanged",o.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(n=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",n.VizParameter="viz-parameter",n.CustomParameter="custom-parameter",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,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",(t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){var t,r,n,i,o,a,s,u,l;(l=e.ErrorCodes||(e.ErrorCodes={})).APINotInitialized="api-not-initialized",l.VisibilityError="visibility-error",l.DialogAlreadyOpen="dialog-already-open",l.DialogClosedByUser="dialog-closed-by-user",l.InternalError="internal-error",l.InvalidDomainDialog="invalid-dialog-domain",l.InvalidParameter="invalid-parameter",l.MissingFilter="missing-filter",l.MissingParameter="missing-parameter",l.ServerError="server-error",l.SettingSaveInProgress="setting-save-in-progress",l.UnsupportedEventName="unsupported-event-name",l.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type",(u=e.ExtensionContext||(e.ExtensionContext={})).Desktop="desktop",u.Server="server",(s=e.ExtensionMode||(e.ExtensionMode={})).Authoring="authoring",s.Viewing="viewing",(a=e.TableauEventType||(e.TableauEventType={})).FilterChanged="filter-changed",a.MarkSelectionChanged="mark-selection-changed",a.SummaryDataChanged="summary-data-changed",a.ParameterChanged="parameter-changed",a.SettingsChanged="settings-changed",a.DashboardLayoutChanged="dashboard-layout-changed",a.WorkbookFormattingChanged="workbook-formatting-changed",(o=e.VizImageEncodingType||(e.VizImageEncodingType={})).Discrete="discrete",o.Continuous="continuous",(i=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})).Ascending="ascending",i.Descending="descending",(n=e.VizImagePaletteType||(e.VizImagePaletteType={})).CustomDiverging="custom-diverging",n.CustomSequential="custom-sequential",(r=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})).Fixed="fixed",r.Manual="manual",(t=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={})).Right="right",t.Left="left",t.Center="center"}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:function(e){"use strict";var t,r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var n=r(808);t.AnalyticsObjectType=n.AnalyticsObjectType,t.AnnotationType=n.AnnotationType,t.ClassNameKey=n.ClassNameKey,t.ColumnType=n.ColumnType,t.DashboardLayoutChange=n.DashboardLayoutChange,t.DashboardObjectType=n.DashboardObjectType,t.DashboardObjectVisibilityType=n.DashboardObjectVisibilityType,t.DataType=n.DataType,t.DateRangeType=n.DateRangeType,t.DialogStyle=n.DialogStyle,t.EncodingType=n.EncodingType,t.FieldAggregationType=n.FieldAggregationType,t.FieldRoleType=n.FieldRoleType,t.FilterDomainType=n.FilterDomainType,t.FilterNullOption=n.FilterNullOption,t.FilterType=n.FilterType,t.FilterUpdateType=n.FilterUpdateType,t.HierarchicalLevelSelectionState=n.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=n.IncludeDataValuesOption,t.MarkType=n.MarkType,t.ParameterValueType=n.ParameterValueType,t.PeriodType=n.PeriodType,t.QuickTableCalcType=n.QuickTableCalcType,t.ReplaySpeedType=n.ReplaySpeedType,t.SelectOptions=n.SelectOptions,t.SelectionUpdateType=n.SelectionUpdateType,t.SheetType=n.SheetType,t.SortDirection=n.SortDirection,t.TrendLineModelType=n.TrendLineModelType,t.ZoneVisibilityType=n.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),r(5668),r(5816),r(8824);var i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,n(r(6716)),n(r(1080)),n(r(5824)),n(r(4547)),n(r(2400)),n(r(2496)),n(r(2472)),n(r(552)),n(r(3256)),n(r(7204)),n(r(3760)),n(r(4528)),n(r(3388)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1080),i=function(){function e(){}return e.isSpecial=function(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]},e.parseBoolean=function(e){var t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t},e.parseNumber=function(e){var t=Number(e);return isNaN(t)?this.specialValueIndicator:t},e.parseDate=function(e){var t=new Date(e);return Number.isNaN(t.getTime())?null:t},e.parseDateTime=function(e){var t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r},e.convertValueAsStringToValue=function(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case n.DataType.Bool:return this.parseBoolean(e);case n.DataType.Int:case n.DataType.Float:return this.parseNumber(e);case n.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case n.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case n.DataType.Spatial:case n.DataType.String:default:return e}}},e.convertValueToNativeValue=function(e,t){if(null==e)return null;switch(t){case n.DataType.Bool:case n.DataType.Int:case n.DataType.Float:return"string"==typeof e?null:e;case n.DataType.Date:return this.parseDate(e);case n.DataType.DateTime:return this.parseDateTime(e);case n.DataType.String:return this.isSpecial(e)?null:e;case n.DataType.Spatial:default:return e}},e.convertStringValueToNativeValue=function(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)},e.specialValueIndicator="%null%",e}();t.DataTypeConverter=i},1080:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,y,h,m,g,v,b,I,S,_,T,P,A,E,w,O,D,x,F,C,N,M;Object.defineProperty(t,"__esModule",{value:!0}),(M=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",M.Server="server",M.Unknown="unknown",(N=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",N.Viewing="viewing",N.Unknown="unknown",(C=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",C.Point="point",C.Area="area",(F=t.ColumnType||(t.ColumnType={})).Discrete="discrete",F.Continuous="continuous",F.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",(D=t.DataType||(t.DataType={})).String="string",D.Int="int",D.Float="float",D.Bool="bool",D.Date="date",D.DateTime="date-time",D.Spatial="spatial",D.Unknown="unknown",(O=t.DialogStyle||(t.DialogStyle={})).Window="window",O.Modal="modal",O.Modeless="modeless",(w=t.EncodedDataType||(t.EncodedDataType={})).Number="number",w.String="string",w.Date="date",w.Boolean="boolean",(E=t.ErrorCodes||(t.ErrorCodes={})).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",(A=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",A.Avg="avg",A.Min="min",A.Max="max",A.Stdev="stdev",A.Stdevp="stdevp",A.Var="var",A.Varp="varp",A.Collect="collect",A.Count="count",A.Countd="countd",A.Median="median",A.Attr="attr",A.None="none",A.Year="year",A.Qtr="qtr",A.Month="month",A.Day="day",A.Hour="hour",A.Minute="minute",A.Second="second",A.Week="week",A.Weekday="weekday",A.MonthYear="month-year",A.Mdy="mdy",A.End="end",A.TruncYear="trunc-year",A.TruncQtr="trunc-qtr",A.TruncMonth="trunc-month",A.TruncWeek="trunc-week",A.TruncDay="trunc-day",A.TruncHour="trunc-hour",A.TruncMinute="trunc-minute",A.TruncSecond="trunc-second",A.Quart1="quart1",A.Quart3="quart3",A.Skewness="skewness",A.Kurtosis="kurtosis",A.InOut="in-out",A.User="user",(P=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",P.Measure="measure",P.Unknown="unknown",(T=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",T.All="all",T.Replace="replace",T.Remove="remove",(_=t.SheetType||(t.SheetType={})).Dashboard="dashboard",_.Story="story",_.Worksheet="worksheet",(S=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",S.List="list",S.Range="range",(I=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",I.Quarters="quarters",I.Months="months",I.Weeks="weeks",I.Days="days",I.Hours="hours",I.Minutes="minutes",I.Seconds="seconds",(b=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",b.NonNullValues="nonnullvalues",b.AllValues="allvalues",(v=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",v.Database="database",(g=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",g.Add="select-add",g.Remove="select-remove",(m=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",m.Toggle="select-options-toggle",m.Menu="select-options-menu",m.Range="select-options-range",m.Search="select-options-search",(h=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",h.IncludeNonNull="include-non-null",h.IncludeAll="include-all",(y=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",y.NoneSelected="none-selected",y.SomeSelected="some-selected",y.UnknownSelected="unknown-selected",(f=t.MarkType||(t.MarkType={})).Bar="bar",f.Line="line",f.Area="area",f.Square="square",f.Circle="circle",f.Shape="shape",f.Text="text",f.Map="map",f.Pie="pie",f.GanttBar="gantt-bar",f.Polygon="polygon",f.Heatmap="heatmap",f.VizExtension="viz-extension",(d=t.FilterType||(t.FilterType={})).Categorical="categorical",d.Range="range",d.RelativeDate="relativeDate",d.Hierarchical="hierarchical",(p=t.DateRangeType||(t.DateRangeType={})).Last="last",p.LastN="lastN",p.Next="next",p.NextN="nextN",p.Current="current",p.ToDate="toDate",(c=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",c.InvalidDomain="invalid-domain",c.Success="success",(l=t.ApiShowDataTableSentinel||(t.ApiShowDataTableSentinel={})).SingleTableId="single-table-id-sentinel",l.SingleTableCaption="Single table id sentinel",(u=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",u.FormattedValuesOnly="formatted-values-only",u.NativeAndFormattedValues="native-and-formatted-values",(s=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",s.Legal="legal",s.Note="note",s.Folio="folio",s.Tabloid="tabloid",s.Ledger="ledger",s.Statement="statement",s.Executive="executive",s.A3="a3",s.A4="a4",s.A5="a5",s.B4="b4",s.B5="b5",s.Quarto="quarto",s.Unspecified="unspecified",(a=t.PageOrientation||(t.PageOrientation={})).Printer="printer",a.Portrait="portrait",a.Landscape="landscape",(o=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",o.ScalePercentage="percent",o.ScaleFitPages="fit-pages",(i=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",i.ScalePct400="pct400",i.ScalePct200="pct200",i.ScalePct100="pct100",i.ScalePct90="pct90",i.ScalePct80="pct80",i.ScalePct75="pct75",i.ScalePct60="pct60",i.ScalePct50="pct50",i.ScalePct25="pct25",(n=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",n.FitTwoHigh="fit0x2",n.FitOneWide="fit1x0",n.FitTwoWide="fit2x0",(r=t.EncodingType||(t.EncodingType={})).Color="color",r.Size="size",r.Label="label",r.Detail="detail",r.Tooltip="tooltip",r.Shape="shape",r.Path="path",r.Angle="angle",r.Geometry="geometry",r.Custom="custom"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.ParameterChanged="parameter-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.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.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",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.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.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.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.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.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.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.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.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",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.ClearFilter="clear-filter",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.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.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetTooltipText="get-tooltip-text",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.MoveAndResizeZones="move-and-resize-zones",r.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.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.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,n,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(n||(n={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(3448),o=r(1680),a=r(4020),s=r(7204),u=function(){function e(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}return e.prototype.startListening=function(){var e=this;if(!this.unregisterFunction){var t=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",t,!0),this.unregisterFunction=function(){return e.thisWindow.removeEventListener("message",t,!0)}}},e.prototype.stopListening=function(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)},e.prototype.setInitializeMessageHandler=function(e){this.initializeMessageHandler=e},e.prototype.setCommandResponseMessageHandler=function(e){this.commandResponseMessageHandler=e},e.prototype.setCommandMessageHandler=function(e){this.commandMessageHandler=e},e.prototype.setNotificationMessageHandler=function(e){this.notificationMessageHandler=e},e.prototype.setHandshakeMessageHandler=function(e){this.handshakeMessageHandler=e},e.prototype.prepareInitializationMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)},e.prototype.prepareCommandMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)},e.prototype.prepareCommandResponseMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)},e.prototype.prepareNotificationMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)},e.prototype.prepareAckMessage=function(){var e={msgGuid:n.raw(),msgType:s.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)},e.prototype.prepareMessage=function(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new o.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)},e.prototype.onMessageReceived=function(e){if((!this.otherWindow||e.source===this.otherWindow)&&e.data){var t=e.data;if(a.isMessage(t))switch(t.msgType){case s.MessageType.Initialize:if(!a.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case s.MessageType.CommandResponse:if(!a.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case s.MessageType.Command:if(!a.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case s.MessageType.Notification:if(!a.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case s.MessageType.Handshake:if(!a.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}},e.prototype.setOtherWindow=function(e){this.otherWindow=e},e.prototype.setOtherWindowOrigin=function(e){this.otherWindowOrigin=e},e}();t.CrossFrameMessenger=u},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r){this._message=e,this._target=t,this._origin=r}return Object.defineProperty(e.prototype,"messageGuid",{get:function(){return this._message.msgGuid},enumerable:!0,configurable:!0}),e.prototype.send=function(){return this._target.postMessage(this._message,this._origin),this},e}();t.CrossFramePreparedMessage=r},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(5824),o=r(7204),a=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function s(e){if(!e)return!1;var t=e;return!(!(t&&t.msgGuid&&t.msgType)||!n.isGuid(t.msgGuid)||"string"!=typeof t.msgType||[o.MessageType.Command,o.MessageType.CommandResponse,o.MessageType.Initialize,o.MessageType.Notification,o.MessageType.Handshake].indexOf(t.msgType)<0)}function u(e){if(!e)return!1;var t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=s,t.isVersion=u,t.isInitMessage=function(e){if(!s(e))return!1;var t=e;return!!(t.msgType===o.MessageType.Initialize&&t.apiVersion&&u(t.apiVersion)&&t.crossFrameVersion&&u(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.CommandResponse||!n.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Notification||!t.data&&!a.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!s(e)&&e.msgType===o.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},9220:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.upgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.downgradeExecuteReturn=function(e){return e},e.prototype.downgradeNotification=function(e){return e},e}();t.IdentityVersionConverter=r},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=n,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error("Cannot convert between external version "+this._externalMajorVersion+" and "+this._platformMajorVersion)}return e.fromData=function(e,t,r,n,i){return new this(e.major,t.major,r,n,i)},e.prototype.upgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._upgradeExecuteTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(9220),i=r(2320),o=r(720);function a(e,t){return e.major===t.major&&e.minor===t.minor}function s(e,t,r,o,s){var l=e.major,c=e.minor,p=t.major;if(l>p)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+p);if(a(e,t))return new n.IdentityVersionConverter;var d=u(l,p,c,r),f=u(l,p,c,o),y=u(l,p,c,s);return f.reverse(),y.reverse(),i.StackingVersionConverter.fromData(e,t,d,f,y)}function u(e,t,r,n){for(var i=[],o=e;o<=t;o++)if(o in n)for(var a=o===e?r:0,s=l(Object.keys(n[o])),u=a;u<=s;u++)u in n[o]&&i.push.apply(i,n[o][u]);return i}function l(e){return e.map((function(e){return Number(e)})).reduce((function(e,t){return e>t?e:t}))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5824);t.DowngradeWorksheetNames=function(e){var t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((function(e){e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===n.NotificationId.SelectedMarksChanged){var t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.downgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.upgradeExecuteReturn=function(e,t,r){return e},e.prototype.upgradeNotification=function(e){return e},e}();t.ExternalIdentityVersionConverter=r},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=n,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error("Cannot convert between external version "+this._externalVersion.major+"\n and "+this._platformVersion.major)}return e.prototype.downgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._downgradeExecuteCallTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3760),i=r(4528),o=r(5768),a=r(2088);function s(e,t,r,a,s){var l=e.major,c=t.major,p=t.minor;if(l>c)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+c);if(l{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);function i(e){void 0!==e&&void 0!==e.dataTable&&Array.isArray(e.dataTable)&&e.dataTable.forEach((function(t){t.forEach((function(t,r){var i=t.value;null!==i&&(t.value=n.DataTypeConverter.convertValueAsStringToValue(i,e.headers[r].dataType))}))}))}function o(e,t){if(t[n.ParameterId.LogicalTableId]!==n.ApiShowDataTableSentinel.SingleTableId)throw new Error("Invalid logical table id passed to "+e+".")}t.UpgradeDataTableTypes=function(e,t,r){if(!e)return e;var n=e.result;if(void 0!==n.data&&void 0!==n.isSummary)return i(n.data),e;var o=e.result;return void 0!==o.data&&Array.isArray(o.data)?(o.data.forEach((function(e){i(e)})),e):e},t.DowngradeUnderlyingTableDataAsync=function(e,t){return e===n.VerbId.GetUnderlyingTableData&&(o(e,t),e=n.VerbId.GetUnderlyingData),{verb:e,parameters:t}},t.DowngradeLogicalTableDataAsync=function(e,t){return e===n.VerbId.GetLogicalTableData&&(o(e,t),e=n.VerbId.GetDataSourceData),{verb:e,parameters:t}},t.UpgradeDataTableRowsAndColumns=function(e,t,r){return function(e){return e===n.VerbId.GetDataSummaryData}(t)&&r[n.ParameterId.MaxRows]&&(e=function(e,t){var r=e.result;return r.data&&Array.isArray(r.data.dataTable)?(t>0&&t{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,n(r(5184));var o=r(8540);t.CrossFrameDispatcher=o.CrossFrameDispatcher;var a=r(8340);t.DataSource=a.DataSource;var s=r(1044);t.ExternalToInternalEnumMappings=s.ExternalToInternalEnumMappings;var u=r(6557);t.InternalToExternalEnumMappings=u.InternalToExternalEnumMappings;var l=r(2680);t.EventListenerManager=l.EventListenerManager;var c=r(1072);t.Field=c.Field;var p=r(2520);t.CustomViewImpl=p.CustomViewImpl;var d=r(1940);t.DashboardImpl=d.DashboardImpl;var f=r(6488);t.DashboardObjectImpl=f.DashboardObjectImpl;var y=r(2180);t.DataSourceImpl=y.DataSourceImpl;var h=r(8552);t.ParameterImpl=h.ParameterImpl;var m=r(8332);t.SheetImpl=m.SheetImpl;var g=r(1116);t.SheetInfoImpl=g.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var b=r(6804);t.StoryImpl=b.StoryImpl;var I=r(2608);t.StoryPointImpl=I.StoryPointImpl;var S=r(6068);t.StoryPointInfoImpl=S.StoryPointInfoImpl;var _=r(3044);t.WorkbookImpl=_.WorkbookImpl;var T=r(6500);t.WorksheetImpl=T.WorksheetImpl;var P=r(3987);t.Point=P.Point,n(r(8672)),n(r(3008));var A=r(1832);t.ClientInfoServiceImpl=A.ClientInfoServiceImpl;var E=r(1288);t.NotificationServiceImpl=E.NotificationServiceImpl;var w=r(6428);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var O=r(1776);t.ServiceImplBase=O.ServiceImplBase;var D=r(4109);t.SizeServiceImpl=D.SizeServiceImpl;var x=r(2248);t.StoryActivationServiceImpl=x.StoryActivationServiceImpl;var F=r(6664);t.TableauError=F.TableauError;var C=r(1724);t.Deferred=C.Deferred;var N=r(7480);t.ErrorHelpers=N.ErrorHelpers;var M=r(5044);t.ExportHelpers=M.ExportHelpers;var k=r(2780);t.SheetUtils=k.SheetUtils;var R=r(1576);t.VersionNumber=R.VersionNumber;var V=r(8648);t.VersionedExternalApiDispatcher=V.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1576),i=function(){function e(){}return Object.defineProperty(e,"Instance",{get:function(){return e._instance},enumerable:!0,configurable:!0}),e.SetVersionNumber=function(t,r){e._instance=new n.VersionNumber(t,r)},e}();t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._connectionInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._connectionInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._connectionInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"serverURI",{get:function(){return this._connectionInfo.serverURI},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._connectionInfo.type},enumerable:!0,configurable:!0}),e}();t.ConnectionSummary=r},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise((function(o,a){var s;(s=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener)||a("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");var u=new n.CrossFrameMessenger(e,s,"*"),l=u.prepareInitializationMessage(t,n.MESSAGING_VERSION,r);u.setCommandResponseMessageHandler((function(e){e.commandGuid===l.messageGuid&&o((function(){return new i.CrossFrameDispatcher(u)}))})),u.startListening(),l.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}return e.prototype.execute=function(e,t){var r=this,n=this._messenger.prepareCommandMessage(e,t),i=new Promise((function(e,t){r._pendingPromises[n.messageGuid]={resolve:e,reject:t}}));return n.send(),i},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e.prototype.onCommandResponse=function(e){if(!(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)){var t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}},e.prototype.onNotification=function(e){for(var t=0,r=this._notificationHandlers;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dataSourceImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._dataSourceImpl.fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceImpl.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceImpl.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceImpl.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceImpl.publishedUrl()},e.prototype.refreshAsync=function(){return this._dataSourceImpl.refreshAsync()},e.prototype.getActiveTablesAsync=function(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()},e.prototype.getConnectionSummariesAsync=function(){return this._dataSourceImpl.getConnectionSummariesAsync()},e.prototype.getUnderlyingDataAsync=function(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)},e.prototype.getLogicalTablesAsync=function(){return this._dataSourceImpl.getLogicalTablesAsync()},e.prototype.getLogicalTableDataAsync=function(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)},e}();t.DataSource=r},1044:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d;Object.defineProperty(t,"__esModule",{value:!0});var f=r(7419),y=r(3448),h=r(5520),m=function(){function e(){}return e.filterDomainType=new h.EnumConverter(((n={})[f.FilterDomainType.Relevant]=y.FilterDomainType.Relevant,n[f.FilterDomainType.Database]=y.FilterDomainType.Database,n)),e.nullOptions=new h.EnumConverter(((i={})[f.FilterNullOption.AllValues]=y.FilterNullOption.AllValues,i[f.FilterNullOption.NonNullValues]=y.FilterNullOption.NonNullValues,i[f.FilterNullOption.NullValues]=y.FilterNullOption.NullValues,i)),e.filterUpdateType=new h.EnumConverter(((o={})[f.FilterUpdateType.Add]=y.FilterUpdateType.Add,o[f.FilterUpdateType.All]=y.FilterUpdateType.All,o[f.FilterUpdateType.Remove]=y.FilterUpdateType.Remove,o[f.FilterUpdateType.Replace]=y.FilterUpdateType.Replace,o)),e.setVisibilityType=new h.EnumConverter(((a={})[f.ZoneVisibilityType.Show]=!0,a[f.ZoneVisibilityType.Hide]=!1,a)),e.setReplaySpeedType=new h.EnumConverter(((s={})[f.ReplaySpeedType.Slow]=2,s[f.ReplaySpeedType.Normal]=1,s[f.ReplaySpeedType.Fast]=.5,s)),e.sheetType=new h.EnumConverter(((u={})[f.SheetType.Dashboard]=y.SheetType.Dashboard,u[f.SheetType.Worksheet]=y.SheetType.Worksheet,u[f.SheetType.Story]=y.SheetType.Story,u)),e.showDataTableFormatType=new h.EnumConverter(((l={})[f.IncludeDataValuesOption.AllValues]=y.ApiShowDataTableFormat.NativeAndFormattedValues,l[f.IncludeDataValuesOption.OnlyNativeValues]=y.ApiShowDataTableFormat.NativeValuesOnly,l[f.IncludeDataValuesOption.OnlyFormattedValues]=y.ApiShowDataTableFormat.FormattedValuesOnly,l)),e.periodType=new h.EnumConverter(((c={})[f.PeriodType.Years]=y.DateStepPeriod.Years,c[f.PeriodType.Quarters]=y.DateStepPeriod.Quarters,c[f.PeriodType.Months]=y.DateStepPeriod.Months,c[f.PeriodType.Weeks]=y.DateStepPeriod.Weeks,c[f.PeriodType.Days]=y.DateStepPeriod.Days,c[f.PeriodType.Hours]=y.DateStepPeriod.Hours,c[f.PeriodType.Minutes]=y.DateStepPeriod.Minutes,c[f.PeriodType.Seconds]=y.DateStepPeriod.Seconds,c)),e.dateRangeType=new h.EnumConverter(((p={})[f.DateRangeType.Last]=y.DateRangeType.Last,p[f.DateRangeType.LastN]=y.DateRangeType.LastN,p[f.DateRangeType.Next]=y.DateRangeType.Next,p[f.DateRangeType.NextN]=y.DateRangeType.NextN,p[f.DateRangeType.Current]=y.DateRangeType.Current,p[f.DateRangeType.ToDate]=y.DateRangeType.ToDate,p)),e.dialogStyles=new h.EnumConverter(((d={})[f.DialogStyle.Window]=y.DialogStyle.Window,d[f.DialogStyle.Modal]=y.DialogStyle.Modal,d[f.DialogStyle.Modeless]=y.DialogStyle.Modeless,d)),e}();t.ExternalToInternalEnumMappings=m},6557:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d,f,y,h,m,g,v,b,I;Object.defineProperty(t,"__esModule",{value:!0});var S=r(7419),_=r(3448),T=r(5520),P=function(){function e(){}return e.extensionContext=new T.EnumConverter(((n={})[_.ExtensionContext.Desktop]=S.ExtensionContext.Desktop,n[_.ExtensionContext.Server]=S.ExtensionContext.Server,n)),e.extensionMode=new T.EnumConverter(((i={})[_.ExtensionMode.Authoring]=S.ExtensionMode.Authoring,i[_.ExtensionMode.Viewing]=S.ExtensionMode.Viewing,i)),e.columnType=new T.EnumConverter(((o={})[_.ColumnType.Continuous]=S.ColumnType.Continuous,o[_.ColumnType.Discrete]=S.ColumnType.Discrete,o[_.ColumnType.Unknown]=S.ColumnType.Unknown,o)),e.fieldAggregationType=new T.EnumConverter(((a={})[_.FieldAggregationType.Attr]=S.FieldAggregationType.Attr,a[_.FieldAggregationType.Avg]=S.FieldAggregationType.Avg,a[_.FieldAggregationType.Collect]=S.FieldAggregationType.Collect,a[_.FieldAggregationType.Count]=S.FieldAggregationType.Count,a[_.FieldAggregationType.Countd]=S.FieldAggregationType.Countd,a[_.FieldAggregationType.Day]=S.FieldAggregationType.Day,a[_.FieldAggregationType.End]=S.FieldAggregationType.End,a[_.FieldAggregationType.Hour]=S.FieldAggregationType.Hour,a[_.FieldAggregationType.InOut]=S.FieldAggregationType.InOut,a[_.FieldAggregationType.Kurtosis]=S.FieldAggregationType.Kurtosis,a[_.FieldAggregationType.Max]=S.FieldAggregationType.Max,a[_.FieldAggregationType.Mdy]=S.FieldAggregationType.Mdy,a[_.FieldAggregationType.Median]=S.FieldAggregationType.Median,a[_.FieldAggregationType.Min]=S.FieldAggregationType.Min,a[_.FieldAggregationType.Minute]=S.FieldAggregationType.Minute,a[_.FieldAggregationType.MonthYear]=S.FieldAggregationType.MonthYear,a[_.FieldAggregationType.None]=S.FieldAggregationType.None,a[_.FieldAggregationType.Qtr]=S.FieldAggregationType.Qtr,a[_.FieldAggregationType.Quart1]=S.FieldAggregationType.Quart1,a[_.FieldAggregationType.Quart3]=S.FieldAggregationType.Quart3,a[_.FieldAggregationType.Second]=S.FieldAggregationType.Second,a[_.FieldAggregationType.Skewness]=S.FieldAggregationType.Skewness,a[_.FieldAggregationType.Stdev]=S.FieldAggregationType.Stdev,a[_.FieldAggregationType.Stdevp]=S.FieldAggregationType.Stdevp,a[_.FieldAggregationType.Sum]=S.FieldAggregationType.Sum,a[_.FieldAggregationType.TruncDay]=S.FieldAggregationType.TruncDay,a[_.FieldAggregationType.TruncHour]=S.FieldAggregationType.TruncHour,a[_.FieldAggregationType.TruncMinute]=S.FieldAggregationType.TruncMinute,a[_.FieldAggregationType.TruncMonth]=S.FieldAggregationType.TruncMonth,a[_.FieldAggregationType.TruncQtr]=S.FieldAggregationType.TruncQtr,a[_.FieldAggregationType.TruncSecond]=S.FieldAggregationType.TruncSecond,a[_.FieldAggregationType.TruncWeek]=S.FieldAggregationType.TruncWeek,a[_.FieldAggregationType.TruncYear]=S.FieldAggregationType.TruncYear,a[_.FieldAggregationType.User]=S.FieldAggregationType.User,a[_.FieldAggregationType.Var]=S.FieldAggregationType.Var,a[_.FieldAggregationType.Varp]=S.FieldAggregationType.Varp,a[_.FieldAggregationType.Week]=S.FieldAggregationType.Week,a[_.FieldAggregationType.Weekday]=S.FieldAggregationType.Weekday,a[_.FieldAggregationType.Year]=S.FieldAggregationType.Year,a)),e.fieldRoleType=new T.EnumConverter(((s={})[_.FieldRoleType.Dimension]=S.FieldRoleType.Dimension,s[_.FieldRoleType.Measure]=S.FieldRoleType.Measure,s[_.FieldRoleType.Unknown]=S.FieldRoleType.Unknown,s)),e.sheetType=new T.EnumConverter(((u={})[_.SheetType.Dashboard]=S.SheetType.Dashboard,u[_.SheetType.Story]=S.SheetType.Story,u[_.SheetType.Worksheet]=S.SheetType.Worksheet,u)),e.dashboardObjectType=new T.EnumConverter(((l={})[_.DashboardObjectType.Extension]=S.DashboardObjectType.Extension,l[_.DashboardObjectType.Blank]=S.DashboardObjectType.Blank,l[_.DashboardObjectType.Image]=S.DashboardObjectType.Image,l[_.DashboardObjectType.Legend]=S.DashboardObjectType.Legend,l[_.DashboardObjectType.PageFilter]=S.DashboardObjectType.PageFilter,l[_.DashboardObjectType.ParameterControl]=S.DashboardObjectType.ParameterControl,l[_.DashboardObjectType.QuickFilter]=S.DashboardObjectType.QuickFilter,l[_.DashboardObjectType.Text]=S.DashboardObjectType.Text,l[_.DashboardObjectType.Title]=S.DashboardObjectType.Title,l[_.DashboardObjectType.WebPage]=S.DashboardObjectType.WebPage,l[_.DashboardObjectType.Worksheet]=S.DashboardObjectType.Worksheet,l)),e.dataType=new T.EnumConverter(((c={})[_.DataType.Bool]=S.DataType.Bool,c[_.DataType.Date]=S.DataType.Date,c[_.DataType.DateTime]=S.DataType.DateTime,c[_.DataType.Float]=S.DataType.Float,c[_.DataType.Int]=S.DataType.Int,c[_.DataType.Spatial]=S.DataType.Spatial,c[_.DataType.String]=S.DataType.String,c)),e.filterUpdateType=new T.EnumConverter(((p={})[_.FilterUpdateType.Add]=S.FilterUpdateType.Add,p[_.FilterUpdateType.All]=S.FilterUpdateType.All,p[_.FilterUpdateType.Remove]=S.FilterUpdateType.Remove,p[_.FilterUpdateType.Replace]=S.FilterUpdateType.Replace,p)),e.allowableValues=new T.EnumConverter(((d={})[_.DomainRestrictionType.All]=S.ParameterValueType.All,d[_.DomainRestrictionType.List]=S.ParameterValueType.List,d[_.DomainRestrictionType.Range]=S.ParameterValueType.Range,d)),e.dateStepPeriod=new T.EnumConverter(((f={})[_.DateStepPeriod.Years]=S.PeriodType.Years,f[_.DateStepPeriod.Quarters]=S.PeriodType.Quarters,f[_.DateStepPeriod.Months]=S.PeriodType.Months,f[_.DateStepPeriod.Weeks]=S.PeriodType.Weeks,f[_.DateStepPeriod.Days]=S.PeriodType.Days,f[_.DateStepPeriod.Hours]=S.PeriodType.Hours,f[_.DateStepPeriod.Minutes]=S.PeriodType.Minutes,f[_.DateStepPeriod.Seconds]=S.PeriodType.Seconds,f)),e.dateRangeType=new T.EnumConverter(((y={})[_.DateRangeType.Current]=S.DateRangeType.Current,y[_.DateRangeType.Last]=S.DateRangeType.Last,y[_.DateRangeType.LastN]=S.DateRangeType.LastN,y[_.DateRangeType.Next]=S.DateRangeType.Next,y[_.DateRangeType.NextN]=S.DateRangeType.NextN,y[_.DateRangeType.ToDate]=S.DateRangeType.ToDate,y)),e.errorCode=new T.EnumConverter(((h={})[_.ErrorCodes.INITIALIZATION_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.INTERNAL_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.MISSING_ENUM_MAPPING]=S.ErrorCodes.InternalError,h[_.ErrorCodes.MISSING_PARAMETER]=S.ErrorCodes.InternalError,h[_.ErrorCodes.PERMISSION_DENIED]=S.ErrorCodes.InternalError,h[_.ErrorCodes.PRES_MODEL_PARSING_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.UNKNOWN_VERB_ID]=S.ErrorCodes.InternalError,h[_.ErrorCodes.VERSION_NOT_CONFIGURED]=S.ErrorCodes.APINotInitialized,h[_.ErrorCodes.VISIBILITY_ERROR]=S.ErrorCodes.VisibilityError,h),S.ErrorCodes.InternalError),e.filterType=new T.EnumConverter(((m={})[_.FilterType.Categorical]=S.FilterType.Categorical,m[_.FilterType.Range]=S.FilterType.Range,m[_.FilterType.RelativeDate]=S.FilterType.RelativeDate,m[_.FilterType.Hierarchical]=S.FilterType.Hierarchical,m)),e.classNameKey=new T.EnumConverter(((g={})["tableau-dashboard-title"]=S.ClassNameKey.DashboardTitle,g["tableau-story-title"]=S.ClassNameKey.StoryTitle,g["tableau-tooltip"]=S.ClassNameKey.Tooltip,g["tableau-worksheet"]=S.ClassNameKey.Worksheet,g["tableau-worksheet-title"]=S.ClassNameKey.WorksheetTitle,g["dashboard-title"]=S.ClassNameKey.DashboardTitle,g["story-title"]=S.ClassNameKey.StoryTitle,g.tooltip=S.ClassNameKey.Tooltip,g.worksheet=S.ClassNameKey.Worksheet,g["worksheet-title"]=S.ClassNameKey.WorksheetTitle,g)),e.hierarchicalLevelSelectionState=new T.EnumConverter(((v={})[_.HierarchicalLevelSelectionState.AllSelected]=S.HierarchicalLevelSelectionState.AllSelected,v[_.HierarchicalLevelSelectionState.NoneSelected]=S.HierarchicalLevelSelectionState.NoneSelected,v[_.HierarchicalLevelSelectionState.SomeSelected]=S.HierarchicalLevelSelectionState.SomeSelected,v[_.HierarchicalLevelSelectionState.UnknownSelected]=S.HierarchicalLevelSelectionState.UnknownSelected,v)),e.annotationType=new T.EnumConverter(((b={})[_.AnnotateEnum.Area]=S.AnnotationType.Area,b[_.AnnotateEnum.Mark]=S.AnnotationType.Mark,b[_.AnnotateEnum.Point]=S.AnnotationType.Point,b)),e.markType=new T.EnumConverter(((I={})[_.MarkType.Area]=S.MarkType.Area,I[_.MarkType.Bar]=S.MarkType.Bar,I[_.MarkType.Circle]=S.MarkType.Circle,I[_.MarkType.GanttBar]=S.MarkType.GanttBar,I[_.MarkType.Heatmap]=S.MarkType.Heatmap,I[_.MarkType.Line]=S.MarkType.Line,I[_.MarkType.Map]=S.MarkType.Map,I[_.MarkType.Pie]=S.MarkType.Pie,I[_.MarkType.Polygon]=S.MarkType.Polygon,I[_.MarkType.Shape]=S.MarkType.Shape,I[_.MarkType.Square]=S.MarkType.Square,I[_.MarkType.Text]=S.MarkType.Text,I[_.MarkType.VizExtension]=S.MarkType.VizExtension,I)),e}();t.InternalToExternalEnumMappings=P},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(){this._eventListenerManagers={}}return e.prototype.addEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot add event, unsupported event type: "+e);return this._eventListenerManagers[e].addEventListener(t)},e.prototype.removeEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot remove event, unsupported event type: "+e);return this._eventListenerManagers[e].removeEventListener(t)},e.prototype.addNewEventType=function(e){this._eventListenerManagers[e.eventType]=e},e}();t.EventListenerManager=o},1072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._fieldImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldImpl.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._fieldImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return this._fieldImpl.aggregation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){return this._fieldImpl.dataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return this._fieldImpl.role},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){return this._fieldImpl.columnType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldImpl.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldImpl.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldImpl.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGeospatial",{get:function(){return this._fieldImpl.isGeospatial},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldImpl.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldImpl.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.Field=r},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}return Object.defineProperty(e.prototype,"luid",{get:function(){return this._luid},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared},set:function(e){this._shared=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isDefault",{get:function(){return this._isDefault},set:function(e){this._isDefault=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ownerName",{get:function(){return this._ownerName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){return n.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)},e}();t.CustomViewImpl=i},1940:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(6557),l=r(3987),c=r(3008),p=r(6664),d=r(7480),f=r(6488),y=r(8332),h=r(1116),m=r(6500),g=function(e){function t(t,r,n,i,o,a){void 0===a&&(a=0);var s=e.call(this,t,i)||this;return s._zones=r,s._sheetPath=n,s._parentStoryPointImpl=o,s._activeDashboardObjectId=a,s}return i(t,e),Object.defineProperty(t.prototype,"worksheetsImpl",{get:function(){return this._worksheetsImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._objects},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._sheetPath.sheetName},enumerable:!0,configurable:!0}),t.prototype.initializeWithPublicInterfaces=function(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(var e=0,t=this._zones;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o,a,s,u,l){this._dashboardImpl=e,this._type=t,this._position=r,this._size=n,this._worksheetImpl=i,this._name=o,this._isFloating=a,this._isVisible=s,this._id=u,this._fieldId=l}return Object.defineProperty(e.prototype,"dashboardImpl",{get:function(){return this._dashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetImpl",{get:function(){return this._worksheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),e}();t.DashboardObjectImpl=r},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(716),o=r(1072),a=r(624),s=r(3008),u=r(7603),l=r(7480),c=r(5288),p=function(){function e(e,t){var r=this;this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((function(e){var t=new c.FieldImpl(e,r);return new o.Field(t)}))}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceInfo.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceInfo.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceInfo.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceInfo.publishedUrl},e.prototype.getMaxPageRowLimit=function(){return 1e4},e.prototype.refreshAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)},e.prototype.getConnectionSummariesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new i.ConnectionSummary(e)}))}))},e.prototype.getActiveTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new u.TableSummary(e)}))}))},e.prototype.getUnderlyingDataAsync=function(e){return e=e||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataAsync=function(e,t){return t=t||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return r=r||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.initializeWithPublicInterfaces=function(e){l.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((function(t){var r=new c.FieldImpl(t,e);return new o.Field(r)}))},e.prototype.getLogicalTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((function(e){return e.map((function(e){return new a.LogicalTable(e)}))}))},e}();t.DataSourceImpl=p},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6557),a=function(){function e(e,t){this._fieldInfo=e,this._parentDataSource=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldInfo.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){var e;return null!=(e=this._fieldInfo.dataType)?e:n.DataType.Unknown},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return o.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return o.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){var e=this._fieldInfo.columnType||i.ColumnType.Unknown;return o.InternalToExternalEnumMappings.columnType.convert(e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldInfo.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldInfo.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldInfo.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGeospatial",{get:function(){return this._fieldInfo.isGeospatial},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldInfo.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldInfo.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.FieldImpl=a},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6557),o=r(3008),a=r(8052),s=r(7480),u=r(1172),l=function(){function e(e,t){this._registryId=t,this.setParameterInfo(e)}return Object.defineProperty(e.prototype,"name",{get:function(){return this._parameterInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentValue",{get:function(){return a.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._globalFieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allowableValues",{get:function(){return this._allowableValues},enumerable:!0,configurable:!0}),e.prototype.changeValueAsync=function(e){var t=this;s.ErrorHelpers.verifyParameter(e,"newValue");var r=u.Param.serializeParameterValue(e);return o.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,r).then((function(e){return t.setParameterInfo(e),t.currentValue}))},e.prototype.setParameterInfo=function(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;var t,r,o,s,u,l=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);l===n.ParameterValueType.List?t=(e.allowableValues||[]).map((function(t){return a.DataValueFactory.MakeParameterDataValue(t,e.dataType)})):l===n.ParameterValueType.Range&&(r=e.minValue&&a.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&a.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),s=e.stepSize,u=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:l,allowableValues:t,minValue:r,maxValue:o,stepSize:s,dateStepPeriod:u}},e}();t.ParameterImpl=l},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3008),o=r(6664),a=r(7480),s=r(1172),u=r(2780),l=function(){function e(e,t){this._sheetInfoImpl=e,this._registryId=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._sheetInfoImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetInfoImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return this._sheetInfoImpl.sheetPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._sheetInfoImpl.sheetSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hidden",{get:function(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"active not implemented")},set:function(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"index not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"url not implemented")},enumerable:!0,configurable:!0}),e.prototype.getSheetSize=function(){if(!u.SheetUtils.isValidSheetSize(this.size))throw new o.TableauError(n.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size},e.prototype.findParameterAsync=function(e){return a.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)},e.prototype.getParametersAsync=function(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)},e.prototype.changeSizeAsync=function(e){var t=this,r=new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw r;var a=this.normalizeSheetSize(e),s=a.behavior===n.SheetSizeBehavior.Automatic;if(!s&&!a.minSize&&!a.maxSize)throw r;if(!s&&this.sheetType===n.SheetType.Worksheet)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===a.behavior)return Promise.resolve(e);var l=this.processNewSize(a);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,l).then((function(){return i.ApiServiceRegistry.get(t._registryId).getService("client-info-service").getClientInfoAsync().then((function(e){var r=e.publishedSheets.find((function(e){return e.name===t.name}));if(!r)throw new o.TableauError(n.SharedErrorCodes.InternalError,"Can't find sheet with name "+t.name);var i=u.SheetUtils.getSheetSizeFromSizeConstraints(r.sizeConstraint);return t._sheetInfoImpl.sheetSize=i,i}))}))},e.prototype.normalizeSheetSize=function(t){var r=t.behavior;return a.ErrorHelpers.verifyEnumValue(r,n.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:r,minSize:e.parseDimensions(t.minSize),maxSize:e.parseDimensions(t.maxSize)}},e.prototype.processNewSize=function(e){var t,r,i,a,u=e.behavior,l=e.minSize,c=e.maxSize,p=!s.Param.isNullOrUndefined(null===(t=l)||void 0===t?void 0:t.width),d=!s.Param.isNullOrUndefined(null===(r=l)||void 0===r?void 0:r.height),f=!s.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),y=!s.Param.isNullOrUndefined(null===(a=c)||void 0===a?void 0:a.height),h=p&&d,m=f&&y;switch(u){case n.SheetSizeBehavior.Automatic:return{behavior:u};case n.SheetSizeBehavior.AtMost:if(!c||!m)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");if((v={width:c.width,height:c.height}).width<0||v.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,maxSize:v};case n.SheetSizeBehavior.AtLeast:if(!l||!h)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");if((g={width:l.width,height:l.height}).width<0||g.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,minSize:g};case n.SheetSizeBehavior.Range:if(!(l&&c&&h&&m))throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");var g={width:l.width,height:l.height},v={width:c.width,height:c.height};if(g.width<0||g.height<0||v.width<0||v.height<0||g.width>v.width||g.height>v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:u,minSize:g,maxSize:v};case n.SheetSizeBehavior.Exactly:if(l&&c){if(h&&m){if(g={width:l.width,height:l.height},v={width:c.width,height:c.height},g.width!==v.width||g.height!==v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:u,minSize:g,maxSize:v}}if(h)return{behavior:u,minSize:g={width:l.width,height:l.height},maxSize:g};if(m)return{behavior:u,minSize:v={width:c.width,height:c.height},maxSize:v}}throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new o.TableauError(n.SharedErrorCodes.InternalError,"Unsupported sheet size behavior: "+u)}},e.parseDimensions=function(e){var t={width:void 0,height:void 0};if(!e)return t;var r=s.Param.tryParseNumber(e.width),n=r.success,i=r.parsed,o=s.Param.tryParseNumber(e.height),a=o.success,u=o.parsed;return n&&a?{width:i,height:u}:n?{width:i}:a?{height:u}:t},e}();t.SheetImpl=l},1116:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e,t,r,n,i,o,a){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=n,this._isActive=i,this._isHidden=o,this._url=a}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetSize",{get:function(){return this._sheetSize},set:function(e){this._sheetSize=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return{sheetName:this.name,isDashboard:this.sheetType===n.SheetType.Dashboard}},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isActive",{get:function(){return this._isActive},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{set:function(e){this._isActive=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e}();t.SheetInfoImpl=i},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._eventType=e,this._handlers=[]}return Object.defineProperty(e.prototype,"eventType",{get:function(){return this._eventType},enumerable:!0,configurable:!0}),e.prototype.addEventListener=function(e){var t=this;return this._handlers.push(e),function(){return t.removeEventListener(e)}},e.prototype.removeEventListener=function(e){var t=this._handlers.length;return this._handlers=this._handlers.filter((function(t){return t!==e})),t>this._handlers.length},e.prototype.triggerEvent=function(e){for(var t=0,r=this._handlers;t=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);var t=this._deferred.getNewPromiseOrThrowIfBusy();return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t},t.prototype.revertStoryPointAsync=function(e){var t=this;if(u.ErrorHelpers.verifyParameter(e,"index"),u.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((function(e){return t.updateStoryInfo(e.index,e),new d.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,t)}))},t.prototype.clearPendingPromises=function(){this._deferred&&this._deferred.reject("All pending promises cleared")},t}(c.SheetImpl);t.StoryImpl=f},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(2780),a=r(1940),s=r(1116),u=r(6500),l=function(){function e(e,t,r,n){this._storyPointInfoImpl=e,n&&(this._containedSheetImpl=this.createContainedSheet(n,t,r))}return Object.defineProperty(e.prototype,"index",{get:function(){return this._storyPointInfoImpl.index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._storyPointInfoImpl.caption},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._storyPointInfoImpl.active},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._storyPointInfoImpl.updated},set:function(e){this._storyPointInfoImpl.updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._storyPointInfoImpl.parentStory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containedSheet",{get:function(){return this._containedSheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointInfoImpl.storyPointId},enumerable:!0,configurable:!0}),e.prototype.createContainedSheet=function(e,t,r){var l,c=o.SheetUtils.getPublishedSheetInfoByName(e.name,t),p=o.SheetUtils.createAutomaticSize(),d=void 0===c,f=c?c.url:"",y=new s.SheetInfoImpl(e.name,o.SheetUtils.getSheetTypeEnum(e.sheetType),p,-1,!1,d,f);switch(y.sheetType){case n.SheetType.Worksheet:var h={worksheet:y.name};l=new u.WorksheetImpl(y,r,h,null,this);break;case n.SheetType.Dashboard:var m={sheetName:y.name,isDashboard:!0};l=new a.DashboardImpl(y,e.dashboardZones,m,r,this);break;default:throw new i.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return l},e}();t.StoryPointImpl=l},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._caption=e,this._index=t,this._storyPointId=r,this._active=n,this._updated=i,this._parentStoryImpl=o}return Object.defineProperty(e.prototype,"caption",{get:function(){return this._caption},set:function(e){this._caption=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},set:function(e){this._index=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._active},set:function(e){this._active=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._updated},set:function(e){this._updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._parentStoryImpl},enumerable:!0,configurable:!0}),e}();t.StoryPointInfoImpl=r},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WorkbookImpl=function(){}},6500:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(8340),u=r(624),l=r(3483),c=r(3008),p=r(6664),d=r(7480),f=r(2180),y=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r)||this;return a._visualId=n,a._parentDashboardImpl=i,a._parentStoryPointImpl=o,a}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){return this._parentDashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"visualId",{get:function(){return this._visualId},enumerable:!0,configurable:!0}),t.prototype.getMaxPageRowLimit=function(){return 1e4},t.prototype.applyFilterAsync=function(e,t,r,n){return d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?d.ErrorHelpers.verifyEnumValue(t.nullOption,a.FilterNullOption,"FilterNullOption"):d.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){if(d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"values"),d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new p.TableauError(a.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)},t.prototype.clearFilterAsync=function(e){return d.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return d.ErrorHelpers.verifyStringParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"options"),d.ErrorHelpers.verifyEnumValue(t.periodType,a.PeriodType,"PeriodType"),d.ErrorHelpers.verifyEnumValue(t.rangeType,a.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)},t.prototype.getDataSourcesAsync=function(){var e=this;return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((function(t){var r=t,n=r.worksheetDataSchemaMap[e.name],i=[],o=n.primaryDataSource;i.push(e.createDataSourceFromInfo(r.dataSources[o]));for(var a=0,s=n.referencedDataSourceList;a{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._logicalTable=e}return Object.defineProperty(e.prototype,"id",{get:function(){return this._logicalTable.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._logicalTable.caption},enumerable:!0,configurable:!0}),e}();t.LogicalTable=r},5064:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.TooltipTextRequestModel=function(e,t){this.visualIdPresModel=e,this.tupleId=t}},6296:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3008),s=r(7480),u=function(){function e(e,t,r,n,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=n,this._registryId=i}return Object.defineProperty(e.prototype,"worksheetName",{get:function(){return this._worksheetName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"filterType",{get:function(){return this._filterType},enumerable:!0,configurable:!0}),e.prototype.getFieldAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)},e.prototype.getAppliedWorksheetsAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)},e.prototype.setAppliedWorksheetsAsync=function(e){s.ErrorHelpers.verifyParameter(e,"applyToWorksheets");var t=new Set(e);return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))},e}();t.Filter=u;var l=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._appliedValues=a,l._isExcludeMode=s,l._isAllSelected=u,l}return i(t,e),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isExcludeMode",{get:function(){return this._isExcludeMode},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.CategoricalFilter=l;var c=function(){function e(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hierarchicalPath",{get:function(){return this._hierarchicalPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"level",{get:function(){return this._level},enumerable:!0,configurable:!0}),e}();t.HierarchicalDataValue=c;var p=function(){function e(e,t){this._name=e,this._levelSelectionState=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"levelSelectionState",{get:function(){return this._levelSelectionState},enumerable:!0,configurable:!0}),e}();t.HierarchicalLevelDetail=p;var d=function(e){function t(t,r,n,i,o,a,s,u,l,c,p){var d=e.call(this,t,r,i,n,o)||this;return d._dimensionName=a,d._hierarchyCaption=s,d._numberOfLevels=u,d._levelDetails=l,d._appliedValues=c,d._isAllSelected=p,d}return i(t,e),t.prototype.getDomainAsync=function(e){throw new Error("Method not implemented.")},Object.defineProperty(t.prototype,"dimensionName",{get:function(){return this._dimensionName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hierarchyCaption",{get:function(){return this._hierarchyCaption},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"numberOfLevels",{get:function(){return this._numberOfLevels},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"levelDetails",{get:function(){return this._levelDetails},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),t}(u);t.HierarchicalFilter=d;var f=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._min=a,l._max=s,l._includeNullValues=u,l}return i(t,e),Object.defineProperty(t.prototype,"minValue",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"maxValue",{get:function(){return this._max},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"includeNullValues",{get:function(){return this._includeNullValues},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){var t=a.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.RangeFilter=f;var y=function(e){function t(t,r,n,i,o,a,s,u,l){var c=e.call(this,t,r,i,n,o)||this;return c._anchorDate=a,c._periodType=s,c._rangeType=u,c._rangeN=l,c}return i(t,e),Object.defineProperty(t.prototype,"anchorDate",{get:function(){return this._anchorDate},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"periodType",{get:function(){return this._periodType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeType",{get:function(){return this._rangeType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeN",{get:function(){return this._rangeN},enumerable:!0,configurable:!0}),t}(u);t.RelativeDateFilter=y;var h=function(){function e(e,t){this._values=e,this._domainType=t}return Object.defineProperty(e.prototype,"values",{get:function(){return this._values},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),e}();t.CategoricalDomain=h;var m=function(){function e(e,t,r){this._min=e,this._max=t,this._domainType=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"min",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"max",{get:function(){return this._max},enumerable:!0,configurable:!0}),e}();t.RangeDomain=m},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=n,this._isSummaryData=i,this._marksInfo=o,this._name=i?"Summary Data Table":"Underlying Data Table"}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columns",{get:function(){return this._columns},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"marksInfo",{get:function(){return this._marksInfo},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"totalRowCount",{get:function(){return this._totalRowCount},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isTotalRowCountLimited",{get:function(){return this._isTotalRowCountLimited},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isSummaryData",{get:function(){return this._isSummaryData},enumerable:!0,configurable:!0}),e}();t.DataTable=r;var n=function(){function e(e,t,r){this._type=e,this._color=t,this._tupleId=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"color",{get:function(){return this._color},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tupleId",{get:function(){return this._tupleId},enumerable:!0,configurable:!0}),e}();t.MarkInfo=n;var i=function(){function e(e,t,r,n,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=n,this._index=i}return Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isReferenced",{get:function(){return this._isReferenced},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),e}();t.Column=i;var o=function(){function e(e,t,r){this._value=e,this._nativeValue=t,this._formattedValue=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeValue",{get:function(){return this._nativeValue},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this._formattedValue},enumerable:!0,configurable:!0}),e}();t.DataValue=o},7968:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},i=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._x=e,this._y=t}return Object.defineProperty(e.prototype,"x",{get:function(){return this._x},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"y",{get:function(){return this._y},enumerable:!0,configurable:!0}),e}();t.Point=r},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3008),i=r(3964),o=r(8028),a=r(1384),s=r(9196),u=r(4924),l=r(3851),c=r(8864),p=r(7712),d=r(1288),f=r(7260),y=r(8784),h=r(4109),m=r(6096),g=r(744),v=r(8856);t.registerAllSharedServices=function(e,t,r){n.ApiServiceRegistry.get(t).registerService(new o.AnimationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new s.DataSourceServiceImpl(e,t,r)),n.ApiServiceRegistry.get(t).registerService(new u.ExportServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new p.GetDataServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new c.FilterServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new d.NotificationServiceImpl(e)),n.ApiServiceRegistry.get(t).registerService(new f.ParametersServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new y.SelectionServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new a.AnnotationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new v.ZoneServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new h.SizeServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new m.VisualModelServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new g.VizServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new l.ExternalContextMenuServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664);window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{};var o=function(){function e(){this._services={}}return e.prototype.registerService=function(e){this._services[e.serviceName]=e},e.prototype.getService=function(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.InternalError,"Service not registered: "+e);return this._services[e]},e}(),a=function(){function e(){}return e.get=function(t){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[t]||e.setInstance(t,new o),!window.__tableauApiServiceRegistry[t])throw new i.TableauError(n.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[t]},e.setInstance=function(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t},e.clearRegistry=function(){window.__tableauApiServiceRegistry={}},e}();t.ApiServiceRegistry=a},3964:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(5064),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"accessibility"},enumerable:!0,configurable:!0}),t.prototype.getTooltipTextAsync=function(e,t){var r,n=new a.TooltipTextRequestModel(e,t),i=((r={})[o.ParameterId.FunctionName]="getTooltipTextAsync",r[o.ParameterId.TooltipTextRequest]=n,r);return this.execute(o.VerbId.GetTooltipText,i).then((function(e){return e.result}))},t.prototype.leaveMarkNavigationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="leaveMarkNavigationAsync",t[o.ParameterId.VisualId]=e,t);return this.execute(o.VerbId.RaiseLeaveMarkNavNotification,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AccessibilityServiceImpl=s},8028:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"animation-service"},enumerable:!0,configurable:!0}),t.prototype.replayAsync=function(e){var t,r=((t={})[a.ParameterId.ReplaySpeed]=1,t);return u.ErrorHelpers.verifyEnumValue(e,o.ReplaySpeedType,"ReplaySpeedType"),r[a.ParameterId.ReplaySpeed]=s.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(a.VerbId.ReplayAnimation,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AnimationServiceImpl=l},1384:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6557),u=r(7104),l=r(6664),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"annotation-service"},enumerable:!0,configurable:!0}),t.prototype.annotateMarkAsync=function(e,t,r){var n,i=this.parseMarkSelectionIds([t]),o=""+r+"",s=((n={})[a.ParameterId.FunctionName]="annotateMarkAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.AnnotateEnum]=a.AnnotateEnum.Mark,n[a.ParameterId.TargetPoint]={x:0,y:0},n[a.ParameterId.SelectionList]=[i.selection],n[a.ParameterId.FormattedText]=o,n);return this.execute(a.VerbId.CreateAnnotation,s).then((function(e){}))},t.prototype.getAnnotationsAsync=function(e){var t,r=this,n=((t={})[a.ParameterId.FunctionName]="getAnnotationsAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.GetAnnotations,n).then((function(e){var t=e.result;return r.annotationFilterMap(t)}))},t.prototype.removeAnnotationAsync=function(e,t){var r,n=this.parseAnnotationSelectionIds([t]),i=((r={})[a.ParameterId.FunctionName]="removeAnnotationAsync",r[a.ParameterId.VisualId]=e,r[a.ParameterId.SelectionList]=[n.selection],r);return this.execute(a.VerbId.RemoveAnnotation,i).then((function(e){}))},t.prototype.parseMarkSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.tupleId;if(!(null!=r&&r>0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="tuples",n.objectIds=t,r.selection=n}return r},t.prototype.parseAnnotationSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.annotationId;if(!(null!=r&&r>=0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="annotations",n.objectIds=t,r.selection=n}return r},t.prototype.mapAnnotation=function(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:s.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}},t.prototype.annotationFilterMap=function(e){var t=this;return e.map((function(e){return t.mapAnnotation(e)}))},t}(r(1776).ServiceImplBase);t.AnnotationServiceImpl=c},1832:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"client-info-service"},enumerable:!0,configurable:!0}),t.prototype.getClientInfoAsync=function(){var e,t=o.VerbId.GetEmbeddingClientInfo,r=((e={})[o.ParameterId.FunctionName]="getClientInfoAsync",e);return this.execute(t,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.ClientInfoServiceImpl=a},9196:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(3448),u=r(8340),l=r(1072),c=r(2180),p=r(5288),d=r(6664),f=r(1776);t.SENTINEL_LOGICAL_TABLE_INFO={id:a.ApiShowDataTableSentinel.SingleTableId,caption:a.ApiShowDataTableSentinel.SingleTableCaption};var y={major:1,minor:20,fix:1},h=function(e){function r(t,r,n){void 0===n&&(n=y);var i=e.call(this,t,r)||this;return i._platformVersion=n,i}return i(r,e),Object.defineProperty(r.prototype,"serviceName",{get:function(){return"data-source-service"},enumerable:!0,configurable:!0}),r.prototype.refreshAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="refreshAsync",t[s.ParameterId.DeltaTimeMs]=0,t[s.ParameterId.ShouldRefreshDS]=!0,t);return e&&(r[s.ParameterId.DataSourceId]=e),this.execute(s.VerbId.RefreshDataSource,r).then((function(e){}))},r.prototype.getActiveTablesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getActiveTablesAsync",t[s.ParameterId.DataSourceId]=e,t);return this.execute(s.VerbId.GetActiveTables,r).then((function(t){var r=t.result;if(0===r.tables.length)throw new d.TableauError(o.ErrorCodes.UnsupportedMethodForDataSourceType,"getActiveTables is not supported for: "+e);return r.tables}))},r.prototype.getDataSourcesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getDataSourcesAsync",t[s.ParameterId.VisualId]=e,t);return this.execute(s.VerbId.GetDataSources,r).then((function(e){return e.result}))},r.prototype.getAllDataSourcesAsync=function(){var e,t=((e={})[s.ParameterId.FunctionName]="getAllDataSourcesAsync",e);return this.execute(s.VerbId.GetAllDataSources,t).then((function(e){return e.result}))},r.prototype.getConnectionSummariesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getConnectionSummariesAsync",t[s.ParameterId.DataSourceId]=e,t);return this.execute(s.VerbId.GetConnectionDescriptionSummaries,r).then((function(e){return e.result}))},r.prototype.getFieldAsync=function(e){var t,r=this,n=s.VerbId.GetFieldAndDataSource,i=((t={})[s.ParameterId.FunctionName]="getFieldAsync",t[s.ParameterId.FieldId]=e,t);return this.execute(n,i).then((function(e){var t=e.result[s.ParameterId.DataSource],n=e.result[s.ParameterId.Field];return r.convertField(n,r.convertDataSource(t))}))},r.prototype.getLogicalTablesAsync=function(e){var r;if(!this.isObjectModelSupportedByPlatform())return new Promise((function(e){return e([t.SENTINEL_LOGICAL_TABLE_INFO])}));var n=((r={})[s.ParameterId.FunctionName]="getLogicalTablesAsync",r[s.ParameterId.DataSourceId]=e,r);return this.execute(s.VerbId.GetLogicalTables,n).then((function(e){return e.result}))},r.prototype.getUnderlyingTablesAsync=function(e){var r;if(!this.isObjectModelSupportedByPlatform())return new Promise((function(e){return e([t.SENTINEL_LOGICAL_TABLE_INFO])}));var n=((r={})[s.ParameterId.FunctionName]="getUnderlyingTablesAsync",r[s.ParameterId.VisualId]=e,r);return this.execute(s.VerbId.GetUnderlyingTables,n).then((function(e){return e.result}))},r.prototype.convertField=function(e,t){return new l.Field(new p.FieldImpl(e,t))},r.prototype.convertDataSource=function(e){return new u.DataSource(new c.DataSourceImpl(e,this._registryId))},r.prototype.isObjectModelSupportedByPlatform=function(){return a.VersionLessThan({major:1,minor:13,fix:0},this._platformVersion)},r}(f.ServiceImplBase);t.DataSourceServiceImpl=h},4924:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},a=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?s[l.ParameterId.FilterLevels]=u:r.length>0?s[l.ParameterId.FilterValues]=r:s[l.ParameterId.FilterLevels]=[],s[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(n),s[l.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(a,s).then((function(e){return t}))},t.prototype.clearFilterAsync=function(e,t){var r,n=l.VerbId.ClearFilter,i=((r={})[l.ParameterId.FunctionName]="clearFilterAsync",r);return i[l.ParameterId.VisualId]=e,i[l.ParameterId.FieldName]=t,this.execute(n,i).then((function(e){return t}))},t.prototype.applyRelativeDateFilterAsync=function(e,t,r){var n,i=l.VerbId.ApplyRelativeDateFilter,o=((n={})[l.ParameterId.FunctionName]="applyRelativeDateFilterAsync",n);if(o[l.ParameterId.VisualId]=e,o[l.ParameterId.FieldName]=t,o[l.ParameterId.PeriodType]=p.ExternalToInternalEnumMappings.periodType.convert(r.periodType),o[l.ParameterId.DateRangeType]=p.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===s.DateRangeType.LastN||r.rangeType===s.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new c.TableauError(s.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");o[l.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(o[l.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(i,o).then((function(e){return e.result}))},t.prototype.getFiltersAsync=function(e){var t,r=this,n=l.VerbId.GetFilters,i=((t={})[l.ParameterId.FunctionName]="getFiltersAsync",t);return i[l.ParameterId.VisualId]=e,this.execute(n,i).then((function(e){var t=e.result;return r.convertDomainFilters(t)}))},t.prototype.getCategoricalDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetCategoricalDomain,a=((n={})[l.ParameterId.FunctionName]="getCategoricalDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertCategoricalDomain(t,r)}))},t.prototype.getRangeDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetRangeDomain,a=((n={})[l.ParameterId.FunctionName]="getRangeDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertRangeDomain(t,r)}))},t.prototype.getDashboardFiltersAsync=function(){var e,t=this,r=l.VerbId.GetDashboardFilters,n=((e={})[l.ParameterId.FunctionName]="getDashboardFiltersAsync",e);return this.execute(r,n).then((function(e){var r=e.result;return t.convertDomainFilters(r)}))},t.prototype.applyDashboardFilterAsync=function(e,t,r,n){var i,o=l.VerbId.DashboardCategoricalFilter,a=((i={})[l.ParameterId.FunctionName]="applyDashboardFilterAsync",i);return a[l.ParameterId.FieldName]=e,a[l.ParameterId.FilterValues]=t,a[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(r),a[l.ParameterId.IsExcludeMode]=n&&!!n.isExcludeMode,this.execute(o,a).then((function(e){return e.result}))},t.prototype.getAppliedWorksheetsAsync=function(e,t){var r;return o(this,void 0,void 0,(function(){var n,i;return a(this,(function(o){switch(o.label){case 0:return[4,this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync")];case 1:return n=o.sent(),i=[],null===(r=n.worksheets)||void 0===r||r.map((function(e){e.isSelected&&i.push(e.worksheetName)})),[2,i]}}))}))},t.prototype.setAppliedWorksheetsAsync=function(e,t,r,n){return o(this,void 0,void 0,(function(){var i,o,u,p,d;return a(this,(function(a){switch(a.label){case 0:return[4,this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal")];case 1:if(!(i=a.sent())||!i.worksheets)throw new c.TableauError(s.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");if(o=[],u="",i.worksheets.forEach((function(e){e.isActive&&(u=e.worksheetName),(e.isSelected||e.isEnabled)&&o.push(e.worksheetName)})),""===u)throw new c.TableauError(s.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(u))throw new c.TableauError(s.SharedErrorCodes.InternalError,u+" must be included in the applied worksheets");return n.forEach((function(e){if(!o.includes(e))throw new c.TableauError(s.SharedErrorCodes.InternalError,"The field "+t+" isn't applicable to the worksheet "+e)})),p=l.VerbId.ChangeSharedFilter,(d={})[l.ParameterId.FunctionName]="setAppliedWorksheetsAsync",d[l.ParameterId.VisualId]={worksheet:e},d[l.ParameterId.FieldId]=r,d[l.ParameterId.SharedFilterSheets]=n,[2,this.execute(p,d).then((function(e){return n}))]}}))}))},t.prototype.executeGetAppliedWorksheets=function(e,t,r){var n=l.VerbId.GetSharedFilter,i={};return i[l.ParameterId.FunctionName]=r,i[l.ParameterId.VisualId]={worksheet:e},i[l.ParameterId.FieldId]=t,this.execute(n,i).then((function(e){return e.result}))},t.prototype.convertDomainFilters=function(e){var t=this,r=[];return e.forEach((function(e){switch(e.filterType){case l.FilterType.Categorical:if(!(n=e))throw new Error("Invalid Categorical Filter");r.push(t.convertCategoricalFilter(n));break;case l.FilterType.Hierarchical:if(!(n=e))throw new Error("Invalid Hierarchical Filter");r.push(t.convertHierarchicalFilter(n));break;case l.FilterType.Range:if(!(n=e))throw new Error("Invalid Range Filter");r.push(t.convertRangeFilter(n));break;case l.FilterType.RelativeDate:var n;if(!(n=e))throw new Error("Invalid Relative Date Filter");r.push(t.convertRelativeDateFilter(n))}})),r},t.prototype.convertCategoricalFilter=function(e){var t=e.values.map((function(e){return y.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)},t.prototype.convertHierarchicalFilter=function(e){var t=e.values.map((function(e){return new f.HierarchicalDataValue(y.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level)})),r=e.levelInfo.map((function(e){return new f.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))}));return new f.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)},t.prototype.convertRangeFilter=function(e){var t=y.DataValueFactory.MakeFilterDataValue(e.min),r=y.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Range,this._registryId,t,r,e.includeNullValues)},t.prototype.convertRelativeDateFilter=function(e){var t=y.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new f.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)},t.prototype.convertCategoricalDomain=function(e,t){var r=e.values.map((function(e){return y.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalDomain(r,t)},t.prototype.convertRangeDomain=function(e,t){var r=y.DataValueFactory.MakeFilterDataValue(e.min),n=y.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeDomain(r,n,t)},t.prototype.convertAnchorDate=function(e){var t=e.getUTCFullYear(),r=e.getUTCMonth()+1,n=e.getUTCDate(),i=e.getUTCHours(),o=e.getUTCMinutes(),a=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(n)||isNaN(i)||isNaN(o)||isNaN(a))throw new c.TableauError(s.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return t+"-"+r+"-"+n+" "+i+":"+o+":"+a},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[u.ParameterId.ParameterError]){if(e[u.ParameterId.InvalidFieldCaption])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldName,e[u.ParameterId.InvalidFieldCaption]);if(e[u.ParameterId.InvalidValues])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldValue,e[u.ParameterId.InvalidValues]);if(e[u.ParameterId.InvalidAggFieldName])throw new c.TableauError(s.SharedErrorCodes.InvalidAggregationFieldName,e[u.ParameterId.InvalidAggFieldName]);throw new c.TableauError(s.SharedErrorCodes.ServerError,"Server Error")}},t}(r(1776).ServiceImplBase);t.FilterServiceImpl=m},7712:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6680),u=r(5136),l=r(1044),c=r(5068),p=r(7968),d=r(8052),f=r(3483),y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.viewDataTableCacheId=s.v4(),t}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"get-data-service"},enumerable:!0,configurable:!0}),t.prototype.getMaxRowLimit=function(){return 1e4},t.prototype.getViewDataTableCacheId=function(){return this.viewDataTableCacheId},t.prototype.getLimitedMaxRows=function(e,t){return e>0&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._filterFn=e,this._callbackFn=t}return e.prototype.onNotification=function(e){this._filterFn(e)&&this._callbackFn(e)},e}();t.Registration=r;var n=function(){function e(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}return e.prototype.registerHandler=function(e,t,n){var i=this,o=this._handlers[e]||new Array,a=new r(t,n);return o.push(a),this._handlers[e]=o,function(){return i.removeRegistration(e,a)}},e.prototype.hasHandlersForNotificationType=function(e){return this._handlers.hasOwnProperty(e)},e.prototype.onNotification=function(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((function(t){return t.onNotification(e.data)}))},e.prototype.removeRegistration=function(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((function(e){return e!==t})))},e}();t.NotificationServiceImplBase=n},7260:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(8552),u=r(6664),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"parameters-service"},enumerable:!0,configurable:!0}),t.prototype.getParametersForSheetAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",t[a.ParameterId.SheetPath]=e,t);return this.getParametersAsync(r)},t.prototype.getAllParametersAsync=function(){var e,t=((e={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",e);return this.getParametersAsync(t)},t.prototype.getParametersAsync=function(e){var t=this;return this.execute(a.VerbId.GetParametersForSheet,e).then((function(e){return e.result.map((function(e){return new s.ParameterImpl(e,t._registryId)}))}))},t.prototype.changeParameterValueAsync=function(e,t){var r,n=((r={})[a.ParameterId.FunctionName]="changeParameterValueAsync",r[a.ParameterId.ParameterFieldName]=e,r[a.ParameterId.ParameterValue]=t,r);return this.execute(a.VerbId.ChangeParameterValue,n).then((function(e){return e.result}))},t.prototype.findParameterByNameAsync=function(e){return this.findParameterAsync(e,void 0)},t.prototype.findParameterByGlobalFieldNameAsync=function(e){return this.findParameterAsync(void 0,e)},t.prototype.findParameterAsync=function(e,t){var r,n=this,i=((r={})[a.ParameterId.FunctionName]="findParameterAsync",r);if(void 0!==e)i[a.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");i[a.ParameterId.ParameterFieldName]=t}return this.execute(a.VerbId.FindParameter,i).then((function(e){if("fieldName"in e.result){var t=e.result;return new s.ParameterImpl(t,n._registryId)}}))},t}(r(1776).ServiceImplBase);t.ParametersServiceImpl=l},8784:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(7104),u=r(6664),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"selection-service"},enumerable:!0,configurable:!0}),t.prototype.clearSelectedMarksAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="clearSelectedMarksAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.ClearSelectedMarks,r).then((function(e){}))},t.prototype.selectMarksByValueAsync=function(e,t,r){var n,i=this;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");var s=this.validateSelectionUpdateType(r),l=this.parseSelectionMarks(t),c=((n={})[a.ParameterId.FunctionName]="selectMarksByValueAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=s,n);return l.hierModelArr&&l.hierModelArr.length&&(c[a.ParameterId.HierValSelectionModels]=l.hierModelArr),l.quantModelArr&&l.quantModelArr.length&&(c[a.ParameterId.QuantRangeSelectionModels]=l.quantModelArr),l.dimModelArr&&l.dimModelArr.length&&(c[a.ParameterId.DimValSelectionModels]=l.dimModelArr),this.execute(a.VerbId.SelectByValue,c).then((function(e){i.apiFilterHandlerCheckForCommandError(e.result)}))},t.prototype.hoverTupleAsync=function(e,t,r,n){var i,o=new s.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,n),u=((i={})[a.ParameterId.FunctionName]="hoverTupleAsync",i[a.ParameterId.HoverTupleInteraction]=o,i);return this.execute(a.VerbId.RaiseHoverTupleNotification,u).then((function(e){}))},t.prototype.selectTuplesAsync=function(e,t,r,n){var i,o=new s.SelectTuplesInteractionModel(e,t,r,n),u=((i={})[a.ParameterId.FunctionName]="selectTuplesAsync",i[a.ParameterId.SelectTuplesInteraction]=o,i);return this.execute(a.VerbId.RaiseSelectTuplesNotification,u).then((function(e){}))},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[a.ParameterId.ParameterError]){if(e[a.ParameterId.InvalidFields])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionFieldName,e[a.ParameterId.InvalidFields]);if(e[a.ParameterId.InvalidValues])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionValue,e[a.ParameterId.InvalidValues]);if(e[a.ParameterId.InvalidDates])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionDate,e[a.ParameterId.InvalidDates])}},t.prototype.selectMarksByIdAsync=function(e,t,r){var n;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");var i=this.validateSelectionUpdateType(r),s=this.parseSelectionIds(t),l=((n={})[a.ParameterId.FunctionName]="selectMarksByIdAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=i,n[a.ParameterId.Selection]=s.selection,n);return this.execute(a.VerbId.SelectByValue,l).then((function(e){}))},t.prototype.parseSelectionIds=function(e){for(var t=[],r=new s.SelectionModelsContainer,n=0;n0?e:0},t}(r(1776).ServiceImplBase);t.SelectionServiceImpl=c},1776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(6557),i=r(6664),o=r(5520),a=function(){function e(e,t){this._dispatcher=e,this._registryId=t}return e.prototype.execute=function(e,t){return this._dispatcher.execute(e,t).catch((function(e){var t=e,r=n.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,o.ShouldThrow.No);throw new i.TableauError(r,t.message)}))},e}();t.ServiceImplBase=a},4109:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"size-service"},enumerable:!0,configurable:!0}),t.prototype.changeSizeAsync=function(e,t){var r,n,i,a,s,u=((r={})[o.ParameterId.FunctionName]="changeSizeAsync",r[o.ParameterId.SheetName]=e,r[o.ParameterId.MinHeight]=(null===(n=t.minSize)||void 0===n?void 0:n.height)||0,r[o.ParameterId.MinWidth]=(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,r[o.ParameterId.MaxHeight]=(null===(a=t.maxSize)||void 0===a?void 0:a.height)||0,r[o.ParameterId.MaxWidth]=(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0,r);return this.execute(o.VerbId.SetSheetSize,u).then((function(e){}))},t}(r(1776).ServiceImplBase);t.SizeServiceImpl=a},2248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"story-activation-service"},enumerable:!0,configurable:!0}),t.prototype.activateNextStoryPointAsync=function(){var e,t=o.VerbId.ActivateNextStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activateNextStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activatePreviousStoryPointAsync=function(){var e,t=o.VerbId.ActivatePreviousStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activatePreviousStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activateStoryPointAsync=function(e){var t,r=o.VerbId.ActivateStoryPoint,n=((t={})[o.ParameterId.FunctionName]="activateStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){}))},t.prototype.revertStoryPointAsync=function(e){var t,r=o.VerbId.RevertStoryPoint,n=((t={})[o.ParameterId.FunctionName]="revertStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.StoryActivationServiceImpl=a},6096:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"visual-model-service"},enumerable:!0,configurable:!0}),t.prototype.getVisualSpecificationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="getVisualSpecificationAsync",t[o.ParameterId.WorksheetName]=e.worksheet,t);return this.execute(o.VerbId.GetVisualSpecification,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VisualModelServiceImpl=a},744:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(2520),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"viz-service"},enumerable:!0,configurable:!0}),t.prototype.createVizImageAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="createVizImageAsync",t[o.ParameterId.VizAPIInputJson]=JSON.stringify(e),t);return this.execute(o.VerbId.VizAPI,r).then((function(e){return e.result}))},t.prototype.activateSheetAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="activateSheetAsync",t[o.ParameterId.SwitchToSheetName]=e,t);return this.execute(o.VerbId.ActivateSheet,r).then((function(){}))},t.prototype.getCustomViewsAsync=function(){var e,t=this,r=((e={})[o.ParameterId.FunctionName]="getCustomViewsAsync",e);return this.execute(o.VerbId.GetCustomViews,r).then((function(e){return e.result.map((function(e){return new a.CustomViewImpl(e,t._registryId)}))}))},t.prototype.showCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="showCustomViewAsync",t[o.ParameterId.CustomViewName]=e||"",t);return this.execute(o.VerbId.ShowCustomView,n).then((function(e){var t,n=e.result;return(null===(t=n)||void 0===t?void 0:t.luid)?new a.CustomViewImpl(n,r._registryId):void 0}))},t.prototype.removeCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="removeCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t);return this.execute(o.VerbId.RemoveCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.saveCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t[o.ParameterId.CustomViewIsDefault]=!1,t);return this.execute(o.VerbId.SaveWorkbookAsCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.setActiveCustomViewAsDefaultAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="setActiveCustomViewAsDefaultAsync",e);return this.execute(o.VerbId.SetActiveCustomViewAsDefault,t).then((function(){}))},t.prototype.saveAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveAsync",t[o.ParameterId.CustomViewLuid]=e.luid,t[o.ParameterId.CustomViewName]=e.name,t[o.ParameterId.CustomViewIsDefault]=e.isDefault,t[o.ParameterId.CustomViewIsPublic]=e.shared,t);return this.execute(o.VerbId.UpdateCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.getCurrentSrcAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="getCurrentSrcAsync",e);return this.execute(o.VerbId.GetCurrentSrc,t).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VizServiceImpl=s},8856:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"zone-service"},enumerable:!0,configurable:!0}),t.prototype.setVisibilityAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="setVisibilityAsync",n[a.ParameterId.Dashboard]=e,n[a.ParameterId.ZoneIdsVisibilityMap]={},n);return l.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach((function(e,r){u.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),u.ErrorHelpers.verifyEnumValue(e,o.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),i[a.ParameterId.ZoneIdsVisibilityMap][r]=s.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(a.VerbId.SetZoneVisibility,i).then((function(e){}))},t.prototype.moveAndResizeAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.Dashboard]=e,n[a.ParameterId.DashboardObjectPositionAndSizeUpdateList]=r,n);return r.forEach((function(e){u.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),u.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(a.VerbId.MoveAndResizeZones,i).then((function(e){}))},t}(r(1776).ServiceImplBase);t.ZoneServiceImpl=c},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._tableInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._tableInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._tableInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"connectionId",{get:function(){return this._tableInfo.connectionId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"customSQL",{get:function(){return this._tableInfo.customSQL},enumerable:!0,configurable:!0}),e}();t.TableSummary=r},6664:function(e,t){"use strict";var r,n=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},r(e,t)},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0});var i=function(e){function t(r,n){var i=e.call(this,r+": "+n)||this;return i._errorCode=r,Object.setPrototypeOf(i,t.prototype),i}return n(t,e),Object.defineProperty(t.prototype,"errorCode",{get:function(){return this._errorCode},enumerable:!0,configurable:!0}),t}(Error);t.TableauError=i},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(5068),o=function(){function e(){}return e.MakeParameterDataValue=function(e,t){return new i.DataValue(e.value,n.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue)},e.MakeFilterDataValue=function(e){return new i.DataValue(e.value,e.value,e.formattedValue)},e.MakeTableDataValue=function(e,t){return new i.DataValue(e.value,void 0!==e.value?n.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)},e}();t.DataValueFactory=o},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){var e=this;this._promise=new Promise((function(t,r){e._resolve=t,e._reject=r}))}return Object.defineProperty(e.prototype,"promise",{get:function(){return this._promise},enumerable:!0,configurable:!0}),e.prototype.resolve=function(e){this._resolve&&this._resolve(e)},e.prototype.reject=function(e){this._reject&&this._reject(e)},e}();t.Deferred=r,t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(7419),o=r(6664),a=function(){function e(e,t){this._mappings=e,this._defaultVal=t}return e.prototype.convert=function(e,t){if(void 0===t&&(t=n.Yes),this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new o.TableauError(i.ErrorCodes.InternalError,"Enum Mapping not found for: "+e)},e}();t.EnumConverter=a,function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1172),a=function(){function e(){}return e.apiNotImplemented=function(e){return new i.TableauError(n.SharedErrorCodes.InternalError,e+" API not yet implemented.")},e.verifyInternalValue=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InternalError,e+" is invalid value for: "+t)},e.verifyParameter=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for parameter: "+t)},e.verifyParameterType=function(e,t,r){if(typeof e!==t)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" has invalid type for parameter: "+r+".")},e.verifyStringParameter=function(e,t){if(null==e||""===e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for paramter: "+t)},e.verifyEnumValue=function(e,t,r){var o=!1;if(Object.keys(t).forEach((function(r){t[r]===e.toString()&&(o=!0)})),!o)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for enum: "+r+".")},e.verifyRange=function(e,t,r){if(!(t<=e&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(7419),o=r(6664),a=function(){function e(){}return e.updateInternalExportPDFOptions=function(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)},e.updateExportLayoutOptions=function(e,t){var r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=n.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=n.PageOrientation.Portrait;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=n.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=n.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=n.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=n.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=n.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=n.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=n.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=n.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=n.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=n.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=n.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=n.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=n.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=n.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=n.PageSizeOption.Unspecified;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,n.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,n.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,n.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,n.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct90);break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}},e.updateSheetOptions=function(e,t){for(var r=e.exportLayoutOptions,n=0,i=e.sheetOptions;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(7480),a=function(){function e(){}return e.serializeDateForPlatform=function(e){return e.getUTCFullYear()+"-"+(e.getUTCMonth()+1)+"-"+e.getUTCDate()+" "+e.getUTCHours()+":"+e.getUTCMinutes()+":"+e.getUTCSeconds()},e.serializeBooleanForPlatform=function(e){return e?"true":"false"},e.serializeNumberForPlatform=function(e){return e.toString(10)},e.isTypeNumber=function(e){return"number"==typeof e||e instanceof Number},e.isTypeDate=function(e){return e instanceof Date},e.isTypeString=function(e){return"string"==typeof e||e instanceof String},e.isTypeBool=function(e){return"boolean"==typeof e||e instanceof Boolean},e.isNullOrUndefined=function(e){return null==e},e.serializeParameterValue=function(t){if(e.isTypeNumber(t))return e.serializeNumberForPlatform(t);if(e.isTypeDate(t))return e.serializeDateForPlatform(t);if(e.isTypeBool(t))return e.serializeBooleanForPlatform(t);if(e.isTypeString(t))return t;throw new i.TableauError(n.ErrorCodes.InternalError,"Unexpected invalid value for: "+t)},e.convertParameterToMap=function(e,t){if(o.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(n.ErrorCodes.InvalidParameter,"Expecting object or Map for: "+t+".");return e instanceof Map?e:new Map(Object.entries(e))},e.tryParseNumber=function(t){if(e.isNullOrUndefined(t))return{success:!1};if(e.isTypeNumber(t))return{parsed:t,success:!0};var r=t.toString();if("NaN"===r)return{parsed:NaN,success:!0};var n=parseFloat(r);return isNaN(n)?{success:!1}:{parsed:n,success:!0}},e}();t.Param=a},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6664),a=function(){function e(){}return e.getSheetSizeFromSizeConstraints=function(e){var t=e.minWidth,r=e.minHeight,i=e.maxWidth,o=e.maxHeight;if(0===r&&0===t)return 0===o&&0===i?{behavior:n.SheetSizeBehavior.Automatic}:{behavior:n.SheetSizeBehavior.AtMost,maxSize:{width:i,height:o}};if(0===o&&0===i)return{behavior:n.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(o===r&&i===t&&t>0)return{behavior:n.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};var a=0===t&&0===i;return{behavior:n.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:a?2147483647:i,height:o}}},e.createAutomaticSize=function(){return{behavior:n.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}},e.getPublishedSheetInfoByName=function(e,t){return t.find((function(t){return t.name===e}))},e.getSheetTypeEnum=function(e){var t;switch(e){case i.SheetType.Worksheet:t=n.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=n.SheetType.Dashboard;break;case i.SheetType.Story:t=n.SheetType.Story;break;default:throw new o.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return t},e.isValidSheetSize=function(e){return void 0!==e.behavior},e}();t.SheetUtils=a},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1724),a=function(){function e(e){void 0===e&&(e=o.UnregisterTimeoutInMilliseconds),this._timeoutInMilliseconds=e}return e.prototype.getNewPromiseOrThrowIfBusy=function(){var e=this;if(this._deferred)throw new i.TableauError(n.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new o.Deferred,this._timeoutId=setTimeout((function(){var t=new i.TableauError(n.SharedErrorCodes.Timeout,"Api failed to complete in "+e._timeoutInMilliseconds/1e3+" seconds");e.reject(t)}),this._timeoutInMilliseconds),this._deferred.promise},e.prototype.resolve=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)},e.prototype.reject=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)},e}();t.ShortLivedDeferred=a},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(e,t){var r=e.split("-");this.build=this.getBuildNumber(r[1]);var o=(e=r[0]).split(".").map((function(e){return parseInt(e,10)}));if(3!==o.length)throw new i.TableauError(n.ErrorCodes.InternalError,"Invalid version number: "+e);this.major=o[0],this.minor=o[1],this.fix=o[2],this.isAlpha=t}return e.prototype.getBuildNumber=function(e){if(!e)return-1;var t=e.split(".");return t[1]?parseInt(t[1],10):-1},Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullFormattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix+"-pre."+this.build},enumerable:!0,configurable:!0}),e}();t.VersionNumber=o},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=function(){function e(e,t){var r=this;this._apiDelegateDispatcher=e,this._versionConverter=n.CreateExternalCompatibleVersionConverter(n.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((function(e){if(0!==r._notificationHandlers.length){var t=r._versionConverter.upgradeNotification(e);r._notificationHandlers.forEach((function(e){e(t)}))}}))}return e.needsVersionConverter=function(e){return n.VersionLessThan(e,n.INTERNAL_CONTRACT_VERSION)},e.prototype.execute=function(e,t){var r=this;try{var n=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(n.verb,n.parameters).then((function(n){return r._versionConverter.upgradeExecuteReturn(n,e,t)}))}catch(e){return Promise.reject(e)}},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e}();t.VersionedExternalApiDispatcher=i},6680:(e,t,r)=>{"use strict";var n;r.r(t),r.d(t,{NIL:()=>x,parse:()=>m,stringify:()=>c,v1:()=>h,v3:()=>A,v4:()=>E,v5:()=>D,validate:()=>s,version:()=>F});var i=new Uint8Array(16);function o(){if(!n&&!(n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(i)}const a=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,s=function(e){return"string"==typeof e&&a.test(e)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e[t+4]]+u[e[t+5]]+"-"+u[e[t+6]]+u[e[t+7]]+"-"+u[e[t+8]]+u[e[t+9]]+"-"+u[e[t+10]]+u[e[t+11]]+u[e[t+12]]+u[e[t+13]]+u[e[t+14]]+u[e[t+15]]).toLowerCase();if(!s(r))throw TypeError("Stringified UUID is invalid");return r};var p,d,f=0,y=0;const h=function(e,t,r){var n=t&&r||0,i=t||new Array(16),a=(e=e||{}).node||p,s=void 0!==e.clockseq?e.clockseq:d;if(null==a||null==s){var u=e.random||(e.rng||o)();null==a&&(a=p=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==s&&(s=d=16383&(u[6]<<8|u[7]))}var l=void 0!==e.msecs?e.msecs:Date.now(),h=void 0!==e.nsecs?e.nsecs:y+1,m=l-f+(h-y)/1e4;if(m<0&&void 0===e.clockseq&&(s=s+1&16383),(m<0||l>f)&&void 0===e.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");f=l,y=h,d=s;var g=(1e4*(268435455&(l+=122192928e5))+h)%4294967296;i[n++]=g>>>24&255,i[n++]=g>>>16&255,i[n++]=g>>>8&255,i[n++]=255&g;var v=l/4294967296*1e4&268435455;i[n++]=v>>>8&255,i[n++]=255&v,i[n++]=v>>>24&15|16,i[n++]=v>>>16&255,i[n++]=s>>>8|128,i[n++]=255&s;for(var b=0;b<6;++b)i[n+b]=a[b];return t||c(i)},m=function(e){if(!s(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function g(e,t,r){function n(e,n,i,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function b(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function I(e,t,r,n,i,o){return b((a=b(b(t,e),b(n,o)))<<(s=i)|a>>>32-s,r);var a,s}function S(e,t,r,n,i,o,a){return I(t&r|~t&n,e,t,i,o,a)}function _(e,t,r,n,i,o,a){return I(t&n|r&~n,e,t,i,o,a)}function T(e,t,r,n,i,o,a){return I(t^r^n,e,t,i,o,a)}function P(e,t,r,n,i,o,a){return I(r^(t|~n),e,t,i,o,a)}const A=g("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,a=parseInt(n.charAt(o>>>4&15)+n.charAt(15&o),16);t.push(a)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[n/8])<>>32-t}const D=g("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var n=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;b=v,v=g,g=O(m,30)>>>0,m=h,h=_}r[0]=r[0]+h>>>0,r[1]=r[1]+m>>>0,r[2]=r[2]+g>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+b>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),x="00000000-0000-0000-0000-000000000000",F=function(e){if(!s(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":162,"fix":0}')}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,r),o.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";var e=n;Object.defineProperty(e,"__esModule",{value:!0});var t=r(5136);r(3e3),r(8315),r(80),r(5668),r(5816),r(3680),r(9308),r(8824),r(8512),r(9232),r(9336);var i=r(976),o=r(5408),a="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.12.0-pre.16",a);var s=new i.ExtensionsImpl;e.extensions=new o.Extensions(s);var u=r(7419);e.AnalyticsObjectType=u.AnalyticsObjectType,e.AnnotationType=u.AnnotationType,e.ClassNameKey=u.ClassNameKey,e.ColumnType=u.ColumnType,e.DashboardLayoutChange=u.DashboardLayoutChange,e.DashboardObjectType=u.DashboardObjectType,e.DashboardObjectVisibilityType=u.DashboardObjectVisibilityType,e.DataType=u.DataType,e.DateRangeType=u.DateRangeType,e.DialogStyle=u.DialogStyle,e.EncodingType=u.EncodingType,e.ErrorCodes=u.ErrorCodes,e.ExtensionContext=u.ExtensionContext,e.ExtensionMode=u.ExtensionMode,e.FieldAggregationType=u.FieldAggregationType,e.FieldRoleType=u.FieldRoleType,e.FilterDomainType=u.FilterDomainType,e.FilterNullOption=u.FilterNullOption,e.FilterType=u.FilterType,e.FilterUpdateType=u.FilterUpdateType,e.HierarchicalLevelSelectionState=u.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=u.IncludeDataValuesOption,e.MarkType=u.MarkType,e.ParameterValueType=u.ParameterValueType,e.PeriodType=u.PeriodType,e.QuickTableCalcType=u.QuickTableCalcType,e.ReplaySpeedType=u.ReplaySpeedType,e.SelectOptions=u.SelectOptions,e.SelectionUpdateType=u.SelectionUpdateType,e.SheetType=u.SheetType,e.SortDirection=u.SortDirection,e.TableauEventType=u.TableauEventType,e.TrendLineModelType=u.TrendLineModelType,e.VizImageEncodingType=u.VizImageEncodingType,e.VizImagePaletteType=u.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=u.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=u.VizImageSizeSettingType,e.VizImageSortDirectionType=u.VizImageSortDirectionType,e.ZoneVisibilityType=u.ZoneVisibilityType})(),window.tableau=n})(); -//# sourceMappingURL=tableau.extensions.1.12.0-pre.16.min.js.map \ No newline at end of file +(()=>{var e={3e3:(e,t,r)=>{r(5092);var n=r(7880);e.exports=n("Array","find")},8315:(e,t,r)=>{r(8504),r(5684);var n=r(340);e.exports=n.Array.from},80:(e,t,r)=>{r(3924),r(472),r(7912),r(8504);var n=r(340);e.exports=n.Map},5668:(e,t,r)=>{r(1300);var n=r(340);e.exports=n.Number.isInteger},5816:(e,t,r)=>{r(3656);var n=r(340);e.exports=n.Number.isNaN},3680:(e,t,r)=>{r(6544);var n=r(340);e.exports=n.Number.parseFloat},9308:(e,t,r)=>{r(7972);var n=r(340);e.exports=n.Number.parseInt},8824:(e,t,r)=>{r(6368);var n=r(340);e.exports=n.Object.assign},8512:(e,t,r)=>{r(8292);var n=r(340);e.exports=n.Object.entries},9232:(e,t,r)=>{r(920);var n=r(340);e.exports=n.Object.setPrototypeOf},9336:(e,t,r)=>{r(6140),r(3924),r(7912),r(7448),r(3936),r(5428),r(1517),r(8504);var n=r(340);e.exports=n.Promise},1381:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a function")}},6372:(e,t,r)=>{var n=r(1600),i=r(5220),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a constructor")}},4040:(e,t,r)=>{var n=r(1600),i=r(984),o=n.String,a=n.TypeError;e.exports=function(e){if("object"==typeof e||i(e))return e;throw a("Can't set "+o(e)+" as a prototype")}},5868:(e,t,r)=>{var n=r(3668),i=r(124),o=r(7072),a=n("unscopables"),s=Array.prototype;null==s[a]&&o.f(s,a,{configurable:!0,value:i(null)}),e.exports=function(e){s[a][e]=!0}},2932:(e,t,r)=>{var n=r(1600),i=r(2408),o=n.TypeError;e.exports=function(e,t){if(i(t,e))return e;throw o("Incorrect invocation")}},3736:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.String,a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not an object")}},8208:(e,t,r)=>{"use strict";var n=r(1600),i=r(5616),o=r(3032),a=r(3848),s=r(3140),u=r(4064),l=r(5220),c=r(9183),p=r(4135),d=r(4944),f=r(8132),y=n.Array;e.exports=function(e){var t=a(e),r=l(this),n=arguments.length,h=n>1?arguments[1]:void 0,m=void 0!==h;m&&(h=i(h,n>2?arguments[2]:void 0));var g,v,b,I,S,_,T=f(t),P=0;if(!T||this==y&&u(T))for(g=c(t),v=r?new this(g):y(g);g>P;P++)_=m?h(t[P],P):t[P],p(v,P,_);else for(S=(I=d(t,T)).next,v=r?new this:[];!(b=o(S,I)).done;P++)_=m?s(I,h,[b.value,P],!0):b.value,p(v,P,_);return v.length=P,v}},6024:(e,t,r)=>{var n=r(3068),i=r(7920),o=r(9183),a=function(e){return function(t,r,a){var s,u=n(t),l=o(u),c=i(a,l);if(e&&r!=r){for(;l>c;)if((s=u[c++])!=s)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===r)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},9560:(e,t,r)=>{var n=r(5616),i=r(604),o=r(3188),a=r(3848),s=r(9183),u=r(1220),l=i([].push),c=function(e){var t=1==e,r=2==e,i=3==e,c=4==e,p=6==e,d=7==e,f=5==e||p;return function(y,h,m,g){for(var v,b,I=a(y),S=o(I),_=n(h,m),T=s(S),P=0,A=g||u,E=t?A(y,T):r||d?A(y,0):void 0;T>P;P++)if((f||P in S)&&(b=_(v=S[P],P,I),e))if(t)E[P]=b;else if(b)switch(e){case 3:return!0;case 5:return v;case 6:return P;case 2:l(E,v)}else switch(e){case 4:return!1;case 7:l(E,v)}return p?-1:i||c?c:E}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},6100:(e,t,r)=>{var n=r(604);e.exports=n([].slice)},4096:(e,t,r)=>{var n=r(1600),i=r(5240),o=r(5220),a=r(9952),s=r(3668)("species"),u=n.Array;e.exports=function(e){var t;return i(e)&&(t=e.constructor,(o(t)&&(t===u||i(t.prototype))||a(t)&&null===(t=t[s]))&&(t=void 0)),void 0===t?u:t}},1220:(e,t,r)=>{var n=r(4096);e.exports=function(e,t){return new(n(e))(0===t?0:t)}},3140:(e,t,r)=>{var n=r(3736),i=r(1792);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){i(e,"throw",t)}}},6344:(e,t,r)=>{var n=r(3668)("iterator"),i=!1;try{var o=0,a={next:function(){return{done:!!o++}},return:function(){i=!0}};a[n]=function(){return this},Array.from(a,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var r=!1;try{var o={};o[n]=function(){return{next:function(){return{done:r=!0}}}},e(o)}catch(e){}return r}},4108:(e,t,r)=>{var n=r(604),i=n({}.toString),o=n("".slice);e.exports=function(e){return o(i(e),8,-1)}},1248:(e,t,r)=>{var n=r(1600),i=r(7796),o=r(984),a=r(4108),s=r(3668)("toStringTag"),u=n.Object,l="Arguments"==a(function(){return arguments}());e.exports=i?a:function(e){var t,r,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=u(e),s))?r:l?a(t):"Object"==(n=a(t))&&o(t.callee)?"Arguments":n}},5032:(e,t,r)=>{var n=r(604),i=r(6100),o=n("".replace),a=n("".split),s=n([].join),u=String(Error("zxcasd").stack),l=/\n\s*at [^:]*:[^\n]*/,c=l.test(u),p=/@[^\n]*\n/.test(u)&&!/zxcasd/.test(u);e.exports=function(e,t){if("string"!=typeof e)return e;if(c)for(;t--;)e=o(e,l,"");else if(p)return s(i(a(e,"\n"),t),"\n");return e}},9920:(e,t,r)=>{"use strict";var n=r(7072).f,i=r(124),o=r(7431),a=r(5616),s=r(2932),u=r(9928),l=r(2648),c=r(9688),p=r(2828),d=r(8756).fastKey,f=r(7932),y=f.set,h=f.getterFor;e.exports={getConstructor:function(e,t,r,l){var c=e((function(e,n){s(e,f),y(e,{type:t,index:i(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=n&&u(n,e[l],{that:e,AS_ENTRIES:r})})),f=c.prototype,m=h(t),g=function(e,t,r){var n,i,o=m(e),a=v(e,t);return a?a.value=r:(o.last=a={index:i=d(t,!0),key:t,value:r,previous:n=o.last,next:void 0,removed:!1},o.first||(o.first=a),n&&(n.next=a),p?o.size++:e.size++,"F"!==i&&(o.index[i]=a)),e},v=function(e,t){var r,n=m(e),i=d(t);if("F"!==i)return n.index[i];for(r=n.first;r;r=r.next)if(r.key==t)return r};return o(f,{clear:function(){for(var e=m(this),t=e.index,r=e.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete t[r.index],r=r.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,r=m(t),n=v(t,e);if(n){var i=n.next,o=n.previous;delete r.index[n.index],n.removed=!0,o&&(o.next=i),i&&(i.previous=o),r.first==n&&(r.first=i),r.last==n&&(r.last=o),p?r.size--:t.size--}return!!n},forEach:function(e){for(var t,r=m(this),n=a(e,arguments.length>1?arguments[1]:void 0);t=t?t.next:r.first;)for(n(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!v(this,e)}}),o(f,r?{get:function(e){var t=v(this,e);return t&&t.value},set:function(e,t){return g(this,0===e?0:e,t)}}:{add:function(e){return g(this,e=0===e?0:e,e)}}),p&&n(f,"size",{get:function(){return m(this).size}}),c},setStrong:function(e,t,r){var n=t+" Iterator",i=h(t),o=h(n);l(e,t,(function(e,t){y(this,{type:n,target:e,state:i(e),kind:t,last:void 0})}),(function(){for(var e=o(this),t=e.kind,r=e.last;r&&r.removed;)r=r.previous;return e.target&&(e.last=r=r?r.next:e.state.first)?"keys"==t?{value:r.key,done:!1}:"values"==t?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),r?"entries":"values",!r,!0),c(t)}}},6064:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(604),a=r(4232),s=r(5028),u=r(8756),l=r(9928),c=r(2932),p=r(984),d=r(9952),f=r(7004),y=r(6344),h=r(9540),m=r(7692);e.exports=function(e,t,r){var g=-1!==e.indexOf("Map"),v=-1!==e.indexOf("Weak"),b=g?"set":"add",I=i[e],S=I&&I.prototype,_=I,T={},P=function(e){var t=o(S[e]);s(S,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return v&&!d(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:function(e,r){return t(this,0===e?0:e,r),this})};if(a(e,!p(I)||!(v||S.forEach&&!f((function(){(new I).entries().next()})))))_=r.getConstructor(t,e,g,b),u.enable();else if(a(e,!0)){var A=new _,E=A[b](v?{}:-0,1)!=A,w=f((function(){A.has(1)})),O=y((function(e){new I(e)})),D=!v&&f((function(){for(var e=new I,t=5;t--;)e[b](t,t);return!e.has(-0)}));O||((_=t((function(e,t){c(e,S);var r=m(new I,e,_);return null!=t&&l(t,r[b],{that:r,AS_ENTRIES:g}),r}))).prototype=S,S.constructor=_),(w||D)&&(P("delete"),P("has"),g&&P("get")),(D||E)&&P(b),v&&S.clear&&delete S.clear}return T[e]=_,n({global:!0,forced:_!=I},T),h(_,e),v||r.setStrong(_,e,g),_}},4640:(e,t,r)=>{var n=r(9180),i=r(4092),o=r(2920),a=r(7072);e.exports=function(e,t){for(var r=i(t),s=a.f,u=o.f,l=0;l{var n=r(7004);e.exports=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},9292:(e,t,r)=>{"use strict";var n=r(804).IteratorPrototype,i=r(124),o=r(364),a=r(9540),s=r(2204),u=function(){return this};e.exports=function(e,t,r){var l=t+" Iterator";return e.prototype=i(n,{next:o(1,r)}),a(e,l,!1,!0),s[l]=u,e}},4768:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(364);e.exports=n?function(e,t,r){return i.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},364:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},4135:(e,t,r)=>{"use strict";var n=r(4061),i=r(7072),o=r(364);e.exports=function(e,t,r){var a=n(t);a in e?i.f(e,a,o(0,r)):e[a]=r}},2648:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(7408),a=r(8492),s=r(984),u=r(9292),l=r(6232),c=r(3440),p=r(9540),d=r(4768),f=r(5028),y=r(3668),h=r(2204),m=r(804),g=a.PROPER,v=a.CONFIGURABLE,b=m.IteratorPrototype,I=m.BUGGY_SAFARI_ITERATORS,S=y("iterator"),_="keys",T="values",P="entries",A=function(){return this};e.exports=function(e,t,r,a,y,m,E){u(r,t,a);var w,O,D,x=function(e){if(e===y&&k)return k;if(!I&&e in N)return N[e];switch(e){case _:case T:case P:return function(){return new r(this,e)}}return function(){return new r(this)}},F=t+" Iterator",C=!1,N=e.prototype,M=N[S]||N["@@iterator"]||y&&N[y],k=!I&&M||x(y),R="Array"==t&&N.entries||M;if(R&&(w=l(R.call(new e)))!==Object.prototype&&w.next&&(o||l(w)===b||(c?c(w,b):s(w[S])||f(w,S,A)),p(w,F,!0,!0),o&&(h[F]=A)),g&&y==T&&M&&M.name!==T&&(!o&&v?d(N,"name",T):(C=!0,k=function(){return i(M,this)})),y)if(O={values:x(T),keys:m?k:x(_),entries:x(P)},E)for(D in O)(I||C||!(D in N))&&f(N,D,O[D]);else n({target:t,proto:!0,forced:I||C},O);return o&&!E||N[S]===k||f(N,S,k,{name:y}),h[t]=k,O}},2828:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},7300:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},4532:e=>{e.exports="object"==typeof window},264:(e,t,r)=>{var n=r(5316),i=r(1600);e.exports=/ipad|iphone|ipod/i.test(n)&&void 0!==i.Pebble},1588:(e,t,r)=>{var n=r(5316);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},3640:(e,t,r)=>{var n=r(4108),i=r(1600);e.exports="process"==n(i.process)},7888:(e,t,r)=>{var n=r(5316);e.exports=/web0s(?!.*chrome)/i.test(n)},5316:(e,t,r)=>{var n=r(6532);e.exports=n("navigator","userAgent")||""},2592:(e,t,r)=>{var n,i,o=r(1600),a=r(5316),s=o.process,u=o.Deno,l=s&&s.versions||u&&u.version,c=l&&l.v8;c&&(i=(n=c.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!i&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(i=+n[1]),e.exports=i},7880:(e,t,r)=>{var n=r(1600),i=r(604);e.exports=function(e,t){return i(n[e].prototype[t])}},8675:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},4464:(e,t,r)=>{var n=r(7004),i=r(364);e.exports=!n((function(){var e=Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",i(1,7)),7!==e.stack)}))},7248:(e,t,r)=>{var n=r(1600),i=r(2920).f,o=r(4768),a=r(5028),s=r(2984),u=r(4640),l=r(4232);e.exports=function(e,t){var r,c,p,d,f,y=e.target,h=e.global,m=e.stat;if(r=h?n:m?n[y]||s(y,{}):(n[y]||{}).prototype)for(c in t){if(d=t[c],p=e.noTargetGet?(f=i(r,c))&&f.value:r[c],!l(h?c:y+(m?".":"#")+c,e.forced)&&void 0!==p){if(typeof d==typeof p)continue;u(d,p)}(e.sham||p&&p.sham)&&o(d,"sham",!0),a(r,c,d,e)}}},7004:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},1748:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},9756:e=>{var t=Function.prototype,r=t.apply,n=t.bind,i=t.call;e.exports="object"==typeof Reflect&&Reflect.apply||(n?i.bind(r):function(){return i.apply(r,arguments)})},5616:(e,t,r)=>{var n=r(604),i=r(1381),o=n(n.bind);e.exports=function(e,t){return i(e),void 0===t?e:o?o(e,t):function(){return e.apply(t,arguments)}}},3032:e=>{var t=Function.prototype.call;e.exports=t.bind?t.bind(t):function(){return t.apply(t,arguments)}},8492:(e,t,r)=>{var n=r(2828),i=r(9180),o=Function.prototype,a=n&&Object.getOwnPropertyDescriptor,s=i(o,"name"),u=s&&"something"===function(){}.name,l=s&&(!n||n&&a(o,"name").configurable);e.exports={EXISTS:s,PROPER:u,CONFIGURABLE:l}},604:e=>{var t=Function.prototype,r=t.bind,n=t.call,i=r&&r.bind(n);e.exports=r?function(e){return e&&i(n,e)}:function(e){return e&&function(){return n.apply(e,arguments)}}},6532:(e,t,r)=>{var n=r(1600),i=r(984);e.exports=function(e,t){return arguments.length<2?(r=n[e],i(r)?r:void 0):n[e]&&n[e][t];var r}},8132:(e,t,r)=>{var n=r(1248),i=r(8808),o=r(2204),a=r(3668)("iterator");e.exports=function(e){if(null!=e)return i(e,a)||i(e,"@@iterator")||o[n(e)]}},4944:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(1381),a=r(3736),s=r(1532),u=r(8132),l=n.TypeError;e.exports=function(e,t){var r=arguments.length<2?u(e):t;if(o(r))return a(i(r,e));throw l(s(e)+" is not iterable")}},8808:(e,t,r)=>{var n=r(1381);e.exports=function(e,t){var r=e[t];return null==r?void 0:n(r)}},1600:(e,t,r)=>{var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof r.g&&r.g)||function(){return this}()||Function("return this")()},9180:(e,t,r)=>{var n=r(604),i=r(3848),o=n({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return o(i(e),t)}},6632:e=>{e.exports={}},5651:(e,t,r)=>{var n=r(1600);e.exports=function(e,t){var r=n.console;r&&r.error&&(1==arguments.length?r.error(e):r.error(e,t))}},2960:(e,t,r)=>{var n=r(6532);e.exports=n("document","documentElement")},2339:(e,t,r)=>{var n=r(2828),i=r(7004),o=r(7300);e.exports=!n&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},3188:(e,t,r)=>{var n=r(1600),i=r(604),o=r(7004),a=r(4108),s=n.Object,u=i("".split);e.exports=o((function(){return!s("z").propertyIsEnumerable(0)}))?function(e){return"String"==a(e)?u(e,""):s(e)}:s},7692:(e,t,r)=>{var n=r(984),i=r(9952),o=r(3440);e.exports=function(e,t,r){var a,s;return o&&n(a=t.constructor)&&a!==r&&i(s=a.prototype)&&s!==r.prototype&&o(e,s),e}},1727:(e,t,r)=>{var n=r(604),i=r(984),o=r(6376),a=n(Function.toString);i(o.inspectSource)||(o.inspectSource=function(e){return a(e)}),e.exports=o.inspectSource},7660:(e,t,r)=>{var n=r(9952),i=r(4768);e.exports=function(e,t){n(t)&&"cause"in t&&i(e,"cause",t.cause)}},8756:(e,t,r)=>{var n=r(7248),i=r(604),o=r(6632),a=r(9952),s=r(9180),u=r(7072).f,l=r(4880),c=r(7316),p=r(6536),d=r(1748),f=!1,y=p("meta"),h=0,m=Object.isExtensible||function(){return!0},g=function(e){u(e,y,{value:{objectID:"O"+h++,weakData:{}}})},v=e.exports={enable:function(){v.enable=function(){},f=!0;var e=l.f,t=i([].splice),r={};r[y]=1,e(r).length&&(l.f=function(r){for(var n=e(r),i=0,o=n.length;i{var n,i,o,a=r(8736),s=r(1600),u=r(604),l=r(9952),c=r(4768),p=r(9180),d=r(6376),f=r(280),y=r(6632),h="Object already initialized",m=s.TypeError,g=s.WeakMap;if(a||d.state){var v=d.state||(d.state=new g),b=u(v.get),I=u(v.has),S=u(v.set);n=function(e,t){if(I(v,e))throw new m(h);return t.facade=e,S(v,e,t),t},i=function(e){return b(v,e)||{}},o=function(e){return I(v,e)}}else{var _=f("state");y[_]=!0,n=function(e,t){if(p(e,_))throw new m(h);return t.facade=e,c(e,_,t),t},i=function(e){return p(e,_)?e[_]:{}},o=function(e){return p(e,_)}}e.exports={set:n,get:i,has:o,enforce:function(e){return o(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!l(t)||(r=i(t)).type!==e)throw m("Incompatible receiver, "+e+" required");return r}}}},4064:(e,t,r)=>{var n=r(3668),i=r(2204),o=n("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||a[o]===e)}},5240:(e,t,r)=>{var n=r(4108);e.exports=Array.isArray||function(e){return"Array"==n(e)}},984:e=>{e.exports=function(e){return"function"==typeof e}},5220:(e,t,r)=>{var n=r(604),i=r(7004),o=r(984),a=r(1248),s=r(6532),u=r(1727),l=function(){},c=[],p=s("Reflect","construct"),d=/^\s*(?:class|function)\b/,f=n(d.exec),y=!d.exec(l),h=function(e){if(!o(e))return!1;try{return p(l,c,e),!0}catch(e){return!1}};e.exports=!p||i((function(){var e;return h(h.call)||!h(Object)||!h((function(){e=!0}))||e}))?function(e){if(!o(e))return!1;switch(a(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return y||!!f(d,u(e))}:h},4232:(e,t,r)=>{var n=r(7004),i=r(984),o=/#|\.prototype\./,a=function(e,t){var r=u[s(e)];return r==c||r!=l&&(i(t)?n(t):!!t)},s=a.normalize=function(e){return String(e).replace(o,".").toLowerCase()},u=a.data={},l=a.NATIVE="N",c=a.POLYFILL="P";e.exports=a},992:(e,t,r)=>{var n=r(9952),i=Math.floor;e.exports=Number.isInteger||function(e){return!n(e)&&isFinite(e)&&i(e)===e}},9952:(e,t,r)=>{var n=r(984);e.exports=function(e){return"object"==typeof e?null!==e:n(e)}},7408:e=>{e.exports=!1},1836:(e,t,r)=>{var n=r(1600),i=r(6532),o=r(984),a=r(2408),s=r(7216),u=n.Object;e.exports=s?function(e){return"symbol"==typeof e}:function(e){var t=i("Symbol");return o(t)&&a(t.prototype,u(e))}},9928:(e,t,r)=>{var n=r(1600),i=r(5616),o=r(3032),a=r(3736),s=r(1532),u=r(4064),l=r(9183),c=r(2408),p=r(4944),d=r(8132),f=r(1792),y=n.TypeError,h=function(e,t){this.stopped=e,this.result=t},m=h.prototype;e.exports=function(e,t,r){var n,g,v,b,I,S,_,T=r&&r.that,P=!(!r||!r.AS_ENTRIES),A=!(!r||!r.IS_ITERATOR),E=!(!r||!r.INTERRUPTED),w=i(t,T),O=function(e){return n&&f(n,"normal",e),new h(!0,e)},D=function(e){return P?(a(e),E?w(e[0],e[1],O):w(e[0],e[1])):E?w(e,O):w(e)};if(A)n=e;else{if(!(g=d(e)))throw y(s(e)+" is not iterable");if(u(g)){for(v=0,b=l(e);b>v;v++)if((I=D(e[v]))&&c(m,I))return I;return new h(!1)}n=p(e,g)}for(S=n.next;!(_=o(S,n)).done;){try{I=D(_.value)}catch(e){f(n,"throw",e)}if("object"==typeof I&&I&&c(m,I))return I}return new h(!1)}},1792:(e,t,r)=>{var n=r(3032),i=r(3736),o=r(8808);e.exports=function(e,t,r){var a,s;i(e);try{if(!(a=o(e,"return"))){if("throw"===t)throw r;return r}a=n(a,e)}catch(e){s=!0,a=e}if("throw"===t)throw r;if(s)throw a;return i(a),r}},804:(e,t,r)=>{"use strict";var n,i,o,a=r(7004),s=r(984),u=r(124),l=r(6232),c=r(5028),p=r(3668),d=r(7408),f=p("iterator"),y=!1;[].keys&&("next"in(o=[].keys())?(i=l(l(o)))!==Object.prototype&&(n=i):y=!0),null==n||a((function(){var e={};return n[f].call(e)!==e}))?n={}:d&&(n=u(n)),s(n[f])||c(n,f,(function(){return this})),e.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:y}},2204:e=>{e.exports={}},9183:(e,t,r)=>{var n=r(1868);e.exports=function(e){return n(e.length)}},3104:(e,t,r)=>{var n,i,o,a,s,u,l,c,p=r(1600),d=r(5616),f=r(2920).f,y=r(5952).set,h=r(1588),m=r(264),g=r(7888),v=r(3640),b=p.MutationObserver||p.WebKitMutationObserver,I=p.document,S=p.process,_=p.Promise,T=f(p,"queueMicrotask"),P=T&&T.value;P||(n=function(){var e,t;for(v&&(e=S.domain)&&e.exit();i;){t=i.fn,i=i.next;try{t()}catch(e){throw i?a():o=void 0,e}}o=void 0,e&&e.enter()},h||v||g||!b||!I?!m&&_&&_.resolve?((l=_.resolve(void 0)).constructor=_,c=d(l.then,l),a=function(){c(n)}):v?a=function(){S.nextTick(n)}:(y=d(y,p),a=function(){y(n)}):(s=!0,u=I.createTextNode(""),new b(n).observe(u,{characterData:!0}),a=function(){u.data=s=!s})),e.exports=P||function(e){var t={fn:e,next:void 0};o&&(o.next=t),i||(i=t,a()),o=t}},3459:(e,t,r)=>{var n=r(1600);e.exports=n.Promise},3880:(e,t,r)=>{var n=r(2592),i=r(7004);e.exports=!!Object.getOwnPropertySymbols&&!i((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},8736:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1727),a=n.WeakMap;e.exports=i(a)&&/native code/.test(o(a))},8071:(e,t,r)=>{"use strict";var n=r(1381),i=function(e){var t,r;this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n})),this.resolve=n(t),this.reject=n(r)};e.exports.f=function(e){return new i(e)}},5744:(e,t,r)=>{var n=r(748);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:n(e)}},6016:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=o("".charAt),c=n.parseFloat,p=n.Symbol,d=p&&p.iterator,f=1/c(u+"-0")!=-1/0||d&&!i((function(){c(Object(d))}));e.exports=f?function(e){var t=s(a(e)),r=c(t);return 0===r&&"-"==l(t,0)?-0:r}:c},6556:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=n.parseInt,c=n.Symbol,p=c&&c.iterator,d=/^[+-]?0x/i,f=o(d.exec),y=8!==l(u+"08")||22!==l(u+"0x16")||p&&!i((function(){l(Object(p))}));e.exports=y?function(e,t){var r=s(a(e));return l(r,t>>>0||(f(d,r)?16:10))}:l},6984:(e,t,r)=>{"use strict";var n=r(2828),i=r(604),o=r(3032),a=r(7004),s=r(9880),u=r(2128),l=r(5988),c=r(3848),p=r(3188),d=Object.assign,f=Object.defineProperty,y=i([].concat);e.exports=!d||a((function(){if(n&&1!==d({b:1},d(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach((function(e){t[e]=e})),7!=d({},e)[r]||s(d({},t)).join("")!=i}))?function(e,t){for(var r=c(e),i=arguments.length,a=1,d=u.f,f=l.f;i>a;)for(var h,m=p(arguments[a++]),g=d?y(s(m),d(m)):s(m),v=g.length,b=0;v>b;)h=g[b++],n&&!o(f,m,h)||(r[h]=m[h]);return r}:d},124:(e,t,r)=>{var n,i=r(3736),o=r(1904),a=r(8675),s=r(6632),u=r(2960),l=r(7300),c=r(280),p="prototype",d="script",f=c("IE_PROTO"),y=function(){},h=function(e){return"<"+d+">"+e+""},m=function(e){e.write(h("")),e.close();var t=e.parentWindow.Object;return e=null,t},g=function(){try{n=new ActiveXObject("htmlfile")}catch(e){}var e,t,r;g="undefined"!=typeof document?document.domain&&n?m(n):(t=l("iframe"),r="java"+d+":",t.style.display="none",u.appendChild(t),t.src=String(r),(e=t.contentWindow.document).open(),e.write(h("document.F=Object")),e.close(),e.F):m(n);for(var i=a.length;i--;)delete g[p][a[i]];return g()};s[f]=!0,e.exports=Object.create||function(e,t){var r;return null!==e?(y[p]=i(e),r=new y,y[p]=null,r[f]=e):r=g(),void 0===t?r:o(r,t)}},1904:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(3736),a=r(3068),s=r(9880);e.exports=n?Object.defineProperties:function(e,t){o(e);for(var r,n=a(t),u=s(t),l=u.length,c=0;l>c;)i.f(e,r=u[c++],n[r]);return e}},7072:(e,t,r)=>{var n=r(1600),i=r(2828),o=r(2339),a=r(3736),s=r(4061),u=n.TypeError,l=Object.defineProperty;t.f=i?l:function(e,t,r){if(a(e),t=s(t),a(r),o)try{return l(e,t,r)}catch(e){}if("get"in r||"set"in r)throw u("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},2920:(e,t,r)=>{var n=r(2828),i=r(3032),o=r(5988),a=r(364),s=r(3068),u=r(4061),l=r(9180),c=r(2339),p=Object.getOwnPropertyDescriptor;t.f=n?p:function(e,t){if(e=s(e),t=u(t),c)try{return p(e,t)}catch(e){}if(l(e,t))return a(!i(o.f,e,t),e[t])}},7316:(e,t,r)=>{var n=r(4108),i=r(3068),o=r(4880).f,a=r(6100),s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&"Window"==n(e)?function(e){try{return o(e)}catch(e){return a(s)}}(e):o(i(e))}},4880:(e,t,r)=>{var n=r(9912),i=r(8675).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,i)}},2128:(e,t)=>{t.f=Object.getOwnPropertySymbols},6232:(e,t,r)=>{var n=r(1600),i=r(9180),o=r(984),a=r(3848),s=r(280),u=r(1040),l=s("IE_PROTO"),c=n.Object,p=c.prototype;e.exports=u?c.getPrototypeOf:function(e){var t=a(e);if(i(t,l))return t[l];var r=t.constructor;return o(r)&&t instanceof r?r.prototype:t instanceof c?p:null}},2408:(e,t,r)=>{var n=r(604);e.exports=n({}.isPrototypeOf)},9912:(e,t,r)=>{var n=r(604),i=r(9180),o=r(3068),a=r(6024).indexOf,s=r(6632),u=n([].push);e.exports=function(e,t){var r,n=o(e),l=0,c=[];for(r in n)!i(s,r)&&i(n,r)&&u(c,r);for(;t.length>l;)i(n,r=t[l++])&&(~a(c,r)||u(c,r));return c}},9880:(e,t,r)=>{var n=r(9912),i=r(8675);e.exports=Object.keys||function(e){return n(e,i)}},5988:(e,t)=>{"use strict";var r={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,i=n&&!r.call({1:2},1);t.f=i?function(e){var t=n(this,e);return!!t&&t.enumerable}:r},3440:(e,t,r)=>{var n=r(604),i=r(3736),o=r(4040);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,r={};try{(e=n(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(r,[]),t=r instanceof Array}catch(e){}return function(r,n){return i(r),o(n),t?e(r,n):r.__proto__=n,r}}():void 0)},5556:(e,t,r)=>{var n=r(2828),i=r(604),o=r(9880),a=r(3068),s=i(r(5988).f),u=i([].push),l=function(e){return function(t){for(var r,i=a(t),l=o(i),c=l.length,p=0,d=[];c>p;)r=l[p++],n&&!s(i,r)||u(d,e?[r,i[r]]:i[r]);return d}};e.exports={entries:l(!0),values:l(!1)}},2816:(e,t,r)=>{"use strict";var n=r(7796),i=r(1248);e.exports=n?{}.toString:function(){return"[object "+i(this)+"]"}},7540:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(984),a=r(9952),s=n.TypeError;e.exports=function(e,t){var r,n;if("string"===t&&o(r=e.toString)&&!a(n=i(r,e)))return n;if(o(r=e.valueOf)&&!a(n=i(r,e)))return n;if("string"!==t&&o(r=e.toString)&&!a(n=i(r,e)))return n;throw s("Can't convert object to primitive value")}},4092:(e,t,r)=>{var n=r(6532),i=r(604),o=r(4880),a=r(2128),s=r(3736),u=i([].concat);e.exports=n("Reflect","ownKeys")||function(e){var t=o.f(s(e)),r=a.f;return r?u(t,r(e)):t}},340:(e,t,r)=>{var n=r(1600);e.exports=n},2699:e=>{e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},9467:(e,t,r)=>{var n=r(3736),i=r(9952),o=r(8071);e.exports=function(e,t){if(n(e),i(t)&&t.constructor===e)return t;var r=o.f(e);return(0,r.resolve)(t),r.promise}},7431:(e,t,r)=>{var n=r(5028);e.exports=function(e,t,r){for(var i in t)n(e,i,t[i],r);return e}},5028:(e,t,r)=>{var n=r(1600),i=r(984),o=r(9180),a=r(4768),s=r(2984),u=r(1727),l=r(7932),c=r(8492).CONFIGURABLE,p=l.get,d=l.enforce,f=String(String).split("String");(e.exports=function(e,t,r,u){var l,p=!!u&&!!u.unsafe,y=!!u&&!!u.enumerable,h=!!u&&!!u.noTargetGet,m=u&&void 0!==u.name?u.name:t;i(r)&&("Symbol("===String(m).slice(0,7)&&(m="["+String(m).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!o(r,"name")||c&&r.name!==m)&&a(r,"name",m),(l=d(r)).source||(l.source=f.join("string"==typeof m?m:""))),e!==n?(p?!h&&e[t]&&(y=!0):delete e[t],y?e[t]=r:a(e,t,r)):y?e[t]=r:s(t,r)})(Function.prototype,"toString",(function(){return i(this)&&p(this).source||u(this)}))},1840:(e,t,r)=>{var n=r(1600).TypeError;e.exports=function(e){if(null==e)throw n("Can't call method on "+e);return e}},2984:(e,t,r)=>{var n=r(1600),i=Object.defineProperty;e.exports=function(e,t){try{i(n,e,{value:t,configurable:!0,writable:!0})}catch(r){n[e]=t}return t}},9688:(e,t,r)=>{"use strict";var n=r(6532),i=r(7072),o=r(3668),a=r(2828),s=o("species");e.exports=function(e){var t=n(e),r=i.f;a&&t&&!t[s]&&r(t,s,{configurable:!0,get:function(){return this}})}},9540:(e,t,r)=>{var n=r(7072).f,i=r(9180),o=r(3668)("toStringTag");e.exports=function(e,t,r){e&&!i(e=r?e:e.prototype,o)&&n(e,o,{configurable:!0,value:t})}},280:(e,t,r)=>{var n=r(4624),i=r(6536),o=n("keys");e.exports=function(e){return o[e]||(o[e]=i(e))}},6376:(e,t,r)=>{var n=r(1600),i=r(2984),o="__core-js_shared__",a=n[o]||i(o,{});e.exports=a},4624:(e,t,r)=>{var n=r(7408),i=r(6376);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.19.0",mode:n?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},7171:(e,t,r)=>{var n=r(3736),i=r(6372),o=r(3668)("species");e.exports=function(e,t){var r,a=n(e).constructor;return void 0===a||null==(r=n(a)[o])?t:i(r)}},5160:(e,t,r)=>{var n=r(604),i=r(9824),o=r(748),a=r(1840),s=n("".charAt),u=n("".charCodeAt),l=n("".slice),c=function(e){return function(t,r){var n,c,p=o(a(t)),d=i(r),f=p.length;return d<0||d>=f?e?"":void 0:(n=u(p,d))<55296||n>56319||d+1===f||(c=u(p,d+1))<56320||c>57343?e?s(p,d):n:e?l(p,d,d+2):c-56320+(n-55296<<10)+65536}};e.exports={codeAt:c(!1),charAt:c(!0)}},1688:(e,t,r)=>{var n=r(604),i=r(1840),o=r(748),a=r(5320),s=n("".replace),u="["+a+"]",l=RegExp("^"+u+u+"*"),c=RegExp(u+u+"*$"),p=function(e){return function(t){var r=o(i(t));return 1&e&&(r=s(r,l,"")),2&e&&(r=s(r,c,"")),r}};e.exports={start:p(1),end:p(2),trim:p(3)}},5952:(e,t,r)=>{var n,i,o,a,s=r(1600),u=r(9756),l=r(5616),c=r(984),p=r(9180),d=r(7004),f=r(2960),y=r(6100),h=r(7300),m=r(1588),g=r(3640),v=s.setImmediate,b=s.clearImmediate,I=s.process,S=s.Dispatch,_=s.Function,T=s.MessageChannel,P=s.String,A=0,E={},w="onreadystatechange";try{n=s.location}catch(e){}var O=function(e){if(p(E,e)){var t=E[e];delete E[e],t()}},D=function(e){return function(){O(e)}},x=function(e){O(e.data)},F=function(e){s.postMessage(P(e),n.protocol+"//"+n.host)};v&&b||(v=function(e){var t=y(arguments,1);return E[++A]=function(){u(c(e)?e:_(e),void 0,t)},i(A),A},b=function(e){delete E[e]},g?i=function(e){I.nextTick(D(e))}:S&&S.now?i=function(e){S.now(D(e))}:T&&!m?(a=(o=new T).port2,o.port1.onmessage=x,i=l(a.postMessage,a)):s.addEventListener&&c(s.postMessage)&&!s.importScripts&&n&&"file:"!==n.protocol&&!d(F)?(i=F,s.addEventListener("message",x,!1)):i=w in h("script")?function(e){f.appendChild(h("script"))[w]=function(){f.removeChild(this),O(e)}}:function(e){setTimeout(D(e),0)}),e.exports={set:v,clear:b}},7920:(e,t,r)=>{var n=r(9824),i=Math.max,o=Math.min;e.exports=function(e,t){var r=n(e);return r<0?i(r+t,0):o(r,t)}},3068:(e,t,r)=>{var n=r(3188),i=r(1840);e.exports=function(e){return n(i(e))}},9824:e=>{var t=Math.ceil,r=Math.floor;e.exports=function(e){var n=+e;return n!=n||0===n?0:(n>0?r:t)(n)}},1868:(e,t,r)=>{var n=r(9824),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},3848:(e,t,r)=>{var n=r(1600),i=r(1840),o=n.Object;e.exports=function(e){return o(i(e))}},2312:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(9952),a=r(1836),s=r(8808),u=r(7540),l=r(3668),c=n.TypeError,p=l("toPrimitive");e.exports=function(e,t){if(!o(e)||a(e))return e;var r,n=s(e,p);if(n){if(void 0===t&&(t="default"),r=i(n,e,t),!o(r)||a(r))return r;throw c("Can't convert object to primitive value")}return void 0===t&&(t="number"),u(e,t)}},4061:(e,t,r)=>{var n=r(2312),i=r(1836);e.exports=function(e){var t=n(e,"string");return i(t)?t:t+""}},7796:(e,t,r)=>{var n={};n[r(3668)("toStringTag")]="z",e.exports="[object z]"===String(n)},748:(e,t,r)=>{var n=r(1600),i=r(1248),o=n.String;e.exports=function(e){if("Symbol"===i(e))throw TypeError("Cannot convert a Symbol value to a string");return o(e)}},1532:(e,t,r)=>{var n=r(1600).String;e.exports=function(e){try{return n(e)}catch(e){return"Object"}}},6536:(e,t,r)=>{var n=r(604),i=0,o=Math.random(),a=n(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++i+o,36)}},7216:(e,t,r)=>{var n=r(3880);e.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3668:(e,t,r)=>{var n=r(1600),i=r(4624),o=r(9180),a=r(6536),s=r(3880),u=r(7216),l=i("wks"),c=n.Symbol,p=c&&c.for,d=u?c:c&&c.withoutSetter||a;e.exports=function(e){if(!o(l,e)||!s&&"string"!=typeof l[e]){var t="Symbol."+e;s&&o(c,e)?l[e]=c[e]:l[e]=u&&p?p(t):d(t)}return l[e]}},5320:e=>{e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},6140:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(2408),a=r(6232),s=r(3440),u=r(4640),l=r(124),c=r(4768),p=r(364),d=r(5032),f=r(7660),y=r(9928),h=r(5744),m=r(4464),g=i.Error,v=[].push,b=function(e,t){var r=o(I,this)?this:l(I),n=arguments.length>2?arguments[2]:void 0;s&&(r=s(new g(void 0),a(r))),c(r,"message",h(t,"")),m&&c(r,"stack",d(r.stack,1)),f(r,n);var i=[];return y(e,v,{that:i}),c(r,"errors",i),r};s?s(b,g):u(b,g);var I=b.prototype=l(g.prototype,{constructor:p(1,b),message:p(1,""),name:p(1,"AggregateError")});n({global:!0},{AggregateError:b})},5092:(e,t,r)=>{"use strict";var n=r(7248),i=r(9560).find,o=r(5868),a="find",s=!0;a in[]&&Array(1)[a]((function(){s=!1})),n({target:"Array",proto:!0,forced:s},{find:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),o(a)},5684:(e,t,r)=>{var n=r(7248),i=r(8208);n({target:"Array",stat:!0,forced:!r(6344)((function(e){Array.from(e)}))},{from:i})},3924:(e,t,r)=>{"use strict";var n=r(3068),i=r(5868),o=r(2204),a=r(7932),s=r(2648),u="Array Iterator",l=a.set,c=a.getterFor(u);e.exports=s(Array,"Array",(function(e,t){l(this,{type:u,target:n(e),index:0,kind:t})}),(function(){var e=c(this),t=e.target,r=e.kind,n=e.index++;return!t||n>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==r?{value:n,done:!1}:"values"==r?{value:t[n],done:!1}:{value:[n,t[n]],done:!1}}),"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},472:(e,t,r)=>{"use strict";r(6064)("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r(9920))},1300:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isInteger:r(992)})},3656:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},6544:(e,t,r)=>{var n=r(7248),i=r(6016);n({target:"Number",stat:!0,forced:Number.parseFloat!=i},{parseFloat:i})},7972:(e,t,r)=>{var n=r(7248),i=r(6556);n({target:"Number",stat:!0,forced:Number.parseInt!=i},{parseInt:i})},6368:(e,t,r)=>{var n=r(7248),i=r(6984);n({target:"Object",stat:!0,forced:Object.assign!==i},{assign:i})},8292:(e,t,r)=>{var n=r(7248),i=r(5556).entries;n({target:"Object",stat:!0},{entries:function(e){return i(e)}})},920:(e,t,r)=>{r(7248)({target:"Object",stat:!0},{setPrototypeOf:r(3440)})},7912:(e,t,r)=>{var n=r(7796),i=r(5028),o=r(2816);n||i(Object.prototype,"toString",o,{unsafe:!0})},3936:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(1381),a=r(8071),s=r(2699),u=r(9928);n({target:"Promise",stat:!0},{allSettled:function(e){var t=this,r=a.f(t),n=r.resolve,l=r.reject,c=s((function(){var r=o(t.resolve),a=[],s=0,l=1;u(e,(function(e){var o=s++,u=!1;l++,i(r,t,e).then((function(e){u||(u=!0,a[o]={status:"fulfilled",value:e},--l||n(a))}),(function(e){u||(u=!0,a[o]={status:"rejected",reason:e},--l||n(a))}))})),--l||n(a)}));return c.error&&l(c.value),r.promise}})},5428:(e,t,r)=>{"use strict";var n=r(7248),i=r(1381),o=r(6532),a=r(3032),s=r(8071),u=r(2699),l=r(9928),c="No one promise resolved";n({target:"Promise",stat:!0},{any:function(e){var t=this,r=o("AggregateError"),n=s.f(t),p=n.resolve,d=n.reject,f=u((function(){var n=i(t.resolve),o=[],s=0,u=1,f=!1;l(e,(function(e){var i=s++,l=!1;u++,a(n,t,e).then((function(e){l||f||(f=!0,p(e))}),(function(e){l||f||(l=!0,o[i]=e,--u||d(new r(o,c)))}))})),--u||d(new r(o,c))}));return f.error&&d(f.value),n.promise}})},1517:(e,t,r)=>{"use strict";var n=r(7248),i=r(7408),o=r(3459),a=r(7004),s=r(6532),u=r(984),l=r(7171),c=r(9467),p=r(5028);if(n({target:"Promise",proto:!0,real:!0,forced:!!o&&a((function(){o.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=l(this,s("Promise")),r=u(e);return this.then(r?function(r){return c(t,e()).then((function(){return r}))}:e,r?function(r){return c(t,e()).then((function(){throw r}))}:e)}}),!i&&u(o)){var d=s("Promise").prototype.finally;o.prototype.finally!==d&&p(o.prototype,"finally",d,{unsafe:!0})}},7448:(e,t,r)=>{"use strict";var n,i,o,a,s=r(7248),u=r(7408),l=r(1600),c=r(6532),p=r(3032),d=r(3459),f=r(5028),y=r(7431),h=r(3440),m=r(9540),g=r(9688),v=r(1381),b=r(984),I=r(9952),S=r(2932),_=r(1727),T=r(9928),P=r(6344),A=r(7171),E=r(5952).set,w=r(3104),O=r(9467),D=r(5651),x=r(8071),F=r(2699),C=r(7932),N=r(4232),M=r(3668),k=r(4532),R=r(3640),V=r(2592),j=M("species"),z="Promise",L=C.get,U=C.set,B=C.getterFor(z),H=d&&d.prototype,W=d,G=H,Y=l.TypeError,q=l.document,K=l.process,Q=x.f,Z=Q,X=!!(q&&q.createEvent&&l.dispatchEvent),J=b(l.PromiseRejectionEvent),$="unhandledrejection",ee=!1,te=N(z,(function(){var e=_(W),t=e!==String(W);if(!t&&66===V)return!0;if(u&&!G.finally)return!0;if(V>=51&&/native code/.test(e))return!1;var r=new W((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(r.constructor={})[j]=n,!(ee=r.then((function(){}))instanceof n)||!t&&k&&!J})),re=te||!P((function(e){W.all(e).catch((function(){}))})),ne=function(e){var t;return!(!I(e)||!b(t=e.then))&&t},ie=function(e,t){if(!e.notified){e.notified=!0;var r=e.reactions;w((function(){for(var n=e.value,i=1==e.state,o=0;r.length>o;){var a,s,u,l=r[o++],c=i?l.ok:l.fail,d=l.resolve,f=l.reject,y=l.domain;try{c?(i||(2===e.rejection&&ue(e),e.rejection=1),!0===c?a=n:(y&&y.enter(),a=c(n),y&&(y.exit(),u=!0)),a===l.promise?f(Y("Promise-chain cycle")):(s=ne(a))?p(s,a,d,f):d(a)):f(n)}catch(e){y&&!u&&y.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},oe=function(e,t,r){var n,i;X?((n=q.createEvent("Event")).promise=t,n.reason=r,n.initEvent(e,!1,!0),l.dispatchEvent(n)):n={promise:t,reason:r},!J&&(i=l["on"+e])?i(n):e===$&&D("Unhandled promise rejection",r)},ae=function(e){p(E,l,(function(){var t,r=e.facade,n=e.value;if(se(e)&&(t=F((function(){R?K.emit("unhandledRejection",n,r):oe($,r,n)})),e.rejection=R||se(e)?2:1,t.error))throw t.value}))},se=function(e){return 1!==e.rejection&&!e.parent},ue=function(e){p(E,l,(function(){var t=e.facade;R?K.emit("rejectionHandled",t):oe("rejectionhandled",t,e.value)}))},le=function(e,t,r){return function(n){e(t,n,r)}},ce=function(e,t,r){e.done||(e.done=!0,r&&(e=r),e.value=t,e.state=2,ie(e,!0))},pe=function(e,t,r){if(!e.done){e.done=!0,r&&(e=r);try{if(e.facade===t)throw Y("Promise can't be resolved itself");var n=ne(t);n?w((function(){var r={done:!1};try{p(n,t,le(pe,r,e),le(ce,r,e))}catch(t){ce(r,t,e)}})):(e.value=t,e.state=1,ie(e,!1))}catch(t){ce({done:!1},t,e)}}};if(te&&(G=(W=function(e){S(this,G),v(e),p(n,this);var t=L(this);try{e(le(pe,t),le(ce,t))}catch(e){ce(t,e)}}).prototype,(n=function(e){U(this,{type:z,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=y(G,{then:function(e,t){var r=B(this),n=r.reactions,i=Q(A(this,W));return i.ok=!b(e)||e,i.fail=b(t)&&t,i.domain=R?K.domain:void 0,r.parent=!0,n[n.length]=i,0!=r.state&&ie(r,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new n,t=L(e);this.promise=e,this.resolve=le(pe,t),this.reject=le(ce,t)},x.f=Q=function(e){return e===W||e===o?new i(e):Z(e)},!u&&b(d)&&H!==Object.prototype)){a=H.then,ee||(f(H,"then",(function(e,t){var r=this;return new W((function(e,t){p(a,r,e,t)})).then(e,t)}),{unsafe:!0}),f(H,"catch",G.catch,{unsafe:!0}));try{delete H.constructor}catch(e){}h&&h(H,G)}s({global:!0,wrap:!0,forced:te},{Promise:W}),m(W,z,!1,!0),g(z),o=c(z),s({target:z,stat:!0,forced:te},{reject:function(e){var t=Q(this);return p(t.reject,void 0,e),t.promise}}),s({target:z,stat:!0,forced:u||te},{resolve:function(e){return O(u&&this===o?W:this,e)}}),s({target:z,stat:!0,forced:re},{all:function(e){var t=this,r=Q(t),n=r.resolve,i=r.reject,o=F((function(){var r=v(t.resolve),o=[],a=0,s=1;T(e,(function(e){var u=a++,l=!1;s++,p(r,t,e).then((function(e){l||(l=!0,o[u]=e,--s||n(o))}),i)})),--s||n(o)}));return o.error&&i(o.value),r.promise},race:function(e){var t=this,r=Q(t),n=r.reject,i=F((function(){var i=v(t.resolve);T(e,(function(e){p(i,t,e).then(r.resolve,n)}))}));return i.error&&n(i.value),r.promise}})},8504:(e,t,r)=>{"use strict";var n=r(5160).charAt,i=r(748),o=r(7932),a=r(2648),s="String Iterator",u=o.set,l=o.getterFor(s);a(String,"String",(function(e){u(this,{type:s,string:i(e),index:0})}),(function(){var e,t=l(this),r=t.string,i=t.index;return i>=r.length?{value:void 0,done:!0}:(e=n(r,i),t.index+=e.length,{value:e,done:!1})}))},1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._type=e}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),e}();t.TableauEvent=r},3248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t)||this;return n._sheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"sheet",{get:function(){return this._sheet},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.TableauSheetEvent=o},4144:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n._worksheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),t}(r(3248).TableauSheetEvent);t.TableauWorksheetEvent=o},4164:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=function(e){function t(t){var r=e.call(this,o.TableauEventType.WorkbookFormattingChanged)||this;return r._formatting=t,r}return i(t,e),Object.defineProperty(t.prototype,"formatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.WorkbookFormattingChangedEvent=a},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=n}return Object.defineProperty(e.prototype,"userId",{get:function(){return this._userId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteId",{get:function(){return this._siteId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteNamespace",{get:function(){return this._siteNamespace},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookId",{get:function(){return this._workbookId},enumerable:!0,configurable:!0}),e}();t.ConnectedServer=r},5920:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(5136),a=r(1468),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t.prototype.getAllDataSourcesAsync=function(){var e=this;return o.ApiServiceRegistry.get(a.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((function(t){var r=t,n=[];return Object.values(r.dataSources).forEach((function(t){n.push(e.createDataSourceFromInfo(t))})),n}))},t.prototype.createDataSourceFromInfo=function(e){var t=new o.DataSourceImpl(e,a.ExtensionsRegistryId),r=new o.DataSource(t);return t.initializeWithPublicInterfaces(r),r},t}(o.WorkbookImpl);t.ExtensionWorkbookImpl=s},976:function(e,t,r){"use strict";var n=this&&this.__spreadArrays||function(){for(var e=0,t=0,r=arguments.length;t0;)r.deleteRule(r.cssRules.length-1);e.formattingSheets.map((function(e){t.applyFormattingSheetToStyleSheet(e,r)}))}},e.prototype.applyFormattingSheetToStyleSheet=function(e,t){var r="",n=e.cssProperties;n.fontFamily&&(r+="font-family: "+n.fontFamily.toString()+"; "),n.fontSize&&(r+="font-size: "+n.fontSize.toString()+"; "),n.fontWeight&&(r+="font-weight: "+n.fontWeight.toString()+"; "),n.fontStyle&&(r+="font-style: "+n.fontStyle.toString()+"; "),n.textDecoration&&(r+="text-decoration: "+n.textDecoration.toString()+"; "),n.color&&(r+="color: "+n.color+"; ");var i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)},e.prototype.initializeWorkbookFormattingChangedEventCallback=function(e){var t=this;a.ApiServiceRegistry.get(m.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(r){r&&(t.initializeTableauFonts(e,r),t.applyAllFormatting(r))}))},e.prototype.initializeTableauFonts=function(e,t){var r,i=this,a=n(g.SupportedBentonSansFontFaces,S.SupportedTableauFontFaces);if(t.formattingSheets.forEach((function(e){e.cssProperties.fontFamily&&a.push(e.cssProperties.fontFamily)})),a.length>0){var s=((r={})[o.ParameterId.FontNameListItems]=a,r);e.execute(o.VerbId.GetFonts,s).then((function(e){i.loadFonts(e.result)})).catch()}},e.prototype.loadFonts=function(e){var t=this;e.forEach((function(e){S.SupportedTableauFontFaces.includes(e.fontName)?t.loadTableauFonts(e):g.SupportedBentonSansFontFaces.includes(e.fontName)?t.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))},e.prototype.initializeDashboardContent=function(e,t){var r=new a.SheetInfoImpl(e.name,i.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),n=new a.DashboardImpl(r,e.zones,t,m.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(n);return new c.DashboardContent(o)},e.prototype.initializeWorksheetContent=function(e){var t=new a.SheetInfoImpl(e.visualId.worksheet,i.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new a.WorksheetImpl(t,m.ExtensionsRegistryId,e.visualId,null,null),n=new l.Worksheet(r);return new y.WorksheetContent(n)},e.prototype.initializeSettings=function(e){var t=new I.SettingsImpl(e);return new d.Settings(t)},e.prototype.initializeContextMenuCallbacks=function(e){a.ApiServiceRegistry.get(m.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.ContextMenuClick,(function(){return!0}),(function(t){if(e){if(!e[t.id])throw new a.TableauError(i.ErrorCodes.InternalError,"Received unexpected context menu Id from event: "+t.id);e[t.id]()}}))},e.prototype.loadTableauFonts=function(e){switch(e.fontName){case S.TableauBookFontFaceName:document.fonts.add(new FontFace(S.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauLightFontFaceName:document.fonts.add(new FontFace(S.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauRegularFontFaceName:document.fonts.add(new FontFace(S.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case S.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(S.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case S.TableauBoldFontFaceName:document.fonts.add(new FontFace(S.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case S.TableauMediumFontFaceName:document.fonts.add(new FontFace(S.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(S.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(S.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e.prototype.loadBentonSansFonts=function(e){switch(e.fontName){case g.BentonSansBookFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case g.BentonSansLightFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case g.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case g.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case g.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(g.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case g.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(g.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e}();t.ExtensionsImpl=T},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((function(e){e(n.INTERNAL_CONTRACT_VERSION).execute(n.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(7112),l=r(1468),c=function(e){function t(t){var r=e.call(this,o.TableauEventType.SettingsChanged)||this;return r._newSettings=t,r}return i(t,e),Object.defineProperty(t.prototype,"newSettings",{get:function(){return this._newSettings},enumerable:!0,configurable:!0}),t}(u.TableauEvent),p=function(){function e(e){this._saveInProgress=!1,this.initializeSettings(e)}return e.prototype.erase=function(e){s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)},e.prototype.get=function(e){return s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]},e.prototype.getAll=function(){return Object.assign({},this._currentSettings)},Object.defineProperty(e.prototype,"isModified",{get:function(){return this._isModified},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){var e=this;return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((function(t){return e._saveInProgress=!1,e._isModified=!1,void 0===e._currentSettings?e._currentSettings=t:Object.assign(e._currentSettings,t),t}),(function(t){return e._saveInProgress=!1,Promise.reject(t)}))):Promise.resolve(this._currentSettings)},e.prototype.set=function(e,t){s.ErrorHelpers.verifyStringParameter(e,"key"),s.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0},e.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.SettingsChanged);return e.registerHandler(a.NotificationId.SettingsChanged,(function(){return!0}),(function(e){t._currentSettings=e.newSettings,n.triggerEvent((function(){return new c(e.newSettings)}))})),r.push(n),r},e.prototype.initializeSettings=function(e){s.ErrorHelpers.verifyParameter(e,"settingsInfo"),s.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1},e.prototype.verifySettingsAreUnlocked=function(){if(this._saveInProgress)throw new s.TableauError(o.ErrorCodes.SettingSaveInProgress,e.ASYNC_SAVE_IN_PROGRESS)},e.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed.",e}();t.SettingsImpl=p},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(7419),o=r(3448),a=r(5136),s=r(1468),u=function(){function e(){}return e.prototype.displayDialogAsync=function(e,t,r){var u=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService"),l=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("notification-service");return new Promise((function(s,c){u.displayDialogAsync(e,t||"",r).then((function(){var e=l.registerHandler(o.NotificationId.ExtensionDialogUpdate,(function(){return!0}),(function(t){if(t.isCloseEvent){if(void 0===t.closePayload)throw new a.TableauError(n.ErrorCodes.InternalError,"closePayload is undefined");s(t.closePayload)}else c(new a.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((function(e){c(e)}))}))},e.prototype.closeDialog=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService").closeDialog(e)},e}();t.UIImpl=u},4252:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(6416),l=r(4164),c=r(1468),p=r(3192),d=r(6132),f=r(5548),y=function(e){function t(t){var r=e.call(this,t)||this;return r._dashboardImpl=t,t.initializeWithPublicInterfaces(),r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"worksheets",{get:function(){return this._dashboardImpl.worksheetsImpl.map((function(e){return new f.Worksheet(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._dashboardImpl.objects.map((function(e){return new p.DashboardObject(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._dashboardImpl.activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._dashboardImpl.activeDashboardName},enumerable:!0,configurable:!0}),t.prototype.setZoneVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.setDashboardObjectVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.getDashboardObjectById=function(e){var t=this._dashboardImpl.getDashboardObjectById(e);return t&&new p.DashboardObject(t)},t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(c.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.DashboardLayoutChanged);e.registerHandler(a.NotificationId.DashboardLayoutChanged,(function(){return!0}),(function(e){var r=t._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);n.triggerEvent((function(){return new u.DashboardLayoutChangedEvent(r)}))})),r.push(n);var i=new s.SingleEventManagerImpl(o.TableauEventType.WorkbookFormattingChanged);return e.registerHandler(a.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(e){i.triggerEvent((function(){return new l.WorkbookFormattingChangedEvent(e)}))})),r.push(i),r},t.prototype.moveAndResizeDashboardObjectsAsync=function(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)},t.prototype.replayAnimationAsync=function(e){return this._dashboardImpl.replayAnimationAsync(e)},t.prototype.getFiltersAsync=function(){return this._dashboardImpl.getFiltersAsync()},t.prototype.applyFilterAsync=function(e,t,r,n){return this._dashboardImpl.applyFilterAsync(e,t,r,n)},t}(d.Sheet);t.Dashboard=y},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4252),i=r(5548),o=function(){function e(e){this._dashboardObjectImpl=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return new n.Dashboard(this._dashboardObjectImpl.dashboardImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._dashboardObjectImpl.type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._dashboardObjectImpl.position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._dashboardObjectImpl.size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheet",{get:function(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._dashboardObjectImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._dashboardObjectImpl.isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._dashboardObjectImpl.isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dashboardObjectImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._dashboardObjectImpl.fieldId},enumerable:!0,configurable:!0}),e}();t.DashboardObject=o},4592:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(864),l=r(1468),c=function(e){function t(t,r){var n=e.call(this)||this;return n.parameterImpl=t,n.initializeEvents(r).forEach((function(e){return n.addNewEventType(e)})),n}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this.parameterImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentValue",{get:function(){return this.parameterImpl.currentValue},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dataType",{get:function(){return this.parameterImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"allowableValues",{get:function(){return this.parameterImpl.allowableValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this.parameterImpl.id},enumerable:!0,configurable:!0}),t.prototype.changeValueAsync=function(e){return this.parameterImpl.changeValueAsync(e)},t.prototype.initializeEvents=function(e){var t=this;s.ErrorHelpers.verifyInternalValue(e,"sheet");var r,n=new Array;try{r=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return n}var i=new s.SingleEventManagerImpl(o.TableauEventType.ParameterChanged);return r.registerHandler(a.NotificationId.ParameterChanged,(function(e){return e===t.parameterImpl.id}),(function(t){i.triggerEvent((function(){return new u.ParameterChangedEvent(t,e)}))})),n.push(i),n},t}(s.EventListenerManager);t.Parameter=c},6132:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(5136),s=r(4592),u=function(e){function t(t){var r=e.call(this)||this;return r._sheetImpl=t,r}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this._sheetImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"sheetType",{get:function(){return this._sheetImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new a.TableauError(o.EmbeddingErrorCodes.ImplementationError,"Size not implemented")},enumerable:!0,configurable:!0}),t.prototype.isValidSize=function(e){var t=e;return void 0!==t.width&&void 0!==t.height},t.prototype.findParameterAsync=function(e){var t=this;return this._sheetImpl.findParameterAsync(e).then((function(e){return new Promise(e?function(r){return r(new s.Parameter(e,t))}:function(e){return e(void 0)})}))},t.prototype.getParametersAsync=function(){var e=this;return this._sheetImpl.getParametersAsync().then((function(t){return t.map((function(t){return new s.Parameter(t,e)}))}))},t}(a.EventListenerManager);t.Sheet=u},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._workbookImpl=e}return e.prototype.getAllDataSourcesAsync=function(){return this._workbookImpl.getAllDataSourcesAsync()},e}();t.Workbook=r},5548:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(5136),l=r(1672),c=r(5572),p=r(3464),d=r(1468),f=r(4252),y=function(e){function t(t){var r=e.call(this,t)||this;return r._worksheetImpl=t,r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){if(null==this._worksheetImpl.parentDashboard)throw new u.TableauError(o.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new f.Dashboard(this._worksheetImpl.parentDashboard)},enumerable:!0,configurable:!0}),t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=u.ApiServiceRegistry.get(d.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new u.SingleEventManagerImpl(a.TableauEventType.MarkSelectionChanged);e.registerHandler(s.NotificationId.SelectedMarksChanged,(function(e){var r=e;return t.visualIdsAreEqual(r,t._worksheetImpl.visualId)}),(function(){return n.triggerEvent((function(){return new c.MarksSelectedEvent(t)}))}));var i=new u.SingleEventManagerImpl(a.TableauEventType.FilterChanged);e.registerHandler(s.NotificationId.FilterChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){i.triggerEvent((function(){return new l.FilterChangedEvent(t,e.fieldName,e.fieldId)}))}));var o=new u.SingleEventManagerImpl(a.TableauEventType.SummaryDataChanged);return e.registerHandler(s.NotificationId.SummaryDataChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){o.triggerEvent((function(){return new p.SummaryDataChangedEvent(t)}))})),r.push(n),r.push(i),r.push(o),r},t.prototype.applyFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyFilterAsync(e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,n)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)},t.prototype.clearFilterAsync=function(e){return this._worksheetImpl.clearFilterAsync(e)},t.prototype.getDataSourcesAsync=function(){return this._worksheetImpl.getDataSourcesAsync()},t.prototype.getFiltersAsync=function(){return this._worksheetImpl.getFiltersAsync()},t.prototype.getSelectedMarksAsync=function(){return this._worksheetImpl.getSelectedMarksAsync()},t.prototype.getHighlightedMarksAsync=function(){return this._worksheetImpl.getHighlightedMarksAsync()},t.prototype.getSummaryDataAsync=function(e){return this._worksheetImpl.getSummaryDataAsync(e)},t.prototype.getSummaryDataReaderAsync=function(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)},t.prototype.getSummaryColumnsInfoAsync=function(){return this._worksheetImpl.getSummaryColumnsInfoAsync()},t.prototype.getUnderlyingDataAsync=function(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)},t.prototype.getUnderlyingTablesAsync=function(){return this._worksheetImpl.getUnderlyingTablesAsync()},t.prototype.getUnderlyingTableDataAsync=function(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)},t.prototype.getUnderlyingTableDataReaderAsync=function(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)},t.prototype.getVisualSpecificationAsync=function(){return this._worksheetImpl.getVisualSpecificationAsync()},t.prototype.clearSelectedMarksAsync=function(){return this._worksheetImpl.clearSelectedMarksAsync()},t.prototype.selectMarksByIDAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.selectMarksByValueAsync=function(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)},t.prototype.selectMarksByIdAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.annotateMarkAsync=function(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)},t.prototype.getAnnotationsAsync=function(){return this._worksheetImpl.getAnnotationsAsync()},t.prototype.removeAnnotationAsync=function(e){return this._worksheetImpl.removeAnnotationAsync(e)},t.prototype.hoverTupleAsync=function(e,t,r){return void 0===r&&(r=!0),this._worksheetImpl.hoverTupleAsync(e,t,r)},t.prototype.selectTuplesAsync=function(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)},t.prototype.getTooltipTextAsync=function(e){return this._worksheetImpl.getTooltipTextAsync(e)},t.prototype.leaveMarkNavigationAsync=function(){return this._worksheetImpl.leaveMarkNavigationAsync()},t.prototype.visualIdsAreEqual=function(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID},t}(r(6132).Sheet);t.Worksheet=y},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dashboard=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return this._dashboard},enumerable:!0,configurable:!0}),e}();t.DashboardContent=r},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(8396),o=r(8012),a=function(){function e(e){this._apiVersion=n.ApiVersion.Instance&&n.ApiVersion.Instance.formattedValue,this._context=n.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=o.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=n.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}return Object.defineProperty(e.prototype,"apiVersion",{get:function(){return this._apiVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this._context},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookFormatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"language",{get:function(){return this._language},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"country",{get:function(){return this._country},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"locale",{get:function(){return this._locale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mode",{get:function(){return this._mode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"operatingSystem",{get:function(){return this._operatingSystem},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tableauVersion",{get:function(){return this._tableauVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"uniqueUserId",{get:function(){return this._uniqueUserId},enumerable:!0,configurable:!0}),e}();t.Environment=a},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.extensionImpl=e,this.extensionImpl=e}return Object.defineProperty(e.prototype,"dashboardContent",{get:function(){return this.extensionImpl.dashboardContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetContent",{get:function(){return this.extensionImpl.worksheetContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"environment",{get:function(){return this.extensionImpl.environment},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"settings",{get:function(){return this.extensionImpl.settings},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ui",{get:function(){return this.extensionImpl.ui},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbook",{get:function(){return this.extensionImpl.workbook},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dashboardObjectId",{get:function(){return this.extensionImpl.extensionZoneId},enumerable:!0,configurable:!0}),e.prototype.initializeAsync=function(e){return this.extensionImpl.initializeAsync(!1,e).then()},e.prototype.initializeDialogAsync=function(){return this.extensionImpl.initializeAsync(!0)},e.prototype.createVizImageAsync=function(e){return this.extensionImpl.createVizImageAsync(e)},e.prototype.setClickThroughAsync=function(e){return this.extensionImpl.setClickThroughAsync(e)},e}();t.Extensions=r},652:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var r=e.call(this)||this;return r._settingsImpl=t,r._settingsImpl.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),t.prototype.erase=function(e){this._settingsImpl.erase(e)},t.prototype.get=function(e){return this._settingsImpl.get(e)},t.prototype.getAll=function(){return this._settingsImpl.getAll()},Object.defineProperty(t.prototype,"isModified",{get:function(){return this._settingsImpl.isModified},enumerable:!0,configurable:!0}),t.prototype.saveAsync=function(){return this._settingsImpl.saveAsync()},t.prototype.set=function(e,t){this._settingsImpl.set(e,t)},t}(r(5136).EventListenerManager);t.Settings=o},1964:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._impl=e}return e.prototype.displayDialogAsync=function(e,t,r){return this._impl.displayDialogAsync(e,t,r)},e.prototype.closeDialog=function(e){this._impl.closeDialog(e)},e}();t.UI=r},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(){}return e.convertToWorkbookFormatting=function(e){return e?{formattingSheets:e.formattingSheets.map((function(e){return{classNameKey:n.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:{fontFamily:e.cssProperties.fontFamily,fontSize:e.cssProperties.fontSize,fontWeight:e.cssProperties.fontWeight,fontStyle:e.cssProperties.fontStyle,textDecoration:e.cssProperties.textDecoration,color:e.cssProperties.color}}}))}:void 0},e}();t.WorkbookFormattingEnvUtil=i},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._worksheet=e}return Object.defineProperty(e.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),e}();t.WorksheetContent=r},6336:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"InitializationService"},enumerable:!0,configurable:!0}),t.prototype.initializeDashboardExtensionsAsync=function(e,t){var r,n=((r={})[o.ParameterId.FunctionName]="initializeDashboardExtensionsAsync",r[o.ParameterId.ExtensionContextMenuIds]=t,r[o.ParameterId.IsExtensionDialog]=e,r);return this.execute(o.VerbId.InitializeExtension,n).then((function(e){return e.result}))},t}(r(5136).ServiceImplBase);t.InitializationServiceImpl=a},5432:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"SettingsService"},enumerable:!0,configurable:!0}),t.prototype.saveSettingsAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="saveSettingsAsync",t[a.ParameterId.SettingsValues]=e,t);return this.execute(a.VerbId.SaveExtensionSettings,r).then((function(e){var t=e.result;if(!t||!t.settingsValues)throw new s.TableauError(o.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))},t}(s.ServiceImplBase);t.SettingsServiceImpl=u},752:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=o.DialogStyle.Window,l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"UIService"},enumerable:!0,configurable:!0}),t.prototype.displayDialogAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="displayDialogAsync",n[a.ParameterId.ExtensionDialogUrl]=e,n[a.ParameterId.ExtensionDialogPayload]=t,n),l=r&&r.height?r.height:400,c=r&&r.width?r.width:600,p=r&&r.dialogStyle?r.dialogStyle:u;if(l<=0||c<=0)throw new s.TableauError(o.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return i[a.ParameterId.ExtensionDialogH]=l,i[a.ParameterId.ExtensionDialogW]=c,s.ErrorHelpers.verifyEnumValue(p,o.DialogStyle,"DialogStyle"),i[a.ParameterId.ExtensionDialogStyle]=s.ExternalToInternalEnumMappings.dialogStyles.convert(p),this.execute(a.VerbId.DisplayDialog,i).then((function(e){switch(e.result){case a.ExtensionDialogResult.DialogAlreadyOpen:throw new s.TableauError(o.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case a.ExtensionDialogResult.InvalidDomain:throw new s.TableauError(o.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))},t.prototype.closeDialog=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="closeDialog",t);return e&&(r[a.ParameterId.ExtensionDialogPayload]=e),this.execute(a.VerbId.CloseDialog,r).then((function(){}))},t.prototype.setClickThroughAsync=function(e,t){var r;if(s.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new s.TableauError(o.ErrorCodes.InternalError,"Extension Id is invalid.");var n=((r={})[a.ParameterId.ExtensionZoneId]=t,r[a.ParameterId.ClickThroughEnabled]=e,r);return this.execute(a.VerbId.SetClickThrough,n).then((function(){}))},t}(s.ServiceImplBase);t.UIServiceImpl=l},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(6336),o=r(5432),a=r(752),s=r(1468);t.registerAllExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new o.SettingsServiceImpl(e,s.ExtensionsRegistryId)),n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new a.UIServiceImpl(e,s.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,s.ExtensionsRegistryId))}},1468:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.PulseLayout=i.PulseLayout,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,n(r(828)),n(r(3432)),n(r(1480)),n(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4744);t.ErrorCodes=n.ErrorCodes,t.ExtensionContext=n.ExtensionContext,t.ExtensionMode=n.ExtensionMode,t.TableauEventType=n.TableauEventType,t.VizImageEncodingType=n.VizImageEncodingType,t.VizImagePaletteType=n.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=n.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=n.VizImageSizeSettingType,t.VizImageSortDirectionType=n.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(268)),n(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,y,h;Object.defineProperty(t,"__esModule",{value:!0}),(h=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",h.Excel="xlsx",(y=t.DeviceType||(t.DeviceType={})).Default="default",y.Desktop="desktop",y.Tablet="tablet",y.Phone="phone",(f=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",f.BrowserNotCapable="browser-not-capable",f.DownloadWorkbookNotAllowed="download-workbook-not-allowed",f.FilterCannotBePerformed="filter-cannot-be-performed",f.IndexOutOfRange="index-out-of-range",f.InternalError="internal-error",f.InvalidCustomViewName="invalid-custom-view-name",f.InvalidDateParameter="invalid-date-parameter",f.invalidFilterFieldNameOrValue="invalid-filter-field-name",f.InvalidParameter="invalid-parameter",f.InvalidSize="invalid-size",f.InvalidSheetType="invalid-sheet-type",f.InvalidSizeBehavior="invalid-size-behavior",f.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",f.InvalidUrl="invalid-url",f.MissingMaxSize="missing-max-size",f.MissingMinSize="missing-min-size",f.MissingMinMaxSize="missing-min-max-size",f.MissingParameter="missing-parameter",f.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",f.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",f.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",f.NotActiveSheet="not-active-sheet",f.NullOrEmptyParameter="null-or-empty-parameter",f.SheetNotInWorkbook="sheet-not-in-workbook",f.StaleDataReference="stale-data-reference",f.UnknownAuthError="unknown-auth-error",f.UnsupportedEventName="unsupported-event-name",f.VizAlreadyInManager="viz-already-in-manager",f.ImplementationError="wrong-implementation",f.NotImplemented="not-implemented",f.EventInitializationError="event-initialization-error",f.IncompatibleVersionError="incompatible-version-error",f.UnknownDialogType="unknown-dialog-type",f.FilterMissingOrNotImplemented="filter-missing-not-implemented",f.StoryPointIdMismatch="storypoint-id-mismatch",(d=t.FileFormats||(t.FileFormats={})).PDF="pdf",d.PNG="png",(p=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",p.Landscape="landscape",(c=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",c.Legal="legal",c.Note="note",c.Folio="folio",c.Tabloid="tabloid",c.Ledger="ledger",c.Statement="statement",c.Executive="executive",c.A3="A3",c.A4="A4",c.A5="A5",c.B4="B4",c.B5="B5",c.Quarto="quarto",c.Unspecified="unspecified",(l=t.PrintScaling||(t.PrintScaling={})).Automatic="automatic",l.Perc25="25%",l.Perc50="50%",l.Perc60="60%",l.Perc75="75%",l.Perc80="80%",l.Perc90="90%",l.Perc100="100%",l.Perc200="200%",l.Perc400="400%",l.AtMost1PageHigh="at-most-1-page-high",l.AtMost2PagesHigh="at-most-2-pages-high",l.AtMost1PageWide="at-most-1-page-wide",l.AtMost2PagesWide="at-most-2-pages-wide",(u=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",u.Axes="axes",u.Filters="filters",u.Sorts="sorts",u.Shelves="shelves",(s=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",s.AskData="askData",s.CustomViews="customViews",s.DataDetails="dataDetails",s.Share="share",s.Subscribe="subscribe",(a=t.Toolbar||(t.Toolbar={})).Top="top",a.Bottom="bottom",a.Hidden="hidden",(o=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",o.Exactly="exactly",o.Range="range",o.AtLeast="atleast",o.AtMost="atmost",(i=t.PulseLayout||(t.PulseLayout={})).Default="default",i.Card="card",i.Ban="ban",(n=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",n.CustomViewRemoved="customviewremoved",n.CustomViewSaved="customviewsaved",n.CustomViewSetDefault="customviewsetdefault",n.EditButtonClicked="editbuttonclicked",n.EditInDesktopButtonClicked="editindesktopbuttonclicked",n.FilterChanged="filterchanged",n.FirstVizSizeKnown="firstvizsizeknown",n.FirstInteractive="firstinteractive",n.CustomMarkContextMenuEvent="custommarkcontextmenu",n.MarkSelectionChanged="markselectionchanged",n.ParameterChanged="parameterchanged",n.ToolbarStateChanged="toolbarstatechanged",n.WorkbookReadyToClose="workbookreadytoclose",n.WorkbookPublished="workbookpublished",n.WorkbookPublishedAs="workbookpublishedas",n.UrlAction="urlaction",n.TabSwitched="tabswitched",n.StoryPointSwitched="storypointswitched",n.VizLoadError="vizloaderror",n.IframeSrcUpdated="iframesrcupdated",n.SummaryDataChanged="summarydatachanged",n.ReadyToReceiveAuthToken="readytoreceiveauthtoken",(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;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter",r.Layout="layout"},3432:(e,t)=>{"use strict";var r,n,i,o,a;Object.defineProperty(t,"__esModule",{value:!0}),(a=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",a.HideEditInDesktopButton="hide-edit-in-desktop-button",a.SuppressDefaultEditBehavior="suppress-default-edit-behavior",a.DisableVersionCheck="disable-version-check",a.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",a.OnFirstVizSizeKnown="onFirstVizSizeKnown",a.OnFirstInteractive="onFirstInteractive",(o=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",o.HideTabs="hide-tabs",o.Toolbar="toolbar",o.InstanceIdToClone="instance-id-to-clone",o.Device="device",o.HideEditButton="hide-edit-button",o.OnEditButtonClicked="onEditButtonClicked",o.OnFilterChanged="onFilterChanged",o.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",o.OnMarkSelectionChanged="onMarkSelectionChanged",o.OnParameterChanged="onParameterChanged",o.OnToolbarStateChanged="onToolbarStateChanged",o.OnUrlAction="onUrlAction",o.OnTabSwitched="onTabSwitched",o.OnCustomViewLoaded="onCustomViewLoaded",o.OnCustomViewRemoved="onCustomViewRemoved",o.OnCustomViewSaved="onCustomViewSaved",o.OnCustomViewSetDefault="onCustomViewSetDefault",o.OnStoryPointSwitched="onStoryPointSwitched",o.OnSummaryDataChanged="onSummaryDataChanged",o.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(n=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",n.VizParameter="viz-parameter",n.CustomParameter="custom-parameter",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,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",(t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){var t,r,n,i,o,a,s,u,l;(l=e.ErrorCodes||(e.ErrorCodes={})).APINotInitialized="api-not-initialized",l.VisibilityError="visibility-error",l.DialogAlreadyOpen="dialog-already-open",l.DialogClosedByUser="dialog-closed-by-user",l.InternalError="internal-error",l.InvalidDomainDialog="invalid-dialog-domain",l.InvalidParameter="invalid-parameter",l.MissingFilter="missing-filter",l.MissingParameter="missing-parameter",l.ServerError="server-error",l.SettingSaveInProgress="setting-save-in-progress",l.UnsupportedEventName="unsupported-event-name",l.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type",(u=e.ExtensionContext||(e.ExtensionContext={})).Desktop="desktop",u.Server="server",(s=e.ExtensionMode||(e.ExtensionMode={})).Authoring="authoring",s.Viewing="viewing",(a=e.TableauEventType||(e.TableauEventType={})).FilterChanged="filter-changed",a.MarkSelectionChanged="mark-selection-changed",a.SummaryDataChanged="summary-data-changed",a.ParameterChanged="parameter-changed",a.SettingsChanged="settings-changed",a.DashboardLayoutChanged="dashboard-layout-changed",a.WorkbookFormattingChanged="workbook-formatting-changed",(o=e.VizImageEncodingType||(e.VizImageEncodingType={})).Discrete="discrete",o.Continuous="continuous",(i=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})).Ascending="ascending",i.Descending="descending",(n=e.VizImagePaletteType||(e.VizImagePaletteType={})).CustomDiverging="custom-diverging",n.CustomSequential="custom-sequential",(r=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})).Fixed="fixed",r.Manual="manual",(t=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={})).Right="right",t.Left="left",t.Center="center"}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:function(e){"use strict";var t,r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var n=r(808);t.AnalyticsObjectType=n.AnalyticsObjectType,t.AnnotationType=n.AnnotationType,t.ClassNameKey=n.ClassNameKey,t.ColumnType=n.ColumnType,t.DashboardLayoutChange=n.DashboardLayoutChange,t.DashboardObjectType=n.DashboardObjectType,t.DashboardObjectVisibilityType=n.DashboardObjectVisibilityType,t.DataType=n.DataType,t.DateRangeType=n.DateRangeType,t.DialogStyle=n.DialogStyle,t.EncodingType=n.EncodingType,t.FieldAggregationType=n.FieldAggregationType,t.FieldRoleType=n.FieldRoleType,t.FilterDomainType=n.FilterDomainType,t.FilterNullOption=n.FilterNullOption,t.FilterType=n.FilterType,t.FilterUpdateType=n.FilterUpdateType,t.HierarchicalLevelSelectionState=n.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=n.IncludeDataValuesOption,t.MarkType=n.MarkType,t.ParameterValueType=n.ParameterValueType,t.PeriodType=n.PeriodType,t.QuickTableCalcType=n.QuickTableCalcType,t.ReplaySpeedType=n.ReplaySpeedType,t.SelectOptions=n.SelectOptions,t.SelectionUpdateType=n.SelectionUpdateType,t.SheetType=n.SheetType,t.SortDirection=n.SortDirection,t.TrendLineModelType=n.TrendLineModelType,t.ZoneVisibilityType=n.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),r(5668),r(5816),r(8824);var i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,n(r(6716)),n(r(1080)),n(r(5824)),n(r(4547)),n(r(2400)),n(r(2496)),n(r(2472)),n(r(552)),n(r(3256)),n(r(7204)),n(r(3760)),n(r(4528)),n(r(3388)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1080),i=function(){function e(){}return e.isSpecial=function(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]},e.parseBoolean=function(e){var t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t},e.parseNumber=function(e){var t=Number(e);return isNaN(t)?this.specialValueIndicator:t},e.parseDate=function(e){var t=new Date(e);return Number.isNaN(t.getTime())?null:t},e.parseDateTime=function(e){var t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r},e.convertValueAsStringToValue=function(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case n.DataType.Bool:return this.parseBoolean(e);case n.DataType.Int:case n.DataType.Float:return this.parseNumber(e);case n.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case n.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case n.DataType.Spatial:case n.DataType.String:default:return e}}},e.convertValueToNativeValue=function(e,t){if(null==e)return null;switch(t){case n.DataType.Bool:case n.DataType.Int:case n.DataType.Float:return"string"==typeof e?null:e;case n.DataType.Date:return this.parseDate(e);case n.DataType.DateTime:return this.parseDateTime(e);case n.DataType.String:return this.isSpecial(e)?null:e;case n.DataType.Spatial:default:return e}},e.convertStringValueToNativeValue=function(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)},e.specialValueIndicator="%null%",e}();t.DataTypeConverter=i},1080:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,y,h,m,g,v,b,I,S,_,T,P,A,E,w,O,D,x,F,C,N,M;Object.defineProperty(t,"__esModule",{value:!0}),(M=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",M.Server="server",M.Unknown="unknown",(N=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",N.Viewing="viewing",N.Unknown="unknown",(C=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",C.Point="point",C.Area="area",(F=t.ColumnType||(t.ColumnType={})).Discrete="discrete",F.Continuous="continuous",F.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",(D=t.DataType||(t.DataType={})).String="string",D.Int="int",D.Float="float",D.Bool="bool",D.Date="date",D.DateTime="date-time",D.Spatial="spatial",D.Unknown="unknown",(O=t.DialogStyle||(t.DialogStyle={})).Window="window",O.Modal="modal",O.Modeless="modeless",(w=t.EncodedDataType||(t.EncodedDataType={})).Number="number",w.String="string",w.Date="date",w.Boolean="boolean",(E=t.ErrorCodes||(t.ErrorCodes={})).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",(A=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",A.Avg="avg",A.Min="min",A.Max="max",A.Stdev="stdev",A.Stdevp="stdevp",A.Var="var",A.Varp="varp",A.Collect="collect",A.Count="count",A.Countd="countd",A.Median="median",A.Attr="attr",A.None="none",A.Year="year",A.Qtr="qtr",A.Month="month",A.Day="day",A.Hour="hour",A.Minute="minute",A.Second="second",A.Week="week",A.Weekday="weekday",A.MonthYear="month-year",A.Mdy="mdy",A.End="end",A.TruncYear="trunc-year",A.TruncQtr="trunc-qtr",A.TruncMonth="trunc-month",A.TruncWeek="trunc-week",A.TruncDay="trunc-day",A.TruncHour="trunc-hour",A.TruncMinute="trunc-minute",A.TruncSecond="trunc-second",A.Quart1="quart1",A.Quart3="quart3",A.Skewness="skewness",A.Kurtosis="kurtosis",A.InOut="in-out",A.User="user",(P=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",P.Measure="measure",P.Unknown="unknown",(T=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",T.All="all",T.Replace="replace",T.Remove="remove",(_=t.SheetType||(t.SheetType={})).Dashboard="dashboard",_.Story="story",_.Worksheet="worksheet",(S=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",S.List="list",S.Range="range",(I=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",I.Quarters="quarters",I.Months="months",I.Weeks="weeks",I.Days="days",I.Hours="hours",I.Minutes="minutes",I.Seconds="seconds",(b=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",b.NonNullValues="nonnullvalues",b.AllValues="allvalues",(v=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",v.Database="database",(g=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",g.Add="select-add",g.Remove="select-remove",(m=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",m.Toggle="select-options-toggle",m.Menu="select-options-menu",m.Range="select-options-range",m.Search="select-options-search",(h=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",h.IncludeNonNull="include-non-null",h.IncludeAll="include-all",(y=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",y.NoneSelected="none-selected",y.SomeSelected="some-selected",y.UnknownSelected="unknown-selected",(f=t.MarkType||(t.MarkType={})).Bar="bar",f.Line="line",f.Area="area",f.Square="square",f.Circle="circle",f.Shape="shape",f.Text="text",f.Map="map",f.Pie="pie",f.GanttBar="gantt-bar",f.Polygon="polygon",f.Heatmap="heatmap",f.VizExtension="viz-extension",(d=t.FilterType||(t.FilterType={})).Categorical="categorical",d.Range="range",d.RelativeDate="relativeDate",d.Hierarchical="hierarchical",(p=t.DateRangeType||(t.DateRangeType={})).Last="last",p.LastN="lastN",p.Next="next",p.NextN="nextN",p.Current="current",p.ToDate="toDate",(c=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",c.InvalidDomain="invalid-domain",c.Success="success",(l=t.ApiShowDataTableSentinel||(t.ApiShowDataTableSentinel={})).SingleTableId="single-table-id-sentinel",l.SingleTableCaption="Single table id sentinel",(u=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",u.FormattedValuesOnly="formatted-values-only",u.NativeAndFormattedValues="native-and-formatted-values",(s=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",s.Legal="legal",s.Note="note",s.Folio="folio",s.Tabloid="tabloid",s.Ledger="ledger",s.Statement="statement",s.Executive="executive",s.A3="a3",s.A4="a4",s.A5="a5",s.B4="b4",s.B5="b5",s.Quarto="quarto",s.Unspecified="unspecified",(a=t.PageOrientation||(t.PageOrientation={})).Printer="printer",a.Portrait="portrait",a.Landscape="landscape",(o=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",o.ScalePercentage="percent",o.ScaleFitPages="fit-pages",(i=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",i.ScalePct400="pct400",i.ScalePct200="pct200",i.ScalePct100="pct100",i.ScalePct90="pct90",i.ScalePct80="pct80",i.ScalePct75="pct75",i.ScalePct60="pct60",i.ScalePct50="pct50",i.ScalePct25="pct25",(n=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",n.FitTwoHigh="fit0x2",n.FitOneWide="fit1x0",n.FitTwoWide="fit2x0",(r=t.EncodingType||(t.EncodingType={})).Color="color",r.Size="size",r.Label="label",r.Detail="detail",r.Tooltip="tooltip",r.Shape="shape",r.Path="path",r.Angle="angle",r.Geometry="geometry",r.Custom="custom"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.ParameterChanged="parameter-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.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.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",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.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.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.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.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.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.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.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.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",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.ClearFilter="clear-filter",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.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.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetTooltipText="get-tooltip-text",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.MoveAndResizeZones="move-and-resize-zones",r.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.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.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,n,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(n||(n={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(3448),o=r(1680),a=r(4020),s=r(7204),u=function(){function e(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}return e.prototype.startListening=function(){var e=this;if(!this.unregisterFunction){var t=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",t,!0),this.unregisterFunction=function(){return e.thisWindow.removeEventListener("message",t,!0)}}},e.prototype.stopListening=function(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)},e.prototype.setInitializeMessageHandler=function(e){this.initializeMessageHandler=e},e.prototype.setCommandResponseMessageHandler=function(e){this.commandResponseMessageHandler=e},e.prototype.setCommandMessageHandler=function(e){this.commandMessageHandler=e},e.prototype.setNotificationMessageHandler=function(e){this.notificationMessageHandler=e},e.prototype.setHandshakeMessageHandler=function(e){this.handshakeMessageHandler=e},e.prototype.prepareInitializationMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)},e.prototype.prepareCommandMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)},e.prototype.prepareCommandResponseMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)},e.prototype.prepareNotificationMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)},e.prototype.prepareAckMessage=function(){var e={msgGuid:n.raw(),msgType:s.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)},e.prototype.prepareMessage=function(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new o.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)},e.prototype.onMessageReceived=function(e){if((!this.otherWindow||e.source===this.otherWindow)&&e.data){var t=e.data;if(a.isMessage(t))switch(t.msgType){case s.MessageType.Initialize:if(!a.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case s.MessageType.CommandResponse:if(!a.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case s.MessageType.Command:if(!a.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case s.MessageType.Notification:if(!a.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case s.MessageType.Handshake:if(!a.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}},e.prototype.setOtherWindow=function(e){this.otherWindow=e},e.prototype.setOtherWindowOrigin=function(e){this.otherWindowOrigin=e},e}();t.CrossFrameMessenger=u},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r){this._message=e,this._target=t,this._origin=r}return Object.defineProperty(e.prototype,"messageGuid",{get:function(){return this._message.msgGuid},enumerable:!0,configurable:!0}),e.prototype.send=function(){return this._target.postMessage(this._message,this._origin),this},e}();t.CrossFramePreparedMessage=r},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(5824),o=r(7204),a=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function s(e){if(!e)return!1;var t=e;return!(!(t&&t.msgGuid&&t.msgType)||!n.isGuid(t.msgGuid)||"string"!=typeof t.msgType||[o.MessageType.Command,o.MessageType.CommandResponse,o.MessageType.Initialize,o.MessageType.Notification,o.MessageType.Handshake].indexOf(t.msgType)<0)}function u(e){if(!e)return!1;var t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=s,t.isVersion=u,t.isInitMessage=function(e){if(!s(e))return!1;var t=e;return!!(t.msgType===o.MessageType.Initialize&&t.apiVersion&&u(t.apiVersion)&&t.crossFrameVersion&&u(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.CommandResponse||!n.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Notification||!t.data&&!a.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!s(e)&&e.msgType===o.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},9220:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.upgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.downgradeExecuteReturn=function(e){return e},e.prototype.downgradeNotification=function(e){return e},e}();t.IdentityVersionConverter=r},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=n,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error("Cannot convert between external version "+this._externalMajorVersion+" and "+this._platformMajorVersion)}return e.fromData=function(e,t,r,n,i){return new this(e.major,t.major,r,n,i)},e.prototype.upgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._upgradeExecuteTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(9220),i=r(2320),o=r(720);function a(e,t){return e.major===t.major&&e.minor===t.minor}function s(e,t,r,o,s){var l=e.major,c=e.minor,p=t.major;if(l>p)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+p);if(a(e,t))return new n.IdentityVersionConverter;var d=u(l,p,c,r),f=u(l,p,c,o),y=u(l,p,c,s);return f.reverse(),y.reverse(),i.StackingVersionConverter.fromData(e,t,d,f,y)}function u(e,t,r,n){for(var i=[],o=e;o<=t;o++)if(o in n)for(var a=o===e?r:0,s=l(Object.keys(n[o])),u=a;u<=s;u++)u in n[o]&&i.push.apply(i,n[o][u]);return i}function l(e){return e.map((function(e){return Number(e)})).reduce((function(e,t){return e>t?e:t}))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5824);t.DowngradeWorksheetNames=function(e){var t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((function(e){e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===n.NotificationId.SelectedMarksChanged){var t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.downgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.upgradeExecuteReturn=function(e,t,r){return e},e.prototype.upgradeNotification=function(e){return e},e}();t.ExternalIdentityVersionConverter=r},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=n,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error("Cannot convert between external version "+this._externalVersion.major+"\n and "+this._platformVersion.major)}return e.prototype.downgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._downgradeExecuteCallTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3760),i=r(4528),o=r(5768),a=r(2088);function s(e,t,r,a,s){var l=e.major,c=t.major,p=t.minor;if(l>c)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+c);if(l{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);function i(e){void 0!==e&&void 0!==e.dataTable&&Array.isArray(e.dataTable)&&e.dataTable.forEach((function(t){t.forEach((function(t,r){var i=t.value;null!==i&&(t.value=n.DataTypeConverter.convertValueAsStringToValue(i,e.headers[r].dataType))}))}))}function o(e,t){if(t[n.ParameterId.LogicalTableId]!==n.ApiShowDataTableSentinel.SingleTableId)throw new Error("Invalid logical table id passed to "+e+".")}t.UpgradeDataTableTypes=function(e,t,r){if(!e)return e;var n=e.result;if(void 0!==n.data&&void 0!==n.isSummary)return i(n.data),e;var o=e.result;return void 0!==o.data&&Array.isArray(o.data)?(o.data.forEach((function(e){i(e)})),e):e},t.DowngradeUnderlyingTableDataAsync=function(e,t){return e===n.VerbId.GetUnderlyingTableData&&(o(e,t),e=n.VerbId.GetUnderlyingData),{verb:e,parameters:t}},t.DowngradeLogicalTableDataAsync=function(e,t){return e===n.VerbId.GetLogicalTableData&&(o(e,t),e=n.VerbId.GetDataSourceData),{verb:e,parameters:t}},t.UpgradeDataTableRowsAndColumns=function(e,t,r){return function(e){return e===n.VerbId.GetDataSummaryData}(t)&&r[n.ParameterId.MaxRows]&&(e=function(e,t){var r=e.result;return r.data&&Array.isArray(r.data.dataTable)?(t>0&&t{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,n(r(5184));var o=r(8540);t.CrossFrameDispatcher=o.CrossFrameDispatcher;var a=r(8340);t.DataSource=a.DataSource;var s=r(1044);t.ExternalToInternalEnumMappings=s.ExternalToInternalEnumMappings;var u=r(6557);t.InternalToExternalEnumMappings=u.InternalToExternalEnumMappings;var l=r(2680);t.EventListenerManager=l.EventListenerManager;var c=r(1072);t.Field=c.Field;var p=r(2520);t.CustomViewImpl=p.CustomViewImpl;var d=r(1940);t.DashboardImpl=d.DashboardImpl;var f=r(6488);t.DashboardObjectImpl=f.DashboardObjectImpl;var y=r(2180);t.DataSourceImpl=y.DataSourceImpl;var h=r(8552);t.ParameterImpl=h.ParameterImpl;var m=r(8332);t.SheetImpl=m.SheetImpl;var g=r(1116);t.SheetInfoImpl=g.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var b=r(6804);t.StoryImpl=b.StoryImpl;var I=r(2608);t.StoryPointImpl=I.StoryPointImpl;var S=r(6068);t.StoryPointInfoImpl=S.StoryPointInfoImpl;var _=r(3044);t.WorkbookImpl=_.WorkbookImpl;var T=r(6500);t.WorksheetImpl=T.WorksheetImpl;var P=r(3987);t.Point=P.Point,n(r(8672)),n(r(3008));var A=r(1832);t.ClientInfoServiceImpl=A.ClientInfoServiceImpl;var E=r(1288);t.NotificationServiceImpl=E.NotificationServiceImpl;var w=r(6428);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var O=r(1776);t.ServiceImplBase=O.ServiceImplBase;var D=r(4109);t.SizeServiceImpl=D.SizeServiceImpl;var x=r(2248);t.StoryActivationServiceImpl=x.StoryActivationServiceImpl;var F=r(6664);t.TableauError=F.TableauError;var C=r(1724);t.Deferred=C.Deferred;var N=r(7480);t.ErrorHelpers=N.ErrorHelpers;var M=r(5044);t.ExportHelpers=M.ExportHelpers;var k=r(2780);t.SheetUtils=k.SheetUtils;var R=r(1576);t.VersionNumber=R.VersionNumber;var V=r(8648);t.VersionedExternalApiDispatcher=V.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1576),i=function(){function e(){}return Object.defineProperty(e,"Instance",{get:function(){return e._instance},enumerable:!0,configurable:!0}),e.SetVersionNumber=function(t,r){e._instance=new n.VersionNumber(t,r)},e}();t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._connectionInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._connectionInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._connectionInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"serverURI",{get:function(){return this._connectionInfo.serverURI},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._connectionInfo.type},enumerable:!0,configurable:!0}),e}();t.ConnectionSummary=r},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise((function(o,a){var s;(s=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener)||a("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");var u=new n.CrossFrameMessenger(e,s,"*"),l=u.prepareInitializationMessage(t,n.MESSAGING_VERSION,r);u.setCommandResponseMessageHandler((function(e){e.commandGuid===l.messageGuid&&o((function(){return new i.CrossFrameDispatcher(u)}))})),u.startListening(),l.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}return e.prototype.execute=function(e,t){var r=this,n=this._messenger.prepareCommandMessage(e,t),i=new Promise((function(e,t){r._pendingPromises[n.messageGuid]={resolve:e,reject:t}}));return n.send(),i},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e.prototype.onCommandResponse=function(e){if(!(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)){var t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}},e.prototype.onNotification=function(e){for(var t=0,r=this._notificationHandlers;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dataSourceImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._dataSourceImpl.fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceImpl.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceImpl.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceImpl.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceImpl.publishedUrl()},e.prototype.refreshAsync=function(){return this._dataSourceImpl.refreshAsync()},e.prototype.getActiveTablesAsync=function(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()},e.prototype.getConnectionSummariesAsync=function(){return this._dataSourceImpl.getConnectionSummariesAsync()},e.prototype.getUnderlyingDataAsync=function(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)},e.prototype.getLogicalTablesAsync=function(){return this._dataSourceImpl.getLogicalTablesAsync()},e.prototype.getLogicalTableDataAsync=function(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)},e}();t.DataSource=r},1044:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d;Object.defineProperty(t,"__esModule",{value:!0});var f=r(7419),y=r(3448),h=r(5520),m=function(){function e(){}return e.filterDomainType=new h.EnumConverter(((n={})[f.FilterDomainType.Relevant]=y.FilterDomainType.Relevant,n[f.FilterDomainType.Database]=y.FilterDomainType.Database,n)),e.nullOptions=new h.EnumConverter(((i={})[f.FilterNullOption.AllValues]=y.FilterNullOption.AllValues,i[f.FilterNullOption.NonNullValues]=y.FilterNullOption.NonNullValues,i[f.FilterNullOption.NullValues]=y.FilterNullOption.NullValues,i)),e.filterUpdateType=new h.EnumConverter(((o={})[f.FilterUpdateType.Add]=y.FilterUpdateType.Add,o[f.FilterUpdateType.All]=y.FilterUpdateType.All,o[f.FilterUpdateType.Remove]=y.FilterUpdateType.Remove,o[f.FilterUpdateType.Replace]=y.FilterUpdateType.Replace,o)),e.setVisibilityType=new h.EnumConverter(((a={})[f.ZoneVisibilityType.Show]=!0,a[f.ZoneVisibilityType.Hide]=!1,a)),e.setReplaySpeedType=new h.EnumConverter(((s={})[f.ReplaySpeedType.Slow]=2,s[f.ReplaySpeedType.Normal]=1,s[f.ReplaySpeedType.Fast]=.5,s)),e.sheetType=new h.EnumConverter(((u={})[f.SheetType.Dashboard]=y.SheetType.Dashboard,u[f.SheetType.Worksheet]=y.SheetType.Worksheet,u[f.SheetType.Story]=y.SheetType.Story,u)),e.showDataTableFormatType=new h.EnumConverter(((l={})[f.IncludeDataValuesOption.AllValues]=y.ApiShowDataTableFormat.NativeAndFormattedValues,l[f.IncludeDataValuesOption.OnlyNativeValues]=y.ApiShowDataTableFormat.NativeValuesOnly,l[f.IncludeDataValuesOption.OnlyFormattedValues]=y.ApiShowDataTableFormat.FormattedValuesOnly,l)),e.periodType=new h.EnumConverter(((c={})[f.PeriodType.Years]=y.DateStepPeriod.Years,c[f.PeriodType.Quarters]=y.DateStepPeriod.Quarters,c[f.PeriodType.Months]=y.DateStepPeriod.Months,c[f.PeriodType.Weeks]=y.DateStepPeriod.Weeks,c[f.PeriodType.Days]=y.DateStepPeriod.Days,c[f.PeriodType.Hours]=y.DateStepPeriod.Hours,c[f.PeriodType.Minutes]=y.DateStepPeriod.Minutes,c[f.PeriodType.Seconds]=y.DateStepPeriod.Seconds,c)),e.dateRangeType=new h.EnumConverter(((p={})[f.DateRangeType.Last]=y.DateRangeType.Last,p[f.DateRangeType.LastN]=y.DateRangeType.LastN,p[f.DateRangeType.Next]=y.DateRangeType.Next,p[f.DateRangeType.NextN]=y.DateRangeType.NextN,p[f.DateRangeType.Current]=y.DateRangeType.Current,p[f.DateRangeType.ToDate]=y.DateRangeType.ToDate,p)),e.dialogStyles=new h.EnumConverter(((d={})[f.DialogStyle.Window]=y.DialogStyle.Window,d[f.DialogStyle.Modal]=y.DialogStyle.Modal,d[f.DialogStyle.Modeless]=y.DialogStyle.Modeless,d)),e}();t.ExternalToInternalEnumMappings=m},6557:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d,f,y,h,m,g,v,b,I;Object.defineProperty(t,"__esModule",{value:!0});var S=r(7419),_=r(3448),T=r(5520),P=function(){function e(){}return e.extensionContext=new T.EnumConverter(((n={})[_.ExtensionContext.Desktop]=S.ExtensionContext.Desktop,n[_.ExtensionContext.Server]=S.ExtensionContext.Server,n)),e.extensionMode=new T.EnumConverter(((i={})[_.ExtensionMode.Authoring]=S.ExtensionMode.Authoring,i[_.ExtensionMode.Viewing]=S.ExtensionMode.Viewing,i)),e.columnType=new T.EnumConverter(((o={})[_.ColumnType.Continuous]=S.ColumnType.Continuous,o[_.ColumnType.Discrete]=S.ColumnType.Discrete,o[_.ColumnType.Unknown]=S.ColumnType.Unknown,o)),e.fieldAggregationType=new T.EnumConverter(((a={})[_.FieldAggregationType.Attr]=S.FieldAggregationType.Attr,a[_.FieldAggregationType.Avg]=S.FieldAggregationType.Avg,a[_.FieldAggregationType.Collect]=S.FieldAggregationType.Collect,a[_.FieldAggregationType.Count]=S.FieldAggregationType.Count,a[_.FieldAggregationType.Countd]=S.FieldAggregationType.Countd,a[_.FieldAggregationType.Day]=S.FieldAggregationType.Day,a[_.FieldAggregationType.End]=S.FieldAggregationType.End,a[_.FieldAggregationType.Hour]=S.FieldAggregationType.Hour,a[_.FieldAggregationType.InOut]=S.FieldAggregationType.InOut,a[_.FieldAggregationType.Kurtosis]=S.FieldAggregationType.Kurtosis,a[_.FieldAggregationType.Max]=S.FieldAggregationType.Max,a[_.FieldAggregationType.Mdy]=S.FieldAggregationType.Mdy,a[_.FieldAggregationType.Median]=S.FieldAggregationType.Median,a[_.FieldAggregationType.Min]=S.FieldAggregationType.Min,a[_.FieldAggregationType.Minute]=S.FieldAggregationType.Minute,a[_.FieldAggregationType.MonthYear]=S.FieldAggregationType.MonthYear,a[_.FieldAggregationType.None]=S.FieldAggregationType.None,a[_.FieldAggregationType.Qtr]=S.FieldAggregationType.Qtr,a[_.FieldAggregationType.Quart1]=S.FieldAggregationType.Quart1,a[_.FieldAggregationType.Quart3]=S.FieldAggregationType.Quart3,a[_.FieldAggregationType.Second]=S.FieldAggregationType.Second,a[_.FieldAggregationType.Skewness]=S.FieldAggregationType.Skewness,a[_.FieldAggregationType.Stdev]=S.FieldAggregationType.Stdev,a[_.FieldAggregationType.Stdevp]=S.FieldAggregationType.Stdevp,a[_.FieldAggregationType.Sum]=S.FieldAggregationType.Sum,a[_.FieldAggregationType.TruncDay]=S.FieldAggregationType.TruncDay,a[_.FieldAggregationType.TruncHour]=S.FieldAggregationType.TruncHour,a[_.FieldAggregationType.TruncMinute]=S.FieldAggregationType.TruncMinute,a[_.FieldAggregationType.TruncMonth]=S.FieldAggregationType.TruncMonth,a[_.FieldAggregationType.TruncQtr]=S.FieldAggregationType.TruncQtr,a[_.FieldAggregationType.TruncSecond]=S.FieldAggregationType.TruncSecond,a[_.FieldAggregationType.TruncWeek]=S.FieldAggregationType.TruncWeek,a[_.FieldAggregationType.TruncYear]=S.FieldAggregationType.TruncYear,a[_.FieldAggregationType.User]=S.FieldAggregationType.User,a[_.FieldAggregationType.Var]=S.FieldAggregationType.Var,a[_.FieldAggregationType.Varp]=S.FieldAggregationType.Varp,a[_.FieldAggregationType.Week]=S.FieldAggregationType.Week,a[_.FieldAggregationType.Weekday]=S.FieldAggregationType.Weekday,a[_.FieldAggregationType.Year]=S.FieldAggregationType.Year,a)),e.fieldRoleType=new T.EnumConverter(((s={})[_.FieldRoleType.Dimension]=S.FieldRoleType.Dimension,s[_.FieldRoleType.Measure]=S.FieldRoleType.Measure,s[_.FieldRoleType.Unknown]=S.FieldRoleType.Unknown,s)),e.sheetType=new T.EnumConverter(((u={})[_.SheetType.Dashboard]=S.SheetType.Dashboard,u[_.SheetType.Story]=S.SheetType.Story,u[_.SheetType.Worksheet]=S.SheetType.Worksheet,u)),e.dashboardObjectType=new T.EnumConverter(((l={})[_.DashboardObjectType.Extension]=S.DashboardObjectType.Extension,l[_.DashboardObjectType.Blank]=S.DashboardObjectType.Blank,l[_.DashboardObjectType.Image]=S.DashboardObjectType.Image,l[_.DashboardObjectType.Legend]=S.DashboardObjectType.Legend,l[_.DashboardObjectType.PageFilter]=S.DashboardObjectType.PageFilter,l[_.DashboardObjectType.ParameterControl]=S.DashboardObjectType.ParameterControl,l[_.DashboardObjectType.QuickFilter]=S.DashboardObjectType.QuickFilter,l[_.DashboardObjectType.Text]=S.DashboardObjectType.Text,l[_.DashboardObjectType.Title]=S.DashboardObjectType.Title,l[_.DashboardObjectType.WebPage]=S.DashboardObjectType.WebPage,l[_.DashboardObjectType.Worksheet]=S.DashboardObjectType.Worksheet,l)),e.dataType=new T.EnumConverter(((c={})[_.DataType.Bool]=S.DataType.Bool,c[_.DataType.Date]=S.DataType.Date,c[_.DataType.DateTime]=S.DataType.DateTime,c[_.DataType.Float]=S.DataType.Float,c[_.DataType.Int]=S.DataType.Int,c[_.DataType.Spatial]=S.DataType.Spatial,c[_.DataType.String]=S.DataType.String,c)),e.filterUpdateType=new T.EnumConverter(((p={})[_.FilterUpdateType.Add]=S.FilterUpdateType.Add,p[_.FilterUpdateType.All]=S.FilterUpdateType.All,p[_.FilterUpdateType.Remove]=S.FilterUpdateType.Remove,p[_.FilterUpdateType.Replace]=S.FilterUpdateType.Replace,p)),e.allowableValues=new T.EnumConverter(((d={})[_.DomainRestrictionType.All]=S.ParameterValueType.All,d[_.DomainRestrictionType.List]=S.ParameterValueType.List,d[_.DomainRestrictionType.Range]=S.ParameterValueType.Range,d)),e.dateStepPeriod=new T.EnumConverter(((f={})[_.DateStepPeriod.Years]=S.PeriodType.Years,f[_.DateStepPeriod.Quarters]=S.PeriodType.Quarters,f[_.DateStepPeriod.Months]=S.PeriodType.Months,f[_.DateStepPeriod.Weeks]=S.PeriodType.Weeks,f[_.DateStepPeriod.Days]=S.PeriodType.Days,f[_.DateStepPeriod.Hours]=S.PeriodType.Hours,f[_.DateStepPeriod.Minutes]=S.PeriodType.Minutes,f[_.DateStepPeriod.Seconds]=S.PeriodType.Seconds,f)),e.dateRangeType=new T.EnumConverter(((y={})[_.DateRangeType.Current]=S.DateRangeType.Current,y[_.DateRangeType.Last]=S.DateRangeType.Last,y[_.DateRangeType.LastN]=S.DateRangeType.LastN,y[_.DateRangeType.Next]=S.DateRangeType.Next,y[_.DateRangeType.NextN]=S.DateRangeType.NextN,y[_.DateRangeType.ToDate]=S.DateRangeType.ToDate,y)),e.errorCode=new T.EnumConverter(((h={})[_.ErrorCodes.INITIALIZATION_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.INTERNAL_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.MISSING_ENUM_MAPPING]=S.ErrorCodes.InternalError,h[_.ErrorCodes.MISSING_PARAMETER]=S.ErrorCodes.InternalError,h[_.ErrorCodes.PERMISSION_DENIED]=S.ErrorCodes.InternalError,h[_.ErrorCodes.PRES_MODEL_PARSING_ERROR]=S.ErrorCodes.InternalError,h[_.ErrorCodes.UNKNOWN_VERB_ID]=S.ErrorCodes.InternalError,h[_.ErrorCodes.VERSION_NOT_CONFIGURED]=S.ErrorCodes.APINotInitialized,h[_.ErrorCodes.VISIBILITY_ERROR]=S.ErrorCodes.VisibilityError,h),S.ErrorCodes.InternalError),e.filterType=new T.EnumConverter(((m={})[_.FilterType.Categorical]=S.FilterType.Categorical,m[_.FilterType.Range]=S.FilterType.Range,m[_.FilterType.RelativeDate]=S.FilterType.RelativeDate,m[_.FilterType.Hierarchical]=S.FilterType.Hierarchical,m)),e.classNameKey=new T.EnumConverter(((g={})["tableau-dashboard-title"]=S.ClassNameKey.DashboardTitle,g["tableau-story-title"]=S.ClassNameKey.StoryTitle,g["tableau-tooltip"]=S.ClassNameKey.Tooltip,g["tableau-worksheet"]=S.ClassNameKey.Worksheet,g["tableau-worksheet-title"]=S.ClassNameKey.WorksheetTitle,g["dashboard-title"]=S.ClassNameKey.DashboardTitle,g["story-title"]=S.ClassNameKey.StoryTitle,g.tooltip=S.ClassNameKey.Tooltip,g.worksheet=S.ClassNameKey.Worksheet,g["worksheet-title"]=S.ClassNameKey.WorksheetTitle,g)),e.hierarchicalLevelSelectionState=new T.EnumConverter(((v={})[_.HierarchicalLevelSelectionState.AllSelected]=S.HierarchicalLevelSelectionState.AllSelected,v[_.HierarchicalLevelSelectionState.NoneSelected]=S.HierarchicalLevelSelectionState.NoneSelected,v[_.HierarchicalLevelSelectionState.SomeSelected]=S.HierarchicalLevelSelectionState.SomeSelected,v[_.HierarchicalLevelSelectionState.UnknownSelected]=S.HierarchicalLevelSelectionState.UnknownSelected,v)),e.annotationType=new T.EnumConverter(((b={})[_.AnnotateEnum.Area]=S.AnnotationType.Area,b[_.AnnotateEnum.Mark]=S.AnnotationType.Mark,b[_.AnnotateEnum.Point]=S.AnnotationType.Point,b)),e.markType=new T.EnumConverter(((I={})[_.MarkType.Area]=S.MarkType.Area,I[_.MarkType.Bar]=S.MarkType.Bar,I[_.MarkType.Circle]=S.MarkType.Circle,I[_.MarkType.GanttBar]=S.MarkType.GanttBar,I[_.MarkType.Heatmap]=S.MarkType.Heatmap,I[_.MarkType.Line]=S.MarkType.Line,I[_.MarkType.Map]=S.MarkType.Map,I[_.MarkType.Pie]=S.MarkType.Pie,I[_.MarkType.Polygon]=S.MarkType.Polygon,I[_.MarkType.Shape]=S.MarkType.Shape,I[_.MarkType.Square]=S.MarkType.Square,I[_.MarkType.Text]=S.MarkType.Text,I[_.MarkType.VizExtension]=S.MarkType.VizExtension,I)),e}();t.InternalToExternalEnumMappings=P},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(){this._eventListenerManagers={}}return e.prototype.addEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot add event, unsupported event type: "+e);return this._eventListenerManagers[e].addEventListener(t)},e.prototype.removeEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot remove event, unsupported event type: "+e);return this._eventListenerManagers[e].removeEventListener(t)},e.prototype.addNewEventType=function(e){this._eventListenerManagers[e.eventType]=e},e}();t.EventListenerManager=o},1072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._fieldImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldImpl.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._fieldImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return this._fieldImpl.aggregation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){return this._fieldImpl.dataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return this._fieldImpl.role},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){return this._fieldImpl.columnType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldImpl.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldImpl.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldImpl.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGeospatial",{get:function(){return this._fieldImpl.isGeospatial},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldImpl.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldImpl.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.Field=r},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}return Object.defineProperty(e.prototype,"luid",{get:function(){return this._luid},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared},set:function(e){this._shared=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isDefault",{get:function(){return this._isDefault},set:function(e){this._isDefault=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ownerName",{get:function(){return this._ownerName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){return n.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)},e}();t.CustomViewImpl=i},1940:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(6557),l=r(3987),c=r(3008),p=r(6664),d=r(7480),f=r(6488),y=r(8332),h=r(1116),m=r(6500),g=function(e){function t(t,r,n,i,o,a){void 0===a&&(a=0);var s=e.call(this,t,i)||this;return s._zones=r,s._sheetPath=n,s._parentStoryPointImpl=o,s._activeDashboardObjectId=a,s}return i(t,e),Object.defineProperty(t.prototype,"worksheetsImpl",{get:function(){return this._worksheetsImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._objects},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._sheetPath.sheetName},enumerable:!0,configurable:!0}),t.prototype.initializeWithPublicInterfaces=function(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(var e=0,t=this._zones;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o,a,s,u,l){this._dashboardImpl=e,this._type=t,this._position=r,this._size=n,this._worksheetImpl=i,this._name=o,this._isFloating=a,this._isVisible=s,this._id=u,this._fieldId=l}return Object.defineProperty(e.prototype,"dashboardImpl",{get:function(){return this._dashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetImpl",{get:function(){return this._worksheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),e}();t.DashboardObjectImpl=r},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(716),o=r(1072),a=r(624),s=r(3008),u=r(7603),l=r(7480),c=r(5288),p=function(){function e(e,t){var r=this;this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((function(e){var t=new c.FieldImpl(e,r);return new o.Field(t)}))}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceInfo.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceInfo.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceInfo.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceInfo.publishedUrl},e.prototype.getMaxPageRowLimit=function(){return 1e4},e.prototype.refreshAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)},e.prototype.getConnectionSummariesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new i.ConnectionSummary(e)}))}))},e.prototype.getActiveTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new u.TableSummary(e)}))}))},e.prototype.getUnderlyingDataAsync=function(e){return e=e||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataAsync=function(e,t){return t=t||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return r=r||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.initializeWithPublicInterfaces=function(e){l.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((function(t){var r=new c.FieldImpl(t,e);return new o.Field(r)}))},e.prototype.getLogicalTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((function(e){return e.map((function(e){return new a.LogicalTable(e)}))}))},e}();t.DataSourceImpl=p},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6557),a=function(){function e(e,t){this._fieldInfo=e,this._parentDataSource=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldInfo.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){var e;return null!=(e=this._fieldInfo.dataType)?e:n.DataType.Unknown},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return o.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return o.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){var e=this._fieldInfo.columnType||i.ColumnType.Unknown;return o.InternalToExternalEnumMappings.columnType.convert(e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldInfo.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldInfo.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldInfo.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGeospatial",{get:function(){return this._fieldInfo.isGeospatial},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldInfo.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldInfo.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.FieldImpl=a},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6557),o=r(3008),a=r(8052),s=r(7480),u=r(1172),l=function(){function e(e,t){this._registryId=t,this.setParameterInfo(e)}return Object.defineProperty(e.prototype,"name",{get:function(){return this._parameterInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentValue",{get:function(){return a.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._globalFieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allowableValues",{get:function(){return this._allowableValues},enumerable:!0,configurable:!0}),e.prototype.changeValueAsync=function(e){var t=this;s.ErrorHelpers.verifyParameter(e,"newValue");var r=u.Param.serializeParameterValue(e);return o.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,r).then((function(e){return t.setParameterInfo(e),t.currentValue}))},e.prototype.setParameterInfo=function(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;var t,r,o,s,u,l=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);l===n.ParameterValueType.List?t=(e.allowableValues||[]).map((function(t){return a.DataValueFactory.MakeParameterDataValue(t,e.dataType)})):l===n.ParameterValueType.Range&&(r=e.minValue&&a.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&a.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),s=e.stepSize,u=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:l,allowableValues:t,minValue:r,maxValue:o,stepSize:s,dateStepPeriod:u}},e}();t.ParameterImpl=l},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3008),o=r(6664),a=r(7480),s=r(1172),u=r(2780),l=function(){function e(e,t){this._sheetInfoImpl=e,this._registryId=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._sheetInfoImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetInfoImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return this._sheetInfoImpl.sheetPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._sheetInfoImpl.sheetSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hidden",{get:function(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"active not implemented")},set:function(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"index not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"url not implemented")},enumerable:!0,configurable:!0}),e.prototype.getSheetSize=function(){if(!u.SheetUtils.isValidSheetSize(this.size))throw new o.TableauError(n.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size},e.prototype.findParameterAsync=function(e){return a.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)},e.prototype.getParametersAsync=function(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)},e.prototype.changeSizeAsync=function(e){var t=this,r=new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw r;var a=this.normalizeSheetSize(e),s=a.behavior===n.SheetSizeBehavior.Automatic;if(!s&&!a.minSize&&!a.maxSize)throw r;if(!s&&this.sheetType===n.SheetType.Worksheet)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===a.behavior)return Promise.resolve(e);var l=this.processNewSize(a);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,l).then((function(){return i.ApiServiceRegistry.get(t._registryId).getService("client-info-service").getClientInfoAsync().then((function(e){var r=e.publishedSheets.find((function(e){return e.name===t.name}));if(!r)throw new o.TableauError(n.SharedErrorCodes.InternalError,"Can't find sheet with name "+t.name);var i=u.SheetUtils.getSheetSizeFromSizeConstraints(r.sizeConstraint);return t._sheetInfoImpl.sheetSize=i,i}))}))},e.prototype.normalizeSheetSize=function(t){var r=t.behavior;return a.ErrorHelpers.verifyEnumValue(r,n.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:r,minSize:e.parseDimensions(t.minSize),maxSize:e.parseDimensions(t.maxSize)}},e.prototype.processNewSize=function(e){var t,r,i,a,u=e.behavior,l=e.minSize,c=e.maxSize,p=!s.Param.isNullOrUndefined(null===(t=l)||void 0===t?void 0:t.width),d=!s.Param.isNullOrUndefined(null===(r=l)||void 0===r?void 0:r.height),f=!s.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),y=!s.Param.isNullOrUndefined(null===(a=c)||void 0===a?void 0:a.height),h=p&&d,m=f&&y;switch(u){case n.SheetSizeBehavior.Automatic:return{behavior:u};case n.SheetSizeBehavior.AtMost:if(!c||!m)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");if((v={width:c.width,height:c.height}).width<0||v.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,maxSize:v};case n.SheetSizeBehavior.AtLeast:if(!l||!h)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");if((g={width:l.width,height:l.height}).width<0||g.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,minSize:g};case n.SheetSizeBehavior.Range:if(!(l&&c&&h&&m))throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");var g={width:l.width,height:l.height},v={width:c.width,height:c.height};if(g.width<0||g.height<0||v.width<0||v.height<0||g.width>v.width||g.height>v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:u,minSize:g,maxSize:v};case n.SheetSizeBehavior.Exactly:if(l&&c){if(h&&m){if(g={width:l.width,height:l.height},v={width:c.width,height:c.height},g.width!==v.width||g.height!==v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:u,minSize:g,maxSize:v}}if(h)return{behavior:u,minSize:g={width:l.width,height:l.height},maxSize:g};if(m)return{behavior:u,minSize:v={width:c.width,height:c.height},maxSize:v}}throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new o.TableauError(n.SharedErrorCodes.InternalError,"Unsupported sheet size behavior: "+u)}},e.parseDimensions=function(e){var t={width:void 0,height:void 0};if(!e)return t;var r=s.Param.tryParseNumber(e.width),n=r.success,i=r.parsed,o=s.Param.tryParseNumber(e.height),a=o.success,u=o.parsed;return n&&a?{width:i,height:u}:n?{width:i}:a?{height:u}:t},e}();t.SheetImpl=l},1116:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e,t,r,n,i,o,a){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=n,this._isActive=i,this._isHidden=o,this._url=a}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetSize",{get:function(){return this._sheetSize},set:function(e){this._sheetSize=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return{sheetName:this.name,isDashboard:this.sheetType===n.SheetType.Dashboard}},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isActive",{get:function(){return this._isActive},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{set:function(e){this._isActive=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e}();t.SheetInfoImpl=i},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._eventType=e,this._handlers=[]}return Object.defineProperty(e.prototype,"eventType",{get:function(){return this._eventType},enumerable:!0,configurable:!0}),e.prototype.addEventListener=function(e){var t=this;return this._handlers.push(e),function(){return t.removeEventListener(e)}},e.prototype.removeEventListener=function(e){var t=this._handlers.length;return this._handlers=this._handlers.filter((function(t){return t!==e})),t>this._handlers.length},e.prototype.triggerEvent=function(e){for(var t=0,r=this._handlers;t=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);var t=this._deferred.getNewPromiseOrThrowIfBusy();return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t},t.prototype.revertStoryPointAsync=function(e){var t=this;if(u.ErrorHelpers.verifyParameter(e,"index"),u.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((function(e){return t.updateStoryInfo(e.index,e),new d.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,t)}))},t.prototype.clearPendingPromises=function(){this._deferred&&this._deferred.reject("All pending promises cleared")},t}(c.SheetImpl);t.StoryImpl=f},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(2780),a=r(1940),s=r(1116),u=r(6500),l=function(){function e(e,t,r,n){this._storyPointInfoImpl=e,n&&(this._containedSheetImpl=this.createContainedSheet(n,t,r))}return Object.defineProperty(e.prototype,"index",{get:function(){return this._storyPointInfoImpl.index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._storyPointInfoImpl.caption},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._storyPointInfoImpl.active},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._storyPointInfoImpl.updated},set:function(e){this._storyPointInfoImpl.updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._storyPointInfoImpl.parentStory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containedSheet",{get:function(){return this._containedSheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointInfoImpl.storyPointId},enumerable:!0,configurable:!0}),e.prototype.createContainedSheet=function(e,t,r){var l,c=o.SheetUtils.getPublishedSheetInfoByName(e.name,t),p=o.SheetUtils.createAutomaticSize(),d=void 0===c,f=c?c.url:"",y=new s.SheetInfoImpl(e.name,o.SheetUtils.getSheetTypeEnum(e.sheetType),p,-1,!1,d,f);switch(y.sheetType){case n.SheetType.Worksheet:var h={worksheet:y.name};l=new u.WorksheetImpl(y,r,h,null,this);break;case n.SheetType.Dashboard:var m={sheetName:y.name,isDashboard:!0};l=new a.DashboardImpl(y,e.dashboardZones,m,r,this);break;default:throw new i.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return l},e}();t.StoryPointImpl=l},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._caption=e,this._index=t,this._storyPointId=r,this._active=n,this._updated=i,this._parentStoryImpl=o}return Object.defineProperty(e.prototype,"caption",{get:function(){return this._caption},set:function(e){this._caption=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},set:function(e){this._index=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._active},set:function(e){this._active=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._updated},set:function(e){this._updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._parentStoryImpl},enumerable:!0,configurable:!0}),e}();t.StoryPointInfoImpl=r},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WorkbookImpl=function(){}},6500:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(8340),u=r(624),l=r(3483),c=r(3008),p=r(6664),d=r(7480),f=r(2180),y=function(e){function t(t,r,n,i,o){var a=e.call(this,t,r)||this;return a._visualId=n,a._parentDashboardImpl=i,a._parentStoryPointImpl=o,a}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){return this._parentDashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"visualId",{get:function(){return this._visualId},enumerable:!0,configurable:!0}),t.prototype.getMaxPageRowLimit=function(){return 1e4},t.prototype.applyFilterAsync=function(e,t,r,n){return d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?d.ErrorHelpers.verifyEnumValue(t.nullOption,a.FilterNullOption,"FilterNullOption"):d.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){if(d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"values"),d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new p.TableauError(a.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)},t.prototype.clearFilterAsync=function(e){return d.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return d.ErrorHelpers.verifyStringParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"options"),d.ErrorHelpers.verifyEnumValue(t.periodType,a.PeriodType,"PeriodType"),d.ErrorHelpers.verifyEnumValue(t.rangeType,a.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)},t.prototype.getDataSourcesAsync=function(){var e=this;return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((function(t){var r=t,n=r.worksheetDataSchemaMap[e.name],i=[],o=n.primaryDataSource;i.push(e.createDataSourceFromInfo(r.dataSources[o]));for(var a=0,s=n.referencedDataSourceList;a{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._logicalTable=e}return Object.defineProperty(e.prototype,"id",{get:function(){return this._logicalTable.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._logicalTable.caption},enumerable:!0,configurable:!0}),e}();t.LogicalTable=r},5064:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.TooltipTextRequestModel=function(e,t){this.visualIdPresModel=e,this.tupleId=t}},6296:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3008),s=r(7480),u=function(){function e(e,t,r,n,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=n,this._registryId=i}return Object.defineProperty(e.prototype,"worksheetName",{get:function(){return this._worksheetName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"filterType",{get:function(){return this._filterType},enumerable:!0,configurable:!0}),e.prototype.getFieldAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)},e.prototype.getAppliedWorksheetsAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)},e.prototype.setAppliedWorksheetsAsync=function(e){s.ErrorHelpers.verifyParameter(e,"applyToWorksheets");var t=new Set(e);return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))},e}();t.Filter=u;var l=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._appliedValues=a,l._isExcludeMode=s,l._isAllSelected=u,l}return i(t,e),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isExcludeMode",{get:function(){return this._isExcludeMode},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.CategoricalFilter=l;var c=function(){function e(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hierarchicalPath",{get:function(){return this._hierarchicalPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"level",{get:function(){return this._level},enumerable:!0,configurable:!0}),e}();t.HierarchicalDataValue=c;var p=function(){function e(e,t){this._name=e,this._levelSelectionState=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"levelSelectionState",{get:function(){return this._levelSelectionState},enumerable:!0,configurable:!0}),e}();t.HierarchicalLevelDetail=p;var d=function(e){function t(t,r,n,i,o,a,s,u,l,c,p){var d=e.call(this,t,r,i,n,o)||this;return d._dimensionName=a,d._hierarchyCaption=s,d._numberOfLevels=u,d._levelDetails=l,d._appliedValues=c,d._isAllSelected=p,d}return i(t,e),t.prototype.getDomainAsync=function(e){throw new Error("Method not implemented.")},Object.defineProperty(t.prototype,"dimensionName",{get:function(){return this._dimensionName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hierarchyCaption",{get:function(){return this._hierarchyCaption},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"numberOfLevels",{get:function(){return this._numberOfLevels},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"levelDetails",{get:function(){return this._levelDetails},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),t}(u);t.HierarchicalFilter=d;var f=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._min=a,l._max=s,l._includeNullValues=u,l}return i(t,e),Object.defineProperty(t.prototype,"minValue",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"maxValue",{get:function(){return this._max},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"includeNullValues",{get:function(){return this._includeNullValues},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){var t=a.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.RangeFilter=f;var y=function(e){function t(t,r,n,i,o,a,s,u,l){var c=e.call(this,t,r,i,n,o)||this;return c._anchorDate=a,c._periodType=s,c._rangeType=u,c._rangeN=l,c}return i(t,e),Object.defineProperty(t.prototype,"anchorDate",{get:function(){return this._anchorDate},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"periodType",{get:function(){return this._periodType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeType",{get:function(){return this._rangeType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeN",{get:function(){return this._rangeN},enumerable:!0,configurable:!0}),t}(u);t.RelativeDateFilter=y;var h=function(){function e(e,t){this._values=e,this._domainType=t}return Object.defineProperty(e.prototype,"values",{get:function(){return this._values},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),e}();t.CategoricalDomain=h;var m=function(){function e(e,t,r){this._min=e,this._max=t,this._domainType=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"min",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"max",{get:function(){return this._max},enumerable:!0,configurable:!0}),e}();t.RangeDomain=m},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=n,this._isSummaryData=i,this._marksInfo=o,this._name=i?"Summary Data Table":"Underlying Data Table"}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columns",{get:function(){return this._columns},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"marksInfo",{get:function(){return this._marksInfo},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"totalRowCount",{get:function(){return this._totalRowCount},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isTotalRowCountLimited",{get:function(){return this._isTotalRowCountLimited},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isSummaryData",{get:function(){return this._isSummaryData},enumerable:!0,configurable:!0}),e}();t.DataTable=r;var n=function(){function e(e,t,r){this._type=e,this._color=t,this._tupleId=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"color",{get:function(){return this._color},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tupleId",{get:function(){return this._tupleId},enumerable:!0,configurable:!0}),e}();t.MarkInfo=n;var i=function(){function e(e,t,r,n,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=n,this._index=i}return Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isReferenced",{get:function(){return this._isReferenced},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),e}();t.Column=i;var o=function(){function e(e,t,r){this._value=e,this._nativeValue=t,this._formattedValue=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeValue",{get:function(){return this._nativeValue},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this._formattedValue},enumerable:!0,configurable:!0}),e}();t.DataValue=o},7968:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},i=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._x=e,this._y=t}return Object.defineProperty(e.prototype,"x",{get:function(){return this._x},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"y",{get:function(){return this._y},enumerable:!0,configurable:!0}),e}();t.Point=r},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3008),i=r(3964),o=r(8028),a=r(1384),s=r(9196),u=r(4924),l=r(3851),c=r(8864),p=r(7712),d=r(1288),f=r(7260),y=r(8784),h=r(4109),m=r(6096),g=r(744),v=r(8856);t.registerAllSharedServices=function(e,t,r){n.ApiServiceRegistry.get(t).registerService(new o.AnimationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new s.DataSourceServiceImpl(e,t,r)),n.ApiServiceRegistry.get(t).registerService(new u.ExportServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new p.GetDataServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new c.FilterServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new d.NotificationServiceImpl(e)),n.ApiServiceRegistry.get(t).registerService(new f.ParametersServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new y.SelectionServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new a.AnnotationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new v.ZoneServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new h.SizeServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new m.VisualModelServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new g.VizServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new l.ExternalContextMenuServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664);window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{};var o=function(){function e(){this._services={}}return e.prototype.registerService=function(e){this._services[e.serviceName]=e},e.prototype.getService=function(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.InternalError,"Service not registered: "+e);return this._services[e]},e}(),a=function(){function e(){}return e.get=function(t){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[t]||e.setInstance(t,new o),!window.__tableauApiServiceRegistry[t])throw new i.TableauError(n.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[t]},e.setInstance=function(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t},e.clearRegistry=function(){window.__tableauApiServiceRegistry={}},e}();t.ApiServiceRegistry=a},3964:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(5064),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"accessibility"},enumerable:!0,configurable:!0}),t.prototype.getTooltipTextAsync=function(e,t){var r,n=new a.TooltipTextRequestModel(e,t),i=((r={})[o.ParameterId.FunctionName]="getTooltipTextAsync",r[o.ParameterId.TooltipTextRequest]=n,r);return this.execute(o.VerbId.GetTooltipText,i).then((function(e){return e.result}))},t.prototype.leaveMarkNavigationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="leaveMarkNavigationAsync",t[o.ParameterId.VisualId]=e,t);return this.execute(o.VerbId.RaiseLeaveMarkNavNotification,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AccessibilityServiceImpl=s},8028:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"animation-service"},enumerable:!0,configurable:!0}),t.prototype.replayAsync=function(e){var t,r=((t={})[a.ParameterId.ReplaySpeed]=1,t);return u.ErrorHelpers.verifyEnumValue(e,o.ReplaySpeedType,"ReplaySpeedType"),r[a.ParameterId.ReplaySpeed]=s.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(a.VerbId.ReplayAnimation,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AnimationServiceImpl=l},1384:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6557),u=r(7104),l=r(6664),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"annotation-service"},enumerable:!0,configurable:!0}),t.prototype.annotateMarkAsync=function(e,t,r){var n,i=this.parseMarkSelectionIds([t]),o=""+r+"",s=((n={})[a.ParameterId.FunctionName]="annotateMarkAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.AnnotateEnum]=a.AnnotateEnum.Mark,n[a.ParameterId.TargetPoint]={x:0,y:0},n[a.ParameterId.SelectionList]=[i.selection],n[a.ParameterId.FormattedText]=o,n);return this.execute(a.VerbId.CreateAnnotation,s).then((function(e){}))},t.prototype.getAnnotationsAsync=function(e){var t,r=this,n=((t={})[a.ParameterId.FunctionName]="getAnnotationsAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.GetAnnotations,n).then((function(e){var t=e.result;return r.annotationFilterMap(t)}))},t.prototype.removeAnnotationAsync=function(e,t){var r,n=this.parseAnnotationSelectionIds([t]),i=((r={})[a.ParameterId.FunctionName]="removeAnnotationAsync",r[a.ParameterId.VisualId]=e,r[a.ParameterId.SelectionList]=[n.selection],r);return this.execute(a.VerbId.RemoveAnnotation,i).then((function(e){}))},t.prototype.parseMarkSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.tupleId;if(!(null!=r&&r>0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="tuples",n.objectIds=t,r.selection=n}return r},t.prototype.parseAnnotationSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.annotationId;if(!(null!=r&&r>=0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="annotations",n.objectIds=t,r.selection=n}return r},t.prototype.mapAnnotation=function(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:s.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}},t.prototype.annotationFilterMap=function(e){var t=this;return e.map((function(e){return t.mapAnnotation(e)}))},t}(r(1776).ServiceImplBase);t.AnnotationServiceImpl=c},1832:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"client-info-service"},enumerable:!0,configurable:!0}),t.prototype.getClientInfoAsync=function(){var e,t=o.VerbId.GetEmbeddingClientInfo,r=((e={})[o.ParameterId.FunctionName]="getClientInfoAsync",e);return this.execute(t,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.ClientInfoServiceImpl=a},9196:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(3448),u=r(8340),l=r(1072),c=r(2180),p=r(5288),d=r(6664),f=r(1776);t.SENTINEL_LOGICAL_TABLE_INFO={id:a.ApiShowDataTableSentinel.SingleTableId,caption:a.ApiShowDataTableSentinel.SingleTableCaption};var y={major:1,minor:20,fix:1},h=function(e){function r(t,r,n){void 0===n&&(n=y);var i=e.call(this,t,r)||this;return i._platformVersion=n,i}return i(r,e),Object.defineProperty(r.prototype,"serviceName",{get:function(){return"data-source-service"},enumerable:!0,configurable:!0}),r.prototype.refreshAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="refreshAsync",t[s.ParameterId.DeltaTimeMs]=0,t[s.ParameterId.ShouldRefreshDS]=!0,t);return e&&(r[s.ParameterId.DataSourceId]=e),this.execute(s.VerbId.RefreshDataSource,r).then((function(e){}))},r.prototype.getActiveTablesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getActiveTablesAsync",t[s.ParameterId.DataSourceId]=e,t);return this.execute(s.VerbId.GetActiveTables,r).then((function(t){var r=t.result;if(0===r.tables.length)throw new d.TableauError(o.ErrorCodes.UnsupportedMethodForDataSourceType,"getActiveTables is not supported for: "+e);return r.tables}))},r.prototype.getDataSourcesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getDataSourcesAsync",t[s.ParameterId.VisualId]=e,t);return this.execute(s.VerbId.GetDataSources,r).then((function(e){return e.result}))},r.prototype.getAllDataSourcesAsync=function(){var e,t=((e={})[s.ParameterId.FunctionName]="getAllDataSourcesAsync",e);return this.execute(s.VerbId.GetAllDataSources,t).then((function(e){return e.result}))},r.prototype.getConnectionSummariesAsync=function(e){var t,r=((t={})[s.ParameterId.FunctionName]="getConnectionSummariesAsync",t[s.ParameterId.DataSourceId]=e,t);return this.execute(s.VerbId.GetConnectionDescriptionSummaries,r).then((function(e){return e.result}))},r.prototype.getFieldAsync=function(e){var t,r=this,n=s.VerbId.GetFieldAndDataSource,i=((t={})[s.ParameterId.FunctionName]="getFieldAsync",t[s.ParameterId.FieldId]=e,t);return this.execute(n,i).then((function(e){var t=e.result[s.ParameterId.DataSource],n=e.result[s.ParameterId.Field];return r.convertField(n,r.convertDataSource(t))}))},r.prototype.getLogicalTablesAsync=function(e){var r;if(!this.isObjectModelSupportedByPlatform())return new Promise((function(e){return e([t.SENTINEL_LOGICAL_TABLE_INFO])}));var n=((r={})[s.ParameterId.FunctionName]="getLogicalTablesAsync",r[s.ParameterId.DataSourceId]=e,r);return this.execute(s.VerbId.GetLogicalTables,n).then((function(e){return e.result}))},r.prototype.getUnderlyingTablesAsync=function(e){var r;if(!this.isObjectModelSupportedByPlatform())return new Promise((function(e){return e([t.SENTINEL_LOGICAL_TABLE_INFO])}));var n=((r={})[s.ParameterId.FunctionName]="getUnderlyingTablesAsync",r[s.ParameterId.VisualId]=e,r);return this.execute(s.VerbId.GetUnderlyingTables,n).then((function(e){return e.result}))},r.prototype.convertField=function(e,t){return new l.Field(new p.FieldImpl(e,t))},r.prototype.convertDataSource=function(e){return new u.DataSource(new c.DataSourceImpl(e,this._registryId))},r.prototype.isObjectModelSupportedByPlatform=function(){return a.VersionLessThan({major:1,minor:13,fix:0},this._platformVersion)},r}(f.ServiceImplBase);t.DataSourceServiceImpl=h},4924:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},a=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?s[l.ParameterId.FilterLevels]=u:r.length>0?s[l.ParameterId.FilterValues]=r:s[l.ParameterId.FilterLevels]=[],s[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(n),s[l.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(a,s).then((function(e){return t}))},t.prototype.clearFilterAsync=function(e,t){var r,n=l.VerbId.ClearFilter,i=((r={})[l.ParameterId.FunctionName]="clearFilterAsync",r);return i[l.ParameterId.VisualId]=e,i[l.ParameterId.FieldName]=t,this.execute(n,i).then((function(e){return t}))},t.prototype.applyRelativeDateFilterAsync=function(e,t,r){var n,i=l.VerbId.ApplyRelativeDateFilter,o=((n={})[l.ParameterId.FunctionName]="applyRelativeDateFilterAsync",n);if(o[l.ParameterId.VisualId]=e,o[l.ParameterId.FieldName]=t,o[l.ParameterId.PeriodType]=p.ExternalToInternalEnumMappings.periodType.convert(r.periodType),o[l.ParameterId.DateRangeType]=p.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===s.DateRangeType.LastN||r.rangeType===s.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new c.TableauError(s.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");o[l.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(o[l.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(i,o).then((function(e){return e.result}))},t.prototype.getFiltersAsync=function(e){var t,r=this,n=l.VerbId.GetFilters,i=((t={})[l.ParameterId.FunctionName]="getFiltersAsync",t);return i[l.ParameterId.VisualId]=e,this.execute(n,i).then((function(e){var t=e.result;return r.convertDomainFilters(t)}))},t.prototype.getCategoricalDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetCategoricalDomain,a=((n={})[l.ParameterId.FunctionName]="getCategoricalDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertCategoricalDomain(t,r)}))},t.prototype.getRangeDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetRangeDomain,a=((n={})[l.ParameterId.FunctionName]="getRangeDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertRangeDomain(t,r)}))},t.prototype.getDashboardFiltersAsync=function(){var e,t=this,r=l.VerbId.GetDashboardFilters,n=((e={})[l.ParameterId.FunctionName]="getDashboardFiltersAsync",e);return this.execute(r,n).then((function(e){var r=e.result;return t.convertDomainFilters(r)}))},t.prototype.applyDashboardFilterAsync=function(e,t,r,n){var i,o=l.VerbId.DashboardCategoricalFilter,a=((i={})[l.ParameterId.FunctionName]="applyDashboardFilterAsync",i);return a[l.ParameterId.FieldName]=e,a[l.ParameterId.FilterValues]=t,a[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(r),a[l.ParameterId.IsExcludeMode]=n&&!!n.isExcludeMode,this.execute(o,a).then((function(e){return e.result}))},t.prototype.getAppliedWorksheetsAsync=function(e,t){var r;return o(this,void 0,void 0,(function(){var n,i;return a(this,(function(o){switch(o.label){case 0:return[4,this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync")];case 1:return n=o.sent(),i=[],null===(r=n.worksheets)||void 0===r||r.map((function(e){e.isSelected&&i.push(e.worksheetName)})),[2,i]}}))}))},t.prototype.setAppliedWorksheetsAsync=function(e,t,r,n){return o(this,void 0,void 0,(function(){var i,o,u,p,d;return a(this,(function(a){switch(a.label){case 0:return[4,this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal")];case 1:if(!(i=a.sent())||!i.worksheets)throw new c.TableauError(s.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");if(o=[],u="",i.worksheets.forEach((function(e){e.isActive&&(u=e.worksheetName),(e.isSelected||e.isEnabled)&&o.push(e.worksheetName)})),""===u)throw new c.TableauError(s.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(u))throw new c.TableauError(s.SharedErrorCodes.InternalError,u+" must be included in the applied worksheets");return n.forEach((function(e){if(!o.includes(e))throw new c.TableauError(s.SharedErrorCodes.InternalError,"The field "+t+" isn't applicable to the worksheet "+e)})),p=l.VerbId.ChangeSharedFilter,(d={})[l.ParameterId.FunctionName]="setAppliedWorksheetsAsync",d[l.ParameterId.VisualId]={worksheet:e},d[l.ParameterId.FieldId]=r,d[l.ParameterId.SharedFilterSheets]=n,[2,this.execute(p,d).then((function(e){return n}))]}}))}))},t.prototype.executeGetAppliedWorksheets=function(e,t,r){var n=l.VerbId.GetSharedFilter,i={};return i[l.ParameterId.FunctionName]=r,i[l.ParameterId.VisualId]={worksheet:e},i[l.ParameterId.FieldId]=t,this.execute(n,i).then((function(e){return e.result}))},t.prototype.convertDomainFilters=function(e){var t=this,r=[];return e.forEach((function(e){switch(e.filterType){case l.FilterType.Categorical:if(!(n=e))throw new Error("Invalid Categorical Filter");r.push(t.convertCategoricalFilter(n));break;case l.FilterType.Hierarchical:if(!(n=e))throw new Error("Invalid Hierarchical Filter");r.push(t.convertHierarchicalFilter(n));break;case l.FilterType.Range:if(!(n=e))throw new Error("Invalid Range Filter");r.push(t.convertRangeFilter(n));break;case l.FilterType.RelativeDate:var n;if(!(n=e))throw new Error("Invalid Relative Date Filter");r.push(t.convertRelativeDateFilter(n))}})),r},t.prototype.convertCategoricalFilter=function(e){var t=e.values.map((function(e){return y.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)},t.prototype.convertHierarchicalFilter=function(e){var t=e.values.map((function(e){return new f.HierarchicalDataValue(y.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level)})),r=e.levelInfo.map((function(e){return new f.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))}));return new f.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)},t.prototype.convertRangeFilter=function(e){var t=y.DataValueFactory.MakeFilterDataValue(e.min),r=y.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Range,this._registryId,t,r,e.includeNullValues)},t.prototype.convertRelativeDateFilter=function(e){var t=y.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new f.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)},t.prototype.convertCategoricalDomain=function(e,t){var r=e.values.map((function(e){return y.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalDomain(r,t)},t.prototype.convertRangeDomain=function(e,t){var r=y.DataValueFactory.MakeFilterDataValue(e.min),n=y.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeDomain(r,n,t)},t.prototype.convertAnchorDate=function(e){var t=e.getUTCFullYear(),r=e.getUTCMonth()+1,n=e.getUTCDate(),i=e.getUTCHours(),o=e.getUTCMinutes(),a=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(n)||isNaN(i)||isNaN(o)||isNaN(a))throw new c.TableauError(s.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return t+"-"+r+"-"+n+" "+i+":"+o+":"+a},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[u.ParameterId.ParameterError]){if(e[u.ParameterId.InvalidFieldCaption])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldName,e[u.ParameterId.InvalidFieldCaption]);if(e[u.ParameterId.InvalidValues])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldValue,e[u.ParameterId.InvalidValues]);if(e[u.ParameterId.InvalidAggFieldName])throw new c.TableauError(s.SharedErrorCodes.InvalidAggregationFieldName,e[u.ParameterId.InvalidAggFieldName]);throw new c.TableauError(s.SharedErrorCodes.ServerError,"Server Error")}},t}(r(1776).ServiceImplBase);t.FilterServiceImpl=m},7712:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6680),u=r(5136),l=r(1044),c=r(5068),p=r(7968),d=r(8052),f=r(3483),y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.viewDataTableCacheId=s.v4(),t}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"get-data-service"},enumerable:!0,configurable:!0}),t.prototype.getMaxRowLimit=function(){return 1e4},t.prototype.getViewDataTableCacheId=function(){return this.viewDataTableCacheId},t.prototype.getLimitedMaxRows=function(e,t){return e>0&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._filterFn=e,this._callbackFn=t}return e.prototype.onNotification=function(e){this._filterFn(e)&&this._callbackFn(e)},e}();t.Registration=r;var n=function(){function e(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}return e.prototype.registerHandler=function(e,t,n){var i=this,o=this._handlers[e]||new Array,a=new r(t,n);return o.push(a),this._handlers[e]=o,function(){return i.removeRegistration(e,a)}},e.prototype.hasHandlersForNotificationType=function(e){return this._handlers.hasOwnProperty(e)},e.prototype.onNotification=function(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((function(t){return t.onNotification(e.data)}))},e.prototype.removeRegistration=function(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((function(e){return e!==t})))},e}();t.NotificationServiceImplBase=n},7260:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(8552),u=r(6664),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"parameters-service"},enumerable:!0,configurable:!0}),t.prototype.getParametersForSheetAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",t[a.ParameterId.SheetPath]=e,t);return this.getParametersAsync(r)},t.prototype.getAllParametersAsync=function(){var e,t=((e={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",e);return this.getParametersAsync(t)},t.prototype.getParametersAsync=function(e){var t=this;return this.execute(a.VerbId.GetParametersForSheet,e).then((function(e){return e.result.map((function(e){return new s.ParameterImpl(e,t._registryId)}))}))},t.prototype.changeParameterValueAsync=function(e,t){var r,n=((r={})[a.ParameterId.FunctionName]="changeParameterValueAsync",r[a.ParameterId.ParameterFieldName]=e,r[a.ParameterId.ParameterValue]=t,r);return this.execute(a.VerbId.ChangeParameterValue,n).then((function(e){return e.result}))},t.prototype.findParameterByNameAsync=function(e){return this.findParameterAsync(e,void 0)},t.prototype.findParameterByGlobalFieldNameAsync=function(e){return this.findParameterAsync(void 0,e)},t.prototype.findParameterAsync=function(e,t){var r,n=this,i=((r={})[a.ParameterId.FunctionName]="findParameterAsync",r);if(void 0!==e)i[a.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");i[a.ParameterId.ParameterFieldName]=t}return this.execute(a.VerbId.FindParameter,i).then((function(e){if("fieldName"in e.result){var t=e.result;return new s.ParameterImpl(t,n._registryId)}}))},t}(r(1776).ServiceImplBase);t.ParametersServiceImpl=l},8784:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(7104),u=r(6664),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"selection-service"},enumerable:!0,configurable:!0}),t.prototype.clearSelectedMarksAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="clearSelectedMarksAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.ClearSelectedMarks,r).then((function(e){}))},t.prototype.selectMarksByValueAsync=function(e,t,r){var n,i=this;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");var s=this.validateSelectionUpdateType(r),l=this.parseSelectionMarks(t),c=((n={})[a.ParameterId.FunctionName]="selectMarksByValueAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=s,n);return l.hierModelArr&&l.hierModelArr.length&&(c[a.ParameterId.HierValSelectionModels]=l.hierModelArr),l.quantModelArr&&l.quantModelArr.length&&(c[a.ParameterId.QuantRangeSelectionModels]=l.quantModelArr),l.dimModelArr&&l.dimModelArr.length&&(c[a.ParameterId.DimValSelectionModels]=l.dimModelArr),this.execute(a.VerbId.SelectByValue,c).then((function(e){i.apiFilterHandlerCheckForCommandError(e.result)}))},t.prototype.hoverTupleAsync=function(e,t,r,n){var i,o=new s.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,n),u=((i={})[a.ParameterId.FunctionName]="hoverTupleAsync",i[a.ParameterId.HoverTupleInteraction]=o,i);return this.execute(a.VerbId.RaiseHoverTupleNotification,u).then((function(e){}))},t.prototype.selectTuplesAsync=function(e,t,r,n){var i,o=new s.SelectTuplesInteractionModel(e,t,r,n),u=((i={})[a.ParameterId.FunctionName]="selectTuplesAsync",i[a.ParameterId.SelectTuplesInteraction]=o,i);return this.execute(a.VerbId.RaiseSelectTuplesNotification,u).then((function(e){}))},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[a.ParameterId.ParameterError]){if(e[a.ParameterId.InvalidFields])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionFieldName,e[a.ParameterId.InvalidFields]);if(e[a.ParameterId.InvalidValues])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionValue,e[a.ParameterId.InvalidValues]);if(e[a.ParameterId.InvalidDates])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionDate,e[a.ParameterId.InvalidDates])}},t.prototype.selectMarksByIdAsync=function(e,t,r){var n;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");var i=this.validateSelectionUpdateType(r),s=this.parseSelectionIds(t),l=((n={})[a.ParameterId.FunctionName]="selectMarksByIdAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=i,n[a.ParameterId.Selection]=s.selection,n);return this.execute(a.VerbId.SelectByValue,l).then((function(e){}))},t.prototype.parseSelectionIds=function(e){for(var t=[],r=new s.SelectionModelsContainer,n=0;n0?e:0},t}(r(1776).ServiceImplBase);t.SelectionServiceImpl=c},1776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(6557),i=r(6664),o=r(5520),a=function(){function e(e,t){this._dispatcher=e,this._registryId=t}return e.prototype.execute=function(e,t){return this._dispatcher.execute(e,t).catch((function(e){var t=e,r=n.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,o.ShouldThrow.No);throw new i.TableauError(r,t.message)}))},e}();t.ServiceImplBase=a},4109:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"size-service"},enumerable:!0,configurable:!0}),t.prototype.changeSizeAsync=function(e,t){var r,n,i,a,s,u=((r={})[o.ParameterId.FunctionName]="changeSizeAsync",r[o.ParameterId.SheetName]=e,r[o.ParameterId.MinHeight]=(null===(n=t.minSize)||void 0===n?void 0:n.height)||0,r[o.ParameterId.MinWidth]=(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,r[o.ParameterId.MaxHeight]=(null===(a=t.maxSize)||void 0===a?void 0:a.height)||0,r[o.ParameterId.MaxWidth]=(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0,r);return this.execute(o.VerbId.SetSheetSize,u).then((function(e){}))},t}(r(1776).ServiceImplBase);t.SizeServiceImpl=a},2248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"story-activation-service"},enumerable:!0,configurable:!0}),t.prototype.activateNextStoryPointAsync=function(){var e,t=o.VerbId.ActivateNextStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activateNextStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activatePreviousStoryPointAsync=function(){var e,t=o.VerbId.ActivatePreviousStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activatePreviousStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activateStoryPointAsync=function(e){var t,r=o.VerbId.ActivateStoryPoint,n=((t={})[o.ParameterId.FunctionName]="activateStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){}))},t.prototype.revertStoryPointAsync=function(e){var t,r=o.VerbId.RevertStoryPoint,n=((t={})[o.ParameterId.FunctionName]="revertStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.StoryActivationServiceImpl=a},6096:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"visual-model-service"},enumerable:!0,configurable:!0}),t.prototype.getVisualSpecificationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="getVisualSpecificationAsync",t[o.ParameterId.WorksheetName]=e.worksheet,t);return this.execute(o.VerbId.GetVisualSpecification,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VisualModelServiceImpl=a},744:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(2520),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"viz-service"},enumerable:!0,configurable:!0}),t.prototype.createVizImageAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="createVizImageAsync",t[o.ParameterId.VizAPIInputJson]=JSON.stringify(e),t);return this.execute(o.VerbId.VizAPI,r).then((function(e){return e.result}))},t.prototype.activateSheetAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="activateSheetAsync",t[o.ParameterId.SwitchToSheetName]=e,t);return this.execute(o.VerbId.ActivateSheet,r).then((function(){}))},t.prototype.getCustomViewsAsync=function(){var e,t=this,r=((e={})[o.ParameterId.FunctionName]="getCustomViewsAsync",e);return this.execute(o.VerbId.GetCustomViews,r).then((function(e){return e.result.map((function(e){return new a.CustomViewImpl(e,t._registryId)}))}))},t.prototype.showCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="showCustomViewAsync",t[o.ParameterId.CustomViewName]=e||"",t);return this.execute(o.VerbId.ShowCustomView,n).then((function(e){var t,n=e.result;return(null===(t=n)||void 0===t?void 0:t.luid)?new a.CustomViewImpl(n,r._registryId):void 0}))},t.prototype.removeCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="removeCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t);return this.execute(o.VerbId.RemoveCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.saveCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t[o.ParameterId.CustomViewIsDefault]=!1,t);return this.execute(o.VerbId.SaveWorkbookAsCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.setActiveCustomViewAsDefaultAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="setActiveCustomViewAsDefaultAsync",e);return this.execute(o.VerbId.SetActiveCustomViewAsDefault,t).then((function(){}))},t.prototype.saveAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveAsync",t[o.ParameterId.CustomViewLuid]=e.luid,t[o.ParameterId.CustomViewName]=e.name,t[o.ParameterId.CustomViewIsDefault]=e.isDefault,t[o.ParameterId.CustomViewIsPublic]=e.shared,t);return this.execute(o.VerbId.UpdateCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.getCurrentSrcAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="getCurrentSrcAsync",e);return this.execute(o.VerbId.GetCurrentSrc,t).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VizServiceImpl=s},8856:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"zone-service"},enumerable:!0,configurable:!0}),t.prototype.setVisibilityAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="setVisibilityAsync",n[a.ParameterId.Dashboard]=e,n[a.ParameterId.ZoneIdsVisibilityMap]={},n);return l.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach((function(e,r){u.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),u.ErrorHelpers.verifyEnumValue(e,o.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),i[a.ParameterId.ZoneIdsVisibilityMap][r]=s.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(a.VerbId.SetZoneVisibility,i).then((function(e){}))},t.prototype.moveAndResizeAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.Dashboard]=e,n[a.ParameterId.DashboardObjectPositionAndSizeUpdateList]=r,n);return r.forEach((function(e){u.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),u.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(a.VerbId.MoveAndResizeZones,i).then((function(e){}))},t}(r(1776).ServiceImplBase);t.ZoneServiceImpl=c},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._tableInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._tableInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._tableInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"connectionId",{get:function(){return this._tableInfo.connectionId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"customSQL",{get:function(){return this._tableInfo.customSQL},enumerable:!0,configurable:!0}),e}();t.TableSummary=r},6664:function(e,t){"use strict";var r,n=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},r(e,t)},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0});var i=function(e){function t(r,n){var i=e.call(this,r+": "+n)||this;return i._errorCode=r,Object.setPrototypeOf(i,t.prototype),i}return n(t,e),Object.defineProperty(t.prototype,"errorCode",{get:function(){return this._errorCode},enumerable:!0,configurable:!0}),t}(Error);t.TableauError=i},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(5068),o=function(){function e(){}return e.MakeParameterDataValue=function(e,t){return new i.DataValue(e.value,n.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue)},e.MakeFilterDataValue=function(e){return new i.DataValue(e.value,e.value,e.formattedValue)},e.MakeTableDataValue=function(e,t){return new i.DataValue(e.value,void 0!==e.value?n.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)},e}();t.DataValueFactory=o},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){var e=this;this._promise=new Promise((function(t,r){e._resolve=t,e._reject=r}))}return Object.defineProperty(e.prototype,"promise",{get:function(){return this._promise},enumerable:!0,configurable:!0}),e.prototype.resolve=function(e){this._resolve&&this._resolve(e)},e.prototype.reject=function(e){this._reject&&this._reject(e)},e}();t.Deferred=r,t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(7419),o=r(6664),a=function(){function e(e,t){this._mappings=e,this._defaultVal=t}return e.prototype.convert=function(e,t){if(void 0===t&&(t=n.Yes),this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new o.TableauError(i.ErrorCodes.InternalError,"Enum Mapping not found for: "+e)},e}();t.EnumConverter=a,function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1172),a=function(){function e(){}return e.apiNotImplemented=function(e){return new i.TableauError(n.SharedErrorCodes.InternalError,e+" API not yet implemented.")},e.verifyInternalValue=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InternalError,e+" is invalid value for: "+t)},e.verifyParameter=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for parameter: "+t)},e.verifyParameterType=function(e,t,r){if(typeof e!==t)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" has invalid type for parameter: "+r+".")},e.verifyStringParameter=function(e,t){if(null==e||""===e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for paramter: "+t)},e.verifyEnumValue=function(e,t,r){var o=!1;if(Object.keys(t).forEach((function(r){t[r]===e.toString()&&(o=!0)})),!o)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for enum: "+r+".")},e.verifyRange=function(e,t,r){if(!(t<=e&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(7419),o=r(6664),a=function(){function e(){}return e.updateInternalExportPDFOptions=function(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)},e.updateExportLayoutOptions=function(e,t){var r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=n.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=n.PageOrientation.Portrait;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=n.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=n.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=n.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=n.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=n.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=n.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=n.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=n.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=n.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=n.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=n.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=n.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=n.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=n.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=n.PageSizeOption.Unspecified;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,n.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,n.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,n.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,n.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct90);break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}},e.updateSheetOptions=function(e,t){for(var r=e.exportLayoutOptions,n=0,i=e.sheetOptions;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(7480),a=function(){function e(){}return e.serializeDateForPlatform=function(e){return e.getUTCFullYear()+"-"+(e.getUTCMonth()+1)+"-"+e.getUTCDate()+" "+e.getUTCHours()+":"+e.getUTCMinutes()+":"+e.getUTCSeconds()},e.serializeBooleanForPlatform=function(e){return e?"true":"false"},e.serializeNumberForPlatform=function(e){return e.toString(10)},e.isTypeNumber=function(e){return"number"==typeof e||e instanceof Number},e.isTypeDate=function(e){return e instanceof Date},e.isTypeString=function(e){return"string"==typeof e||e instanceof String},e.isTypeBool=function(e){return"boolean"==typeof e||e instanceof Boolean},e.isNullOrUndefined=function(e){return null==e},e.serializeParameterValue=function(t){if(e.isTypeNumber(t))return e.serializeNumberForPlatform(t);if(e.isTypeDate(t))return e.serializeDateForPlatform(t);if(e.isTypeBool(t))return e.serializeBooleanForPlatform(t);if(e.isTypeString(t))return t;throw new i.TableauError(n.ErrorCodes.InternalError,"Unexpected invalid value for: "+t)},e.convertParameterToMap=function(e,t){if(o.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(n.ErrorCodes.InvalidParameter,"Expecting object or Map for: "+t+".");return e instanceof Map?e:new Map(Object.entries(e))},e.tryParseNumber=function(t){if(e.isNullOrUndefined(t))return{success:!1};if(e.isTypeNumber(t))return{parsed:t,success:!0};var r=t.toString();if("NaN"===r)return{parsed:NaN,success:!0};var n=parseFloat(r);return isNaN(n)?{success:!1}:{parsed:n,success:!0}},e}();t.Param=a},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6664),a=function(){function e(){}return e.getSheetSizeFromSizeConstraints=function(e){var t=e.minWidth,r=e.minHeight,i=e.maxWidth,o=e.maxHeight;if(0===r&&0===t)return 0===o&&0===i?{behavior:n.SheetSizeBehavior.Automatic}:{behavior:n.SheetSizeBehavior.AtMost,maxSize:{width:i,height:o}};if(0===o&&0===i)return{behavior:n.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(o===r&&i===t&&t>0)return{behavior:n.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};var a=0===t&&0===i;return{behavior:n.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:a?2147483647:i,height:o}}},e.createAutomaticSize=function(){return{behavior:n.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}},e.getPublishedSheetInfoByName=function(e,t){return t.find((function(t){return t.name===e}))},e.getSheetTypeEnum=function(e){var t;switch(e){case i.SheetType.Worksheet:t=n.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=n.SheetType.Dashboard;break;case i.SheetType.Story:t=n.SheetType.Story;break;default:throw new o.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return t},e.isValidSheetSize=function(e){return void 0!==e.behavior},e}();t.SheetUtils=a},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1724),a=function(){function e(e){void 0===e&&(e=o.UnregisterTimeoutInMilliseconds),this._timeoutInMilliseconds=e}return e.prototype.getNewPromiseOrThrowIfBusy=function(){var e=this;if(this._deferred)throw new i.TableauError(n.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new o.Deferred,this._timeoutId=setTimeout((function(){var t=new i.TableauError(n.SharedErrorCodes.Timeout,"Api failed to complete in "+e._timeoutInMilliseconds/1e3+" seconds");e.reject(t)}),this._timeoutInMilliseconds),this._deferred.promise},e.prototype.resolve=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)},e.prototype.reject=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)},e}();t.ShortLivedDeferred=a},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(e,t){var r=e.split("-");this.build=this.getBuildNumber(r[1]);var o=(e=r[0]).split(".").map((function(e){return parseInt(e,10)}));if(3!==o.length)throw new i.TableauError(n.ErrorCodes.InternalError,"Invalid version number: "+e);this.major=o[0],this.minor=o[1],this.fix=o[2],this.isAlpha=t}return e.prototype.getBuildNumber=function(e){if(!e)return-1;var t=e.split(".");return t[1]?parseInt(t[1],10):-1},Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullFormattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix+"-pre."+this.build},enumerable:!0,configurable:!0}),e}();t.VersionNumber=o},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=function(){function e(e,t){var r=this;this._apiDelegateDispatcher=e,this._versionConverter=n.CreateExternalCompatibleVersionConverter(n.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((function(e){if(0!==r._notificationHandlers.length){var t=r._versionConverter.upgradeNotification(e);r._notificationHandlers.forEach((function(e){e(t)}))}}))}return e.needsVersionConverter=function(e){return n.VersionLessThan(e,n.INTERNAL_CONTRACT_VERSION)},e.prototype.execute=function(e,t){var r=this;try{var n=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(n.verb,n.parameters).then((function(n){return r._versionConverter.upgradeExecuteReturn(n,e,t)}))}catch(e){return Promise.reject(e)}},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e}();t.VersionedExternalApiDispatcher=i},6680:(e,t,r)=>{"use strict";var n;r.r(t),r.d(t,{NIL:()=>x,parse:()=>m,stringify:()=>c,v1:()=>h,v3:()=>A,v4:()=>E,v5:()=>D,validate:()=>s,version:()=>F});var i=new Uint8Array(16);function o(){if(!n&&!(n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(i)}const a=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,s=function(e){return"string"==typeof e&&a.test(e)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e[t+4]]+u[e[t+5]]+"-"+u[e[t+6]]+u[e[t+7]]+"-"+u[e[t+8]]+u[e[t+9]]+"-"+u[e[t+10]]+u[e[t+11]]+u[e[t+12]]+u[e[t+13]]+u[e[t+14]]+u[e[t+15]]).toLowerCase();if(!s(r))throw TypeError("Stringified UUID is invalid");return r};var p,d,f=0,y=0;const h=function(e,t,r){var n=t&&r||0,i=t||new Array(16),a=(e=e||{}).node||p,s=void 0!==e.clockseq?e.clockseq:d;if(null==a||null==s){var u=e.random||(e.rng||o)();null==a&&(a=p=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==s&&(s=d=16383&(u[6]<<8|u[7]))}var l=void 0!==e.msecs?e.msecs:Date.now(),h=void 0!==e.nsecs?e.nsecs:y+1,m=l-f+(h-y)/1e4;if(m<0&&void 0===e.clockseq&&(s=s+1&16383),(m<0||l>f)&&void 0===e.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");f=l,y=h,d=s;var g=(1e4*(268435455&(l+=122192928e5))+h)%4294967296;i[n++]=g>>>24&255,i[n++]=g>>>16&255,i[n++]=g>>>8&255,i[n++]=255&g;var v=l/4294967296*1e4&268435455;i[n++]=v>>>8&255,i[n++]=255&v,i[n++]=v>>>24&15|16,i[n++]=v>>>16&255,i[n++]=s>>>8|128,i[n++]=255&s;for(var b=0;b<6;++b)i[n+b]=a[b];return t||c(i)},m=function(e){if(!s(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function g(e,t,r){function n(e,n,i,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function b(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function I(e,t,r,n,i,o){return b((a=b(b(t,e),b(n,o)))<<(s=i)|a>>>32-s,r);var a,s}function S(e,t,r,n,i,o,a){return I(t&r|~t&n,e,t,i,o,a)}function _(e,t,r,n,i,o,a){return I(t&n|r&~n,e,t,i,o,a)}function T(e,t,r,n,i,o,a){return I(t^r^n,e,t,i,o,a)}function P(e,t,r,n,i,o,a){return I(r^(t|~n),e,t,i,o,a)}const A=g("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,a=parseInt(n.charAt(o>>>4&15)+n.charAt(15&o),16);t.push(a)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[n/8])<>>32-t}const D=g("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var n=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;b=v,v=g,g=O(m,30)>>>0,m=h,h=_}r[0]=r[0]+h>>>0,r[1]=r[1]+m>>>0,r[2]=r[2]+g>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+b>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),x="00000000-0000-0000-0000-000000000000",F=function(e){if(!s(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":162,"fix":0}')}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,r),o.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";var e=n;Object.defineProperty(e,"__esModule",{value:!0});var t=r(5136);r(3e3),r(8315),r(80),r(5668),r(5816),r(3680),r(9308),r(8824),r(8512),r(9232),r(9336);var i=r(976),o=r(5408),a="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.12.1-pre.1",a);var s=new i.ExtensionsImpl;e.extensions=new o.Extensions(s);var u=r(7419);e.AnalyticsObjectType=u.AnalyticsObjectType,e.AnnotationType=u.AnnotationType,e.ClassNameKey=u.ClassNameKey,e.ColumnType=u.ColumnType,e.DashboardLayoutChange=u.DashboardLayoutChange,e.DashboardObjectType=u.DashboardObjectType,e.DashboardObjectVisibilityType=u.DashboardObjectVisibilityType,e.DataType=u.DataType,e.DateRangeType=u.DateRangeType,e.DialogStyle=u.DialogStyle,e.EncodingType=u.EncodingType,e.ErrorCodes=u.ErrorCodes,e.ExtensionContext=u.ExtensionContext,e.ExtensionMode=u.ExtensionMode,e.FieldAggregationType=u.FieldAggregationType,e.FieldRoleType=u.FieldRoleType,e.FilterDomainType=u.FilterDomainType,e.FilterNullOption=u.FilterNullOption,e.FilterType=u.FilterType,e.FilterUpdateType=u.FilterUpdateType,e.HierarchicalLevelSelectionState=u.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=u.IncludeDataValuesOption,e.MarkType=u.MarkType,e.ParameterValueType=u.ParameterValueType,e.PeriodType=u.PeriodType,e.QuickTableCalcType=u.QuickTableCalcType,e.ReplaySpeedType=u.ReplaySpeedType,e.SelectOptions=u.SelectOptions,e.SelectionUpdateType=u.SelectionUpdateType,e.SheetType=u.SheetType,e.SortDirection=u.SortDirection,e.TableauEventType=u.TableauEventType,e.TrendLineModelType=u.TrendLineModelType,e.VizImageEncodingType=u.VizImageEncodingType,e.VizImagePaletteType=u.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=u.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=u.VizImageSizeSettingType,e.VizImageSortDirectionType=u.VizImageSortDirectionType,e.ZoneVisibilityType=u.ZoneVisibilityType})(),window.tableau=n})(); +//# sourceMappingURL=tableau.extensions.1.12.1-pre.1.min.js.map \ No newline at end of file diff --git a/package.json b/package.json index 6d3320d7..5e59d733 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "extensions-api-sdk", - "version": "1.12.0", + "version": "1.12.1", "description": "Sample code and documentation for the Tableau Extensions API.", "scripts": { "build": "npm install && npm run lint && webpack --config webpack.config.js", From d52dcdfaab4ed0a2ba254aedc7c8788f1a4a9c67 Mon Sep 17 00:00:00 2001 From: stephendeoca Date: Wed, 19 Feb 2025 12:01:25 -0800 Subject: [PATCH 2/2] Updated tabextsandbox --- package-lock.json | 757 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 490 insertions(+), 269 deletions(-) diff --git a/package-lock.json b/package-lock.json index a5ac7476..0c762d8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "extensions-api-sdk", - "version": "1.12.0", + "version": "1.12.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "extensions-api-sdk", - "version": "1.12.0", + "version": "1.12.1", "license": "MIT", "dependencies": { "http-server": "^14.1.0" }, "devDependencies": { "@tableau/extensions-api-types": "1.12.0", - "@tableau/tabextsandbox": "^1.12.0", + "@tableau/tabextsandbox": "^1.12.1", "@tableau/tableau-ui": "3.10", "@testing-library/jest-dom": "^5.11.0", "@testing-library/react": "^11.1.0", @@ -1275,13 +1275,13 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -1330,9 +1330,9 @@ } }, "node_modules/@tableau/tabextsandbox": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@tableau/tabextsandbox/-/tabextsandbox-1.12.0.tgz", - "integrity": "sha512-ro0rJNYOLhPn0ucxTa3lgRc7MIMy4o2Bkjw/jI6tpiQgOwqwLUgvMOOmQSdSswjGPrwOHqSUIntVoG7sMyPhnA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@tableau/tabextsandbox/-/tabextsandbox-1.12.1.tgz", + "integrity": "sha512-1LmrtqEjTYoIMdYUri6CYWmT4/lU6xgdaDx1E7J+YDyLF/yW4zPBtJnG/GKlhC4FKNCD5dTMMCcKNtdpirL6zw==", "dev": true, "dependencies": { "ejs": "^3.1.8", @@ -1533,9 +1533,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "node_modules/@types/graceful-fs": { @@ -1744,148 +1744,148 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -1994,16 +1994,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "deprecated": "package has been renamed to acorn-import-attributes", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2077,15 +2067,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -2401,9 +2421,9 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -2414,7 +2434,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -2424,21 +2444,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2559,6 +2564,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2812,9 +2844,9 @@ "peer": true }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "engines": { "node": ">= 0.6" @@ -2846,9 +2878,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -3113,6 +3145,19 @@ "node": ">=8" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3160,18 +3205,18 @@ "dev": true }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -3248,12 +3293,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -3976,37 +4048,37 @@ "peer": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -4015,21 +4087,10 @@ }, "engines": { "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/fast-deep-equal": { @@ -4050,6 +4111,22 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -4121,13 +4198,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -4249,10 +4326,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", @@ -4280,14 +4359,23 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4303,6 +4391,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stdin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", @@ -4397,10 +4497,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/has": { @@ -4433,10 +4544,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -4459,6 +4569,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -6737,6 +6858,14 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -6747,10 +6876,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -6768,12 +6900,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -6937,10 +7069,12 @@ } }, "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true, + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7189,9 +7323,9 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "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 }, "node_modules/picocolors": { @@ -7538,9 +7672,12 @@ } }, "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, "engines": { "node": ">=0.6" }, @@ -7880,14 +8017,15 @@ } }, "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -7897,6 +8035,40 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", @@ -7955,9 +8127,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -7978,6 +8150,15 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -7994,15 +8175,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -8048,14 +8229,68 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8467,9 +8702,9 @@ } }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -8485,16 +8720,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -9110,9 +9345,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -9133,34 +9368,33 @@ } }, "node_modules/webpack": { - "version": "5.90.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", - "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -9253,19 +9487,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", diff --git a/package.json b/package.json index 5e59d733..202cafc6 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "devDependencies": { "@tableau/extensions-api-types": "1.12.0", - "@tableau/tabextsandbox": "^1.12.0", + "@tableau/tabextsandbox": "^1.12.1", "@tableau/tableau-ui": "3.10", "@testing-library/jest-dom": "^5.11.0", "@testing-library/react": "^11.1.0",