@sapui5/sap.fe.test 1.121.1 → 1.122.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.test",
3
- "version": "1.121.1",
3
+ "version": "1.122.0",
4
4
  "description": "SAPUI5 Library sap.fe.test",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.121.1</version>
9
+ <version>1.122.0</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.test</documentation>
12
12
 
@@ -5,8 +5,8 @@
5
5
 
6
6
  */
7
7
  sap.ui.define(
8
- ["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/thirdparty/jquery", "sap/base/util/UriParameters", "./Utils", "./Stubs"],
9
- function (Opa5, OpaBuilder, jQuery, UriParameters, Utils, Stubs) {
8
+ ["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/thirdparty/jquery", "./Utils", "./Stubs"],
9
+ function (Opa5, OpaBuilder, jQuery, Utils, Stubs) {
10
10
  "use strict";
11
11
 
12
12
  /**
@@ -23,7 +23,7 @@ sap.ui.define(
23
23
  return Opa5.extend("sap.fe.test.BaseArrangements", {
24
24
  constructor: function (mSettings) {
25
25
  Opa5.apply(this);
26
- var oUriParams = new UriParameters(window.location.href),
26
+ var oUriParams = new URLSearchParams(window.location.search),
27
27
  mDefaultLaunchParameters = {
28
28
  "sap-ui-log-level": "ERROR",
29
29
  "sap-ui-xx-viewCache": true
@@ -2,12 +2,14 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log", "sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/fe/core/TemplateModel", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor", "sap/fe/core/converters/ConverterContext", "sap/fe/core/jsx-runtime/jsx", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/test/UI5MockHelper", "sap/ui/base/BindingParser", "sap/ui/base/ManagedObject", "sap/ui/base/ManagedObjectMetadata", "sap/ui/core/Component", "sap/ui/core/InvisibleText", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/util/serializer/Serializer", "sap/ui/fl/Utils", "sap/ui/fl/apply/_internal/flexState/FlexState", "sap/ui/fl/apply/_internal/flexState/Loader", "sap/ui/fl/apply/_internal/preprocessors/XmlPreprocessor", "sap/ui/fl/initial/_internal/Storage", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "xpath", "./JestFlexibilityHelper"], function (compiler, fs, htmljs_parser, path, Log, LoaderExtensions, merge, TemplateModel, BuildingBlockTemplateProcessor, ConverterContext, jsx, SideEffectsFactory, UI5MockHelper, BindingParser, ManagedObject, ManagedObjectMetadata, Component, InvisibleText, XMLTemplateProcessor, XMLPreprocessor, Serializer, Utils, FlexState, Loader, XmlPreprocessor, AppStorage, JSONModel, ODataMetaModel, _MetadataRequestor, xpath, JestFlexibilityHelper) {
5
+ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log", "sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/fe/core/TemplateModel", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/jsx-runtime/jsx", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/test/UI5MockHelper", "sap/ui/base/BindingParser", "sap/ui/base/ManagedObject", "sap/ui/base/ManagedObjectMetadata", "sap/ui/core/Component", "sap/ui/core/InvisibleText", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/util/serializer/Serializer", "sap/ui/fl/Utils", "sap/ui/fl/apply/_internal/flexState/FlexState", "sap/ui/fl/apply/_internal/flexState/Loader", "sap/ui/fl/apply/_internal/preprocessors/XmlPreprocessor", "sap/ui/fl/initial/_internal/Storage", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "xpath", "./JestFlexibilityHelper"], function (compiler, fs, htmljs_parser, path, Log, LoaderExtensions, merge, TemplateModel, BuildingBlockTemplateProcessor, ConverterContext, MetaModelConverter, jsx, SideEffectsFactory, UI5MockHelper, BindingParser, ManagedObject, ManagedObjectMetadata, Component, InvisibleText, XMLTemplateProcessor, XMLPreprocessor, Serializer, Utils, FlexState, Loader, XmlPreprocessor, AppStorage, JSONModel, ODataMetaModel, _MetadataRequestor, xpath, JestFlexibilityHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  var createFlexibilityChangesObject = JestFlexibilityHelper.createFlexibilityChangesObject;
10
10
  var createMockResourceModel = UI5MockHelper.createMockResourceModel;
11
+ var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
12
+ var convertTypes = MetaModelConverter.convertTypes;
11
13
  var parseXMLString = BuildingBlockTemplateProcessor.parseXMLString;
12
14
  var createParser = htmljs_parser.createParser;
13
15
  Log.setLevel(1, "sap.ui.core.util.XMLPreprocessor");
@@ -385,9 +387,9 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
385
387
  };
386
388
  };
387
389
  _exports.getFakeDiagnostics = getFakeDiagnostics;
388
- const getConverterContextForTest = function (convertedTypes, manifestSettings) {
389
- const entitySet = convertedTypes.entitySets.find(es => es.name === manifestSettings.entitySet);
390
- const dataModelPath = getDataModelObjectPathForProperty(entitySet, convertedTypes, entitySet);
390
+ const getConverterContextForTest = function (metaModel, manifestSettings) {
391
+ const convertedTypes = convertTypes(metaModel);
392
+ const dataModelPath = manifestSettings.contextPath ? getInvolvedDataModelObjects(metaModel.createBindingContext(manifestSettings.contextPath)) : getInvolvedDataModelObjects(metaModel.createBindingContext(`/${manifestSettings.entitySet}`));
391
393
  return new ConverterContext(convertedTypes, manifestSettings, getFakeDiagnostics(), merge, dataModelPath);
392
394
  };
393
395
  _exports.getConverterContextForTest = getConverterContextForTest;
@@ -736,4 +738,4 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
736
738
  _exports.registerMockFragments = registerMockFragments;
737
739
  return _exports;
738
740
  }, false);
739
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2ciLCJzZXRMZXZlbCIsImplc3QiLCJzZXRUaW1lb3V0IiwibmFtZVNwYWNlTWFwIiwibWFjcm8iLCJtYWNyb3MiLCJmZUJCIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsImNvbnRyb2wiLCJjb250cm9scyIsImNvcmUiLCJkdCIsIm0iLCJmIiwiZmwiLCJpbnRlcm5hbE1hY3JvIiwibWRjIiwibWRjYXQiLCJtZGNGaWVsZCIsIm1kY1RhYmxlIiwidSIsIm1hY3JvTWljcm9DaGFydCIsIm1pY3JvQ2hhcnQiLCJtYWNyb1RhYmxlIiwicmV2ZXNlTmFtZXNwYWNlTWFwIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsInJldmVyc2VNYXAiLCJjdXJyZW50TmFtZSIsInNlbGVjdCIsInhwYXRoIiwidXNlTmFtZXNwYWNlcyIsImRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UiLCJjb21wdXRlRmllbGRHcm91cElkcyIsIl9nZXRUZW1wbGF0ZWRTZWxlY3RvciIsInhtbGRvbSIsInNlbGVjdG9yIiwicm9vdFBhdGgiLCJub2RlTmFtZSIsInN0YXJ0c1dpdGgiLCJfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyIsInNNZXRhZGF0YVVybCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwiZmFrZVNpZGVFZmZlY3RTZXJ2aWNlIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImhhc093blByb3BlcnR5IiwiYXNzaWduIiwiY29udmVydGVyQ29udGV4dCIsIlRlbXBsYXRlTW9kZWwiLCJmb3JFYWNoIiwic01vZGVsTmFtZSIsImlzVGVtcGxhdGVNb2RlbCIsImRhdGEiLCJzZXR0aW5ncyIsIm1vZGVscyIsIm1ldGFNb2RlbCIsImJpbmRpbmdDb250ZXh0cyIsImFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImZuIiwiZ2V0RGlhZ25vc3RpY3MiLCJ1bmRlZmluZWQiLCJtb2NrUmV0dXJuVmFsdWUiLCJzS2V5IiwiZXhwZWN0IiwiZ2V0T2JqZWN0IiwidG9CZURlZmluZWQiLCJvTW9kZWwiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIl9sb2FkUmVzb3VyY2VWaWV3Iiwidmlld05hbWUiLCJuYW1lIiwicmVwbGFjZSIsInZpZXciLCJMb2FkZXJFeHRlbnNpb25zIiwibG9hZFJlc291cmNlIiwiZG9jdW1lbnRFbGVtZW50IiwicnVuWFBhdGhRdWVyeSIsImV4dGVuZCIsInRvSGF2ZUNvbnRyb2wiLCJub2RlcyIsIm1lc3NhZ2UiLCJvdXRwdXRYbWwiLCJzZXJpYWxpemVYTUwiLCJwYXNzIiwibGVuZ3RoIiwidG9Ob3RIYXZlQ29udHJvbCIsInRvSGF2ZVRlbXBsYXRpbmdFcnJvcnMiLCJ4bWwiLCJ4bWxUZXh0IiwiYmFzZTY0RW50cmllcyIsIm1hdGNoIiwiZXJyb3JNZXNzYWdlcyIsIm1hcCIsImF0b2IiLCJzbGljZSIsImpvaW4iLCJmb3JtYXRCdWlsZGluZ0Jsb2NrWE1MIiwieG1sU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9ybWF0WE1MIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwid2luZG93IiwiWE1MU2VyaWFsaXplciIsIm5vZGUiLCJzZXJpYWxpemVUb1N0cmluZyIsIlNUQVJUIiwiRU5EIiwiVUlEIiwibGluZXMiLCJjdXJyZW50TGluZSIsImxldmVsIiwiYXR0cmlidXRlcyIsIm5ld2xpbmUiLCJwdXNoIiwicmVwZWF0IiwiYXBwZW5kQXR0cmlidXRlcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJpbmNsdWRlcyIsImF0dHJpYnV0ZSIsInZhbHVlIiwiYXBwZW5kIiwicGFyc2VyIiwicmVhZCIsImNyZWF0ZVBhcnNlciIsIm9uT3BlblRhZ1N0YXJ0Iiwib25PcGVuVGFnTmFtZSIsIm9uQXR0ck5hbWUiLCJ1bnNoaWZ0Iiwib25BdHRyVmFsdWUiLCJvbk9wZW5UYWdFbmQiLCJzZWxmQ2xvc2VkIiwib25DbG9zZVRhZ1N0YXJ0Iiwib25DbG9zZVRhZ05hbWUiLCJvbkNsb3NlVGFnRW5kIiwicGFyc2UiLCJ0cmltIiwiY29tcGlsZUNEUyIsImNkc1VybCIsIm9wdGlvbnMiLCJjZHNTdHJpbmciLCJmcyIsInJlYWRGaWxlU3luYyIsImVkbXhDb250ZW50IiwiY2RzMmVkbXgiLCJkaXIiLCJwYXRoIiwicmVzb2x2ZSIsImFsbE9wdGlvbnMiLCJlbnRyaWVzIiwiZWRteEZpbGVOYW1lIiwiZmlsZW5hbWUiLCJvcHRpb25LZXkiLCJvcHRpb25WYWx1ZSIsInRvU3RyaW5nIiwiYmFzZW5hbWUiLCJlZG14RmlsZVBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsInNvdXJjZXMiLCJyZXF1aXJlIiwiY3NuIiwiY29tcGlsZXIiLCJjb21waWxlU291cmNlcyIsImVkbXhPcHRpb25zIiwib2RhdGFGb3JlaWduS2V5cyIsIm9kYXRhRm9ybWF0Iiwib2RhdGFDb250YWlubWVudCIsImVkbXgiLCJ0byIsIkVycm9yIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsImNsYXNzTmFtZU9EYXRhTW9kZWwiLCJzY29wZU9iamVjdCIsImdldE1vZGVsIiwiaXNBIiwiZ2V0U2VydmljZVVybCIsImdldFNlcnZpY2UiLCJnZXRDYXBhYmlsaXRpZXMiLCJzZXJ2aWNlSW5zdGFuY2UiLCJTaWRlRWZmZWN0c0ZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsImdldEludGVyZmFjZSIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJjb252ZXJ0ZWRUeXBlcyIsIm1hbmlmZXN0U2V0dGluZ3MiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwiT0RhdGFNZXRhTW9kZWwiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwibmFtZWRNb2RlbHNDb250ZW50IiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJkZWZhdWx0TW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiY29udGVudCIsIm1vZGVsIiwiZ2V0VGV4dCIsIlRFU1RWSUVXSUQiLCJhcHBseUZsZXhDaGFuZ2VzIiwiZmxleENoYW5nZXMiLCJyZXN1bHRYTUwiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaWQiLCJjaGFuZ2VzIiwiY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0IiwiYXBwSWQiLCJvTWFuaWZlc3QiLCJ0eXBlIiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwib0FwcENvbXBvbmVudCIsImdldENvbXBvbmVudERhdGEiLCJnZXRNYW5pZmVzdE9iamVjdCIsImdldEVudHJ5IiwiZ2V0TG9jYWxJZCIsInNJZCIsInNweU9uIiwiQXBwU3RvcmFnZSIsIlByb21pc2UiLCJMb2FkZXIiLCJDb21wb25lbnQiLCJVdGlscyIsIkZsZXhTdGF0ZSIsImluaXRpYWxpemUiLCJjb21wb25lbnRJZCIsIlhtbFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJjaGFuZ2VzQXBwbGllZCIsImdldENoYW5nZXNGcm9tWE1MIiwidG9CZSIsInZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcyIsImZsYXRNYXAiLCJlIiwiZmlsdGVyIiwiYXR0ciIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsImNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsIiwidGVtcGxhdGVkWG1sIiwiRE9NUGFyc2VyIiwieG1sRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwiWE1MUHJlcHJvY2Vzc29yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRUZW1wbGF0ZWRYTUwiLCJqc3giLCJkZWZpbmVYTUxOYW1lc3BhY2VNYXAiLCJ0ZW1wbGF0ZWRYTUwiLCJzZXJpYWxpZWRYTUwiLCJub3QiLCJwcm9jZXNzVmlldyIsIm9WaWV3RG9jdW1lbnQiLCJvUHJlcHJvY2Vzc2VkVmlldyIsImFzRWxlbWVudCIsImFzU3RyaW5nIiwib3V0ZXJIVE1MIiwicHJvY2Vzc0ZyYWdtZW50IiwidGVzdERhdGEiLCJpbnB1dFhtbCIsImlucHV0RG9jIiwianNvbk1vZGVsIiwic2V0RGF0YSIsInJlc3VsdERvYyIsImZyYWdtZW50cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZnJhZ21lbnQiLCJpbm5lckhUTUwiLCJ4bWxSZXN1bHQiLCJjaGlsZHJlbiIsInNlcmlhbGl6ZUNvbnRyb2wiLCJjb250cm9sVG9TZXJpYWxpemUiLCJ0YWJDb3VudCIsImdldFRhYiIsInRvQWRkIiwidGFiIiwiaSIsInNlcmlhbGl6ZURlbGVnYXRlIiwic3RhcnQiLCJzQWdncmVnYXRpb25OYW1lIiwiY29udHJvbERldGFpbCIsImdldFBhcmVudCIsImluZGV4SW5QYXJlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImluZGV4T2YiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJlbmQiLCJtaWRkbGUiLCJnZXRJZCIsIk1hbmFnZWRPYmplY3RNZXRhZGF0YSIsImlzR2VuZXJhdGVkSWQiLCJvQ29udHJvbEtleSIsIm1Qcm9wZXJ0aWVzIiwibUJpbmRpbmdJbmZvcyIsImJpbmRpbmdEZXRhaWwiLCJKU09OIiwic3RyaW5naWZ5IiwibUFzc29jaWF0aW9ucyIsIm1FdmVudFJlZ2lzdHJ5Iiwic3RhcnRBZ2dyZWdhdGlvbiIsInNOYW1lIiwib3V0IiwiZW5kQWdncmVnYXRpb24iLCJjb250cm9sVG9SZW5kZXIiLCJTZXJpYWxpemVyIiwic2VyaWFsaXplIiwiY3JlYXRlQXdhaXRlciIsImZuUmVzb2x2ZSIsIm15UHJvbWlzZSIsInByb21pc2UiLCJyZW5kZXJCdWlsZGluZ0Jsb2NrV2l0aE1vZGVscyIsImJ1aWxkaW5nQmxvY2siLCJNYW5hZ2VkT2JqZWN0IiwicnVuV2l0aFByZXByb2Nlc3NvcnMiLCJnZXRDb250ZW50IiwiY29udHJvbFNldHRpbmdzIiwicmVnaXN0ZXJNb2NrRnJhZ21lbnRzIiwib3JpZ2luYWxMb2FkVGVtcGxhdGUiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZVByb21pc2UiLCJsb2FkVGVtcGxhdGVTdHViIiwibW9ja0ltcGxlbWVudGF0aW9uIiwidGVtcGxhdGVOYW1lIiwiZXh0ZW5zaW9uIiwicGFyc2VYTUxTdHJpbmciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQW55QW5ub3RhdGlvbiwgQ29udmVydGVkTWV0YWRhdGEsIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBjb21waWxlciBmcm9tIFwiQHNhcC9jZHMtY29tcGlsZXJcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHR5cGUgeyBSYW5nZSwgUmFuZ2VzIH0gZnJvbSBcImh0bWxqcy1wYXJzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVBhcnNlciB9IGZyb20gXCJodG1sanMtcGFyc2VyXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2FkZXJFeHRlbnNpb25zIGZyb20gXCJzYXAvYmFzZS91dGlsL0xvYWRlckV4dGVuc2lvbnNcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgVGVtcGxhdGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVNb2RlbFwiO1xuaW1wb3J0IHsgcGFyc2VYTUxTdHJpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MsIE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBJRGlhZ25vc3RpY3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCBqc3ggZnJvbSBcInNhcC9mZS9jb3JlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFNpZGVFZmZlY3RzRmFjdG9yeSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL3Rlc3QvVUk1TW9ja0hlbHBlclwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXJcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwic2FwL3VpL2ZsL1V0aWxzXCI7XG5pbXBvcnQgRmxleFN0YXRlIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvX2ludGVybmFsL2ZsZXhTdGF0ZS9GbGV4U3RhdGVcIjtcbmltcG9ydCBMb2FkZXIgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0xvYWRlclwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvbWRjL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgX01ldGFkYXRhUmVxdWVzdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvbGliL19NZXRhZGF0YVJlcXVlc3RvclwiO1xuaW1wb3J0IHhwYXRoIGZyb20gXCJ4cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VkT2JqZWN0RXggfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QgfSBmcm9tIFwiLi9KZXN0RmxleGliaWxpdHlIZWxwZXJcIjtcblxudHlwZSBQcmVQcm9jZXNzb3JTZXR0aW5nc1R5cGUgPSB7XG5cdG1vZGVsczoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfCBPRGF0YU1ldGFNb2RlbDtcblx0fTtcblx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdH07XG59O1xudHlwZSBNb2NrRnJhZ21lbnQgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0Y29udGVudDogc3RyaW5nO1xufTtcblxudHlwZSBKZXN0VGVtcGxhdGVkVmlldyA9IHtcblx0YXNFbGVtZW50OiBFbGVtZW50IHwgdW5kZWZpbmVkO1xuXHRhc1N0cmluZzogc3RyaW5nO1xufTtcblxuTG9nLnNldExldmVsKDEgYXMgYW55LCBcInNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yXCIpO1xuamVzdC5zZXRUaW1lb3V0KDQwMDAwKTtcblxuY29uc3QgbmFtZVNwYWNlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRtYWNybzogXCJzYXAuZmUubWFjcm9zXCIsXG5cdG1hY3JvczogXCJzYXAuZmUubWFjcm9zXCIsXG5cdGZlQkI6IFwic2FwLmZlLmNvcmUuYnVpbGRpbmdCbG9ja3MudGVtcGxhdGluZ1wiLFxuXHRtYWNyb0ZpZWxkOiBcInNhcC5mZS5tYWNyb3MuZmllbGRcIixcblx0bWFjcm9kYXRhOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0bG9nOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0Y29udHJvbDogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRjb250cm9sczogXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzXCIsXG5cdGNvcmU6IFwic2FwLnVpLmNvcmVcIixcblx0ZHQ6IFwic2FwLnVpLmR0XCIsXG5cdG06IFwic2FwLm1cIixcblx0ZjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0Zmw6IFwic2FwLnVpLmZsXCIsXG5cdGludGVybmFsTWFjcm86IFwic2FwLmZlLm1hY3Jvcy5pbnRlcm5hbFwiLFxuXHRtZGM6IFwic2FwLnVpLm1kY1wiLFxuXHRtZGNhdDogXCJzYXAudWkubWRjLmFjdGlvbnRvb2xiYXJcIixcblx0bWRjRmllbGQ6IFwic2FwLnVpLm1kYy5maWVsZFwiLFxuXHRtZGNUYWJsZTogXCJzYXAudWkubWRjLnRhYmxlXCIsXG5cdHU6IFwic2FwLnVpLnVuaWZpZWRcIixcblx0bWFjcm9NaWNyb0NoYXJ0OiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRtaWNyb0NoYXJ0OiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCIsXG5cdG1hY3JvVGFibGU6IFwic2FwLmZlLm1hY3Jvcy50YWJsZVwiXG59O1xuY29uc3QgcmV2ZXNlTmFtZXNwYWNlTWFwID0gT2JqZWN0LmtleXMobmFtZVNwYWNlTWFwKS5yZWR1Y2UoKHJldmVyc2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGN1cnJlbnROYW1lKSA9PiB7XG5cdHJldmVyc2VNYXBbbmFtZVNwYWNlTWFwW2N1cnJlbnROYW1lXV0gPSBjdXJyZW50TmFtZTtcblx0cmV0dXJuIHJldmVyc2VNYXA7XG59LCB7fSk7XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmNvbnN0IGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UgPSB7IGNvbXB1dGVGaWVsZEdyb3VwSWRzOiAoKSA9PiBbXSB9O1xuXG5mdW5jdGlvbiBfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tOiBOb2RlLCBzZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcblx0LyoqXG5cdCAqIGlmIGEgcm9vdCBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIGR1cmluZyB0aGUgdGVtcGxhdGluZyBieSBvdXIgSmVzdCBUZW1wbGF0aW5nIG1ldGhvZHNcblx0ICogdGhlIHJvb3QgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgc2VsZWN0b3IgcGF0aC5cblx0ICovXG5cdGNvbnN0IHJvb3RQYXRoID0gXCIvcm9vdFwiO1xuXHRyZXR1cm4gYCR7eG1sZG9tLm5vZGVOYW1lID09PSBcInJvb3RcIiAmJiAhc2VsZWN0b3Iuc3RhcnRzV2l0aChyb290UGF0aCkgPyByb290UGF0aCA6IFwiXCJ9JHtzZWxlY3Rvcn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKTogUHJvbWlzZTxQcmVQcm9jZXNzb3JTZXR0aW5nc1R5cGU+IHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXG5cdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHQvLyBpZiBub3QgYWxyZWFkeSBwYXNzZWQgdG8gdGVoIHRlbXBsYXRpbmdcblx0aWYgKCFtTW9kZWxzLmhhc093blByb3BlcnR5KFwiY29udmVydGVyQ29udGV4dFwiKSkge1xuXHRcdG1Nb2RlbHMgPSBPYmplY3QuYXNzaWduKG1Nb2RlbHMsIHsgY29udmVydGVyQ29udGV4dDogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwpIH0pO1xuXHR9XG5cblx0T2JqZWN0LmtleXMobU1vZGVscykuZm9yRWFjaChmdW5jdGlvbiAoc01vZGVsTmFtZSkge1xuXHRcdGlmIChtTW9kZWxzW3NNb2RlbE5hbWVdICYmIG1Nb2RlbHNbc01vZGVsTmFtZV0uaXNUZW1wbGF0ZU1vZGVsKSB7XG5cdFx0XHRtTW9kZWxzW3NNb2RlbE5hbWVdID0gbmV3IFRlbXBsYXRlTW9kZWwobU1vZGVsc1tzTW9kZWxOYW1lXS5kYXRhLCBvTWV0YU1vZGVsKTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0IHNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9LFxuXHRcdGFwcENvbXBvbmVudDogeyBnZXRTaWRlRWZmZWN0c1NlcnZpY2U6IGplc3QuZm4oKSwgZ2V0RGlhZ25vc3RpY3M6ICgpID0+IHVuZGVmaW5lZCB9XG5cdH07XG5cblx0c2V0dGluZ3MuYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZS5tb2NrUmV0dXJuVmFsdWUoZmFrZVNpZGVFZmZlY3RTZXJ2aWNlID8/IGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXHQvL0luamVjdCBtb2RlbHMgYW5kIGJpbmRpbmdDb250ZXh0c1xuXHRPYmplY3Qua2V5cyhtQmluZGluZ0NvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0tleV0gPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobUJpbmRpbmdDb250ZXh0c1tzS2V5XSk7IC8vVmFsdWUgaXMgc1BhdGhcblx0XHRzZXR0aW5ncy5tb2RlbHNbc0tleV0gPSBvTW9kZWw7XG5cdH0pO1xuXHRyZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIF9sb2FkUmVzb3VyY2VWaWV3KHZpZXdOYW1lOiBzdHJpbmcpOiBFbGVtZW50IHtcblx0Y29uc3QgbmFtZSA9IHZpZXdOYW1lLnJlcGxhY2UoL1xcLi9nLCBcIi9cIikgKyBcIi52aWV3LnhtbFwiO1xuXHRjb25zdCB2aWV3ID0gTG9hZGVyRXh0ZW5zaW9ucy5sb2FkUmVzb3VyY2UobmFtZSk7XG5cdHJldHVybiB2aWV3LmRvY3VtZW50RWxlbWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IHJ1blhQYXRoUXVlcnkgPSBmdW5jdGlvbiAoc2VsZWN0b3I6IHN0cmluZywgeG1sZG9tOiBOb2RlIHwgdW5kZWZpbmVkKSB7XG5cdHJldHVybiBzZWxlY3Qoc2VsZWN0b3IsIHhtbGRvbSk7XG59O1xuXG5leHBlY3QuZXh0ZW5kKHtcblx0dG9IYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb20sIHNlbGVjdG9yKSwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBkaWQgbm90IGZpbmQgY29udHJvbHMgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPj0gMVxuXHRcdH07XG5cdH0sXG5cdHRvTm90SGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tLCBzZWxlY3RvciksIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgVGhlcmUgaXMgYSBjb250cm9sIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID09PSAwXG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBmb3IgZXJyb3JzIGluIGB4bWxgIGNyZWF0ZWQgZHVyaW5nIHRlbXBsYXRpbmcgb2YgYW4gWE1MIHN0cmluZyBvclxuXHQgKiBhbiBYTUwgbm9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBjaGVja2VzIGZvciB0aGUgeG1sIGVycm9ycyBjcmVhdGVkIGJ5IHRoZVxuXHQgKiBmdW5jdGlvbiBbQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yLmNyZWF0ZUVycm9yWE1MXXtAbGluayBzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nLkJ1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvciNjcmVhdGVFcnJvclhNTH0uXG5cdCAqXG5cdCAqIEBwYXJhbSB4bWwgWE1MIFN0cmluZyBvciBYTUwgTm9kZSB0byBiZSB0ZXN0ZWQgZm9yIGVycm9yc1xuXHQgKiBAcmV0dXJucyBKZXN0IE1hdGNoZXIgcmVzdWx0IG9iamVjdFxuXHQgKi9cblx0dG9IYXZlVGVtcGxhdGluZ0Vycm9ycyh4bWw6IHN0cmluZyB8IE5vZGUpIHtcblx0XHRjb25zdCB4bWxUZXh0ID0gdHlwZW9mIHhtbCA9PT0gXCJzdHJpbmdcIiA/IHhtbCA6IHNlcmlhbGl6ZVhNTCh4bWwpO1xuXHRcdGNvbnN0IGJhc2U2NEVudHJpZXM6IHN0cmluZ1tdID0geG1sVGV4dC5tYXRjaCgvQkJGXFwuYmFzZTY0RGVjb2RlXFwoJyhbXiddKiknXFwpL2dtKSB8fCAoW10gYXMgc3RyaW5nW10pO1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gYmFzZTY0RW50cmllcy5tYXAoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuXHRcdFx0aWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBhdG9iKG1lc3NhZ2UubWF0Y2goLygnW14nXSopLyk/LlswXT8uc2xpY2UoMSkgfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9KTtcblx0XHRpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPD0gMCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVzc2FnZTogKCkgPT4gYFhNTCBUZW1wbGF0aW5nIHdpdGhvdXQgZXJyb3JzYCxcblx0XHRcdFx0cGFzczogZmFsc2Vcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lc3NhZ2U6ICgpID0+IGVycm9yTWVzc2FnZXMuam9pbihcIlxcblwiKSxcblx0XHRcdFx0cGFzczogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoeG1sU3RyaW5nKSkge1xuXHRcdHhtbFN0cmluZyA9IHhtbFN0cmluZy5qb2luKFwiXCIpO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sQXR0cmlidXRlID0gZnVuY3Rpb24gKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoJHtfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sRG9tLCBjb250cm9sU2VsZWN0b3IpfS9AJHthdHRyaWJ1dGVOYW1lfSlgO1xuXHRyZXR1cm4gcnVuWFBhdGhRdWVyeShzZWxlY3RvciwgeG1sRG9tKTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBwYXJ0cyBvciB0aGUgY29tcGxldGUgZ2l2ZW4gWE1MIERPTSB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHhtbERvbSBET00gbm9kZSB0aGF0IGlzIHRvIGJlIHNlcmlhbGl6ZWQuXG4gKiBAcGFyYW0gc2VsZWN0b3IgT3B0aW9uYWwgc2VsZWN0b3Igb2Ygc3ViIG5vZGVzXG4gKiBAcmV0dXJucyBYTUwgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVYTUwgPSBmdW5jdGlvbiAoeG1sRG9tOiBOb2RlLCBzZWxlY3Rvcj86IHN0cmluZykge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGxldCB4bWxTdHJpbmc6IHN0cmluZztcblx0aWYgKHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KHNlbGVjdG9yLCB4bWxEb20pIGFzIE5vZGVbXTtcblx0XHR4bWxTdHJpbmcgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobm9kZSkpLmpvaW4oXCJcXG5cIik7XG5cdH0gZWxzZSB7XG5cdFx0eG1sU3RyaW5nID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbi8qKlxuICogRm9ybWF0cyBhIHN0cmluZyBjb250YWluaW5nIGFuIFhNTCBkb2N1bWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIG9ubHkgY29uc2lkZXJzIFhNTCB0YWdzIGFuZCBhdHRyaWJ1dGVzLCBpZ25vcmluZyBldmVyeXRoaW5nIGVsc2UgKHRleHQsIGNvbW1lbnRzKS4gQWRkaXRpb25hbGx5LFxuICogYXR0cmlidXRlIHZhbHVlcyBjb250YWluaW5nIGEgdmFyeWluZyBVSUQgYXJlIHJlcGxhY2VkIHdpdGggYSBjb25zdGFudCB2YWx1ZS5cbiAqXG4gKiBBbiBcIlhNTFwiIHN0cmluZyBjb250YWluaW5nIG11bHRpcGxlIHJvb3QgZWxlbWVudHMgY2FuIGJlLlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgIFRoZSBpbnB1dCBYTUwgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGFsc28gYWNjZXB0cyBcIlhNTFwiIHN0cmluZ3Mgd2l0aCBtdWx0aXBsZSByb290IGVsZW1lbnRzLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBYTUwgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0WE1MID0gZnVuY3Rpb24gKHhtbFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgU1RBUlQgPSBcIjxfX1hNTF9fPlwiLFxuXHRcdEVORCA9IFwiPC9fX1hNTF9fPlwiLFxuXHRcdFVJRCA9IC91aWQtLWlkLVxcZHsxM30tXFxkezEsM30vLFxuXHRcdGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdGxldCBjdXJyZW50TGluZSA9IFwiXCIsXG5cdFx0bGV2ZWwgPSAtMSxcblx0XHRhdHRyaWJ1dGVzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfVtdID0gW107XG5cblx0ZnVuY3Rpb24gbmV3bGluZSgpIHtcblx0XHRpZiAoY3VycmVudExpbmUgJiYgY3VycmVudExpbmUgIT09IFNUQVJUKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcblx0XHR9XG5cblx0XHRjdXJyZW50TGluZSA9IGxldmVsID4gMCA/IFwiICBcIi5yZXBlYXQobGV2ZWwpIDogXCJcIjtcblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGVuZEF0dHJpYnV0ZXMoKSB7XG5cdFx0aWYgKGF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0YXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0XHRpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiAhYi5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0fSBlbHNlIGlmICghYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiBiLm5hbWUuc3RhcnRzV2l0aChcInhtbG5zXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiBiLm5hbWUuc3RhcnRzV2l0aChcInhtbG5zXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYS5uYW1lLmluY2x1ZGVzKFwiOlwiKSAmJiAhYi5uYW1lLmluY2x1ZGVzKFwiOlwiKSkge1xuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0fSBlbHNlIGlmICghYS5uYW1lLmluY2x1ZGVzKFwiOlwiKSAmJiBiLm5hbWUuaW5jbHVkZXMoXCI6XCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRsZXZlbCsrO1xuXHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuXHRcdFx0XHRuZXdsaW5lKCk7XG5cdFx0XHRcdGN1cnJlbnRMaW5lICs9IGF0dHJpYnV0ZS5uYW1lO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlLnZhbHVlKSBjdXJyZW50TGluZSArPSBhdHRyaWJ1dGUudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRsZXZlbC0tO1xuXHRcdFx0YXR0cmlidXRlcyA9IFtdO1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGVuZChkYXRhOiBSYW5nZSkge1xuXHRcdGN1cnJlbnRMaW5lICs9IHBhcnNlci5yZWFkKGRhdGEpO1xuXHR9XG5cblx0Y29uc3QgcGFyc2VyID0gY3JlYXRlUGFyc2VyKHtcblx0XHRvbk9wZW5UYWdTdGFydChkYXRhOiBSYW5nZSkge1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdFx0YXBwZW5kKGRhdGEpO1xuXHRcdH0sXG5cblx0XHRvbk9wZW5UYWdOYW1lOiBhcHBlbmQsXG5cblx0XHRvbkF0dHJOYW1lKGRhdGE6IFJhbmdlKSB7XG5cdFx0XHRhdHRyaWJ1dGVzLnVuc2hpZnQoeyBuYW1lOiBwYXJzZXIucmVhZChkYXRhKSB9KTtcblx0XHR9LFxuXG5cdFx0b25BdHRyVmFsdWUoZGF0YTogUmFuZ2VzLkF0dHJWYWx1ZSkge1xuXHRcdFx0YXR0cmlidXRlc1swXS52YWx1ZSA9IHBhcnNlci5yZWFkKGRhdGEpLnJlcGxhY2UoVUlELCBcInVpZC0taWRcIik7IC8vIHJlcGxhY2UgdmFyeWluZyBVSURzIHdpdGggYSBjb25zdGFudCB2YWx1ZVxuXHRcdH0sXG5cblx0XHRvbk9wZW5UYWdFbmQoZGF0YTogUmFuZ2VzLk9wZW5UYWdFbmQpIHtcblx0XHRcdGFwcGVuZEF0dHJpYnV0ZXMoKTtcblx0XHRcdGFwcGVuZChkYXRhKTtcblx0XHRcdGlmICghZGF0YS5zZWxmQ2xvc2VkKSBsZXZlbCsrO1xuXHRcdH0sXG5cblx0XHRvbkNsb3NlVGFnU3RhcnQoZGF0YTogUmFuZ2UpIHtcblx0XHRcdGxldmVsLS07XG5cdFx0XHRuZXdsaW5lKCk7XG5cdFx0XHRhcHBlbmQoZGF0YSk7XG5cdFx0fSxcblxuXHRcdG9uQ2xvc2VUYWdOYW1lOiBhcHBlbmQsXG5cdFx0b25DbG9zZVRhZ0VuZDogYXBwZW5kXG5cdH0pO1xuXG5cdHBhcnNlci5wYXJzZShTVEFSVCArIHhtbFN0cmluZyArIEVORCk7XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIENEUyBmaWxlIGludG8gYW4gRURNWCBmaWxlLlxuICpcbiAqIEBwYXJhbSBjZHNVcmwgVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgQ0RTIGRlZmluaXRpb24uIFRoaXMgZmlsZSBtdXN0IGRlY2xhcmUgdGhlIG5hbWVzcGFjZVxuICogc2FwLmZlLnRlc3QgYW5kIGEgc2VydmljZSBKZXN0U2VydmljZVxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcmV0dXJucyBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbiAoY2RzVXJsOiBzdHJpbmcsIG9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGNkc1N0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhjZHNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gY2RzMmVkbXgoY2RzU3RyaW5nLCBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIsIG9wdGlvbnMpO1xuXHRjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoY2RzVXJsLCBcIi4uXCIsIFwiZ2VuXCIpO1xuXG5cdC8vIElmIHRoZSBjYWxsZXIgcHJvdmlkZWQgQ0RTIGNvbXBpbGVyIG9wdGlvbnM6IEluY2x1ZGUgdGhlbSBpbiB0aGUgZmlsZW5hbWUuIFRoaXMgcHJldmVudHMgdW5wcmVkaWN0YWJsZSByZXN1bHRzIGlmIHRoZSBzYW1lIENEUyBzb3VyY2Vcblx0Ly8gZmlsZSBpcyB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGggYSBkaWZmZXJlbnQgc2V0IG9mIG9wdGlvbnMgKGUuZy4gaW4gYSB0ZXN0IHJ1bm5pbmcgaW4gcGFyYWxsZWwpXG5cdGNvbnN0IGFsbE9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKTtcblx0YWxsT3B0aW9ucy5zb3J0KChhLCBiKSA9PiBiWzBdLmxvY2FsZUNvbXBhcmUoYVswXSkpO1xuXG5cdGNvbnN0IGVkbXhGaWxlTmFtZSA9XG5cdFx0YWxsT3B0aW9ucy5yZWR1Y2UoXG5cdFx0XHQoZmlsZW5hbWUsIFtvcHRpb25LZXksIG9wdGlvblZhbHVlXSkgPT4gYCR7ZmlsZW5hbWV9IyR7b3B0aW9uS2V5fT0ke29wdGlvblZhbHVlLnRvU3RyaW5nKCl9I2AsXG5cdFx0XHRwYXRoLmJhc2VuYW1lKGNkc1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCJcIilcblx0XHQpICsgXCIueG1sXCI7XG5cblx0Y29uc3QgZWRteEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpciwgZWRteEZpbGVOYW1lKTtcblxuXHRmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRmcy53cml0ZUZpbGVTeW5jKGVkbXhGaWxlUGF0aCwgZWRteENvbnRlbnQpO1xuXHRyZXR1cm4gZWRteEZpbGVQYXRoO1xufTtcblxuLyoqXG4gKiBDb21waWxlIENEUyB0byBFRE1YLlxuICpcbiAqIEBwYXJhbSBjZHMgVGhlIENEUyBtb2RlbC4gSXQgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHNlcnZpY2UuXG4gKiBAcGFyYW0gc2VydmljZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gYmUgY29tcGlsZWQuIERlZmF1bHRzIHRvIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIi5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgbW9kZWwgYXMgRURNWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNkczJlZG14KGNkczogc3RyaW5nLCBzZXJ2aWNlID0gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBcInNvdXJjZS5jZHNcIjogY2RzIH07XG5cblx0Ly8gYWxsb3cgdG8gaW5jbHVkZSBzdHVmZiBmcm9tIEBzYXAvY2RzL2NvbW1vblxuXHRpZiAoY2RzLmluY2x1ZGVzKFwiJ0BzYXAvY2RzL2NvbW1vbidcIikpIHtcblx0XHRzb3VyY2VzW1wiY29tbW9uLmNkc1wiXSA9IGZzLnJlYWRGaWxlU3luYyhyZXF1aXJlLnJlc29sdmUoXCJAc2FwL2Nkcy9jb21tb24uY2RzXCIpLCBcInV0Zi04XCIpO1xuXHR9XG5cblx0Y29uc3QgY3NuID0gY29tcGlsZXIuY29tcGlsZVNvdXJjZXMoc291cmNlcywge30pO1xuXG5cdGNvbnN0IGVkbXhPcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7XG5cdFx0b2RhdGFGb3JlaWduS2V5czogdHJ1ZSxcblx0XHRvZGF0YUZvcm1hdDogXCJzdHJ1Y3R1cmVkXCIsXG5cdFx0b2RhdGFDb250YWlubWVudDogdHJ1ZSxcblx0XHQuLi5vcHRpb25zLFxuXHRcdHNlcnZpY2U6IHNlcnZpY2Vcblx0fTtcblxuXHRjb25zdCBlZG14ID0gY29tcGlsZXIudG8uZWRteChjc24sIGVkbXhPcHRpb25zKTtcblx0aWYgKCFlZG14KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21waWxhdGlvbiBmYWlsZWQuIEhpbnQ6IE1ha2Ugc3VyZSB0aGF0IHRoZSBDRFMgbW9kZWwgZGVmaW5lcyBzZXJ2aWNlICR7c2VydmljZX0uYCk7XG5cdH1cblx0cmV0dXJuIGVkbXg7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRjbGFzc05hbWVPRGF0YU1vZGVsID0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiXG4pOiBQcm9taXNlPFNpZGVFZmZlY3RzU2VydmljZT4ge1xuXHRjb25zdCBzY29wZU9iamVjdCA9IHtcblx0XHRnZXRNb2RlbDogKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aXNBOiAoKSA9PiBjbGFzc05hbWVPRGF0YU1vZGVsID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIsXG5cdFx0XHRcdGdldE1ldGFNb2RlbDogKCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBtZXRhTW9kZWw7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldFNlcnZpY2VVcmw6ICgpID0+IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGdldFNlcnZpY2U6ICgpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGdldENhcGFiaWxpdGllczogKCkgPT4gdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblx0Y29uc3Qgc2VydmljZUluc3RhbmNlID0gYXdhaXQgbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKHsgc2NvcGVPYmplY3QsIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH0pO1xuXHRyZXR1cm4gc2VydmljZUluc3RhbmNlLmdldEludGVyZmFjZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VEaWFnbm9zdGljcyA9IGZ1bmN0aW9uICgpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoKGlzc3VlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRtYW5pZmVzdFNldHRpbmdzOiBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncyB8IE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzXG4pIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVkVHlwZXMuZW50aXR5U2V0cy5maW5kKChlcykgPT4gZXMubmFtZSA9PT0gbWFuaWZlc3RTZXR0aW5ncy5lbnRpdHlTZXQpO1xuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5KGVudGl0eVNldCBhcyBFbnRpdHlTZXQsIGNvbnZlcnRlZFR5cGVzLCBlbnRpdHlTZXQpO1xuXHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQoY29udmVydGVkVHlwZXMsIG1hbmlmZXN0U2V0dGluZ3MsIGdldEZha2VEaWFnbm9zdGljcygpLCBtZXJnZSwgZGF0YU1vZGVsUGF0aCk7XG59O1xuY29uc3QgbWV0YU1vZGVsQ2FjaGU6IGFueSA9IHt9O1xuZXhwb3J0IGNvbnN0IGdldE1ldGFNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIChzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwgdW5kZWZpbmVkLCB7fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIG51bGwpO1xuXHRcdGF3YWl0IG9NZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXIoKTtcblx0XHRtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdHJldHVybiBtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0cHJvcGVydHk/OiBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb25cbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVkVHlwZXM6IGNvbnZlcnRlZFR5cGVzXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aDtcblx0cmV0dXJuIHRhcmdldFBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nID0gZnVuY3Rpb24gKGJpbmRpbmdTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdHJldHVybiBiaW5kaW5nRWxlbWVudC5mb3JtYXR0ZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbn07XG5cbnR5cGUgTW9kZWxDb250ZW50ID0ge1xuXHRbbmFtZTogc3RyaW5nXTogYW55O1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSBhIGJpbmRpbmcgYWdhaW5zdCBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBiaW5kaW5nU3RyaW5nIFRoZSBiaW5kaW5nIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlbENvbnRlbnQgQ29udGVudCBvZiB0aGUgZGVmYXVsdCBtb2RlbCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gbmFtZWRNb2RlbHNDb250ZW50IENvbnRlbnRzIG9mIGFkZGl0aW9uYWwsIG5hbWVkIG1vZGVscyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgZXZhbHVhdGVkIGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwoXG5cdGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxDb250ZW50OiBNb2RlbENvbnRlbnQsXG5cdG5hbWVkTW9kZWxzQ29udGVudD86IHsgW21vZGVsTmFtZTogc3RyaW5nXTogTW9kZWxDb250ZW50IH1cbik6IHN0cmluZyB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblxuXHRjb25zdCBkZWZhdWx0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdHRleHQuc2V0TW9kZWwoZGVmYXVsdE1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChkZWZhdWx0TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpKTtcblxuXHRpZiAobmFtZWRNb2RlbHNDb250ZW50KSB7XG5cdFx0Zm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMobmFtZWRNb2RlbHNDb250ZW50KSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgSlNPTk1vZGVsKGNvbnRlbnQpO1xuXHRcdFx0dGV4dC5zZXRNb2RlbChtb2RlbCwgbmFtZSk7XG5cdFx0XHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KG1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSwgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRleHQuZ2V0VGV4dCgpO1xufVxuXG5jb25zdCBURVNUVklFV0lEID0gXCJ0ZXN0Vmlld0lkXCI7XG5cbmNvbnN0IGFwcGx5RmxleENoYW5nZXMgPSBhc3luYyBmdW5jdGlvbiAoZmxleENoYW5nZXM6IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH0sIG9NZXRhTW9kZWw6IE1ldGFNb2RlbCwgcmVzdWx0WE1MOiBhbnkpIHtcblx0Ly8gcHJlZml4IElkc1xuXHRbLi4ucmVzdWx0WE1MLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaWRdXCIpXS5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0bm9kZS5pZCA9IGAke1RFU1RWSUVXSUR9LS0ke25vZGUuaWR9YDtcblx0fSk7XG5cdGNvbnN0IGNoYW5nZXMgPSBjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QoVEVTVFZJRVdJRCwgZmxleENoYW5nZXMpO1xuXHRjb25zdCBhcHBJZCA9IFwic29tZUNvbXBvbmVudFwiO1xuXHRjb25zdCBvTWFuaWZlc3QgPSB7XG5cdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdGlkOiBhcHBJZCxcblx0XHRcdHR5cGU6IFwiYXBwbGljYXRpb25cIixcblx0XHRcdGNyb3NzTmF2aWdhdGlvbjoge1xuXHRcdFx0XHRvdXRib3VuZHM6IFtdXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgPSB7XG5cdFx0Z2V0RGlhZ25vc3RpY3M6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoZ2V0RmFrZURpYWdub3N0aWNzKCkpLFxuXHRcdGdldE1vZGVsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldE1ldGFNb2RlbDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShvTWV0YU1vZGVsKVxuXHRcdH0pLFxuXHRcdGdldENvbXBvbmVudERhdGE6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe30pLFxuXHRcdGdldE1hbmlmZXN0T2JqZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldEVudHJ5OiBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiAob01hbmlmZXN0IGFzIGFueSlbbmFtZV07XG5cdFx0XHR9XG5cdFx0fSksXG5cdFx0Z2V0TG9jYWxJZDogamVzdC5mbigoc0lkKSA9PiBzSWQpXG5cdH0gYXMgdW5rbm93biBhcyBBcHBDb21wb25lbnQ7XG5cdC8vZmFrZSBjaGFuZ2VzXG5cdGplc3Quc3B5T24oQXBwU3RvcmFnZSwgXCJsb2FkRmxleERhdGFcIikubW9ja1JldHVyblZhbHVlKFByb21pc2UucmVzb2x2ZShjaGFuZ2VzKSk7XG5cdGplc3Quc3B5T24oTG9hZGVyLCBcImxvYWRGbGV4RGF0YVwiKS5tb2NrUmV0dXJuVmFsdWUoUHJvbWlzZS5yZXNvbHZlKGNoYW5nZXMpKTtcblxuXHRqZXN0LnNweU9uKENvbXBvbmVudCBhcyB1bmtub3duIGFzIHsgZ2V0Q29tcG9uZW50QnlJZDogKCkgPT4gQXBwQ29tcG9uZW50IH0sIFwiZ2V0Q29tcG9uZW50QnlJZFwiKS5tb2NrUmV0dXJuVmFsdWUob0FwcENvbXBvbmVudCk7XG5cdGplc3Quc3B5T24oVXRpbHMsIFwiZ2V0QXBwQ29tcG9uZW50Rm9yQ29udHJvbFwiKS5tb2NrUmV0dXJuVmFsdWUob0FwcENvbXBvbmVudCk7XG5cdGF3YWl0IEZsZXhTdGF0ZS5pbml0aWFsaXplKHtcblx0XHRjb21wb25lbnRJZDogYXBwSWRcblx0fSk7XG5cdHJlc3VsdFhNTCA9IGF3YWl0IFhtbFByZXByb2Nlc3Nvci5wcm9jZXNzKHJlc3VsdFhNTCwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiwgY29tcG9uZW50SWQ6IGFwcElkLCBpZDogVEVTVFZJRVdJRCB9KTtcblxuXHQvL0Fzc2VydCB0aGF0IGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBhcHBsaWVkXG5cdGNvbnN0IGNoYW5nZXNBcHBsaWVkID0gZ2V0Q2hhbmdlc0Zyb21YTUwocmVzdWx0WE1MKTtcblx0ZXhwZWN0KGNoYW5nZXNBcHBsaWVkLmxlbmd0aCkudG9CZShmbGV4Q2hhbmdlcz8uY2hhbmdlcz8ubGVuZ3RoID8/IDAgKyBmbGV4Q2hhbmdlcz8udmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzPy5sZW5ndGggPz8gMCk7XG5cdHJldHVybiByZXN1bHRYTUw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2hhbmdlc0Zyb21YTUwgPSAoeG1sOiBhbnkpID0+XG5cdFsuLi54bWwucXVlcnlTZWxlY3RvckFsbChcIipcIildXG5cdFx0LmZsYXRNYXAoKGUpID0+IFsuLi5lLmF0dHJpYnV0ZXNdLm1hcCgoYSkgPT4gYS5uYW1lKSlcblx0XHQuZmlsdGVyKChhdHRyKSA9PiBhdHRyLmluY2x1ZGVzKFwic2FwLnVpLmZsLmFwcGxpZWRDaGFuZ2VzXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBhbnk7IGVudGl0eVNldD86IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LFxuXHRmYWtlU2lkZUVmZmVjdFNlcnZpY2U/OiB1bmtub3duXG4pIHtcblx0aWYgKCFtTW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRtTW9kZWxzW1wic2FwLmZlLmkxOG5cIl0gPSBjcmVhdGVNb2NrUmVzb3VyY2VNb2RlbCgpO1xuXHR9XG5cblx0Y29uc3QgdGVtcGxhdGVkWG1sID0gYDxyb290PiR7eG1sSW5wdXR9PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IHhtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGVkWG1sLCBcInRleHQveG1sXCIpO1xuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSBhd2FpdCBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMsIGZha2VTaWRlRWZmZWN0U2VydmljZSk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRsZXQgcmVzdWx0WE1MID0gKGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKHhtbERvYy5maXJzdEVsZW1lbnRDaGlsZCEsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKSkgYXMgYW55O1xuXG5cdGlmIChmbGV4Q2hhbmdlcykge1xuXHRcdC8vIGFwcGx5IGZsZXggY2hhbmdlc1xuXHRcdHJlc3VsdFhNTCA9IGF3YWl0IGFwcGx5RmxleENoYW5nZXMoZmxleENoYW5nZXMsIG9NZXRhTW9kZWwsIHJlc3VsdFhNTCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0ZWRYTUwgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0cmV0dXJuIGpzeC5kZWZpbmVYTUxOYW1lc3BhY2VNYXAocmV2ZXNlTmFtZXNwYWNlTWFwLCBhc3luYyAoKSA9PiB7XG5cdFx0Y29uc3QgdGVtcGxhdGVkWE1MID0gYXdhaXQgZ2V0VGVtcGxhdGluZ1Jlc3VsdChcblx0XHRcdHhtbElucHV0LFxuXHRcdFx0c01ldGFkYXRhVXJsLFxuXHRcdFx0bUJpbmRpbmdDb250ZXh0cyxcblx0XHRcdG1Nb2RlbHMsXG5cdFx0XHRmbGV4Q2hhbmdlcyxcblx0XHRcdGZha2VTaWRlRWZmZWN0U2VydmljZVxuXHRcdCk7XG5cdFx0Y29uc3Qgc2VyaWFsaWVkWE1MID0gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCwgdW5kZWZpbmVkKTtcblx0XHRleHBlY3Qoc2VyaWFsaWVkWE1MKS5ub3QudG9IYXZlVGVtcGxhdGluZ0Vycm9ycygpO1xuXHRcdHJldHVybiBzZXJpYWxpZWRYTUw7XG5cdH0pIGFzIHVua25vd24gYXMgUHJvbWlzZTxzdHJpbmc+O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgdmlldyB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxuICpcbiAqIEBwYXJhbSBuYW1lIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB2aWV3IHRvIGJlIHRlc3RlZC5cbiAqIEBwYXJhbSBzTWV0YWRhdGFVcmwgVXJsIG9mIHRoZSBtZXRhZGF0YS5cbiAqIEBwYXJhbSBtQmluZGluZ0NvbnRleHRzIE1hcCBvZiB0aGUgYmluZGluZ0NvbnRleHRzIHRvIHNldCBvbiB0aGUgbW9kZWxzLlxuICogQHBhcmFtIG1Nb2RlbHMgTWFwIG9mIHRoZSBtb2RlbHMuXG4gKiBAcGFyYW0gZmxleENoYW5nZXMgT2JqZWN0IHdpdGggVUkgY2hhbmdlcyBsaWtlICdjaGFuZ2VzJyBvciAndmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzJ1xuICogQHJldHVybnMgVGVtcGxhdGVkIHZpZXcgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzVmlldyhcblx0bmFtZTogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRmbGV4Q2hhbmdlcz86IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH1cbik6IFByb21pc2U8SmVzdFRlbXBsYXRlZFZpZXc+IHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRjb25zdCBvVmlld0RvY3VtZW50ID0gX2xvYWRSZXNvdXJjZVZpZXcobmFtZSk7XG5cdGNvbnN0IG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IGF3YWl0IF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscyk7XG5cdGxldCBvUHJlcHJvY2Vzc2VkVmlldyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKG9WaWV3RG9jdW1lbnQsIHsgbmFtZTogbmFtZSB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpO1xuXHRpZiAoZmxleENoYW5nZXMpIHtcblx0XHRvUHJlcHJvY2Vzc2VkVmlldyA9IGF3YWl0IGFwcGx5RmxleENoYW5nZXMoZmxleENoYW5nZXMgPz8gW10sIG9NZXRhTW9kZWwsIG9QcmVwcm9jZXNzZWRWaWV3KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGFzRWxlbWVudDogb1ByZXByb2Nlc3NlZFZpZXcsXG5cdFx0YXNTdHJpbmc6IGZvcm1hdFhNTChvUHJlcHJvY2Vzc2VkVmlldz8ub3V0ZXJIVE1MIHx8IFwiXCIpXG5cdH07XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgcmVxdWVzdGVkIFhNTCBmcmFnbWVudCB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxuICpcbiAqIEBwYXJhbSBuYW1lIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBiZSB0ZXN0ZWQuXG4gKiBAcGFyYW0gdGVzdERhdGEgVGVzdCBkYXRhIGNvbnNpc3RpbmdcbiAqIEByZXR1cm5zIFRlbXBsYXRlZCBmcmFnbWVudCBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcmFnbWVudChuYW1lOiBzdHJpbmcsIHRlc3REYXRhOiB7IFttb2RlbDogc3RyaW5nXTogb2JqZWN0IH0pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRjb25zdCBpbnB1dFhtbCA9IGA8cm9vdD48Y29yZTpGcmFnbWVudCBmcmFnbWVudE5hbWU9XCIke25hbWV9XCIgdHlwZT1cIlhNTFwiIHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiIC8+PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IGlucHV0RG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhpbnB1dFhtbCwgXCJ0ZXh0L3htbFwiKTtcblxuXHQvLyBidWlsZCBtb2RlbCBhbmQgYmluZGluZ3MgZm9yIGdpdmVuIHRlc3QgZGF0YVxuXHRjb25zdCBzZXR0aW5ncyA9IHtcblx0XHRtb2RlbHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB9LFxuXHRcdGJpbmRpbmdDb250ZXh0czoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogb2JqZWN0IH0sXG5cdFx0YXBwQ29tcG9uZW50OiB7IGdldFNpZGVFZmZlY3RzU2VydmljZTogamVzdC5mbigpLCBnZXREaWFnbm9zdGljczogKCkgPT4gdW5kZWZpbmVkIH1cblx0fTtcblx0Zm9yIChjb25zdCBtb2RlbCBpbiB0ZXN0RGF0YSkge1xuXHRcdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRqc29uTW9kZWwuc2V0RGF0YSh0ZXN0RGF0YVttb2RlbF0pO1xuXHRcdHNldHRpbmdzLm1vZGVsc1ttb2RlbF0gPSBqc29uTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW21vZGVsXSA9IHNldHRpbmdzLm1vZGVsc1ttb2RlbF0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHR9XG5cdHNldHRpbmdzLmFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UubW9ja1JldHVyblZhbHVlKGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXG5cdC8vIGV4ZWN1dGUgdGhlIHByZS1wcm9jZXNzb3Jcblx0Y29uc3QgcmVzdWx0RG9jID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXREb2MuZmlyc3RFbGVtZW50Q2hpbGQsIHsgbmFtZSB9LCBzZXR0aW5ncyk7XG5cblx0Ly8gZXhjbHVkZSBuZXN0ZWQgZnJhZ21lbnRzIGZyb20gdGVzdCBzbmFwc2hvdHNcblx0Y29uc3QgZnJhZ21lbnRzID0gcmVzdWx0RG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29yZTpGcmFnbWVudFwiKSBhcyBhbnk7XG5cdGlmIChmcmFnbWVudHM/Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0ZnJhZ21lbnQuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR9XG5cdH1cblxuXHQvLyBLZWVwIHRoZSBmcmFnbWVudCByZXN1bHQgYXMgY2hpbGQgb2Ygcm9vdCBub2RlIHdoZW4gZnJhZ21lbnQgZ2VuZXJhdGVzIG11bHRpcGxlIHJvb3QgY29udHJvbHNcblx0Y29uc3QgeG1sUmVzdWx0ID0gcmVzdWx0RG9jLmNoaWxkcmVuLmxlbmd0aCA+IDEgPyByZXN1bHREb2Mub3V0ZXJIVE1MIDogcmVzdWx0RG9jLmlubmVySFRNTDtcblxuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFJlc3VsdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDb250cm9sKGNvbnRyb2xUb1NlcmlhbGl6ZT86IFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W10pIHtcblx0bGV0IHRhYkNvdW50ID0gMDtcblx0ZnVuY3Rpb24gZ2V0VGFiKHRvQWRkOiBudW1iZXIgPSAwKSB7XG5cdFx0bGV0IHRhYiA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJDb3VudCArIHRvQWRkOyBpKyspIHtcblx0XHRcdHRhYiArPSBcIlxcdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFiO1xuXHR9XG5cdGNvbnN0IHNlcmlhbGl6ZURlbGVnYXRlID0ge1xuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBjb250cm9sRGV0YWlsID0gXCJcIjtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLmdldFBhcmVudCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXhJblBhcmVudCA9IChjb250cm9sLmdldFBhcmVudCgpLmdldEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUpIGFzIE1hbmFnZWRPYmplY3RbXSk/LmluZGV4T2Y/Lihjb250cm9sKTtcblx0XHRcdFx0XHRpZiAoaW5kZXhJblBhcmVudCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCxcXG4ke2dldFRhYigpfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb250cm9sRGV0YWlsICs9IGAke2NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9KGA7XG5cdFx0XHRyZXR1cm4gY29udHJvbERldGFpbDtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFwifSlcIjtcblx0XHR9LFxuXHRcdG1pZGRsZTogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSkge1xuXHRcdFx0Y29uc3QgaWQgPSBjb250cm9sLmdldElkKCk7XG5cdFx0XHRsZXQgZGF0YSA9IGB7aWQ6ICR7TWFuYWdlZE9iamVjdE1ldGFkYXRhLmlzR2VuZXJhdGVkSWQoaWQpID8gXCJfX2R5bmFtaWNJZFwiIDogaWR9YDtcblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tUHJvcGVydGllcykge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7Y29udHJvbC5tUHJvcGVydGllc1tvQ29udHJvbEtleV19YDtcblx0XHRcdFx0fSBlbHNlIGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3MuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYmluZGluZ0RldGFpbCA9IGNvbnRyb2wubUJpbmRpbmdJbmZvc1tvQ29udHJvbEtleV07XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke0pTT04uc3RyaW5naWZ5KGJpbmRpbmdEZXRhaWwpfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tQXNzb2NpYXRpb25zKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Bc3NvY2lhdGlvbnMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke1xuXHRcdFx0XHRcdFx0KGNvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV0/LmpvaW4/LihcIixcIikgPz8gY29udHJvbC5tQXNzb2NpYXRpb25zW29Db250cm9sS2V5XSkgfHwgdW5kZWZpbmVkXG5cdFx0XHRcdFx0fWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tRXZlbnRSZWdpc3RyeSkge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tRXZlbnRSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06IHRydWV9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YSArPSBgYDtcblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH0sXG5cdFx0c3RhcnRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc05hbWU6IHN0cmluZykge1xuXHRcdFx0bGV0IG91dCA9IGAsXFxuJHtnZXRUYWIoKX0ke3NOYW1lfWA7XG5cdFx0XHR0YWJDb3VudCsrO1xuXG5cdFx0XHRpZiAoY29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXSkge1xuXHRcdFx0XHRvdXQgKz0gYD17IHBhdGg6JyR7Y29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXS5wYXRofScsIHRlbXBsYXRlOlxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dCArPSBgPVtcXG4ke2dldFRhYigpfWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3V0O1xuXHRcdH0sXG5cdFx0ZW5kQWdncmVnYXRpb246IGZ1bmN0aW9uIChjb250cm9sOiBhbnksIHNOYW1lOiBzdHJpbmcpIHtcblx0XHRcdHRhYkNvdW50LS07XG5cdFx0XHRpZiAoY29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXSkge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9fWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9XWA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoQXJyYXkuaXNBcnJheShjb250cm9sVG9TZXJpYWxpemUpKSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xUb1NlcmlhbGl6ZS5tYXAoKGNvbnRyb2xUb1JlbmRlcjogVUk1RWxlbWVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1JlbmRlciwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBuZXcgU2VyaWFsaXplcihjb250cm9sVG9TZXJpYWxpemUsIHNlcmlhbGl6ZURlbGVnYXRlKS5zZXJpYWxpemUoKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXdhaXRlcigpIHtcblx0bGV0IGZuUmVzb2x2ZSE6IEZ1bmN0aW9uO1xuXHRjb25zdCBteVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdH0pO1xuXHRyZXR1cm4geyBwcm9taXNlOiBteVByb21pc2UsIHJlc29sdmU6IGZuUmVzb2x2ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQnVpbGRpbmdCbG9ja1dpdGhNb2RlbHMoYnVpbGRpbmdCbG9jazogeyBnZXRDb250ZW50OiBGdW5jdGlvbiB9LCBtb2RlbHM6IHsgW2tleTogc3RyaW5nXTogTW9kZWwgfSk6IENvbnRyb2wge1xuXHRyZXR1cm4gKE1hbmFnZWRPYmplY3QgYXMgTWFuYWdlZE9iamVjdEV4KS5ydW5XaXRoUHJlcHJvY2Vzc29ycyhcblx0XHQoKSA9PiB7XG5cdFx0XHRyZXR1cm4gYnVpbGRpbmdCbG9jay5nZXRDb250ZW50KCk7XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRzZXR0aW5nczogZnVuY3Rpb24gKGNvbnRyb2xTZXR0aW5nczogeyBtb2RlbHM6IHVua25vd24gfSkge1xuXHRcdFx0XHRjb250cm9sU2V0dGluZ3MubW9kZWxzID0gbW9kZWxzO1xuXHRcdFx0XHRyZXR1cm4gY29udHJvbFNldHRpbmdzO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9ja0ZyYWdtZW50cyguLi5mcmFnbWVudHM6IE1vY2tGcmFnbWVudFtdKTogamVzdC5TcHlJbnN0YW5jZSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGNvbnN0IG9yaWdpbmFsTG9hZFRlbXBsYXRlID0gKFhNTFRlbXBsYXRlUHJvY2Vzc29yIGFzIGFueSkubG9hZFRlbXBsYXRlUHJvbWlzZTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3QgbG9hZFRlbXBsYXRlU3R1YiA9IGplc3Quc3B5T24oWE1MVGVtcGxhdGVQcm9jZXNzb3IgYXMgYW55LCBcImxvYWRUZW1wbGF0ZVByb21pc2VcIik7XG5cdGxvYWRUZW1wbGF0ZVN0dWIubW9ja0ltcGxlbWVudGF0aW9uKCgodGVtcGxhdGVOYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcblx0XHRcdGlmIChmcmFnbWVudC5uYW1lID09PSB0ZW1wbGF0ZU5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlWE1MU3RyaW5nKGZyYWdtZW50LmNvbnRlbnQpWzBdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3JpZ2luYWxMb2FkVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBleHRlbnNpb24pO1xuXHR9KSBhcyAoKCkgPT4gRWxlbWVudCkgfCB1bmRlZmluZWQpO1xuXHRyZXR1cm4gbG9hZFRlbXBsYXRlU3R1Yjtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7O0VBZ0VBQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQVMsa0NBQWtDLENBQUM7RUFDMURDLElBQUksQ0FBQ0MsVUFBVSxDQUFDLEtBQUssQ0FBQztFQUV0QixNQUFNQyxZQUFvQyxHQUFHO0lBQzVDQyxLQUFLLEVBQUUsZUFBZTtJQUN0QkMsTUFBTSxFQUFFLGVBQWU7SUFDdkJDLElBQUksRUFBRSx1Q0FBdUM7SUFDN0NDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakNDLFNB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
741
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2ciLCJzZXRMZXZlbCIsImplc3QiLCJzZXRUaW1lb3V0IiwibmFtZVNwYWNlTWFwIiwibWFjcm8iLCJtYWNyb3MiLCJmZUJCIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsImNvbnRyb2wiLCJjb250cm9scyIsImNvcmUiLCJkdCIsIm0iLCJmIiwiZmwiLCJpbnRlcm5hbE1hY3JvIiwibWRjIiwibWRjYXQiLCJtZGNGaWVsZCIsIm1kY1RhYmxlIiwidSIsIm1hY3JvTWljcm9DaGFydCIsIm1pY3JvQ2hhcnQiLCJtYWNyb1RhYmxlIiwicmV2ZXNlTmFtZXNwYWNlTWFwIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsInJldmVyc2VNYXAiLCJjdXJyZW50TmFtZSIsInNlbGVjdCIsInhwYXRoIiwidXNlTmFtZXNwYWNlcyIsImRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UiLCJjb21wdXRlRmllbGRHcm91cElkcyIsIl9nZXRUZW1wbGF0ZWRTZWxlY3RvciIsInhtbGRvbSIsInNlbGVjdG9yIiwicm9vdFBhdGgiLCJub2RlTmFtZSIsInN0YXJ0c1dpdGgiLCJfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyIsInNNZXRhZGF0YVVybCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwiZmFrZVNpZGVFZmZlY3RTZXJ2aWNlIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImhhc093blByb3BlcnR5IiwiYXNzaWduIiwiY29udmVydGVyQ29udGV4dCIsIlRlbXBsYXRlTW9kZWwiLCJmb3JFYWNoIiwic01vZGVsTmFtZSIsImlzVGVtcGxhdGVNb2RlbCIsImRhdGEiLCJzZXR0aW5ncyIsIm1vZGVscyIsIm1ldGFNb2RlbCIsImJpbmRpbmdDb250ZXh0cyIsImFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImZuIiwiZ2V0RGlhZ25vc3RpY3MiLCJ1bmRlZmluZWQiLCJtb2NrUmV0dXJuVmFsdWUiLCJzS2V5IiwiZXhwZWN0IiwiZ2V0T2JqZWN0IiwidG9CZURlZmluZWQiLCJvTW9kZWwiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIl9sb2FkUmVzb3VyY2VWaWV3Iiwidmlld05hbWUiLCJuYW1lIiwicmVwbGFjZSIsInZpZXciLCJMb2FkZXJFeHRlbnNpb25zIiwibG9hZFJlc291cmNlIiwiZG9jdW1lbnRFbGVtZW50IiwicnVuWFBhdGhRdWVyeSIsImV4dGVuZCIsInRvSGF2ZUNvbnRyb2wiLCJub2RlcyIsIm1lc3NhZ2UiLCJvdXRwdXRYbWwiLCJzZXJpYWxpemVYTUwiLCJwYXNzIiwibGVuZ3RoIiwidG9Ob3RIYXZlQ29udHJvbCIsInRvSGF2ZVRlbXBsYXRpbmdFcnJvcnMiLCJ4bWwiLCJ4bWxUZXh0IiwiYmFzZTY0RW50cmllcyIsIm1hdGNoIiwiZXJyb3JNZXNzYWdlcyIsIm1hcCIsImF0b2IiLCJzbGljZSIsImpvaW4iLCJmb3JtYXRCdWlsZGluZ0Jsb2NrWE1MIiwieG1sU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9ybWF0WE1MIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwid2luZG93IiwiWE1MU2VyaWFsaXplciIsIm5vZGUiLCJzZXJpYWxpemVUb1N0cmluZyIsIlNUQVJUIiwiRU5EIiwiVUlEIiwibGluZXMiLCJjdXJyZW50TGluZSIsImxldmVsIiwiYXR0cmlidXRlcyIsIm5ld2xpbmUiLCJwdXNoIiwicmVwZWF0IiwiYXBwZW5kQXR0cmlidXRlcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJpbmNsdWRlcyIsImF0dHJpYnV0ZSIsInZhbHVlIiwiYXBwZW5kIiwicGFyc2VyIiwicmVhZCIsImNyZWF0ZVBhcnNlciIsIm9uT3BlblRhZ1N0YXJ0Iiwib25PcGVuVGFnTmFtZSIsIm9uQXR0ck5hbWUiLCJ1bnNoaWZ0Iiwib25BdHRyVmFsdWUiLCJvbk9wZW5UYWdFbmQiLCJzZWxmQ2xvc2VkIiwib25DbG9zZVRhZ1N0YXJ0Iiwib25DbG9zZVRhZ05hbWUiLCJvbkNsb3NlVGFnRW5kIiwicGFyc2UiLCJ0cmltIiwiY29tcGlsZUNEUyIsImNkc1VybCIsIm9wdGlvbnMiLCJjZHNTdHJpbmciLCJmcyIsInJlYWRGaWxlU3luYyIsImVkbXhDb250ZW50IiwiY2RzMmVkbXgiLCJkaXIiLCJwYXRoIiwicmVzb2x2ZSIsImFsbE9wdGlvbnMiLCJlbnRyaWVzIiwiZWRteEZpbGVOYW1lIiwiZmlsZW5hbWUiLCJvcHRpb25LZXkiLCJvcHRpb25WYWx1ZSIsInRvU3RyaW5nIiwiYmFzZW5hbWUiLCJlZG14RmlsZVBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsInNvdXJjZXMiLCJyZXF1aXJlIiwiY3NuIiwiY29tcGlsZXIiLCJjb21waWxlU291cmNlcyIsImVkbXhPcHRpb25zIiwib2RhdGFGb3JlaWduS2V5cyIsIm9kYXRhRm9ybWF0Iiwib2RhdGFDb250YWlubWVudCIsImVkbXgiLCJ0byIsIkVycm9yIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsImNsYXNzTmFtZU9EYXRhTW9kZWwiLCJzY29wZU9iamVjdCIsImdldE1vZGVsIiwiaXNBIiwiZ2V0U2VydmljZVVybCIsImdldFNlcnZpY2UiLCJnZXRDYXBhYmlsaXRpZXMiLCJzZXJ2aWNlSW5zdGFuY2UiLCJTaWRlRWZmZWN0c0ZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsImdldEludGVyZmFjZSIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJtYW5pZmVzdFNldHRpbmdzIiwiY29udmVydGVkVHlwZXMiLCJjb252ZXJ0VHlwZXMiLCJkYXRhTW9kZWxQYXRoIiwiY29udGV4dFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJlbnRpdHlTZXQiLCJDb252ZXJ0ZXJDb250ZXh0IiwibWVyZ2UiLCJtZXRhTW9kZWxDYWNoZSIsIm9SZXF1ZXN0b3IiLCJfTWV0YWRhdGFSZXF1ZXN0b3IiLCJjcmVhdGUiLCJPRGF0YU1ldGFNb2RlbCIsImZldGNoRW50aXR5Q29udGFpbmVyIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5IiwicHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVNldCIsInRhcmdldEVudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwiY29udGV4dExvY2F0aW9uIiwiZXZhbHVhdGVCaW5kaW5nIiwiYmluZGluZ1N0cmluZyIsImJpbmRpbmdFbGVtZW50IiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJhcmdzIiwiZm9ybWF0dGVyIiwiYXBwbHkiLCJldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwiLCJtb2RlbENvbnRlbnQiLCJuYW1lZE1vZGVsc0NvbnRlbnQiLCJ0ZXh0IiwiSW52aXNpYmxlVGV4dCIsImJpbmRQcm9wZXJ0eSIsImRlZmF1bHRNb2RlbCIsIkpTT05Nb2RlbCIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJjb250ZW50IiwibW9kZWwiLCJnZXRUZXh0IiwiVEVTVFZJRVdJRCIsImFwcGx5RmxleENoYW5nZXMiLCJmbGV4Q2hhbmdlcyIsInJlc3VsdFhNTCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpZCIsImNoYW5nZXMiLCJjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QiLCJhcHBJZCIsIm9NYW5pZmVzdCIsInR5cGUiLCJjcm9zc05hdmlnYXRpb24iLCJvdXRib3VuZHMiLCJvQXBwQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50RGF0YSIsImdldE1hbmlmZXN0T2JqZWN0IiwiZ2V0RW50cnkiLCJnZXRMb2NhbElkIiwic0lkIiwic3B5T24iLCJBcHBTdG9yYWdlIiwiUHJvbWlzZSIsIkxvYWRlciIsIkNvbXBvbmVudCIsIlV0aWxzIiwiRmxleFN0YXRlIiwiaW5pdGlhbGl6ZSIsImNvbXBvbmVudElkIiwiWG1sUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImNoYW5nZXNBcHBsaWVkIiwiZ2V0Q2hhbmdlc0Zyb21YTUwiLCJ0b0JlIiwidmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzIiwiZmxhdE1hcCIsImUiLCJmaWx0ZXIiLCJhdHRyIiwiZ2V0VGVtcGxhdGluZ1Jlc3VsdCIsInhtbElucHV0IiwiY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwiLCJ0ZW1wbGF0ZWRYbWwiLCJET01QYXJzZXIiLCJ4bWxEb2MiLCJwYXJzZUZyb21TdHJpbmciLCJvUHJlcHJvY2Vzc29yU2V0dGluZ3MiLCJYTUxQcmVwcm9jZXNzb3IiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImdldFRlbXBsYXRlZFhNTCIsImpzeCIsImRlZmluZVhNTE5hbWVzcGFjZU1hcCIsInRlbXBsYXRlZFhNTCIsInNlcmlhbGllZFhNTCIsIm5vdCIsInByb2Nlc3NWaWV3Iiwib1ZpZXdEb2N1bWVudCIsIm9QcmVwcm9jZXNzZWRWaWV3IiwiYXNFbGVtZW50IiwiYXNTdHJpbmciLCJvdXRlckhUTUwiLCJwcm9jZXNzRnJhZ21lbnQiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwiaW5wdXREb2MiLCJqc29uTW9kZWwiLCJzZXREYXRhIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJmcmFnbWVudCIsImlubmVySFRNTCIsInhtbFJlc3VsdCIsImNoaWxkcmVuIiwic2VyaWFsaXplQ29udHJvbCIsImNvbnRyb2xUb1NlcmlhbGl6ZSIsInRhYkNvdW50IiwiZ2V0VGFiIiwidG9BZGQiLCJ0YWIiLCJpIiwic2VyaWFsaXplRGVsZWdhdGUiLCJzdGFydCIsInNBZ2dyZWdhdGlvbk5hbWUiLCJjb250cm9sRGV0YWlsIiwiZ2V0UGFyZW50IiwiaW5kZXhJblBhcmVudCIsImdldEFnZ3JlZ2F0aW9uIiwiaW5kZXhPZiIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImVuZCIsIm1pZGRsZSIsImdldElkIiwiTWFuYWdlZE9iamVjdE1ldGFkYXRhIiwiaXNHZW5lcmF0ZWRJZCIsIm9Db250cm9sS2V5IiwibVByb3BlcnRpZXMiLCJtQmluZGluZ0luZm9zIiwiYmluZGluZ0RldGFpbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtQXNzb2NpYXRpb25zIiwibUV2ZW50UmVnaXN0cnkiLCJzdGFydEFnZ3JlZ2F0aW9uIiwic05hbWUiLCJvdXQiLCJlbmRBZ2dyZWdhdGlvbiIsImNvbnRyb2xUb1JlbmRlciIsIlNlcmlhbGl6ZXIiLCJzZXJpYWxpemUiLCJjcmVhdGVBd2FpdGVyIiwiZm5SZXNvbHZlIiwibXlQcm9taXNlIiwicHJvbWlzZSIsInJlbmRlckJ1aWxkaW5nQmxvY2tXaXRoTW9kZWxzIiwiYnVpbGRpbmdCbG9jayIsIk1hbmFnZWRPYmplY3QiLCJydW5XaXRoUHJlcHJvY2Vzc29ycyIsImdldENvbnRlbnQiLCJjb250cm9sU2V0dGluZ3MiLCJyZWdpc3Rlck1vY2tGcmFnbWVudHMiLCJvcmlnaW5hbExvYWRUZW1wbGF0ZSIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlUHJvbWlzZSIsImxvYWRUZW1wbGF0ZVN0dWIiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJ0ZW1wbGF0ZU5hbWUiLCJleHRlbnNpb24iLCJwYXJzZVhNTFN0cmluZyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSmVzdFRlbXBsYXRpbmdIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbnlBbm5vdGF0aW9uLCBDb252ZXJ0ZWRNZXRhZGF0YSwgRW50aXR5U2V0LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IGNvbXBpbGVyIGZyb20gXCJAc2FwL2Nkcy1jb21waWxlclwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgdHlwZSB7IFJhbmdlLCBSYW5nZXMgfSBmcm9tIFwiaHRtbGpzLXBhcnNlclwiO1xuaW1wb3J0IHsgY3JlYXRlUGFyc2VyIH0gZnJvbSBcImh0bWxqcy1wYXJzZXJcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IExvYWRlckV4dGVuc2lvbnMgZnJvbSBcInNhcC9iYXNlL3V0aWwvTG9hZGVyRXh0ZW5zaW9uc1wiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgeyBwYXJzZVhNTFN0cmluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncywgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBJRGlhZ25vc3RpY3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCBqc3ggZnJvbSBcInNhcC9mZS9jb3JlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFNpZGVFZmZlY3RzRmFjdG9yeSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL3Rlc3QvVUk1TW9ja0hlbHBlclwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXJcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwic2FwL3VpL2ZsL1V0aWxzXCI7XG5pbXBvcnQgRmxleFN0YXRlIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvX2ludGVybmFsL2ZsZXhTdGF0ZS9GbGV4U3RhdGVcIjtcbmltcG9ydCBMb2FkZXIgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0xvYWRlclwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvbWRjL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgX01ldGFkYXRhUmVxdWVzdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvbGliL19NZXRhZGF0YVJlcXVlc3RvclwiO1xuaW1wb3J0IHhwYXRoIGZyb20gXCJ4cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VkT2JqZWN0RXggfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QgfSBmcm9tIFwiLi9KZXN0RmxleGliaWxpdHlIZWxwZXJcIjtcblxudHlwZSBQcmVQcm9jZXNzb3JTZXR0aW5nc1R5cGUgPSB7XG5cdG1vZGVsczoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfCBPRGF0YU1ldGFNb2RlbDtcblx0fTtcblx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdH07XG59O1xudHlwZSBNb2NrRnJhZ21lbnQgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0Y29udGVudDogc3RyaW5nO1xufTtcblxudHlwZSBKZXN0VGVtcGxhdGVkVmlldyA9IHtcblx0YXNFbGVtZW50OiBFbGVtZW50IHwgdW5kZWZpbmVkO1xuXHRhc1N0cmluZzogc3RyaW5nO1xufTtcblxuTG9nLnNldExldmVsKDEgYXMgYW55LCBcInNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yXCIpO1xuamVzdC5zZXRUaW1lb3V0KDQwMDAwKTtcblxuY29uc3QgbmFtZVNwYWNlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRtYWNybzogXCJzYXAuZmUubWFjcm9zXCIsXG5cdG1hY3JvczogXCJzYXAuZmUubWFjcm9zXCIsXG5cdGZlQkI6IFwic2FwLmZlLmNvcmUuYnVpbGRpbmdCbG9ja3MudGVtcGxhdGluZ1wiLFxuXHRtYWNyb0ZpZWxkOiBcInNhcC5mZS5tYWNyb3MuZmllbGRcIixcblx0bWFjcm9kYXRhOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0bG9nOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0Y29udHJvbDogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRjb250cm9sczogXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzXCIsXG5cdGNvcmU6IFwic2FwLnVpLmNvcmVcIixcblx0ZHQ6IFwic2FwLnVpLmR0XCIsXG5cdG06IFwic2FwLm1cIixcblx0ZjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0Zmw6IFwic2FwLnVpLmZsXCIsXG5cdGludGVybmFsTWFjcm86IFwic2FwLmZlLm1hY3Jvcy5pbnRlcm5hbFwiLFxuXHRtZGM6IFwic2FwLnVpLm1kY1wiLFxuXHRtZGNhdDogXCJzYXAudWkubWRjLmFjdGlvbnRvb2xiYXJcIixcblx0bWRjRmllbGQ6IFwic2FwLnVpLm1kYy5maWVsZFwiLFxuXHRtZGNUYWJsZTogXCJzYXAudWkubWRjLnRhYmxlXCIsXG5cdHU6IFwic2FwLnVpLnVuaWZpZWRcIixcblx0bWFjcm9NaWNyb0NoYXJ0OiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRtaWNyb0NoYXJ0OiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCIsXG5cdG1hY3JvVGFibGU6IFwic2FwLmZlLm1hY3Jvcy50YWJsZVwiXG59O1xuY29uc3QgcmV2ZXNlTmFtZXNwYWNlTWFwID0gT2JqZWN0LmtleXMobmFtZVNwYWNlTWFwKS5yZWR1Y2UoKHJldmVyc2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGN1cnJlbnROYW1lKSA9PiB7XG5cdHJldmVyc2VNYXBbbmFtZVNwYWNlTWFwW2N1cnJlbnROYW1lXV0gPSBjdXJyZW50TmFtZTtcblx0cmV0dXJuIHJldmVyc2VNYXA7XG59LCB7fSk7XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmNvbnN0IGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UgPSB7IGNvbXB1dGVGaWVsZEdyb3VwSWRzOiAoKSA9PiBbXSB9O1xuXG5mdW5jdGlvbiBfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tOiBOb2RlLCBzZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcblx0LyoqXG5cdCAqIGlmIGEgcm9vdCBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIGR1cmluZyB0aGUgdGVtcGxhdGluZyBieSBvdXIgSmVzdCBUZW1wbGF0aW5nIG1ldGhvZHNcblx0ICogdGhlIHJvb3QgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgc2VsZWN0b3IgcGF0aC5cblx0ICovXG5cdGNvbnN0IHJvb3RQYXRoID0gXCIvcm9vdFwiO1xuXHRyZXR1cm4gYCR7eG1sZG9tLm5vZGVOYW1lID09PSBcInJvb3RcIiAmJiAhc2VsZWN0b3Iuc3RhcnRzV2l0aChyb290UGF0aCkgPyByb290UGF0aCA6IFwiXCJ9JHtzZWxlY3Rvcn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKTogUHJvbWlzZTxQcmVQcm9jZXNzb3JTZXR0aW5nc1R5cGU+IHtcblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXG5cdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHQvLyBpZiBub3QgYWxyZWFkeSBwYXNzZWQgdG8gdGVoIHRlbXBsYXRpbmdcblx0aWYgKCFtTW9kZWxzLmhhc093blByb3BlcnR5KFwiY29udmVydGVyQ29udGV4dFwiKSkge1xuXHRcdG1Nb2RlbHMgPSBPYmplY3QuYXNzaWduKG1Nb2RlbHMsIHsgY29udmVydGVyQ29udGV4dDogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwpIH0pO1xuXHR9XG5cblx0T2JqZWN0LmtleXMobU1vZGVscykuZm9yRWFjaChmdW5jdGlvbiAoc01vZGVsTmFtZSkge1xuXHRcdGlmIChtTW9kZWxzW3NNb2RlbE5hbWVdICYmIG1Nb2RlbHNbc01vZGVsTmFtZV0uaXNUZW1wbGF0ZU1vZGVsKSB7XG5cdFx0XHRtTW9kZWxzW3NNb2RlbE5hbWVdID0gbmV3IFRlbXBsYXRlTW9kZWwobU1vZGVsc1tzTW9kZWxOYW1lXS5kYXRhLCBvTWV0YU1vZGVsKTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0IHNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9LFxuXHRcdGFwcENvbXBvbmVudDogeyBnZXRTaWRlRWZmZWN0c1NlcnZpY2U6IGplc3QuZm4oKSwgZ2V0RGlhZ25vc3RpY3M6ICgpID0+IHVuZGVmaW5lZCB9XG5cdH07XG5cblx0c2V0dGluZ3MuYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZS5tb2NrUmV0dXJuVmFsdWUoZmFrZVNpZGVFZmZlY3RTZXJ2aWNlID8/IGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXHQvL0luamVjdCBtb2RlbHMgYW5kIGJpbmRpbmdDb250ZXh0c1xuXHRPYmplY3Qua2V5cyhtQmluZGluZ0NvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0tleV0gPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobUJpbmRpbmdDb250ZXh0c1tzS2V5XSk7IC8vVmFsdWUgaXMgc1BhdGhcblx0XHRzZXR0aW5ncy5tb2RlbHNbc0tleV0gPSBvTW9kZWw7XG5cdH0pO1xuXHRyZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIF9sb2FkUmVzb3VyY2VWaWV3KHZpZXdOYW1lOiBzdHJpbmcpOiBFbGVtZW50IHtcblx0Y29uc3QgbmFtZSA9IHZpZXdOYW1lLnJlcGxhY2UoL1xcLi9nLCBcIi9cIikgKyBcIi52aWV3LnhtbFwiO1xuXHRjb25zdCB2aWV3ID0gTG9hZGVyRXh0ZW5zaW9ucy5sb2FkUmVzb3VyY2UobmFtZSk7XG5cdHJldHVybiB2aWV3LmRvY3VtZW50RWxlbWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IHJ1blhQYXRoUXVlcnkgPSBmdW5jdGlvbiAoc2VsZWN0b3I6IHN0cmluZywgeG1sZG9tOiBOb2RlIHwgdW5kZWZpbmVkKSB7XG5cdHJldHVybiBzZWxlY3Qoc2VsZWN0b3IsIHhtbGRvbSk7XG59O1xuXG5leHBlY3QuZXh0ZW5kKHtcblx0dG9IYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb20sIHNlbGVjdG9yKSwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBkaWQgbm90IGZpbmQgY29udHJvbHMgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPj0gMVxuXHRcdH07XG5cdH0sXG5cdHRvTm90SGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tLCBzZWxlY3RvciksIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgVGhlcmUgaXMgYSBjb250cm9sIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID09PSAwXG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBmb3IgZXJyb3JzIGluIGB4bWxgIGNyZWF0ZWQgZHVyaW5nIHRlbXBsYXRpbmcgb2YgYW4gWE1MIHN0cmluZyBvclxuXHQgKiBhbiBYTUwgbm9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBjaGVja2VzIGZvciB0aGUgeG1sIGVycm9ycyBjcmVhdGVkIGJ5IHRoZVxuXHQgKiBmdW5jdGlvbiBbQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yLmNyZWF0ZUVycm9yWE1MXXtAbGluayBzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nLkJ1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvciNjcmVhdGVFcnJvclhNTH0uXG5cdCAqXG5cdCAqIEBwYXJhbSB4bWwgWE1MIFN0cmluZyBvciBYTUwgTm9kZSB0byBiZSB0ZXN0ZWQgZm9yIGVycm9yc1xuXHQgKiBAcmV0dXJucyBKZXN0IE1hdGNoZXIgcmVzdWx0IG9iamVjdFxuXHQgKi9cblx0dG9IYXZlVGVtcGxhdGluZ0Vycm9ycyh4bWw6IHN0cmluZyB8IE5vZGUpIHtcblx0XHRjb25zdCB4bWxUZXh0ID0gdHlwZW9mIHhtbCA9PT0gXCJzdHJpbmdcIiA/IHhtbCA6IHNlcmlhbGl6ZVhNTCh4bWwpO1xuXHRcdGNvbnN0IGJhc2U2NEVudHJpZXM6IHN0cmluZ1tdID0geG1sVGV4dC5tYXRjaCgvQkJGXFwuYmFzZTY0RGVjb2RlXFwoJyhbXiddKiknXFwpL2dtKSB8fCAoW10gYXMgc3RyaW5nW10pO1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gYmFzZTY0RW50cmllcy5tYXAoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuXHRcdFx0aWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBhdG9iKG1lc3NhZ2UubWF0Y2goLygnW14nXSopLyk/LlswXT8uc2xpY2UoMSkgfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9KTtcblx0XHRpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPD0gMCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVzc2FnZTogKCkgPT4gYFhNTCBUZW1wbGF0aW5nIHdpdGhvdXQgZXJyb3JzYCxcblx0XHRcdFx0cGFzczogZmFsc2Vcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lc3NhZ2U6ICgpID0+IGVycm9yTWVzc2FnZXMuam9pbihcIlxcblwiKSxcblx0XHRcdFx0cGFzczogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoeG1sU3RyaW5nKSkge1xuXHRcdHhtbFN0cmluZyA9IHhtbFN0cmluZy5qb2luKFwiXCIpO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sQXR0cmlidXRlID0gZnVuY3Rpb24gKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoJHtfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sRG9tLCBjb250cm9sU2VsZWN0b3IpfS9AJHthdHRyaWJ1dGVOYW1lfSlgO1xuXHRyZXR1cm4gcnVuWFBhdGhRdWVyeShzZWxlY3RvciwgeG1sRG9tKTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBwYXJ0cyBvciB0aGUgY29tcGxldGUgZ2l2ZW4gWE1MIERPTSB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHhtbERvbSBET00gbm9kZSB0aGF0IGlzIHRvIGJlIHNlcmlhbGl6ZWQuXG4gKiBAcGFyYW0gc2VsZWN0b3IgT3B0aW9uYWwgc2VsZWN0b3Igb2Ygc3ViIG5vZGVzXG4gKiBAcmV0dXJucyBYTUwgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVYTUwgPSBmdW5jdGlvbiAoeG1sRG9tOiBOb2RlLCBzZWxlY3Rvcj86IHN0cmluZykge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGxldCB4bWxTdHJpbmc6IHN0cmluZztcblx0aWYgKHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KHNlbGVjdG9yLCB4bWxEb20pIGFzIE5vZGVbXTtcblx0XHR4bWxTdHJpbmcgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobm9kZSkpLmpvaW4oXCJcXG5cIik7XG5cdH0gZWxzZSB7XG5cdFx0eG1sU3RyaW5nID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbi8qKlxuICogRm9ybWF0cyBhIHN0cmluZyBjb250YWluaW5nIGFuIFhNTCBkb2N1bWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIG9ubHkgY29uc2lkZXJzIFhNTCB0YWdzIGFuZCBhdHRyaWJ1dGVzLCBpZ25vcmluZyBldmVyeXRoaW5nIGVsc2UgKHRleHQsIGNvbW1lbnRzKS4gQWRkaXRpb25hbGx5LFxuICogYXR0cmlidXRlIHZhbHVlcyBjb250YWluaW5nIGEgdmFyeWluZyBVSUQgYXJlIHJlcGxhY2VkIHdpdGggYSBjb25zdGFudCB2YWx1ZS5cbiAqXG4gKiBBbiBcIlhNTFwiIHN0cmluZyBjb250YWluaW5nIG11bHRpcGxlIHJvb3QgZWxlbWVudHMgY2FuIGJlLlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgIFRoZSBpbnB1dCBYTUwgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGFsc28gYWNjZXB0cyBcIlhNTFwiIHN0cmluZ3Mgd2l0aCBtdWx0aXBsZSByb290IGVsZW1lbnRzLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBYTUwgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0WE1MID0gZnVuY3Rpb24gKHhtbFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgU1RBUlQgPSBcIjxfX1hNTF9fPlwiLFxuXHRcdEVORCA9IFwiPC9fX1hNTF9fPlwiLFxuXHRcdFVJRCA9IC91aWQtLWlkLVxcZHsxM30tXFxkezEsM30vLFxuXHRcdGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdGxldCBjdXJyZW50TGluZSA9IFwiXCIsXG5cdFx0bGV2ZWwgPSAtMSxcblx0XHRhdHRyaWJ1dGVzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfVtdID0gW107XG5cblx0ZnVuY3Rpb24gbmV3bGluZSgpIHtcblx0XHRpZiAoY3VycmVudExpbmUgJiYgY3VycmVudExpbmUgIT09IFNUQVJUKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcblx0XHR9XG5cblx0XHRjdXJyZW50TGluZSA9IGxldmVsID4gMCA/IFwiICBcIi5yZXBlYXQobGV2ZWwpIDogXCJcIjtcblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGVuZEF0dHJpYnV0ZXMoKSB7XG5cdFx0aWYgKGF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0YXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0XHRpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiAhYi5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0fSBlbHNlIGlmICghYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiBiLm5hbWUuc3RhcnRzV2l0aChcInhtbG5zXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiBiLm5hbWUuc3RhcnRzV2l0aChcInhtbG5zXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYS5uYW1lLmluY2x1ZGVzKFwiOlwiKSAmJiAhYi5uYW1lLmluY2x1ZGVzKFwiOlwiKSkge1xuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0fSBlbHNlIGlmICghYS5uYW1lLmluY2x1ZGVzKFwiOlwiKSAmJiBiLm5hbWUuaW5jbHVkZXMoXCI6XCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRsZXZlbCsrO1xuXHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuXHRcdFx0XHRuZXdsaW5lKCk7XG5cdFx0XHRcdGN1cnJlbnRMaW5lICs9IGF0dHJpYnV0ZS5uYW1lO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlLnZhbHVlKSBjdXJyZW50TGluZSArPSBhdHRyaWJ1dGUudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRsZXZlbC0tO1xuXHRcdFx0YXR0cmlidXRlcyA9IFtdO1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGVuZChkYXRhOiBSYW5nZSkge1xuXHRcdGN1cnJlbnRMaW5lICs9IHBhcnNlci5yZWFkKGRhdGEpO1xuXHR9XG5cblx0Y29uc3QgcGFyc2VyID0gY3JlYXRlUGFyc2VyKHtcblx0XHRvbk9wZW5UYWdTdGFydChkYXRhOiBSYW5nZSkge1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdFx0YXBwZW5kKGRhdGEpO1xuXHRcdH0sXG5cblx0XHRvbk9wZW5UYWdOYW1lOiBhcHBlbmQsXG5cblx0XHRvbkF0dHJOYW1lKGRhdGE6IFJhbmdlKSB7XG5cdFx0XHRhdHRyaWJ1dGVzLnVuc2hpZnQoeyBuYW1lOiBwYXJzZXIucmVhZChkYXRhKSB9KTtcblx0XHR9LFxuXG5cdFx0b25BdHRyVmFsdWUoZGF0YTogUmFuZ2VzLkF0dHJWYWx1ZSkge1xuXHRcdFx0YXR0cmlidXRlc1swXS52YWx1ZSA9IHBhcnNlci5yZWFkKGRhdGEpLnJlcGxhY2UoVUlELCBcInVpZC0taWRcIik7IC8vIHJlcGxhY2UgdmFyeWluZyBVSURzIHdpdGggYSBjb25zdGFudCB2YWx1ZVxuXHRcdH0sXG5cblx0XHRvbk9wZW5UYWdFbmQoZGF0YTogUmFuZ2VzLk9wZW5UYWdFbmQpIHtcblx0XHRcdGFwcGVuZEF0dHJpYnV0ZXMoKTtcblx0XHRcdGFwcGVuZChkYXRhKTtcblx0XHRcdGlmICghZGF0YS5zZWxmQ2xvc2VkKSBsZXZlbCsrO1xuXHRcdH0sXG5cblx0XHRvbkNsb3NlVGFnU3RhcnQoZGF0YTogUmFuZ2UpIHtcblx0XHRcdGxldmVsLS07XG5cdFx0XHRuZXdsaW5lKCk7XG5cdFx0XHRhcHBlbmQoZGF0YSk7XG5cdFx0fSxcblxuXHRcdG9uQ2xvc2VUYWdOYW1lOiBhcHBlbmQsXG5cdFx0b25DbG9zZVRhZ0VuZDogYXBwZW5kXG5cdH0pO1xuXG5cdHBhcnNlci5wYXJzZShTVEFSVCArIHhtbFN0cmluZyArIEVORCk7XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIENEUyBmaWxlIGludG8gYW4gRURNWCBmaWxlLlxuICpcbiAqIEBwYXJhbSBjZHNVcmwgVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgQ0RTIGRlZmluaXRpb24uIFRoaXMgZmlsZSBtdXN0IGRlY2xhcmUgdGhlIG5hbWVzcGFjZVxuICogc2FwLmZlLnRlc3QgYW5kIGEgc2VydmljZSBKZXN0U2VydmljZVxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcmV0dXJucyBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbiAoY2RzVXJsOiBzdHJpbmcsIG9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGNkc1N0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhjZHNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gY2RzMmVkbXgoY2RzU3RyaW5nLCBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIsIG9wdGlvbnMpO1xuXHRjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoY2RzVXJsLCBcIi4uXCIsIFwiZ2VuXCIpO1xuXG5cdC8vIElmIHRoZSBjYWxsZXIgcHJvdmlkZWQgQ0RTIGNvbXBpbGVyIG9wdGlvbnM6IEluY2x1ZGUgdGhlbSBpbiB0aGUgZmlsZW5hbWUuIFRoaXMgcHJldmVudHMgdW5wcmVkaWN0YWJsZSByZXN1bHRzIGlmIHRoZSBzYW1lIENEUyBzb3VyY2Vcblx0Ly8gZmlsZSBpcyB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGggYSBkaWZmZXJlbnQgc2V0IG9mIG9wdGlvbnMgKGUuZy4gaW4gYSB0ZXN0IHJ1bm5pbmcgaW4gcGFyYWxsZWwpXG5cdGNvbnN0IGFsbE9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKTtcblx0YWxsT3B0aW9ucy5zb3J0KChhLCBiKSA9PiBiWzBdLmxvY2FsZUNvbXBhcmUoYVswXSkpO1xuXG5cdGNvbnN0IGVkbXhGaWxlTmFtZSA9XG5cdFx0YWxsT3B0aW9ucy5yZWR1Y2UoXG5cdFx0XHQoZmlsZW5hbWUsIFtvcHRpb25LZXksIG9wdGlvblZhbHVlXSkgPT4gYCR7ZmlsZW5hbWV9IyR7b3B0aW9uS2V5fT0ke29wdGlvblZhbHVlLnRvU3RyaW5nKCl9I2AsXG5cdFx0XHRwYXRoLmJhc2VuYW1lKGNkc1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCJcIilcblx0XHQpICsgXCIueG1sXCI7XG5cblx0Y29uc3QgZWRteEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpciwgZWRteEZpbGVOYW1lKTtcblxuXHRmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRmcy53cml0ZUZpbGVTeW5jKGVkbXhGaWxlUGF0aCwgZWRteENvbnRlbnQpO1xuXHRyZXR1cm4gZWRteEZpbGVQYXRoO1xufTtcblxuLyoqXG4gKiBDb21waWxlIENEUyB0byBFRE1YLlxuICpcbiAqIEBwYXJhbSBjZHMgVGhlIENEUyBtb2RlbC4gSXQgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHNlcnZpY2UuXG4gKiBAcGFyYW0gc2VydmljZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gYmUgY29tcGlsZWQuIERlZmF1bHRzIHRvIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIi5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgbW9kZWwgYXMgRURNWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNkczJlZG14KGNkczogc3RyaW5nLCBzZXJ2aWNlID0gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBcInNvdXJjZS5jZHNcIjogY2RzIH07XG5cblx0Ly8gYWxsb3cgdG8gaW5jbHVkZSBzdHVmZiBmcm9tIEBzYXAvY2RzL2NvbW1vblxuXHRpZiAoY2RzLmluY2x1ZGVzKFwiJ0BzYXAvY2RzL2NvbW1vbidcIikpIHtcblx0XHRzb3VyY2VzW1wiY29tbW9uLmNkc1wiXSA9IGZzLnJlYWRGaWxlU3luYyhyZXF1aXJlLnJlc29sdmUoXCJAc2FwL2Nkcy9jb21tb24uY2RzXCIpLCBcInV0Zi04XCIpO1xuXHR9XG5cblx0Y29uc3QgY3NuID0gY29tcGlsZXIuY29tcGlsZVNvdXJjZXMoc291cmNlcywge30pO1xuXG5cdGNvbnN0IGVkbXhPcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7XG5cdFx0b2RhdGFGb3JlaWduS2V5czogdHJ1ZSxcblx0XHRvZGF0YUZvcm1hdDogXCJzdHJ1Y3R1cmVkXCIsXG5cdFx0b2RhdGFDb250YWlubWVudDogdHJ1ZSxcblx0XHQuLi5vcHRpb25zLFxuXHRcdHNlcnZpY2U6IHNlcnZpY2Vcblx0fTtcblxuXHRjb25zdCBlZG14ID0gY29tcGlsZXIudG8uZWRteChjc24sIGVkbXhPcHRpb25zKTtcblx0aWYgKCFlZG14KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21waWxhdGlvbiBmYWlsZWQuIEhpbnQ6IE1ha2Ugc3VyZSB0aGF0IHRoZSBDRFMgbW9kZWwgZGVmaW5lcyBzZXJ2aWNlICR7c2VydmljZX0uYCk7XG5cdH1cblx0cmV0dXJuIGVkbXg7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRjbGFzc05hbWVPRGF0YU1vZGVsID0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiXG4pOiBQcm9taXNlPFNpZGVFZmZlY3RzU2VydmljZT4ge1xuXHRjb25zdCBzY29wZU9iamVjdCA9IHtcblx0XHRnZXRNb2RlbDogKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aXNBOiAoKSA9PiBjbGFzc05hbWVPRGF0YU1vZGVsID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIsXG5cdFx0XHRcdGdldE1ldGFNb2RlbDogKCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBtZXRhTW9kZWw7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldFNlcnZpY2VVcmw6ICgpID0+IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGdldFNlcnZpY2U6ICgpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGdldENhcGFiaWxpdGllczogKCkgPT4gdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblx0Y29uc3Qgc2VydmljZUluc3RhbmNlID0gYXdhaXQgbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKHsgc2NvcGVPYmplY3QsIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH0pO1xuXHRyZXR1cm4gc2VydmljZUluc3RhbmNlLmdldEludGVyZmFjZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VEaWFnbm9zdGljcyA9IGZ1bmN0aW9uICgpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoKGlzc3VlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uIChcblx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0bWFuaWZlc3RTZXR0aW5nczogTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MgfCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5nc1xuKSB7XG5cdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG1ldGFNb2RlbCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBtYW5pZmVzdFNldHRpbmdzLmNvbnRleHRQYXRoXG5cdFx0PyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1hbmlmZXN0U2V0dGluZ3MuY29udGV4dFBhdGgpIGFzIENvbnRleHQpXG5cdFx0OiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAvJHttYW5pZmVzdFNldHRpbmdzLmVudGl0eVNldH1gKSk7XG5cdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZWRUeXBlcywgbWFuaWZlc3RTZXR0aW5ncywgZ2V0RmFrZURpYWdub3N0aWNzKCksIG1lcmdlLCBkYXRhTW9kZWxQYXRoKTtcbn07XG5jb25zdCBtZXRhTW9kZWxDYWNoZTogYW55ID0ge307XG5leHBvcnQgY29uc3QgZ2V0TWV0YU1vZGVsID0gYXN5bmMgZnVuY3Rpb24gKHNNZXRhZGF0YVVybDogc3RyaW5nKSB7XG5cdGNvbnN0IG9SZXF1ZXN0b3IgPSBfTWV0YWRhdGFSZXF1ZXN0b3IuY3JlYXRlKHt9LCBcIjQuMFwiLCB1bmRlZmluZWQsIHt9KTtcblx0aWYgKCFtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdKSB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG5ldyAoT0RhdGFNZXRhTW9kZWwgYXMgYW55KShvUmVxdWVzdG9yLCBzTWV0YWRhdGFVcmwsIHVuZGVmaW5lZCwgbnVsbCk7XG5cdFx0YXdhaXQgb01ldGFNb2RlbC5mZXRjaEVudGl0eUNvbnRhaW5lcigpO1xuXHRcdG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0gPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0cmV0dXJuIG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRwcm9wZXJ0eT86IFByb3BlcnR5IHwgRW50aXR5U2V0IHwgQW55QW5ub3RhdGlvblxuKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdGNvbnN0IHRhcmdldFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggPSB7XG5cdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IGVudGl0eVNldCxcblx0XHRuYXZpZ2F0aW9uUHJvcGVydGllczogW10sXG5cdFx0dGFyZ2V0T2JqZWN0OiBwcm9wZXJ0eSxcblx0XHR0YXJnZXRFbnRpdHlTZXQ6IGVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlUeXBlOiBlbnRpdHlTZXQuZW50aXR5VHlwZSxcblx0XHRjb252ZXJ0ZWRUeXBlczogY29udmVydGVkVHlwZXNcblx0fTtcblx0dGFyZ2V0UGF0aC5jb250ZXh0TG9jYXRpb24gPSB0YXJnZXRQYXRoO1xuXHRyZXR1cm4gdGFyZ2V0UGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBldmFsdWF0ZUJpbmRpbmcgPSBmdW5jdGlvbiAoYmluZGluZ1N0cmluZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0cmV0dXJuIGJpbmRpbmdFbGVtZW50LmZvcm1hdHRlci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xufTtcblxudHlwZSBNb2RlbENvbnRlbnQgPSB7XG5cdFtuYW1lOiBzdHJpbmddOiBhbnk7XG59O1xuXG4vKipcbiAqIEV2YWx1YXRlIGEgYmluZGluZyBhZ2FpbnN0IGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIGJpbmRpbmdTdHJpbmcgVGhlIGJpbmRpbmcgc3RyaW5nLlxuICogQHBhcmFtIG1vZGVsQ29udGVudCBDb250ZW50IG9mIHRoZSBkZWZhdWx0IG1vZGVsIHRvIHVzZSBmb3IgZXZhbHVhdGlvbi5cbiAqIEBwYXJhbSBuYW1lZE1vZGVsc0NvbnRlbnQgQ29udGVudHMgb2YgYWRkaXRpb25hbCwgbmFtZWQgbW9kZWxzIHRvIHVzZS5cbiAqIEByZXR1cm5zIFRoZSBldmFsdWF0ZWQgYmluZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbChcblx0YmluZGluZ1N0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtb2RlbENvbnRlbnQ6IE1vZGVsQ29udGVudCxcblx0bmFtZWRNb2RlbHNDb250ZW50PzogeyBbbW9kZWxOYW1lOiBzdHJpbmddOiBNb2RlbENvbnRlbnQgfVxuKTogc3RyaW5nIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdGNvbnN0IHRleHQgPSBuZXcgSW52aXNpYmxlVGV4dCgpO1xuXHR0ZXh0LmJpbmRQcm9wZXJ0eShcInRleHRcIiwgYmluZGluZ0VsZW1lbnQpO1xuXG5cdGNvbnN0IGRlZmF1bHRNb2RlbCA9IG5ldyBKU09OTW9kZWwobW9kZWxDb250ZW50KTtcblx0dGV4dC5zZXRNb2RlbChkZWZhdWx0TW9kZWwpO1xuXHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KGRlZmF1bHRNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikpO1xuXG5cdGlmIChuYW1lZE1vZGVsc0NvbnRlbnQpIHtcblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhuYW1lZE1vZGVsc0NvbnRlbnQpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IG5ldyBKU09OTW9kZWwoY29udGVudCk7XG5cdFx0XHR0ZXh0LnNldE1vZGVsKG1vZGVsLCBuYW1lKTtcblx0XHRcdHRleHQuc2V0QmluZGluZ0NvbnRleHQobW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpLCBuYW1lKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGV4dC5nZXRUZXh0KCk7XG59XG5cbmNvbnN0IFRFU1RWSUVXSUQgPSBcInRlc3RWaWV3SWRcIjtcblxuY29uc3QgYXBwbHlGbGV4Q2hhbmdlcyA9IGFzeW5jIGZ1bmN0aW9uIChmbGV4Q2hhbmdlczogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSwgb01ldGFNb2RlbDogTWV0YU1vZGVsLCByZXN1bHRYTUw6IGFueSkge1xuXHQvLyBwcmVmaXggSWRzXG5cdFsuLi5yZXN1bHRYTUwucXVlcnlTZWxlY3RvckFsbChcIltpZF1cIildLmZvckVhY2goKG5vZGUpID0+IHtcblx0XHRub2RlLmlkID0gYCR7VEVTVFZJRVdJRH0tLSR7bm9kZS5pZH1gO1xuXHR9KTtcblx0Y29uc3QgY2hhbmdlcyA9IGNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdChURVNUVklFV0lELCBmbGV4Q2hhbmdlcyk7XG5cdGNvbnN0IGFwcElkID0gXCJzb21lQ29tcG9uZW50XCI7XG5cdGNvbnN0IG9NYW5pZmVzdCA9IHtcblx0XHRcInNhcC5hcHBcIjoge1xuXHRcdFx0aWQ6IGFwcElkLFxuXHRcdFx0dHlwZTogXCJhcHBsaWNhdGlvblwiLFxuXHRcdFx0Y3Jvc3NOYXZpZ2F0aW9uOiB7XG5cdFx0XHRcdG91dGJvdW5kczogW11cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNvbnN0IG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCA9IHtcblx0XHRnZXREaWFnbm9zdGljczogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShnZXRGYWtlRGlhZ25vc3RpY3MoKSksXG5cdFx0Z2V0TW9kZWw6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe1xuXHRcdFx0Z2V0TWV0YU1vZGVsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG9NZXRhTW9kZWwpXG5cdFx0fSksXG5cdFx0Z2V0Q29tcG9uZW50RGF0YTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7fSksXG5cdFx0Z2V0TWFuaWZlc3RPYmplY3Q6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe1xuXHRcdFx0Z2V0RW50cnk6IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIChvTWFuaWZlc3QgYXMgYW55KVtuYW1lXTtcblx0XHRcdH1cblx0XHR9KSxcblx0XHRnZXRMb2NhbElkOiBqZXN0LmZuKChzSWQpID0+IHNJZClcblx0fSBhcyB1bmtub3duIGFzIEFwcENvbXBvbmVudDtcblx0Ly9mYWtlIGNoYW5nZXNcblx0amVzdC5zcHlPbihBcHBTdG9yYWdlLCBcImxvYWRGbGV4RGF0YVwiKS5tb2NrUmV0dXJuVmFsdWUoUHJvbWlzZS5yZXNvbHZlKGNoYW5nZXMpKTtcblx0amVzdC5zcHlPbihMb2FkZXIsIFwibG9hZEZsZXhEYXRhXCIpLm1vY2tSZXR1cm5WYWx1ZShQcm9taXNlLnJlc29sdmUoY2hhbmdlcykpO1xuXG5cdGplc3Quc3B5T24oQ29tcG9uZW50IGFzIHVua25vd24gYXMgeyBnZXRDb21wb25lbnRCeUlkOiAoKSA9PiBBcHBDb21wb25lbnQgfSwgXCJnZXRDb21wb25lbnRCeUlkXCIpLm1vY2tSZXR1cm5WYWx1ZShvQXBwQ29tcG9uZW50KTtcblx0amVzdC5zcHlPbihVdGlscywgXCJnZXRBcHBDb21wb25lbnRGb3JDb250cm9sXCIpLm1vY2tSZXR1cm5WYWx1ZShvQXBwQ29tcG9uZW50KTtcblx0YXdhaXQgRmxleFN0YXRlLmluaXRpYWxpemUoe1xuXHRcdGNvbXBvbmVudElkOiBhcHBJZFxuXHR9KTtcblx0cmVzdWx0WE1MID0gYXdhaXQgWG1sUHJlcHJvY2Vzc29yLnByb2Nlc3MocmVzdWx0WE1MLCB7IG5hbWU6IFwiVGVzdCBGcmFnbWVudFwiLCBjb21wb25lbnRJZDogYXBwSWQsIGlkOiBURVNUVklFV0lEIH0pO1xuXG5cdC8vQXNzZXJ0IHRoYXQgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIGFwcGxpZWRcblx0Y29uc3QgY2hhbmdlc0FwcGxpZWQgPSBnZXRDaGFuZ2VzRnJvbVhNTChyZXN1bHRYTUwpO1xuXHRleHBlY3QoY2hhbmdlc0FwcGxpZWQubGVuZ3RoKS50b0JlKGZsZXhDaGFuZ2VzPy5jaGFuZ2VzPy5sZW5ndGggPz8gMCArIGZsZXhDaGFuZ2VzPy52YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXM/Lmxlbmd0aCA/PyAwKTtcblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDaGFuZ2VzRnJvbVhNTCA9ICh4bWw6IGFueSkgPT5cblx0Wy4uLnhtbC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKV1cblx0XHQuZmxhdE1hcCgoZSkgPT4gWy4uLmUuYXR0cmlidXRlc10ubWFwKChhKSA9PiBhLm5hbWUpKVxuXHRcdC5maWx0ZXIoKGF0dHIpID0+IGF0dHIuaW5jbHVkZXMoXCJzYXAudWkuZmwuYXBwbGllZENoYW5nZXNcIikpO1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGluZ1Jlc3VsdCA9IGFzeW5jIGZ1bmN0aW9uIChcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRmbGV4Q2hhbmdlcz86IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH0sXG5cdGZha2VTaWRlRWZmZWN0U2VydmljZT86IHVua25vd25cbikge1xuXHRpZiAoIW1Nb2RlbHNbXCJzYXAuZmUuaTE4blwiXSkge1xuXHRcdG1Nb2RlbHNbXCJzYXAuZmUuaTE4blwiXSA9IGNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsKCk7XG5cdH1cblxuXHRjb25zdCB0ZW1wbGF0ZWRYbWwgPSBgPHJvb3Q+JHt4bWxJbnB1dH08L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0ZW1wbGF0ZWRYbWwsIFwidGV4dC94bWxcIik7XG5cdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHQvLyBpZiBub3QgYWxyZWFkeSBwYXNzZWQgdG8gdGVoIHRlbXBsYXRpbmdcblxuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IGF3YWl0IF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscywgZmFrZVNpZGVFZmZlY3RTZXJ2aWNlKTtcblxuXHQvL1RoaXMgY29udGV4dCBmb3IgbWFjcm8gdGVzdGluZ1xuXHRpZiAob1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0pIHtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW1widGhpc1wiXSA9IG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxuXG5cdGxldCByZXN1bHRYTUwgPSAoYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoeG1sRG9jLmZpcnN0RWxlbWVudENoaWxkISwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpKSBhcyBhbnk7XG5cblx0aWYgKGZsZXhDaGFuZ2VzKSB7XG5cdFx0Ly8gYXBwbHkgZmxleCBjaGFuZ2VzXG5cdFx0cmVzdWx0WE1MID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhmbGV4Q2hhbmdlcywgb01ldGFNb2RlbCwgcmVzdWx0WE1MKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0WE1MO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlZFhNTCA9IGFzeW5jIGZ1bmN0aW9uIChcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LFxuXHRmYWtlU2lkZUVmZmVjdFNlcnZpY2U/OiB1bmtub3duXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRyZXR1cm4ganN4LmRlZmluZVhNTE5hbWVzcGFjZU1hcChyZXZlc2VOYW1lc3BhY2VNYXAsIGFzeW5jICgpID0+IHtcblx0XHRjb25zdCB0ZW1wbGF0ZWRYTUwgPSBhd2FpdCBnZXRUZW1wbGF0aW5nUmVzdWx0KFxuXHRcdFx0eG1sSW5wdXQsXG5cdFx0XHRzTWV0YWRhdGFVcmwsXG5cdFx0XHRtQmluZGluZ0NvbnRleHRzLFxuXHRcdFx0bU1vZGVscyxcblx0XHRcdGZsZXhDaGFuZ2VzLFxuXHRcdFx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlXG5cdFx0KTtcblx0XHRjb25zdCBzZXJpYWxpZWRYTUwgPSBzZXJpYWxpemVYTUwodGVtcGxhdGVkWE1MLCB1bmRlZmluZWQpO1xuXHRcdGV4cGVjdChzZXJpYWxpZWRYTUwpLm5vdC50b0hhdmVUZW1wbGF0aW5nRXJyb3JzKCk7XG5cdFx0cmV0dXJuIHNlcmlhbGllZFhNTDtcblx0fSkgYXMgdW5rbm93biBhcyBQcm9taXNlPHN0cmluZz47XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCB2aWV3IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZpZXcgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHNNZXRhZGF0YVVybCBVcmwgb2YgdGhlIG1ldGFkYXRhLlxuICogQHBhcmFtIG1CaW5kaW5nQ29udGV4dHMgTWFwIG9mIHRoZSBiaW5kaW5nQ29udGV4dHMgdG8gc2V0IG9uIHRoZSBtb2RlbHMuXG4gKiBAcGFyYW0gbU1vZGVscyBNYXAgb2YgdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBmbGV4Q2hhbmdlcyBPYmplY3Qgd2l0aCBVSSBjaGFuZ2VzIGxpa2UgJ2NoYW5nZXMnIG9yICd2YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMnXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgdmlldyBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NWaWV3KFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfVxuKTogUHJvbWlzZTxKZXN0VGVtcGxhdGVkVmlldz4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9WaWV3RG9jdW1lbnQgPSBfbG9hZFJlc291cmNlVmlldyhuYW1lKTtcblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblx0bGV0IG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3Mob1ZpZXdEb2N1bWVudCwgeyBuYW1lOiBuYW1lIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncyk7XG5cdGlmIChmbGV4Q2hhbmdlcykge1xuXHRcdG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhmbGV4Q2hhbmdlcyA/PyBbXSwgb01ldGFNb2RlbCwgb1ByZXByb2Nlc3NlZFZpZXcpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0YXNFbGVtZW50OiBvUHJlcHJvY2Vzc2VkVmlldyxcblx0XHRhc1N0cmluZzogZm9ybWF0WE1MKG9QcmVwcm9jZXNzZWRWaWV3Py5vdXRlckhUTUwgfHwgXCJcIilcblx0fTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgWE1MIGZyYWdtZW50IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGJlIHRlc3RlZC5cbiAqIEBwYXJhbSB0ZXN0RGF0YSBUZXN0IGRhdGEgY29uc2lzdGluZ1xuICogQHJldHVybnMgVGVtcGxhdGVkIGZyYWdtZW50IGFzIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZyYWdtZW50KG5hbWU6IHN0cmluZywgdGVzdERhdGE6IHsgW21vZGVsOiBzdHJpbmddOiBvYmplY3QgfSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdGNvbnN0IGlucHV0WG1sID0gYDxyb290Pjxjb3JlOkZyYWdtZW50IGZyYWdtZW50TmFtZT1cIiR7bmFtZX1cIiB0eXBlPVwiWE1MXCIgeG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCIgLz48L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgaW5wdXREb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGlucHV0WG1sLCBcInRleHQveG1sXCIpO1xuXG5cdC8vIGJ1aWxkIG1vZGVsIGFuZCBiaW5kaW5ncyBmb3IgZ2l2ZW4gdGVzdCBkYXRhXG5cdGNvbnN0IHNldHRpbmdzID0ge1xuXHRcdG1vZGVsczoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogSlNPTk1vZGVsIH0sXG5cdFx0YmluZGluZ0NvbnRleHRzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBvYmplY3QgfSxcblx0XHRhcHBDb21wb25lbnQ6IHsgZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlOiBqZXN0LmZuKCksIGdldERpYWdub3N0aWNzOiAoKSA9PiB1bmRlZmluZWQgfVxuXHR9O1xuXHRmb3IgKGNvbnN0IG1vZGVsIGluIHRlc3REYXRhKSB7XG5cdFx0Y29uc3QganNvbk1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdGpzb25Nb2RlbC5zZXREYXRhKHRlc3REYXRhW21vZGVsXSk7XG5cdFx0c2V0dGluZ3MubW9kZWxzW21vZGVsXSA9IGpzb25Nb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbbW9kZWxdID0gc2V0dGluZ3MubW9kZWxzW21vZGVsXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblx0c2V0dGluZ3MuYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZS5tb2NrUmV0dXJuVmFsdWUoZGVmYXVsdEZha2VTaWRlRWZmZWN0U2VydmljZSk7XG5cblx0Ly8gZXhlY3V0ZSB0aGUgcHJlLXByb2Nlc3NvclxuXHRjb25zdCByZXN1bHREb2MgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2VzcyhpbnB1dERvYy5maXJzdEVsZW1lbnRDaGlsZCwgeyBuYW1lIH0sIHNldHRpbmdzKTtcblxuXHQvLyBleGNsdWRlIG5lc3RlZCBmcmFnbWVudHMgZnJvbSB0ZXN0IHNuYXBzaG90c1xuXHRjb25zdCBmcmFnbWVudHMgPSByZXN1bHREb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjb3JlOkZyYWdtZW50XCIpIGFzIGFueTtcblx0aWYgKGZyYWdtZW50cz8ubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7XG5cdFx0XHRmcmFnbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdH1cblx0fVxuXG5cdC8vIEtlZXAgdGhlIGZyYWdtZW50IHJlc3VsdCBhcyBjaGlsZCBvZiByb290IG5vZGUgd2hlbiBmcmFnbWVudCBnZW5lcmF0ZXMgbXVsdGlwbGUgcm9vdCBjb250cm9sc1xuXHRjb25zdCB4bWxSZXN1bHQgPSByZXN1bHREb2MuY2hpbGRyZW4ubGVuZ3RoID4gMSA/IHJlc3VsdERvYy5vdXRlckhUTUwgOiByZXN1bHREb2MuaW5uZXJIVE1MO1xuXG5cdHJldHVybiBmb3JtYXRYTUwoeG1sUmVzdWx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNvbnRyb2woY29udHJvbFRvU2VyaWFsaXplPzogVUk1RWxlbWVudCB8IFVJNUVsZW1lbnRbXSkge1xuXHRsZXQgdGFiQ291bnQgPSAwO1xuXHRmdW5jdGlvbiBnZXRUYWIodG9BZGQ6IG51bWJlciA9IDApIHtcblx0XHRsZXQgdGFiID0gXCJcIjtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRhYkNvdW50ICsgdG9BZGQ7IGkrKykge1xuXHRcdFx0dGFiICs9IFwiXFx0XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0YWI7XG5cdH1cblx0Y29uc3Qgc2VyaWFsaXplRGVsZWdhdGUgPSB7XG5cdFx0c3RhcnQ6IGZ1bmN0aW9uIChjb250cm9sOiBhbnksIHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdFx0bGV0IGNvbnRyb2xEZXRhaWwgPSBcIlwiO1xuXHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wuZ2V0UGFyZW50KCkpIHtcblx0XHRcdFx0XHRjb25zdCBpbmRleEluUGFyZW50ID0gKGNvbnRyb2wuZ2V0UGFyZW50KCkuZ2V0QWdncmVnYXRpb24oc0FnZ3JlZ2F0aW9uTmFtZSkgYXMgTWFuYWdlZE9iamVjdFtdKT8uaW5kZXhPZj8uKGNvbnRyb2wpO1xuXHRcdFx0XHRcdGlmIChpbmRleEluUGFyZW50ID4gMCkge1xuXHRcdFx0XHRcdFx0Y29udHJvbERldGFpbCArPSBgLFxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCR7Y29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX0oYDtcblx0XHRcdHJldHVybiBjb250cm9sRGV0YWlsO1xuXHRcdH0sXG5cdFx0ZW5kOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gXCJ9KVwiO1xuXHRcdH0sXG5cdFx0bWlkZGxlOiBmdW5jdGlvbiAoY29udHJvbDogYW55KSB7XG5cdFx0XHRjb25zdCBpZCA9IGNvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGxldCBkYXRhID0gYHtpZDogJHtNYW5hZ2VkT2JqZWN0TWV0YWRhdGEuaXNHZW5lcmF0ZWRJZChpZCkgPyBcIl9fZHluYW1pY0lkXCIgOiBpZH1gO1xuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Qcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtjb250cm9sLm1Qcm9wZXJ0aWVzW29Db250cm9sS2V5XX1gO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nRGV0YWlsID0gY29udHJvbC5tQmluZGluZ0luZm9zW29Db250cm9sS2V5XTtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7SlNPTi5zdHJpbmdpZnkoYmluZGluZ0RldGFpbCl9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1Bc3NvY2lhdGlvbnMpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubUFzc29jaWF0aW9ucy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7XG5cdFx0XHRcdFx0XHQoY29udHJvbC5tQXNzb2NpYXRpb25zW29Db250cm9sS2V5XT8uam9pbj8uKFwiLFwiKSA/PyBjb250cm9sLm1Bc3NvY2lhdGlvbnNbb0NvbnRyb2xLZXldKSB8fCB1bmRlZmluZWRcblx0XHRcdFx0XHR9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1FdmVudFJlZ2lzdHJ5KSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1FdmVudFJlZ2lzdHJ5Lmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogdHJ1ZX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRkYXRhICs9IGBgO1xuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fSxcblx0XHRzdGFydEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRsZXQgb3V0ID0gYCxcXG4ke2dldFRhYigpfSR7c05hbWV9YDtcblx0XHRcdHRhYkNvdW50Kys7XG5cblx0XHRcdGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdKSB7XG5cdFx0XHRcdG91dCArPSBgPXsgcGF0aDonJHtjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdLnBhdGh9JywgdGVtcGxhdGU6XFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0ICs9IGA9W1xcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvdXQ7XG5cdFx0fSxcblx0XHRlbmRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc05hbWU6IHN0cmluZykge1xuXHRcdFx0dGFiQ291bnQtLTtcblx0XHRcdGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdKSB7XG5cdFx0XHRcdHJldHVybiBgXFxuJHtnZXRUYWIoKX19YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgXFxuJHtnZXRUYWIoKX1dYDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xUb1NlcmlhbGl6ZSkpIHtcblx0XHRyZXR1cm4gY29udHJvbFRvU2VyaWFsaXplLm1hcCgoY29udHJvbFRvUmVuZGVyOiBVSTVFbGVtZW50KSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoY29udHJvbFRvUmVuZGVyLCBzZXJpYWxpemVEZWxlZ2F0ZSkuc2VyaWFsaXplKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1NlcmlhbGl6ZSwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBd2FpdGVyKCkge1xuXHRsZXQgZm5SZXNvbHZlITogRnVuY3Rpb247XG5cdGNvbnN0IG15UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0fSk7XG5cdHJldHVybiB7IHByb21pc2U6IG15UHJvbWlzZSwgcmVzb2x2ZTogZm5SZXNvbHZlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJCdWlsZGluZ0Jsb2NrV2l0aE1vZGVscyhidWlsZGluZ0Jsb2NrOiB7IGdldENvbnRlbnQ6IEZ1bmN0aW9uIH0sIG1vZGVsczogeyBba2V5OiBzdHJpbmddOiBNb2RlbCB9KTogQ29udHJvbCB7XG5cdHJldHVybiAoTWFuYWdlZE9iamVjdCBhcyBNYW5hZ2VkT2JqZWN0RXgpLnJ1bldpdGhQcmVwcm9jZXNzb3JzKFxuXHRcdCgpID0+IHtcblx0XHRcdHJldHVybiBidWlsZGluZ0Jsb2NrLmdldENvbnRlbnQoKTtcblx0XHR9LFxuXHRcdHtcblx0XHRcdHNldHRpbmdzOiBmdW5jdGlvbiAoY29udHJvbFNldHRpbmdzOiB7IG1vZGVsczogdW5rbm93biB9KSB7XG5cdFx0XHRcdGNvbnRyb2xTZXR0aW5ncy5tb2RlbHMgPSBtb2RlbHM7XG5cdFx0XHRcdHJldHVybiBjb250cm9sU2V0dGluZ3M7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2NrRnJhZ21lbnRzKC4uLmZyYWdtZW50czogTW9ja0ZyYWdtZW50W10pOiBqZXN0LlNweUluc3RhbmNlIHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb3JpZ2luYWxMb2FkVGVtcGxhdGUgPSAoWE1MVGVtcGxhdGVQcm9jZXNzb3IgYXMgYW55KS5sb2FkVGVtcGxhdGVQcm9taXNlO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRjb25zdCBsb2FkVGVtcGxhdGVTdHViID0gamVzdC5zcHlPbihYTUxUZW1wbGF0ZVByb2Nlc3NvciBhcyBhbnksIFwibG9hZFRlbXBsYXRlUHJvbWlzZVwiKTtcblx0bG9hZFRlbXBsYXRlU3R1Yi5tb2NrSW1wbGVtZW50YXRpb24oKCh0ZW1wbGF0ZU5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpID0+IHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0aWYgKGZyYWdtZW50Lm5hbWUgPT09IHRlbXBsYXRlTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VYTUxTdHJpbmcoZnJhZ21lbnQuY29udGVudClbMF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvcmlnaW5hbExvYWRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIGV4dGVuc2lvbik7XG5cdH0pIGFzICgoKSA9PiBFbGVtZW50KSB8IHVuZGVmaW5lZCk7XG5cdHJldHVybiBsb2FkVGVtcGxhdGVTdHViO1xufVxuIl0sIm1hcHBp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
@@ -12,6 +12,7 @@ import TemplateModel from "sap/fe/core/TemplateModel";
12
12
  import { parseXMLString } from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor";
13
13
  import ConverterContext from "sap/fe/core/converters/ConverterContext";
14
14
  import type { ListReportManifestSettings, ObjectPageManifestSettings } from "sap/fe/core/converters/ManifestSettings";
15
+ import { convertTypes, getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
15
16
  import type { IDiagnostics } from "sap/fe/core/converters/TemplateConverter";
16
17
  import type { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
17
18
  import jsx from "sap/fe/core/jsx-runtime/jsx";
@@ -454,11 +455,13 @@ export const getFakeDiagnostics = function (): IDiagnostics {
454
455
  };
455
456
 
456
457
  export const getConverterContextForTest = function (
457
- convertedTypes: ConvertedMetadata,
458
+ metaModel: ODataMetaModel,
458
459
  manifestSettings: ListReportManifestSettings | ObjectPageManifestSettings
459
460
  ) {
460
- const entitySet = convertedTypes.entitySets.find((es) => es.name === manifestSettings.entitySet);
461
- const dataModelPath = getDataModelObjectPathForProperty(entitySet as EntitySet, convertedTypes, entitySet);
461
+ const convertedTypes = convertTypes(metaModel);
462
+ const dataModelPath = manifestSettings.contextPath
463
+ ? getInvolvedDataModelObjects(metaModel.createBindingContext(manifestSettings.contextPath) as Context)
464
+ : getInvolvedDataModelObjects(metaModel.createBindingContext(`/${manifestSettings.entitySet}`));
462
465
  return new ConverterContext(convertedTypes, manifestSettings, getFakeDiagnostics(), merge, dataModelPath);
463
466
  };
464
467
  const metaModelCache: any = {};
@@ -655,6 +655,13 @@ sap.ui.define(
655
655
  .description("Seeing Text with text '" + sText + "'")
656
656
  .execute();
657
657
  },
658
+ iSeeBetterLinkWithText: function (sText) {
659
+ return OpaBuilder.create(this)
660
+ .hasType("sap.fe.macros.controls.BetterLink")
661
+ .hasProperties({ text: sText })
662
+ .description("Seeing Text with text '" + sText + "'")
663
+ .execute();
664
+ },
658
665
  iSeeTitleWithText: function (sText) {
659
666
  return OpaBuilder.create(this)
660
667
  .hasType("sap.m.Title")
@@ -5,25 +5,19 @@
5
5
 
6
6
  */
7
7
  sap.ui.define(
8
- [
9
- "sap/base/util/LoaderExtensions",
10
- "sap/base/util/UriParameters",
11
- "sap/base/util/merge",
12
- "sap/base/strings/formatMessage",
13
- "sap/base/strings/capitalize"
14
- ],
15
- function (LoaderExtensions, UriParameters, mergeObjects, formatMessageRaw, capitalize) {
8
+ ["sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/base/strings/formatMessage", "sap/base/strings/capitalize"],
9
+ function (LoaderExtensions, mergeObjects, formatMessageRaw, capitalize) {
16
10
  "use strict";
17
11
 
18
12
  var Utils = {};
19
13
 
20
14
  Utils.getManifest = function (sComponentName) {
21
- var oUshellContainer = sap.ushell && sap.ushell.Container;
22
- if (!oUshellContainer) {
15
+ const ushellContainer = sap.ui.require("sap/ushell/Container");
16
+ if (!ushellContainer) {
23
17
  var appPath = Utils.getNoFLPAppPath();
24
18
  sComponentName = "local" + appPath;
25
19
  }
26
- var oUriParams = new UriParameters(window.location.href),
20
+ var oUriParams = new URLSearchParams(window.location.search),
27
21
  sDeltaManifest = oUriParams.get("manifest"),
28
22
  oTargetManifest = LoaderExtensions.loadResource(sComponentName + "/manifest.json");
29
23
 
@@ -52,7 +46,7 @@ sap.ui.define(
52
46
 
53
47
  Utils.getNoFLPAppPath = function () {
54
48
  /*demokit.html scenario - parameter app = appName expected*/
55
- var oUriParameters = new UriParameters(window.location.href);
49
+ var oUriParameters = new URLSearchParams(window.location.search);
56
50
  var sApp = oUriParameters.get("app") || "SalesOrder";
57
51
  return Utils.getAppInfo(sApp).appPath;
58
52
  };
@@ -13,10 +13,9 @@ sap.ui.define(
13
13
  "sap/ui/test/OpaBuilder",
14
14
  "sap/ui/test/actions/Action",
15
15
  "sap/ui/core/library",
16
- "sap/ui/test/Opa5",
17
- "sap/base/util/UriParameters"
16
+ "sap/ui/test/Opa5"
18
17
  ],
19
- function (BaseAPI, Utils, FEBuilder, TableBuilder, OpaBuilder, Action, library, Opa5, SAPUriParameters) {
18
+ function (BaseAPI, Utils, FEBuilder, TableBuilder, OpaBuilder, Action, library, Opa5) {
20
19
  "use strict";
21
20
 
22
21
  var SortOrder = library.SortOrder;
@@ -171,13 +170,7 @@ sap.ui.define(
171
170
  * @public
172
171
  */
173
172
  TableAPI.prototype.iConfirmFilterDialog = function () {
174
- // TODO: Remove this temporary toggle when MDC development for the "Filter Query Panel" has been finished
175
- var bUseQueryPanel = new SAPUriParameters(Opa5.getWindow().location.search).getAll("sap-ui-xx-filterQueryPanel")[0] === "true";
176
- if (bUseQueryPanel) {
177
- return this._iConfirmFilterDialogWithQueryPanel();
178
- } else {
179
- return this._iConfirmFilterDialogWithListPanel();
180
- }
173
+ return this._iConfirmFilterDialogWithQueryPanel();
181
174
  };
182
175
 
183
176
  TableAPI.prototype._iConfirmFilterDialogWithQueryPanel = function () {
@@ -17,8 +17,7 @@ sap.ui.define(
17
17
  "sap/fe/test/builder/MdcTableBuilder",
18
18
  "sap/fe/test/builder/MdcFilterFieldBuilder",
19
19
  "./APIHelper",
20
- "sap/ui/test/Opa5",
21
- "sap/base/util/UriParameters"
20
+ "sap/ui/test/Opa5"
22
21
  ],
23
22
  function (
24
23
  TableAPI,
@@ -32,8 +31,7 @@ sap.ui.define(
32
31
  TableBuilder,
33
32
  FilterFieldBuilder,
34
33
  APIHelper,
35
- Opa5,
36
- SAPUriParameters
34
+ Opa5
37
35
  ) {
38
36
  "use strict";
39
37
 
@@ -854,13 +852,7 @@ sap.ui.define(
854
852
  * @public
855
853
  */
856
854
  Actions.prototype.iChangeFilterField = function (vColumnIdentifier, vValue, bClearFirst) {
857
- // TODO: Remove this temporary toggle when MDC development for the "Filter Query Panel" has been finished
858
- var bUseQueryPanel = new SAPUriParameters(Opa5.getWindow().location.search).getAll("sap-ui-xx-filterQueryPanel")[0] === "true";
859
- if (bUseQueryPanel) {
860
- return this._iChangeFilterFieldOnQueryPanel(vColumnIdentifier, vValue, bClearFirst);
861
- } else {
862
- return this._iChangeFilterFieldOnListPanel(vColumnIdentifier, vValue, bClearFirst);
863
- }
855
+ return this._iChangeFilterFieldOnQueryPanel(vColumnIdentifier, vValue, bClearFirst);
864
856
  };
865
857
 
866
858
  Actions.prototype._iChangeFilterFieldOnQueryPanel = function (vColumnIdentifier, vValue, bClearFirst) {
@@ -14,10 +14,9 @@ sap.ui.define(
14
14
  "sap/fe/test/builder/MdcFilterFieldBuilder",
15
15
  "sap/ui/core/library",
16
16
  "./APIHelper",
17
- "sap/ui/test/Opa5",
18
- "sap/base/util/UriParameters"
17
+ "sap/ui/test/Opa5"
19
18
  ],
20
- function (TableAPI, Utils, OpaBuilder, FEBuilder, TableBuilder, FilterFieldBuilder, library, APIHelper, Opa5, SAPUriParameters) {
19
+ function (TableAPI, Utils, OpaBuilder, FEBuilder, TableBuilder, FilterFieldBuilder, library, APIHelper, Opa5) {
21
20
  "use strict";
22
21
 
23
22
  var SortOrder = library.SortOrder;
@@ -545,13 +544,7 @@ sap.ui.define(
545
544
  * @public
546
545
  */
547
546
  TableAssertions.prototype.iCheckFilterField = function (vColumnIdentifier, mState) {
548
- // TODO: Remove this temporary toggle when MDC development for the "Filter Query Panel" has been finished
549
- var bUseQueryPanel = new SAPUriParameters(Opa5.getWindow().location.search).getAll("sap-ui-xx-filterQueryPanel")[0] === "true";
550
- if (bUseQueryPanel) {
551
- return this._iCheckFilterFieldOnQueryPanel(vColumnIdentifier, mState);
552
- } else {
553
- return this._iCheckFilterFieldOnListPanel(vColumnIdentifier, mState);
554
- }
547
+ return this._iCheckFilterFieldOnQueryPanel(vColumnIdentifier, mState);
555
548
  };
556
549
 
557
550
  TableAssertions.prototype._iCheckFilterFieldOnQueryPanel = function (vColumnIdentifier, mState) {
@@ -8,14 +8,13 @@ sap.ui.define(
8
8
  [
9
9
  "sap/ui/test/Opa5",
10
10
  "sap/ui/test/OpaBuilder",
11
- "sap/base/util/UriParameters",
12
11
  "sap/fe/test/Utils",
13
12
  "sap/fe/test/Stubs",
14
13
  "sap/fe/test/BaseArrangements",
15
14
  "sap/fe/test/internal/ConsoleErrorChecker",
16
15
  "sap/ui/thirdparty/jquery"
17
16
  ],
18
- function (Opa5, OpaBuilder, UriParameters, Utils, Stubs, BaseArrangements, ConsoleErrorChecker, jQuery) {
17
+ function (Opa5, OpaBuilder, Utils, Stubs, BaseArrangements, ConsoleErrorChecker, jQuery) {
19
18
  "use strict";
20
19
 
21
20
  return BaseArrangements.extend("sap.fe.test.internal.FEArrangements", {
@@ -33,7 +32,7 @@ sap.ui.define(
33
32
 
34
33
  iResetTestData: function (bIgnoreRedeploy) {
35
34
  var that = this,
36
- oUriParams = new UriParameters(window.location.href),
35
+ oUriParams = new URLSearchParams(window.location.search),
37
36
  sBackendUrl = oUriParams.get("useBackendUrl"),
38
37
  sProxyPrefix = sBackendUrl ? "/databinding/proxy/" + sBackendUrl.replace("://", "/") : "",
39
38
  bSuccess = false;
@@ -14,7 +14,6 @@ sap.ui.define(
14
14
  var defaultSettings = {
15
15
  launchUrl: "test-resources/sap/fe/templates/internal/demokit/flpSandbox.html",
16
16
  launchParameters: {
17
- "sap-ui-xx-filterQueryPanel": true,
18
17
  "sap-ui-xx-csp-policy": "sap-target-level-3:ro"
19
18
  }
20
19
  };
@@ -22,7 +22,7 @@ sap.ui.define(["sap/ui/core/Lib", "sap/ui/core/library"], function (Library, _li
22
22
  controls: [],
23
23
  elements: [],
24
24
  // eslint-disable-next-line no-template-curly-in-string
25
- version: "1.121.1",
25
+ version: "1.122.0",
26
26
  noLibraryCSS: true
27
27
  });
28
28
  return thisLib;