@sapui5/sap.fe.core 1.136.0 → 1.136.1

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.
Files changed (87) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +4 -6
  4. package/src/sap/fe/core/AppComponent.ts +4 -4
  5. package/src/sap/fe/core/CommonUtils.js +41 -14
  6. package/src/sap/fe/core/CommonUtils.ts +47 -16
  7. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  8. package/src/sap/fe/core/IRowBindingInterface.ts +1 -1
  9. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +4 -1
  10. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +3 -0
  11. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +12 -4
  12. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +10 -3
  13. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +139 -5
  14. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +169 -4
  15. package/src/sap/fe/core/controllerextensions/EditFlow.js +48 -43
  16. package/src/sap/fe/core/controllerextensions/EditFlow.ts +54 -51
  17. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +39 -5
  18. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +38 -1
  19. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -13
  20. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +10 -11
  21. package/src/sap/fe/core/controllerextensions/MessageHandler.js +32 -21
  22. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +31 -20
  23. package/src/sap/fe/core/controllerextensions/PageReady.js +6 -3
  24. package/src/sap/fe/core/controllerextensions/PageReady.ts +6 -2
  25. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -2
  26. package/src/sap/fe/core/controllerextensions/Recommendations.ts +7 -5
  27. package/src/sap/fe/core/controllerextensions/Share.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Share.ts +3 -4
  29. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +9 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +8 -13
  31. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +9 -9
  32. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +20 -10
  33. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +31 -8
  34. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +46 -9
  35. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  36. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
  37. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +20 -18
  38. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +37 -23
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +4 -3
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +6 -1
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +6 -3
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +11 -3
  43. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +5 -2
  44. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +3 -2
  45. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +1 -1
  47. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  48. package/src/sap/fe/core/controls/CommandExecution.ts +1 -1
  49. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +3 -2
  50. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +2 -0
  51. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -2
  52. package/src/sap/fe/core/converters/controls/Common/Action.ts +4 -1
  53. package/src/sap/fe/core/converters/controls/Common/Chart.js +7 -2
  54. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -1
  55. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +41 -58
  56. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +43 -111
  57. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +14 -6
  58. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -6
  59. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -3
  60. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -2
  61. package/src/sap/fe/core/formatters/ValueFormatter.js +21 -1
  62. package/src/sap/fe/core/formatters/ValueFormatter.ts +19 -0
  63. package/src/sap/fe/core/fpm/manifest.json +1 -1
  64. package/src/sap/fe/core/helpers/DeleteHelper.js +2 -2
  65. package/src/sap/fe/core/helpers/DeleteHelper.ts +1 -1
  66. package/src/sap/fe/core/helpers/ModelHelper.js +2 -2
  67. package/src/sap/fe/core/helpers/ModelHelper.ts +1 -1
  68. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  69. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  70. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  71. package/src/sap/fe/core/helpers/StableIdHelper.ts +4 -1
  72. package/src/sap/fe/core/helpers/TitleHelper.js +13 -6
  73. package/src/sap/fe/core/helpers/TitleHelper.ts +19 -6
  74. package/src/sap/fe/core/library.js +1 -1
  75. package/src/sap/fe/core/messagebundle.properties +0 -1
  76. package/src/sap/fe/core/rootView/Fcl.controller.js +9 -15
  77. package/src/sap/fe/core/rootView/Fcl.controller.ts +9 -15
  78. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +9 -6
  79. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -6
  80. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
  81. package/src/sap/fe/core/templating/DataModelPathHelper.ts +1 -1
  82. package/src/sap/fe/core/templating/EntitySetHelper.js +60 -48
  83. package/src/sap/fe/core/templating/EntitySetHelper.ts +80 -58
  84. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -4
  85. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +5 -5
  86. package/src/sap/fe/core/templating/UIFormatters.js +7 -1
  87. package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
@@ -2,11 +2,10 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/routing/ContextPathHelper", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/ui/core/Component", "sap/ui/core/Lib", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "../converters/MetaModelConverter", "./collaboration/CollaborationCommon", "./editFlow/editFlowConstants", "./messageHandler/messageHandling"], function (Log, ClassSupport, CommonUtils, BusyLocker, draft, ContextPathHelper, NavigationReason, EditState, ModelHelper, Component, Library, ControllerExtension, OverrideExecution, MetaModelConverter, CollaborationCommon, UiModelConstants, messageHandling) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/routing/ContextPathHelper", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/ModelHelper", "sap/ui/core/Component", "sap/ui/core/Lib", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "../converters/MetaModelConverter", "./editFlow/editFlowConstants", "./messageHandler/messageHandling"], function (Log, ClassSupport, CommonUtils, BusyLocker, draft, ContextPathHelper, NavigationReason, EditState, ModelHelper, Component, Library, ControllerExtension, OverrideExecution, MetaModelConverter, UiModelConstants, messageHandling) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _class, _class2;
9
- var addSelf = CollaborationCommon.addSelf;
10
9
  var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
11
10
  var resolvePath = ContextPathHelper.resolvePath;
12
11
  var isPathOnDraftRoot = ContextPathHelper.isPathOnDraftRoot;
@@ -357,7 +356,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
357
356
  if ((this._oTargetInformation.viewLevel ?? 0) >= (routeInformation?.routeLevel ?? 0)) {
358
357
  this._oAppComponent.getRoutingService().addBindingCleanupPromise(new Promise(resolve => {
359
358
  setTimeout(() => {
360
- if (routeInformation?.routeLevel === 0 && this.base.collaborativeDraft.isConnected()) {
359
+ if (routeInformation?.routeLevel === 0) {
361
360
  // The route has level 0 --> we need to leave the collaboration session as no OP is displayed
362
361
  this.base.collaborativeDraft.disconnect();
363
362
  }
@@ -638,6 +637,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
638
637
  oContext = this._createContext(oContext.getPath(), oModel);
639
638
  }
640
639
 
640
+ // If the binding context is part of a collaborative draft, we call addSelf before binding the page so that the Share action
641
+ // is part of the same batch as the page load, and we can get the list of participating users later
642
+ if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel()) && oContext.getPath().includes("IsActiveEntity=false")) {
643
+ this.base.collaborativeDraft.executeShareAction(oContext);
644
+ }
645
+
641
646
  // Set the binding context with the proper before/after callbacks
642
647
  this.beforeSetBindingContext(oContext, {
643
648
  editable: oNavigationParameters.bTargetEditable,
@@ -732,11 +737,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
732
737
  this.base.messageHandler.holdMessagesForControl(this._oView);
733
738
  });
734
739
  oHiddenBinding.attachEventOnce("dataReceived", this.onDataReceived.bind(this));
735
- const boundContext = oHiddenBinding.getBoundContext();
736
- if (isCollaborationDraftSupported && sPath.includes("IsActiveEntity=false")) {
737
- addSelf(oMetaModel, sContextPath, oModel, boundContext);
738
- }
739
- return boundContext;
740
+ return oHiddenBinding.getBoundContext();
740
741
  }
741
742
  };
742
743
  _proto.onDataReceived = async function onDataReceived(oEvent) {
@@ -957,7 +958,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
957
958
  const oMetaModel = oContext.getModel().getMetaModel();
958
959
  const navigationParameters = {
959
960
  noPreservationCache: true,
960
- layout: this._oView.getModel("fclhelper").getProperty("/actionButtonsInfo/closeColumn")
961
+ layout: this._oView.getModel("fclhelper").getProperty("/actionButtonsInfo/closeColumn"),
962
+ callExtension: true
961
963
  };
962
964
  const isDocumentModified = !!this.getView()?.getModel("ui")?.getProperty(UiModelConstants.DocumentModified) || !oContext.getProperty("HasActiveEntity");
963
965
  const isHiddenDraftEnabled = (this._oAppComponent.getEnvironmentCapabilities()?.getCapabilities()?.HiddenDraft).enabled;
@@ -970,12 +972,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
970
972
  this.navigateBackFromContext(oContext, navigationParameters);
971
973
  } else if (oViewData?.viewLevel === 1 && ModelHelper.isDraftSupported(oMetaModel, oContext.getPath())) {
972
974
  draft.processDataLossOrDraftDiscardConfirmation(() => {
973
- // We don't have callExtension=true in this case, as there's a user validation with the dataloss dialog
974
- // and it wouldn't make sense to cancel the navigation after this confirmation
975
975
  this.navigateBackFromContext(oContext, navigationParameters);
976
976
  }, Function.prototype, oContext, this._oView.getController(), true, draft.NavigationType.BackNavigation);
977
977
  } else {
978
- navigationParameters.callExtension = true;
979
978
  this.navigateBackFromContext(oContext, navigationParameters);
980
979
  }
981
980
  // Removes transition message for the specified context
@@ -985,4 +984,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
985
984
  }(ControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype), _class2)) || _class);
986
985
  return InternalRouting;
987
986
  }, false);
988
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJfZGVjNCIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM1IiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiQmVmb3JlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiaXNBIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0SGFzaEZvck5hdmlnYXRpb24iLCJjb250ZXh0IiwibmF2aWdhdGlvblRhcmdldE5hbWUiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsImRldGFpbFJvdXRlIiwicm91dGVOYW1lIiwicGFyYW1ldGVyTWFwcGluZyIsImdldEhhc2hGcm9tUm91dGUiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY3JlYXRlZENvbnRleHQiLCJjaGVja05vSGFzaENoYW5nZSIsImVkaXRhYmxlIiwicGVyc2lzdE9QU2Nyb2xsIiwidXBkYXRlRkNMTGV2ZWwiLCJmb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJjYWxsRXh0ZW5zaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2V0UHJvcGVydHkiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsImhpZGRlbkJpbmRpbmciLCJiYWNrUGF0aCIsImdldFBhdGhUb05hdmlnYXRlQmFjayIsImdldFBhdGgiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm92ZXJyaWRlTmF2Iiwib25CZWZvcmVOYXZpZ2F0aW9uIiwiZGVzdHJveSIsIlByb21pc2UiLCJyZXNvbHZlIiwiRkNMTGV2ZWwiLCJnZXRGQ0xMZXZlbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaXNQYXRoT25EcmFmdFJvb3QiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGVhZGVySW5mbyIsIlR5cGVOYW1lIiwibmFtZSIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJwYXJlbnRCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFnZ3JlZ2F0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCJncm91cCIsImFnZ3JlZ2F0ZSIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJzSGFzaCIsImdldEhhc2giLCJpbmNsdWRlcyIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibVBhcmFtZXRlcnMiLCJuYXZUb0hhc2giLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsImRpc3BsYXlFcnJvclBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJnZXRSb3V0aW5nU2VydmljZSIsImFkZEJpbmRpbmdDbGVhbnVwUHJvbWlzZSIsInNldFRpbWVvdXQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJpc0Nvbm5lY3RlZCIsImRpc2Nvbm5lY3QiLCJfc2V0QmluZGluZ0NvbnRleHQiLCJfYnVpbGRCaW5kaW5nUGF0aCIsInJvdXRlQXJndW1lbnRzIiwiYmluZGluZ1BhdHRlcm4iLCJuYXZpZ2F0aW9uUGFyYW1ldGVycyIsInBhdGgiLCJyZXBsYWNlIiwiZGVmZXJyZWQiLCJzS2V5Iiwic1ZhbHVlIiwiYlRhcmdldEVkaXRhYmxlIiwiYkFjdGlvbkNyZWF0ZSIsIm9FdmVudCIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJiaW5kUHJvbWlzZSIsIm9Nb2RlbCIsIl9iaW5kRGVmZXJyZWQiLCJFZGl0Rmxvd0FjdGlvbiIsImlzT3BlbkluRWRpdE1vZGUiLCJfYmluZFBhZ2VGb3JFZGl0IiwiX2JpbmRQYWdlIiwiZmluYWxseSIsInRvU3RyaW5nIiwidXBkYXRlVUlTdGF0ZUZvclZpZXciLCJ0YXJnZXRQYXRoIiwiY3JlYXRlRGVmZXJyZWRDb250ZXh0IiwibGlzdEJpbmRpbmciLCJwYXJlbnRDb250ZXh0IiwiZGF0YSIsIl9iaW5kUGFnZVRvQ29udGV4dCIsInRlY2huaWNhbFBhdGgiLCJyZXNvbHZlUGF0aCIsImlzU3RpY2t5RWRpdE1vZGUiLCJpc1N0aWNreSIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsImFjdGl2ZUNvbnRleHQiLCJ1c2VDb250ZXh0IiwiX2NyZWF0ZUNvbnRleHQiLCJlZGl0RmxvdyIsImVkaXREb2N1bWVudCIsIl9iaW5kUGFnZVRvUGF0aCIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwiZSIsIm1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VzIiwic1RhcmdldFBhdGgiLCJvQ3VycmVudENvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJzaG91bGRSZWZyZXNoQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiaXNEcmFmdFN1cHBvcnRlZCIsInJlc2V0Q2hhbmdlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsImlubGluZUVkaXRGbG93IiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJJTkxJTkVFRElUX1VQREFURUdST1VQSUQiLCJvRHJhZnRSb290IiwiZ2V0T2JqZWN0Iiwib0RyYWZ0Tm9kZSIsImRhdGFNb2RlbE9iamVjdCIsImdldENvbnRleHQiLCJhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsInRhcmdldEVudGl0eVNldCIsInNlbWFudGljS2V5cyIsIkNvbW1vbiIsIlNlbWFudGljS2V5IiwibWFwIiwia2V5IiwidmFsdWUiLCJfZ2V0S2VlcEFsaXZlQ29udGV4dCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJjb25jYXQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicHJvcGVydGllc1RvU2VsZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsInB1c2giLCIkc2VsZWN0Iiwiam9pbiIsIm9QcmV2aW91c0JpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwib0hpZGRlbkJpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJvbkRhdGFSZWNlaXZlZCIsImJvdW5kQ29udGV4dCIsImFkZFNlbGYiLCJpc0xvY2tlZCIsInVubG9jayIsIm1QYXJhbXMiLCJlcnJvclN0YXR1cyIsInN0YXR1cyIsImNhdXNlIiwib1Jlc291cmNlQnVuZGxlIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsImNvbnRyb2wiLCJyZWxlYXNlSG9sZEJ5Q29udHJvbCIsIm9CaW5kaW5nQ29udGV4dCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJ0YXJnZXRQcm9wZXJ0aWVzIiwidGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJzbGljZSIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiaXRlbSIsImkiLCJyZWR1Y2UiLCJ0YXJnZXRQcm9wZXJ0eSIsImluZGV4IiwiaW5kZXhPZiIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0IiwiaXNLZWVwQWxpdmUiLCJiS2VlcEFsaXZlIiwiZm5CZWZvcmVEZXN0cm95IiwiYlJlcXVlc3RNZXNzYWdlcyIsImVuZHNXaXRoIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJzZXRLZWVwQWxpdmUiLCJrZXB0QWxpdmVTZWdtZW50cyIsInNwbGl0IiwiYWRkaXRpb25uYWxTZWdtZW50cyIsInBvcCIsImtlcHRBbGl2ZVBhdGgiLCJvS2VlcEFsaXZlQ29udGV4dCIsInJldmVyc2UiLCJhZGRpdGlvbm5hbFBhdGgiLCJzd2l0Y2hGdWxsU2NyZWVuIiwib1NvdXJjZSIsIm9GQ0xIZWxwZXJNb2RlbCIsImJJc0Z1bGxTY3JlZW4iLCJzTmV4dExheW91dCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJfcm91dGluZyIsImxheW91dCIsIndhcm5pbmciLCJjbG9zZUNvbHVtbiIsIm9WaWV3RGF0YSIsIm5vUHJlc2VydmF0aW9uQ2FjaGUiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiRG9jdW1lbnRNb2RpZmllZCIsImlzSGlkZGVuRHJhZnRFbmFibGVkIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJIaWRkZW5EcmFmdCIsImVuYWJsZWQiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJza2lwQmFja05hdmlnYXRpb24iLCJjYW5jZWxEb2N1bWVudCIsImRyYWZ0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJGdW5jdGlvbiIsIk5hdmlnYXRpb25UeXBlIiwiQmFja05hdmlnYXRpb24iLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVUcmFuc2lzdGlvbk1lc3NhZ2VGb3JDb250ZXh0IiwiQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHR5cGUgTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0LCB0eXBlIFNob3dNZXNzYWdlc1BhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgeyBnZXREcmFmdE9yQWN0aXZlQ29udGV4dCwgaXNQYXRoT25EcmFmdFJvb3QsIHJlc29sdmVQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvQ29udGV4dFBhdGhIZWxwZXJcIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nVGFyZ2V0IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB7IGFkZFNlbGYgfSBmcm9tIFwiLi9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCIuL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCIuL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuXG50eXBlIFJvdXRlSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldHM/OiB1bmtub3duW107XG5cdHJvdXRlTGV2ZWw6IG51bWJlcjtcbn07XG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfb1ZpZXchOiBGRVZpZXc7XG5cblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblxuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cblx0cHJpdmF0ZSBfb1JvdXRlciE6IFJvdXRlcjtcblxuXHRwcml2YXRlIF9vUm91dGluZ1NlcnZpY2UhOiBSb3V0aW5nU2VydmljZTtcblxuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblxuXHRwcml2YXRlIF9mblJvdXRlTWF0Y2hlZEJvdW5kPzogRnVuY3Rpb247XG5cblx0cHJvdGVjdGVkIF9vVGFyZ2V0SW5mb3JtYXRpb24hOiBSb3V0aW5nVGFyZ2V0O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fb1JvdXRpbmdTZXJ2aWNlICYmIHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQ/LmlzQShcInNhcC5mZS5jb3JlLlJldXNlQ29tcG9uZW50XCIpICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0Ly8gUmV1c2UgY29tcG9uZW50cyBjYW4gcG90ZW50aWFsbHkgZW1iZWQgYSB2aWV3IHdpdGggYSBwYWdlIGNvbnRyb2xsZXIsIHdlIHdhbnQgdG8gYXZvaWQgYXR0YWNoaW5nIHRoZSByb3V0ZSBtYXRjaGVkIGV2ZW50IGluIHRoaXMgY2FzZVxuXHRcdFx0XHRcdHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQgPSB0aGlzLl9vblJvdXRlTWF0Y2hlZC5iaW5kKHRoaXMpO1xuXHRcdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQoe30sIHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldykhID8/IHt9O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk6IHZvaWQge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKF9iaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHt9XG5cblx0YmVmb3JlU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcoYmluZGluZ0NvbnRleHQsIF9tUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KGJpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdGFmdGVyU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiBvYmplY3QpOiB2b2lkIHtcblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0LCB7IC4uLl9tUGFyYW1ldGVycywgZGVmZXJyZWRDcmVhdGlvbjogdHJ1ZSB9KTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEBwYXJhbSBkZWxheWVkVXNhZ2UgVHJ1ZSB0byByZXR1cm4gYSBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIHRoZSBuYXZpZ2F0aW9uLCBGYWxzZSB0byBleGVjdXRlIHRoZSBuYXZpZ2F0aW9uIGltbWVkaWF0ZWx5XG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IHRydWVcblx0KTogUHJvbWlzZTwoKSA9PiB2b2lkPjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgbmF2aWdhdGVUb1RhcmdldChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRkZWxheWVkVXNhZ2U/OiBib29sZWFuXG5cdCk6IFByb21pc2U8KCgpID0+IHZvaWQpIHwgdm9pZD4ge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSwgZGVsYXllZFVzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0by5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHJldHVybnMgVGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0b1xuXHQgKi9cblx0YXN5bmMgZ2V0SGFzaEZvck5hdmlnYXRpb24oY29udGV4dDogQ29udGV4dCwgbmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPSB0aGlzPy5fb1BhZ2VDb21wb25lbnQ/LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IGRldGFpbFJvdXRlID0gbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgcm91dGVOYW1lID0gZGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJNYXBwaW5nID0gZGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0SGFzaEZyb21Sb3V0ZShjb250ZXh0LCByb3V0ZU5hbWUsIHBhcmFtZXRlck1hcHBpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldEhhc2hGcm9tUm91dGUoY29udGV4dCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNlc3NhcnkuXG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCBudWxsID0gY29udGV4dDtcblx0XHRcdGxldCBoaWRkZW5CaW5kaW5nOiBPRGF0YUNvbnRleHRCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPT09IC0xKSB7XG5cdFx0XHRcdC8vIElmIHdlJ3JlIG5hdmlnYXRpbmcgYmFjaywgd2UgbmVlZCB0byBmaW5kIHRoZSBcInBhcmVudFwiIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgYmFja1BhdGggPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0UGF0aFRvTmF2aWdhdGVCYWNrKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Ly8gQXMgd2UgZG9uJ3QgY2FsbCB0aGUgZXh0ZW5zaW9uIHdoZW4gbmF2aWdhdGluZyBiYWNrIHRvIHRoZSBMUiwgYmFja1BhdGggaXMgbmV2ZXIgZW1wdHkgc28gd2UgY2FuIHNhZmVseSBjcmVhdGUgYSBjb250ZXh0XG5cdFx0XHRcdGhpZGRlbkJpbmRpbmcgPSBjb250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoYmFja1BhdGgpO1xuXHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IGhpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvdmVycmlkZU5hdiA9IGF3YWl0IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKHsgYmluZGluZ0NvbnRleHQ6IGNvbnRleHRUb05hdmlnYXRlIH0pO1xuXHRcdFx0aGlkZGVuQmluZGluZz8uZGVzdHJveSgpO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdC8vIEluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyBmcm9tIGEgdGFibGUgaW4gYSBMaXN0UmVwb3J0IHdpdGggZHJhZnQsIHRoZXJlJ3Mgc3BlY2lhbCBoYW5kbGluZyBmb3IgY29sbGFib3JhdGlvbiBhbmQgdHJlZSB0YWJsZS5cblx0XHQvLyBXZSBtYXkgbm90IG5hdmlnYXRlIHRvIHRoZSBjb250ZXh0IHRoZSB1c2VyIGNsaWNrZWQgb24uXG5cdFx0aWYgKHBhcmFtZXRlcnMucmVhc29uID09PSBOYXZpZ2F0aW9uUmVhc29uLlJvd1ByZXNzICYmIGNvbnRleHQuaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRcdGlmIChpc1BhdGhPbkRyYWZ0Um9vdChjb250ZXh0LmdldFBhdGgoKSwgbWV0YU1vZGVsKSkge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0Rm9yTmF2aWdhdGlvbiA9XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25XaXRoQ29sbGFib3JhdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKSkgPz9cblx0XHRcdFx0XHQoYXdhaXQgdGhpcy5nZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUoY29udGV4dCkpO1xuXG5cdFx0XHRcdC8vIFVzZSBhbm90aGVyIGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdGlmIChjb250ZXh0Rm9yTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0Rm9yTmF2aWdhdGlvbjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyB0byBhIGRyYWZ0IGluc3RhbmNlIGZyb20gdGhlIExSIGFuZCB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBvcmlnaW5hbENvbnRleHRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgVGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGNvbnRleHQsIG51bGwgb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24oXG5cdFx0b3JpZ2luYWxDb250ZXh0OiBDb250ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHQpOiBQcm9taXNlPENvbnRleHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBvcmlnaW5hbENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbiwgYW5kIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCBpbnN0YW5jZSBmcm9tIHRoZSBMUixcblx0XHRcdC8vIFdlIHdhbnQgdG8gY2hlY2sgaWYgdGhlIGRyYWZ0IGluc3RhbmNlIGV4aXN0cyBmaXJzdC4gT3RoZXJ3aXNlIHdlIG5hdmlnYXRlIHRvIHRoZSBvcmlnaW5hbCAoZHJhZnQpIHZlcnNpb24uXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gTm90aWZ5IHRoZSB1c2VyIHRoYXQgd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdGhlIHNhdmVkIGluc3RhbmNlXG5cdFx0XHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkpKTtcblx0XHRcdFx0cGFyYW1ldGVycy5yZWRpcmVjdGVkVG9Ob25EcmFmdCA9XG5cdFx0XHRcdFx0KG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uSGVhZGVySW5mbz8uVHlwZU5hbWUgYXMgdW5rbm93biBhcyBzdHJpbmcpID8/XG5cdFx0XHRcdFx0b2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLm5hbWU7XG5cblx0XHRcdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHQvLyBGQ0w6IHJlcGxhY2UgdGhlIGNvbnRleHQgaW4gdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHRUb1JlcGxhY2VXaXRoID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdG9yaWdpbmFsQ29udGV4dC5yZXBsYWNlV2l0aChjb250ZXh0VG9SZXBsYWNlV2l0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRnVsbHNjcmVlbjogdHJpZ2dlciBhIHJlZnJlc2ggb2YgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVXNlIHRoZSBzYXZlZCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYW4gYWN0aXZlIGluc3RhbmNlIGZyb20gdGhlIExSIGFuZCB3ZSdyZSBpbiBhIFRyZWUgb3IgQW5hbHl0aWNhbCB0YWJsZS5cblx0ICogQHBhcmFtIG9yaWdpbmFsQ29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29udGV4dCwgbnVsbCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZU9yQW5hbHl0aWNhbFRhYmxlKG9yaWdpbmFsQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Q29udGV4dCB8IG51bGw+IHtcblx0XHRjb25zdCBwYXJlbnRCaW5kaW5nID0gb3JpZ2luYWxDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRpZiAoIXBhcmVudEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIFRoZSBjb250ZXh0IGRvZXNuJ3QgYmVsb25nIHRvIGEgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgYWdncmVnYXRpb24gPSBwYXJlbnRCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXNcblx0XHRcdHwgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmc7IGdyb3VwPzogb2JqZWN0OyBhZ2dyZWdhdGU/OiBvYmplY3QgfVxuXHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFhZ2dyZWdhdGlvbj8uaGllcmFyY2h5UXVhbGlmaWVyICYmICFhZ2dyZWdhdGlvbj8uZ3JvdXAgJiYgIWFnZ3JlZ2F0aW9uPy5hZ2dyZWdhdGUpIHtcblx0XHRcdC8vIFRoZSBjb250ZXh0IGRvZXNuJ3QgYmVsb25nIHRvIGEgaGllcmFyY2hpY2FsL2FuYWx5dGljYWwgbGlzdCBiaW5kaW5nXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWUpIHtcblx0XHRcdC8vIElmIHdlJ3JlIGluIGEgVHJlZS9BbmFseXRpY2FsIHRhYmxlLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgaW5zdGFuY2UgdGhhdCBoYXMgYSBkcmFmdCxcblx0XHRcdC8vIC0tPiBXZSB0cnkgdG8gbmF2aWdhdGUgdG8gdGhlIGRyYWZ0IGluc3RhbmNlIChpZiBpdCBzdGlsbCBleGlzdHMpXG5cdFx0XHRjb25zdCBkcmFmdE9yQWN0aXZlQ29udGV4dCA9IGF3YWl0IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0KG9yaWdpbmFsQ29udGV4dCk7XG5cblx0XHRcdGlmIChkcmFmdE9yQWN0aXZlQ29udGV4dCAhPT0gbnVsbCAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpICE9PSBkcmFmdE9yQWN0aXZlQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0Ly8gVXNlIHRoZSBkcmFmdCBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gZHJhZnRPckFjdGl2ZUNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBjb250ZXh0XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQoY29udGV4dDogQ29udGV4dCB8IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblxuXHRcdHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpOiB2b2lkIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluY2x1ZGVzKFwiKC4uLilcIikpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3BsYXlzIGFuIGVycm9yIChpbGx1c3RyYXRlZCBtZXNzYWdlKSBpbiB0aGUgcGFnZS5cblx0ICogQHBhcmFtIHNFcnJvck1lc3NhZ2Vcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IHN0cmluZywgbVBhcmFtZXRlcnM6IE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1jcmVhdGVcIikgfHwgdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWF1dG9DcmVhdGVcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycywgdGhpcy5nZXRGQ0xMZXZlbCgpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0XG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3RhdGUgaXMgaW1wYWN0ZWQgYnkgdGhlIGNvbnRleHRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dCk7XG5cdH1cblxuXHRfaXNWaWV3UGFydE9mUm91dGUocm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb24pOiBib29sZWFuIHtcblx0XHRjb25zdCBhVGFyZ2V0cyA9IHJvdXRlSW5mb3JtYXRpb24/LnRhcmdldHM7XG5cdFx0aWYgKCFhVGFyZ2V0cyB8fCAhYVRhcmdldHMuaW5jbHVkZXModGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpKSB7XG5cdFx0XHQvLyBJZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaGFzIGEgdmlldyBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHJvdXRlIGxldmVsLCBpdCBtZWFucyB0aGlzIHZpZXcgY29tZXMgXCJhZnRlclwiIHRoZSByb3V0ZVxuXHRcdFx0Ly8gaW4gdGVybXMgb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQsIHRvIGF2b2lkIHRoaXMgdmlldyB0byBoYXZlIGRhdGEgaWYgd2UgbmF2aWdhdGUgdG8gaXQgbGF0ZXIgb25cblx0XHRcdC8vIFRoaXMgaXMgZG9uZSBpbiBhIHRpbWVvdXQgdG8gYWxsb3cgZm9yIGZvY3Vzb3V0IGV2ZW50cyB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHByb3Blcmx5IGluIGNvbGxhYm9yYXRpdmUgZHJhZnRcblx0XHRcdGlmICgodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSkge1xuXHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYWRkQmluZGluZ0NsZWFudXBQcm9taXNlKFxuXHRcdFx0XHRcdG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPT09IDAgJiYgdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIHJvdXRlIGhhcyBsZXZlbCAwIC0tPiB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBjb2xsYWJvcmF0aW9uIHNlc3Npb24gYXMgbm8gT1AgaXMgZGlzcGxheWVkXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgoXG5cdFx0cm91dGVBcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD4sXG5cdFx0YmluZGluZ1BhdHRlcm46IHN0cmluZyxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvXG5cdCk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cblx0XHRcdGlmICh0eXBlb2Ygc1ZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluY2x1ZGVzKGB7JHtzS2V5fX1gKSkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KT8uW1wiaS1hY3Rpb25cIl0/LmluY2x1ZGVzKFwiY3JlYXRlXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKFxuXHRcdG9FdmVudDogRXZlbnQ8e1xuXHRcdFx0cm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb247XG5cdFx0XHRyb3V0ZVBhdHRlcm46IHN0cmluZztcblx0XHRcdG5hdmlnYXRpb25JbmZvOiBSb3V0aW5nTmF2aWdhdGlvbkluZm87XG5cdFx0XHRhcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG9iamVjdD47XG5cdFx0fT5cblx0KTogdm9pZCB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiA/PyB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0bGV0IGJpbmRQcm9taXNlO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCk7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uICYmXG5cdFx0XHQodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWVkaXRcIikgfHwgKHRoaXMuX29QYWdlQ29tcG9uZW50Py5pc09wZW5JbkVkaXRNb2RlPy4oKSA/PyBmYWxzZSkpXG5cdFx0KSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlRm9yRWRpdChwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblxuXHRcdGJpbmRQcm9taXNlXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgZHVyaW5nIHBhZ2UgYmluZGluZyBcIiArIGVycm9yLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSk7XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLmdldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgZGVmZmVyZWQgY29udGV4dFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgX2JpbmREZWZlcnJlZCh0YXJnZXRQYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmJlZm9yZVNldEJpbmRpbmdDb250ZXh0KG51bGwsIHsgZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSB9KTtcblxuXHRcdGlmICghbmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMgfHwgbmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMubW9kZSA9PT0gXCJEZWZlcnJlZFwiKSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8ubGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/LnBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/LmRhdGEsXG5cdFx0XHRcdFx0ISFuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIHRoZSBjb250ZXh0IHRvIGF2b2lkIHNob3dpbmcgb2xkIGRhdGFcblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLCBpZiB0aGUgYXBwIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgcHJlZmVycmVkIG1vZGUgZWRpdC5cblx0ICpcblx0ICogSWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGFuIGFjdGl2ZSBlbnRpdHksIGl0IGlzIGRpcmVjdGx5IGNvbnZlcnRlZCB0byBkcmFmdCB1c2luZyB0aGUgRWRpdEZsb3cgY29udHJvbGxlciBleHRlbnNpb24uXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqL1xuXHRhc3luYyBfYmluZFBhZ2VGb3JFZGl0KHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYmluZFBhZ2VUb0NvbnRleHQobnVsbCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHRlY2huaWNhbFBhdGg6IHN0cmluZyA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHQvLyBjaGVjayBmb3Igc3RpY2t5ICYgc3RpY2t5IGVkaXQgc2Vzc2lvblxuXHRcdFx0Y29uc3QgaXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUodGhpcy5iYXNlLmdldFZpZXcoKSk7XG5cdFx0XHRjb25zdCBpc1N0aWNreSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpO1xuXHRcdFx0aWYgKHRlY2huaWNhbFBhdGguaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT10cnVlXCIpIHx8IChpc1N0aWNreSAmJiAhaXNTdGlja3lFZGl0TW9kZSkpIHtcblx0XHRcdFx0Ly8gY3JlYXRlIGNvbnRleHQgb3IgdXNlIHRoZSBvbmUgdGhlIHVzZXIgY2xpY2tlZCBvblxuXHRcdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0ID1cblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0Py5nZXRQYXRoKCkgPT09IHRlY2huaWNhbFBhdGhcblx0XHRcdFx0XHRcdD8gbmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dFxuXHRcdFx0XHRcdFx0OiB0aGlzLl9jcmVhdGVDb250ZXh0KHRlY2huaWNhbFBhdGgsIG1vZGVsKTtcblxuXHRcdFx0XHQvLyBlZGl0IGRvY3VtZW50XG5cdFx0XHRcdHJldHVybiBhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuZWRpdERvY3VtZW50KGFjdGl2ZUNvbnRleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2JpbmRQYWdlVG9QYXRoKHRlY2huaWNhbFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0dGl0bGU6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0ZGVzY3JpcHRpb246IChlcnJvciBhcyBFcnJvcikubWVzc2FnZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIG9uIHRoZSBwYWdlIGlzIHNldFxuXHQgKi9cblx0YXN5bmMgX2JpbmRQYWdlKHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0Ly8gVGhlIHBhZ2UgYmluZGluZyBpcyBkb25lIGFzeW5jaHJvbm91c2x5LCB0byBtYWtlIHN1cmUgX29uUm91dGVNYXRjaGVkIGlzIGNhbGxlZCBmb3IgYWxsIHRhcmdldHMgYmVmb3JlLCBhbmQgdGhlIGJpbmRpbmcgY2xlYW51cCBwcm9taXNlcyBhcmUgcHJvcGVybHkgc3RvcmVkIGluIHRoZSByb3V0aW5nIHNlcnZpY2UuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZWNobmljYWxQYXRoID0gYXdhaXQgcmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgbW9kZWwsIHRoaXMuX29Sb3V0aW5nU2VydmljZSwgdGhpcy5fb1JvdXRlcik7XG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoe30pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gYnVpbGQgdGhlIGNvbnRleHQgKHRoaXMgaXMgYSBwYXRoIGluIHRoZSBtb2RlbCwgc28gb25seSB0ZWNobmljYWwga2V5cyBhcmUgYWxsb3dlZCkuXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpIHtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAhPT0gb0N1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGxldCBzaG91bGRSZWZyZXNoQ29udGV4dCA9IGZhbHNlO1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgRkNMLCBpZiB3ZSdyZSByZXVzaW5nIGEgY29udGV4dCBmcm9tIGEgdGFibGUgKHRocm91Z2ggbmF2aWdhdGlvbiksIHdlIHJlZnJlc2ggaXQgdG8gYXZvaWQgb3V0ZGF0ZWQgZGF0YVxuXHRcdFx0XHQvLyBXZSBkb24ndCB3YWl0IGZvciB0aGUgcmVmcmVzaCB0byBiZSBjb21wbGV0ZWQgKHJlcXVlc3RSZWZyZXNoKSwgc28gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBxdWVyeSBnb2VzIGludG8gdGhlIHNhbWVcblx0XHRcdFx0Ly8gYmF0Y2ggYXMgdGhlIG9uZXMgZnJvbSBjb250cm9scyBpbiB0aGUgcGFnZS5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgJiYgb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcykge1xuXHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9Vc2VDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0aWYgKCFvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgb1VzZUNvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0XHRcdFx0c2hvdWxkUmVmcmVzaENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgfHxcblx0XHRcdFx0XHRcdChNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgb1VzZUNvbnRleHQuZ2V0UGF0aCgpKSAmJlxuXHRcdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBidXQgd2UncmUgaW4gY29sbGFib3JhdGlvbiBkcmFmdCwgd2UgZm9yY2UgdGhlIHJlZnJlc2ggKGRpc2NhcmRpbmcgcGVuZGluZyBjaGFuZ2VzKSBhcyB3ZSBuZWVkIHRvIGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuXHRcdFx0XHRcdFx0Ly8gV2hlbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1AsIHRoZSB2aWV3IGlzIG5vdCBjb25uZWN0ZWQgeWV0IC0tPiBjaGVjayBpZiB3ZSdyZSBpbiBkcmFmdCB3aXRoIGNvbGxhYm9yYXRpb24gZnJvbSB0aGUgbWV0YW1vZGVsXG5cdFx0XHRcdFx0XHRvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG9Vc2VDb250ZXh0LCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChzaG91bGRSZWZyZXNoQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgb1VzZUNvbnRleHQsIG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5nZXRHcm91cElkKCkpXG5cdFx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoYENhbm5vdCByZWZyZXNoIGNvbnRleHQ6ICR7ZXJyfWApO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbikge1xuXHRcdFx0XHQvLyBXZSBoYXZlIHRoZSBzYW1lIGNvbnRleHQgYnV0IGFuIGVkaXRmbG93IGFjdGlvbiBoYXBwZW5lZCAoZS5nLiBDYW5jZWxEb2N1bWVudCBpbiBzdGlja3kgbW9kZSlcblx0XHRcdFx0Ly8gLS0+IFdlIG5lZWQgdG8gY2FsbCBvbkJlZm9yZS9BZnRlckJpbmRpbmcgdG8gcmVmcmVzaCB0aGUgb2JqZWN0IHBhZ2UgcHJvcGVybHlcblx0XHRcdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvVXNlQ29udGV4dCwge1xuXHRcdFx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nOiBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCksXG5cdFx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0cmVhc29uOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uLFxuXHRcdFx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChvVXNlQ29udGV4dCwgeyByZWRpcmVjdGVkVG9Ob25EcmFmdDogb05hdmlnYXRpb25QYXJhbWV0ZXJzPy5yZWRpcmVjdGVkVG9Ob25EcmFmdCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHNDdXJyZW50UGF0aCAhPT0gc1RhcmdldFBhdGggfHwgb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbikge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5BcHBTdGF0ZUNoYW5nZWQgJiZcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uUmVzdG9yZUhpc3RvcnkgJiZcblx0XHRcdEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkgJiZcblx0XHRcdCFvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRvQ3VycmVudENvbnRleHRcblx0XHQpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogdm9pZCB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCAmJiAhdGhpcy5fb0FwcENvbXBvbmVudC5pc0V4aXRpbmcgJiYgb1Jvb3RWaWV3Q29udHJvbGxlci5pc0NvbnRleHRVc2VkSW5QYWdlcyhvQ29udGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0cnVlIC8vIExvYWQgbWVzc2FnZXMsIG90aGVyd2lzZSB0aGV5IGRvbid0IGdldCByZWZyZXNoZWQgbGF0ZXIsIGUuZy4gZm9yIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRcdC8vIHNldEtlZXBBbGl2ZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJlbnQgbGlzdGJpbmRpbmcgZG9lc24ndCBoYXZlICQkb3duUmVxdWVzdD10cnVlXG5cdFx0XHRcdC8vIFRoaXMgY2FzZSBmb3IgY3VzdG9tIGZyYWdtZW50cyBpcyBzdXBwb3J0ZWQsIGJ1dCBhbiBlcnJvciBpcyBsb2dnZWQgdG8gbWFrZSB0aGUgbGFjayBvZiBzeW5jaHJvbml6YXRpb24gYXBwYXJlbnRcblx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdGBWaWV3IGZvciAke29Db250ZXh0LmdldFBhdGgoKX0gd29uJ3QgYmUgc3luY2hyb25pemVkLiBQYXJlbnQgbGlzdEJpbmRpbmcgbXVzdCBoYXZlIGJpbmRpbmcgcGFyYW1ldGVyICQkb3duUmVxdWVzdD10cnVlYFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCBvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGNvbnRleHQgb3RoZXJ3aXNlIHdlIGdldCBlcnJvcnNcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgd2l0aCB0aGUgcHJvcGVyIGJlZm9yZS9hZnRlciBjYWxsYmFja3Ncblx0XHR0aGlzLmJlZm9yZVNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHR9KTtcblxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqL1xuXHRfY3JlYXRlQ29udGV4dChzUGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBDb250ZXh0IHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG9NZXRhTW9kZWwpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHRpZiAodGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmlzSW5saW5lRWRpdFBvc3NpYmxlKCkpIHtcblx0XHRcdC8vIGlmIGlubGluZSBlZGl0IGlzIGVuYWJsZWQgb24gdGhlIHBhZ2UgYW5kIHRoaXMgaXMgdGhlIGFjdGl2ZSBlbnRpdHksIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBncm91cCBpZCB0byBpbmxpbmVcblx0XHRcdG1QYXJhbWV0ZXJzLiQkdXBkYXRlR3JvdXBJZCA9IHNQYXRoLmluY2x1ZGVzKFwiSXNBY3RpdmVFbnRpdHk9dHJ1ZVwiKSA/IENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCA6IFwiJGF1dG9cIjtcblx0XHR9XG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSkgYW5kIHNlbWFudGljIGtleXMgKGZvciBjcmVhdGluZyB0aGUgc2VtYW50aWMgVVJMKVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0ID0gc0NvbnRleHRQYXRoXG5cdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpICYmIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvTWV0YU1vZGVsLmdldENvbnRleHQoc0NvbnRleHRQYXRoKSlcblx0XHRcdDogbnVsbDtcblx0XHRjb25zdCBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzID0gTW9kZWxIZWxwZXIuZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyhcblx0XHRcdGRhdGFNb2RlbE9iamVjdD8udGFyZ2V0RW50aXR5VHlwZSBhcyBFbnRpdHlUeXBlLFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0Py50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0XG5cdFx0KTtcblx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBvRHJhZnRSb290XG5cdFx0XHQ/IGRhdGFNb2RlbE9iamVjdD8udGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5Py5tYXAoKGtleSkgPT4ga2V5LnZhbHVlKSA/PyBbXVxuXHRcdFx0OiBbXTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbCwgc1BhdGgsIGZhbHNlLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBrZWVwQWxpdmUgY29udGV4dCAke3NQYXRofWApO1xuXHRcdFx0fSBlbHNlIGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0uY29uY2F0KHNlbWFudGljS2V5cyk7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocHJvcGVydGllc1RvUmVxdWVzdCk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKG9EcmFmdFJvb3QgPyBwcm9wZXJ0aWVzVG9SZXF1ZXN0LmNvbmNhdChbXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXSkgOiBwcm9wZXJ0aWVzVG9SZXF1ZXN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb1NlbGVjdDogc3RyaW5nW10gPSBbXTtcblx0XHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKFwiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0cHJvcGVydGllc1RvU2VsZWN0LnB1c2goLi4uc2VtYW50aWNLZXlzKTtcblx0XHRcdH1cblx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKC4uLmFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMpO1xuXG5cdFx0XHRpZiAoaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQgJiYgb0RyYWZ0Um9vdCkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHJvcGVydGllc1RvU2VsZWN0Lmxlbmd0aCkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gcHJvcGVydGllc1RvU2VsZWN0LmpvaW4oXCIsXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRjb25zdCBvUHJldmlvdXNCaW5kaW5nID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0QmluZGluZygpO1xuXHRcdFx0XHRpZiAob1ByZXZpb3VzQmluZGluZykge1xuXHRcdFx0XHRcdG9Nb2RlbC5yZXNldENoYW5nZXMob1ByZXZpb3VzQmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHRcdFx0XHRcdG9QcmV2aW91c0JpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9IaWRkZW5CaW5kaW5nID0gb01vZGVsLmJpbmRDb250ZXh0KHNQYXRoLCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlcXVlc3RlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0XHRcdHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlci5ob2xkTWVzc2FnZXNGb3JDb250cm9sKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMub25EYXRhUmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRjb25zdCBib3VuZENvbnRleHQgPSBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGlmIChpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCAmJiBzUGF0aC5pbmNsdWRlcyhcIklzQWN0aXZlRW50aXR5PWZhbHNlXCIpKSB7XG5cdFx0XHRcdGFkZFNlbGYob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoISwgb01vZGVsLCBib3VuZENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGJvdW5kQ29udGV4dDtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgb25EYXRhUmVjZWl2ZWQob0V2ZW50OiBFdmVudDx7IGVycm9yOiB7IHN0YXR1cz86IG51bWJlcjsgY2F1c2U/OiB7IHN0YXR1cz86IG51bWJlciB9OyBtZXNzYWdlPzogc3RyaW5nIH0gfT4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBlcnJvciA9IG9FdmVudD8uZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5fb1ZpZXcpKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXG5cdFx0aWYgKGVycm9yKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0bGV0IG1QYXJhbXM6IFNob3dNZXNzYWdlc1BhcmFtZXRlcnMgPSB7fTtcblx0XHRcdGNvbnN0IGVycm9yU3RhdHVzID0gZXJyb3Iuc3RhdHVzID8/IGVycm9yLmNhdXNlPy5zdGF0dXM7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRpZiAoZXJyb3JTdGF0dXMgPT09IDUwMykge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRpc0luaXRpYWxMb2FkNTAzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGVycm9yU3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGVycm9yPy5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdG1QYXJhbXMuY29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlci5yZWxlYXNlSG9sZEJ5Q29udHJvbCh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHNpZGUgZWZmZWN0cyBvbiBhIGJpbmRpbmcgY29udGV4dCB0byBcInJlZnJlc2hcIiBpdC5cblx0ICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcHJvdmlkZWQgYnkgdGhlIG1vZGVsXG5cdCAqIGEgcmVmcmVzaCBvbiB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHdvcmsgaW4gY2FzZSBhIGNyZWF0aW9uIHJvdyB3aXRoIGEgdHJhbnNpZW50IGNvbnRleHQgaXNcblx0ICogdXNlZC4gYWxzbyBhIHJlcXVlc3RTaWRlRWZmZWN0cyB3aXRoIGFuIGVtcHR5IHBhdGggd291bGQgZmFpbCBkdWUgdG8gdGhlIHRyYW5zaWVudCBjb250ZXh0XG5cdCAqIHRoZXJlZm9yZSB3ZSBnZXQgYWxsIGRlcGVuZGVudCBiaW5kaW5ncyAodmlhIHByaXZhdGUgbW9kZWwgbWV0aG9kKSB0byBkZXRlcm1pbmUgYWxsIHBhdGhzIGFuZCB0aGVuXG5cdCAqIHJlcXVlc3QgdGhlbS5cblx0ICogQHBhcmFtIG9CaW5kaW5nQ29udGV4dCBDb250ZXh0IHRvIGJlIHJlZnJlc2hlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID1cblx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDtcblx0XHRjb25zdCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgYVByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBbXVxuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmc6IEJpbmRpbmcpOiB2b2lkIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKG9CaW5kaW5nLmdldENvbnRleHQoKT8uZ2V0UGF0aCgpID8/IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBPE9EYXRhQ29udGV4dEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoaXRlbSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICghYVByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZGluZyBvZiB0aGUgY29udGV4dCBtdXN0IGhhdmUgJCRQYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyB0cnVlLCB0aGlzIGJvdW5kIGNvbnRleHQgbWF5IGJlIG5lZWRlZCB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nXG5cdFx0Z2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpO1xuXG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzW2ldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydHlQYXRocztcblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHR9XG5cdFx0Ly9hbGwgdGhpcyBsb2dpYyB0byBiZSByZXBsYWNlZCB3aXRoIGEgU2lkZUVmZmVjdHMgcmVxdWVzdCBmb3IgYW4gZW1wdHkgcGF0aCAocmVmcmVzaCBldmVyeXRoaW5nKSwgYWZ0ZXIgdGVzdGluZyB0cmFuc2llbnQgY29udGV4dHNcblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnJlZHVjZSgodGFyZ2V0czogc3RyaW5nW10sIHRhcmdldFByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAodGFyZ2V0UHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSB0YXJnZXRQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0dGFyZ2V0cy5wdXNoKGluZGV4ID4gMCA/IHRhcmdldFByb3BlcnR5LnNsaWNlKDAsIGluZGV4KSA6IHRhcmdldFByb3BlcnR5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YXJnZXRzO1xuXHRcdH0sIFtdKTtcblx0XHQvLyBPRGF0YSBtb2RlbCB3aWxsIHRha2UgY2FyZSBvZiBkdXBsaWNhdGVzXG5cdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoWy4uLm9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcywgLi4ub1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXNdLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCk6IHZvaWQge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0fVxuXG5cdFx0b1RhcmdldENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0aWYgKG9QcmV2aW91c0NvbnRleHQ/LmlzS2VlcEFsaXZlKCkgJiYgb1ByZXZpb3VzQ29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShvUHJldmlvdXNDb250ZXh0LCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZsZXhpYmxlIGNvbHVtbiBsYXlvdXQgKEZDTCkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgdmlldyAoLTEgaWYgdGhlIGFwcCBpcyBub3QgRkNMKS5cblx0ICogQHJldHVybnMgVGhlIGxldmVsXG5cdCAqL1xuXHRnZXRGQ0xMZXZlbCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uRkNMTGV2ZWw7XG5cdH1cblxuXHRfc2V0S2VlcEFsaXZlKFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdGJLZWVwQWxpdmU6IGJvb2xlYW4sXG5cdFx0Zm5CZWZvcmVEZXN0cm95PzogUGFyYW1ldGVyczxDb250ZXh0W1wic2V0S2VlcEFsaXZlXCJdPlsxXSxcblx0XHRiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhblxuXHQpOiB2b2lkIHtcblx0XHRpZiAob0NvbnRleHQuZ2V0UGF0aCgpLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0Ly8gV2Uga2VlcCB0aGUgY29udGV4dCBhbGl2ZSBvbmx5IGlmIHRoZXkncmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIGkuZS4gaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgJyknXG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc01ldGFQYXRoKTtcblx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShiS2VlcEFsaXZlLCBmbkJlZm9yZURlc3Ryb3ksICEhc01lc3NhZ2VzUGF0aCAmJiBiUmVxdWVzdE1lc3NhZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0S2VlcEFsaXZlQ29udGV4dChcblx0XHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0cGF0aDogc3RyaW5nLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuLFxuXHRcdHBhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnNcblx0KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gR2V0IHRoZSBwYXRoIGZvciB0aGUgY29udGV4dCB0aGF0IGlzIHJlYWxseSBrZXB0IGFsaXZlIChwYXJ0IG9mIGEgY29sbGVjdGlvbilcblx0XHQvLyBpLmUuIHJlbW92ZSBhbGwgc2VnbWVudHMgbm90IGVuZGluZyB3aXRoIGEgJyknXG5cdFx0Y29uc3Qga2VwdEFsaXZlU2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBhZGRpdGlvbm5hbFNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHdoaWxlIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggJiYgIWtlcHRBbGl2ZVNlZ21lbnRzW2tlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIDFdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5wdXNoKGtlcHRBbGl2ZVNlZ21lbnRzLnBvcCgpISk7XG5cdFx0fVxuXG5cdFx0aWYgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBrZXB0QWxpdmVQYXRoID0ga2VwdEFsaXZlU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0Y29uc3Qgb0tlZXBBbGl2ZUNvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChrZXB0QWxpdmVQYXRoLCBiUmVxdWVzdE1lc3NhZ2VzLCBwYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChhZGRpdGlvbm5hbFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG9LZWVwQWxpdmVDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnJldmVyc2UoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9ubmFsUGF0aCA9IGFkZGl0aW9ubmFsU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0XHRyZXR1cm4gb01vZGVsLmJpbmRDb250ZXh0KGFkZGl0aW9ubmFsUGF0aCwgb0tlZXBBbGl2ZUNvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c3dpdGNoRnVsbFNjcmVlbigpOiB2b2lkIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvRkNMSGVscGVyTW9kZWwgPSBvU291cmNlLmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLFxuXHRcdFx0YklzRnVsbFNjcmVlbiA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9pc0Z1bGxTY3JlZW5cIiksXG5cdFx0XHRzTmV4dExheW91dCA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0YklzRnVsbFNjcmVlbiA/IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2V4aXRGdWxsU2NyZWVuXCIgOiBcIi9hY3Rpb25CdXR0b25zSW5mby9mdWxsU2NyZWVuXCJcblx0XHRcdCksXG5cdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0ID0gKG9Sb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dFxuXHRcdFx0PyAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCkhXG5cdFx0XHQ6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBsYXlvdXQ6IHNOZXh0TGF5b3V0IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiY2Fubm90IHN3aXRjaCBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbHNjcmVlblwiKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgdGhlIGNvbHVtbiBmb3IgdGhlIGN1cnJlbnQgdmlldyBpbiBhIEZDTC5cblx0ICpcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5CZWZvcmUpXG5cdGFzeW5jIGNsb3NlQ29sdW1uKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0bGF5b3V0OiB0aGlzLl9vVmlldy5nZXRNb2RlbChcImZjbGhlbHBlclwiKS5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9jbG9zZUNvbHVtblwiKVxuXHRcdH07XG5cblx0XHRjb25zdCBpc0RvY3VtZW50TW9kaWZpZWQgPVxuXHRcdFx0ISF0aGlzLmdldFZpZXcoKT8uZ2V0TW9kZWwoXCJ1aVwiKT8uZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKSB8fCAhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5fb0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKT8uSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQpXG5cdFx0XHQuZW5hYmxlZDtcblxuXHRcdGlmICghaXNEb2N1bWVudE1vZGlmaWVkICYmIGlzSGlkZGVuRHJhZnRFbmFibGVkKSB7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlLFxuXHRcdFx0XHRza2lwQmFja05hdmlnYXRpb246IHRydWVcblx0XHRcdH07XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHQvLyBXZSBkb24ndCBoYXZlIGNhbGxFeHRlbnNpb249dHJ1ZSBpbiB0aGlzIGNhc2UsIGFzIHRoZXJlJ3MgYSB1c2VyIHZhbGlkYXRpb24gd2l0aCB0aGUgZGF0YWxvc3MgZGlhbG9nXG5cdFx0XHRcdFx0Ly8gYW5kIGl0IHdvdWxkbid0IG1ha2Ugc2Vuc2UgdG8gY2FuY2VsIHRoZSBuYXZpZ2F0aW9uIGFmdGVyIHRoaXMgY29uZmlybWF0aW9uXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLl9vVmlldy5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5jYWxsRXh0ZW5zaW9uID0gdHJ1ZTtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlcyB0cmFuc2l0aW9uIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgY29udGV4dFxuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVUcmFuc2lzdGlvbk1lc3NhZ2VGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFJvdXRpbmc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTRDQTtBQUNBO0FBQ0E7QUFDQTtFQUhBLElBS01BLGVBQWUsSUFBQUMsSUFBQSxHQURwQkMsY0FBYyxDQUFDLGtEQUFrRCxDQUFDLEVBQUFDLEtBQUEsR0FvQmpFQyxjQUFjLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBT2hCRCxjQUFjLENBQUMsQ0FBQyxFQUFBRSxLQUFBLEdBd0NoQkMsZUFBZSxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLEVBQUFDLEtBQUEsR0FLbkNMLGVBQWUsQ0FBQyxDQUFDLEVBQUFNLEtBQUEsR0FDakJKLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxFQUFBRyxLQUFBLEdBS25DUCxlQUFlLENBQUMsQ0FBQyxFQUFBUSxLQUFBLEdBQ2pCTixVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsRUFBQUssTUFBQSxHQVduQ1QsZUFBZSxDQUFDLENBQUMsRUFBQVUsTUFBQSxHQUNqQlIsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLEVBQUFPLE1BQUEsR0FnQ25DWCxlQUFlLENBQUMsQ0FBQyxFQUFBWSxNQUFBLEdBNkNqQlosZUFBZSxDQUFDLENBQUMsRUFBQWEsTUFBQSxHQTZMakJiLGVBQWUsQ0FBQyxDQUFDLEVBQUFjLE1BQUEsR0FDakJDLGNBQWMsQ0FBQyxDQUFDLEVBQUFDLE1BQUEsR0E4QmhCaEIsZUFBZSxDQUFDLENBQUMsRUFBQWlCLE1BQUEsR0FDakJGLGNBQWMsQ0FBQyxDQUFDLEVBQUFHLE1BQUEsR0FpZGhCbEIsZUFBZSxDQUFDLENBQUMsRUFBQW1CLE1BQUEsR0EyTmpCbkIsZUFBZSxDQUFDLENBQUMsRUFBQW9CLE1BQUEsR0FDakJMLGNBQWMsQ0FBQyxD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
987
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJfZGVjNCIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM1IiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiQmVmb3JlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsImRldGFjaFJvdXRlTWF0Y2hlZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiaXNBIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0SGFzaEZvck5hdmlnYXRpb24iLCJjb250ZXh0IiwibmF2aWdhdGlvblRhcmdldE5hbWUiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsImRldGFpbFJvdXRlIiwicm91dGVOYW1lIiwicGFyYW1ldGVyTWFwcGluZyIsImdldEhhc2hGcm9tUm91dGUiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsImFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbiIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY3JlYXRlZENvbnRleHQiLCJjaGVja05vSGFzaENoYW5nZSIsImVkaXRhYmxlIiwicGVyc2lzdE9QU2Nyb2xsIiwidXBkYXRlRkNMTGV2ZWwiLCJmb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJjYWxsRXh0ZW5zaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldE1vZGVsIiwic2V0UHJvcGVydHkiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsImhpZGRlbkJpbmRpbmciLCJiYWNrUGF0aCIsImdldFBhdGhUb05hdmlnYXRlQmFjayIsImdldFBhdGgiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm92ZXJyaWRlTmF2Iiwib25CZWZvcmVOYXZpZ2F0aW9uIiwiZGVzdHJveSIsIlByb21pc2UiLCJyZXNvbHZlIiwiRkNMTGV2ZWwiLCJnZXRGQ0xMZXZlbCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1vZGVsIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaXNQYXRoT25EcmFmdFJvb3QiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiZ2V0TWV0YUNvbnRleHQiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGVhZGVySW5mbyIsIlR5cGVOYW1lIiwibmFtZSIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJwYXJlbnRCaW5kaW5nIiwiZ2V0QmluZGluZyIsImFnZ3JlZ2F0aW9uIiwiZ2V0QWdncmVnYXRpb24iLCJoaWVyYXJjaHlRdWFsaWZpZXIiLCJncm91cCIsImFnZ3JlZ2F0ZSIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJzSGFzaCIsImdldEhhc2giLCJpbmNsdWRlcyIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibVBhcmFtZXRlcnMiLCJuYXZUb0hhc2giLCJnZXREZWZhdWx0Q3JlYXRlSGFzaCIsImRpc3BsYXlFcnJvclBhZ2UiLCJpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkiLCJfaXNWaWV3UGFydE9mUm91dGUiLCJyb3V0ZUluZm9ybWF0aW9uIiwiYVRhcmdldHMiLCJ0YXJnZXRzIiwidGFyZ2V0TmFtZSIsInZpZXdMZXZlbCIsInJvdXRlTGV2ZWwiLCJnZXRSb3V0aW5nU2VydmljZSIsImFkZEJpbmRpbmdDbGVhbnVwUHJvbWlzZSIsInNldFRpbWVvdXQiLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJkaXNjb25uZWN0IiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImJBY3Rpb25DcmVhdGUiLCJvRXZlbnQiLCJnZXRQYXJhbWV0ZXIiLCJnZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4iLCJjb250ZXh0UGF0dGVybiIsIm1Bcmd1bWVudHMiLCJnZXRQYXJhbWV0ZXJzIiwib05hdmlnYXRpb25QYXJhbWV0ZXJzIiwiYmluZFByb21pc2UiLCJvTW9kZWwiLCJfYmluZERlZmVycmVkIiwiRWRpdEZsb3dBY3Rpb24iLCJpc09wZW5JbkVkaXRNb2RlIiwiX2JpbmRQYWdlRm9yRWRpdCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ0b1N0cmluZyIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3IiwidGFyZ2V0UGF0aCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsImxpc3RCaW5kaW5nIiwicGFyZW50Q29udGV4dCIsImRhdGEiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJ0ZWNobmljYWxQYXRoIiwicmVzb2x2ZVBhdGgiLCJpc1N0aWNreUVkaXRNb2RlIiwiaXNTdGlja3kiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJhY3RpdmVDb250ZXh0IiwidXNlQ29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwiZWRpdEZsb3ciLCJlZGl0RG9jdW1lbnQiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsImUiLCJtZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlcyIsInNUYXJnZXRQYXRoIiwib0N1cnJlbnRDb250ZXh0IiwiX2dldEJpbmRpbmdDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic2hvdWxkUmVmcmVzaENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0Nvbm5lY3RlZCIsInJlc2V0Q2hhbmdlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsImV4ZWN1dGVTaGFyZUFjdGlvbiIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsImlubGluZUVkaXRGbG93IiwiaXNJbmxpbmVFZGl0UG9zc2libGUiLCJJTkxJTkVFRElUX1VQREFURUdST1VQSUQiLCJvRHJhZnRSb290IiwiZ2V0T2JqZWN0Iiwib0RyYWZ0Tm9kZSIsImRhdGFNb2RlbE9iamVjdCIsImdldENvbnRleHQiLCJhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsInRhcmdldEVudGl0eVNldCIsInNlbWFudGljS2V5cyIsIkNvbW1vbiIsIlNlbWFudGljS2V5IiwibWFwIiwia2V5IiwidmFsdWUiLCJfZ2V0S2VlcEFsaXZlQ29udGV4dCIsInByb3BlcnRpZXNUb1JlcXVlc3QiLCJjb25jYXQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicHJvcGVydGllc1RvU2VsZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsInB1c2giLCIkc2VsZWN0Iiwiam9pbiIsIm9QcmV2aW91c0JpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwib0hpZGRlbkJpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJvbkRhdGFSZWNlaXZlZCIsImlzTG9ja2VkIiwidW5sb2NrIiwibVBhcmFtcyIsImVycm9yU3RhdHVzIiwic3RhdHVzIiwiY2F1c2UiLCJvUmVzb3VyY2VCdW5kbGUiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwiY29udHJvbCIsInJlbGVhc2VIb2xkQnlDb250cm9sIiwib0JpbmRpbmdDb250ZXh0Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsInNsaWNlIiwiZ2V0RGVwZW5kZW50QmluZGluZ3MiLCJpdGVtIiwiaSIsInJlZHVjZSIsInRhcmdldFByb3BlcnR5IiwiaW5kZXgiLCJpbmRleE9mIiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsImJLZWVwQWxpdmUiLCJmbkJlZm9yZURlc3Ryb3kiLCJiUmVxdWVzdE1lc3NhZ2VzIiwiZW5kc1dpdGgiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwic3BsaXQiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsIm9LZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwibGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImlzRG9jdW1lbnRNb2RpZmllZCIsIlVpTW9kZWxDb25zdGFudHMiLCJEb2N1bWVudE1vZGlmaWVkIiwiaXNIaWRkZW5EcmFmdEVuYWJsZWQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkhpZGRlbkRyYWZ0IiwiZW5hYmxlZCIsInNraXBEaXNjYXJkUG9wb3ZlciIsInNraXBCYWNrTmF2aWdhdGlvbiIsImNhbmNlbERvY3VtZW50IiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVRyYW5zaXN0aW9uTWVzc2FnZUZvckNvbnRleHQiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsIk9iamVjdCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0LCBFbnRpdHlUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHsgdHlwZSBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQsIHR5cGUgU2hvd01lc3NhZ2VzUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kQ29udGV4dFBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB7IGdldERyYWZ0T3JBY3RpdmVDb250ZXh0LCBpc1BhdGhPbkRyYWZ0Um9vdCwgcmVzb2x2ZVBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Db250ZXh0UGF0aEhlbHBlclwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuaW1wb3J0IHR5cGUgUm91dGVyUHJveHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvUm91dGVyUHJveHlcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIEZjbENvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L0ZjbC5jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbywgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBSb3V0aW5nU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdUYXJnZXQgfSBmcm9tIFwic2FwL3VpL2NvcmUvTWFuaWZlc3RcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBIaWRkZW5EcmFmdCB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1RhcmdldFR5cGUgfSBmcm9tIFwiLi4vc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcIi4vZWRpdEZsb3cvZWRpdEZsb3dDb25zdGFudHNcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5cbnR5cGUgUm91dGVJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0cz86IHVua25vd25bXTtcblx0cm91dGVMZXZlbDogbnVtYmVyO1xufTtcbi8qKlxuICoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uIENvbnRyb2xsZXIgZXh0ZW5zaW9ufVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIF9vVmlldyE6IEZFVmlldztcblxuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgbnVsbDtcblxuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQ/OiBGdW5jdGlvbjtcblxuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbiE6IFJvdXRpbmdUYXJnZXQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UgJiYgdGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCkge1xuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5fb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKHRoaXMuX29WaWV3KSBhcyBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD47XG5cdFx0dGhpcy5fb1JvdXRlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyKCk7XG5cdFx0dGhpcy5fb1JvdXRlclByb3h5ID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXG5cdFx0aWYgKCF0aGlzLl9vQXBwQ29tcG9uZW50IHx8ICF0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY29udHJvbGVyIGV4dGVuc2lvbiAnc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVzaW9ucy5JbnRlcm5hbFJvdXRpbmdcIik7XG5cdFx0fVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudCA9PT0gdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdC8vIFRoZSB2aWV3IGlzbid0IGhvc3RlZCBpbiBhIGRlZGljYXRlZCBVSUNvbXBvbmVudCwgYnV0IGRpcmVjdGx5IGluIHRoZSBhcHBcblx0XHRcdC8vIC0tPiBqdXN0IGtlZXAgdGhlIHZpZXdcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBSb3V0aW5nU2VydmljZSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UgPSBvUm91dGluZ1NlcnZpY2U7XG5cdFx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudD8uaXNBKFwic2FwLmZlLmNvcmUuUmV1c2VDb21wb25lbnRcIikgIT09IHRydWUpIHtcblx0XHRcdFx0XHQvLyBSZXVzZSBjb21wb25lbnRzIGNhbiBwb3RlbnRpYWxseSBlbWJlZCBhIHZpZXcgd2l0aCBhIHBhZ2UgY29udHJvbGxlciwgd2Ugd2FudCB0byBhdm9pZCBhdHRhY2hpbmcgdGhlIHJvdXRlIG1hdGNoZWQgZXZlbnQgaW4gdGhpcyBjYXNlXG5cdFx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KSEgPz8ge307XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpOiB2b2lkIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcoX2JpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge31cblxuXHRiZWZvcmVTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCwgX21QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcoYmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0YWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IG9iamVjdCk6IHZvaWQge1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcoYmluZGluZ0NvbnRleHQsIHsgLi4uX21QYXJhbWV0ZXJzLCBkZWZlcnJlZENyZWF0aW9uOiB0cnVlIH0pO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25BZnRlckJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHBhcmFtIGRlbGF5ZWRVc2FnZSBUcnVlIHRvIHJldHVybiBhIGZ1bmN0aW9uIGZvciBleGVjdXRpbmcgdGhlIG5hdmlnYXRpb24sIEZhbHNlIHRvIGV4ZWN1dGUgdGhlIG5hdmlnYXRpb24gaW1tZWRpYXRlbHlcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlVG9UYXJnZXQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0c05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0ZGVsYXllZFVzYWdlPzogdHJ1ZVxuXHQpOiBQcm9taXNlPCgpID0+IHZvaWQ+O1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IGJvb2xlYW5cblx0KTogUHJvbWlzZTwoKCkgPT4gdm9pZCkgfCB2b2lkPiB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIHNSb3V0ZU5hbWUsIG1QYXJhbWV0ZXJNYXBwaW5nLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG8ob0NvbnRleHQsIG51bGwsIG51bGwsIGJQcmVzZXJ2ZUhpc3RvcnksIGRlbGF5ZWRVc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgSGFzaCB3ZSdyZSBuYXZpZ2F0aW5nIHRvLlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcmV0dXJucyBUaGUgSGFzaCB3ZSdyZSBuYXZpZ2F0aW5nIHRvXG5cdCAqL1xuXHRhc3luYyBnZXRIYXNoRm9yTmF2aWdhdGlvbihjb250ZXh0OiBDb250ZXh0LCBuYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9IHRoaXM/Ll9vUGFnZUNvbXBvbmVudD8uZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3QgZGV0YWlsUm91dGUgPSBuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCByb3V0ZU5hbWUgPSBkZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IHBhcmFtZXRlck1hcHBpbmcgPSBkZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRIYXNoRnJvbVJvdXRlKGNvbnRleHQsIHJvdXRlTmFtZSwgcGFyYW1ldGVyTWFwcGluZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0SGFzaEZyb21Sb3V0ZShjb250ZXh0LCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQgcm91dGUuXG5cdCAqIEBwYXJhbSBzVGFyZ2V0Um91dGVOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCByb3V0ZVxuXHQgKiBAcGFyYW0gW29QYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB0byAndHJ1ZScgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsICdmYWxzZScgaWYgdGhlIG5hdmlnYXRpb24gZGlkIG5vdCBoYXBwZW5cblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQ6IENvbnRleHQgfCBPRGF0YUxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmIChjb250ZXh0LmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRpZiAocGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8ubW9kZSA9PT0gXCJBc3luY1wiKSB7XG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGVpdGhlciBjcmVhdGVkIGFzeW5jIChQcm9taXNlKVxuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGFjdGl2YXRlIHRoZSByb3V0ZU1hdGNoU3luY2hybyBvbiB0aGUgUm91dGVyUHJveHkgdG8gYXZvaWQgdGhhdFxuXHRcdFx0XHQvLyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIG5hdmlnYXRlVG9Db250ZXh0IGNvbmZsaWN0cyB3aXRoIHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk7XG5cblx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycy5jcmVhdGVDb250ZXh0UHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKGFzeW5jIChjcmVhdGVkQ29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gb25jZSB0aGUgY29udGV4dCBpcyByZXR1cm5lZCB3ZSBuYXZpZ2F0ZSBpbnRvIGl0XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChjcmVhdGVkQ29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogcGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZSxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IHBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdHBlcnNpc3RPUFNjcm9sbDogcGFyYW1ldGVycy5wZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBwYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsLFxuXHRcdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiBwYXJhbWV0ZXJzLmZvcmNlRm9jdXNcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgIT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0XHQvLyBOYXZpZ2F0ZSB0byBhIGxpc3QgYmluZGluZyBub3QgeWV0IHN1cHBvcnRlZFxuXHRcdFx0XHR0aHJvdyBcIm5hdmlnYXRpb24gdG8gYSBsaXN0IGJpbmRpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWRcIjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMuY2FsbEV4dGVuc2lvbikge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXG5cdFx0XHQvLyBTdG9yaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0IHRvIHVzZSBpdCBpbiBpbnRlcm5hbCByb3V0ZSBuYXZpZ2F0aW9uIGlmIG5lY2Vzc2FyeS5cblx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IG51bGwgPSBjb250ZXh0O1xuXHRcdFx0bGV0IGhpZGRlbkJpbmRpbmc6IE9EYXRhQ29udGV4dEJpbmRpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAocGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9PT0gLTEpIHtcblx0XHRcdFx0Ly8gSWYgd2UncmUgbmF2aWdhdGluZyBiYWNrLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIFwicGFyZW50XCIgY29udGV4dFxuXHRcdFx0XHRjb25zdCBiYWNrUGF0aCA9IHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRQYXRoVG9OYXZpZ2F0ZUJhY2soY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHQvLyBBcyB3ZSBkb24ndCBjYWxsIHRoZSBleHRlbnNpb24gd2hlbiBuYXZpZ2F0aW5nIGJhY2sgdG8gdGhlIExSLCBiYWNrUGF0aCBpcyBuZXZlciBlbXB0eSBzbyB3ZSBjYW4gc2FmZWx5IGNyZWF0ZSBhIGNvbnRleHRcblx0XHRcdFx0aGlkZGVuQmluZGluZyA9IGNvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChiYWNrUGF0aCk7XG5cdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gaGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG92ZXJyaWRlTmF2ID0gYXdhaXQgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZy5vbkJlZm9yZU5hdmlnYXRpb24oeyBiaW5kaW5nQ29udGV4dDogY29udGV4dFRvTmF2aWdhdGUgfSk7XG5cdFx0XHRoaWRkZW5CaW5kaW5nPy5kZXN0cm95KCk7XG5cdFx0XHRpZiAob3ZlcnJpZGVOYXYpIHtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBjb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRwYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0Ly8gSW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIGZyb20gYSB0YWJsZSBpbiBhIExpc3RSZXBvcnQgd2l0aCBkcmFmdCwgdGhlcmUncyBzcGVjaWFsIGhhbmRsaW5nIGZvciBjb2xsYWJvcmF0aW9uIGFuZCB0cmVlIHRhYmxlLlxuXHRcdC8vIFdlIG1heSBub3QgbmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgdGhlIHVzZXIgY2xpY2tlZCBvbi5cblx0XHRpZiAocGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MgJiYgY29udGV4dC5pc0E8Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdFx0aWYgKGlzUGF0aE9uRHJhZnRSb290KGNvbnRleHQuZ2V0UGF0aCgpLCBtZXRhTW9kZWwpKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRGb3JOYXZpZ2F0aW9uID1cblx0XHRcdFx0XHQoYXdhaXQgdGhpcy5nZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpKSA/P1xuXHRcdFx0XHRcdChhd2FpdCB0aGlzLmdldENvbnRleHRGb3JOYXZpZ2F0aW9uRnJvbVRyZWVPckFuYWx5dGljYWxUYWJsZShjb250ZXh0KSk7XG5cblx0XHRcdFx0Ly8gVXNlIGFub3RoZXIgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0aWYgKGNvbnRleHRGb3JOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHRGb3JOYXZpZ2F0aW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIgYW5kIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbi5cblx0ICogQHBhcmFtIG9yaWdpbmFsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29udGV4dCwgbnVsbCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0Q29udGV4dEZvck5hdmlnYXRpb25XaXRoQ29sbGFib3JhdGlvbihcblx0XHRvcmlnaW5hbENvbnRleHQ6IENvbnRleHQsXG5cdFx0cGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCk6IFByb21pc2U8Q29udGV4dCB8IG51bGw+IHtcblx0XHRjb25zdCBtb2RlbCA9IG9yaWdpbmFsQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gSWYgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhIGRyYWZ0IGluc3RhbmNlIGZyb20gdGhlIExSLFxuXHRcdFx0Ly8gV2Ugd2FudCB0byBjaGVjayBpZiB0aGUgZHJhZnQgaW5zdGFuY2UgZXhpc3RzIGZpcnN0LiBPdGhlcndpc2Ugd2UgbmF2aWdhdGUgdG8gdGhlIG9yaWdpbmFsIChkcmFmdCkgdmVyc2lvbi5cblx0XHRcdGNvbnN0IGRyYWZ0T3JBY3RpdmVDb250ZXh0ID0gYXdhaXQgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQob3JpZ2luYWxDb250ZXh0KTtcblxuXHRcdFx0aWYgKGRyYWZ0T3JBY3RpdmVDb250ZXh0ICE9PSBudWxsICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkgIT09IGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHQvLyBOb3RpZnkgdGhlIHVzZXIgdGhhdCB3ZSBoYXZlIG5hdmlnYXRlZCB0byB0aGUgc2F2ZWQgaW5zdGFuY2Vcblx0XHRcdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSkpO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLnJlZGlyZWN0ZWRUb05vbkRyYWZ0ID1cblx0XHRcdFx0XHQob2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZSBhcyB1bmtub3duIGFzIHN0cmluZykgPz9cblx0XHRcdFx0XHRvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUubmFtZTtcblxuXHRcdFx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIEZDTDogcmVwbGFjZSB0aGUgY29udGV4dCBpbiB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dFRvUmVwbGFjZVdpdGggPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0b3JpZ2luYWxDb250ZXh0LnJlcGxhY2VXaXRoKGNvbnRleHRUb1JlcGxhY2VXaXRoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBGdWxsc2NyZWVuOiB0cmlnZ2VyIGEgcmVmcmVzaCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVc2UgdGhlIHNhdmVkIGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBkcmFmdE9yQWN0aXZlQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbnRleHRcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgZnJvbSB0aGUgTFIgYW5kIHdlJ3JlIGluIGEgVHJlZSBvciBBbmFseXRpY2FsIHRhYmxlLlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUob3JpZ2luYWxDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IHBhcmVudEJpbmRpbmcgPSBvcmlnaW5hbENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGlmICghcGFyZW50QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IHBhcmVudEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhc1xuXHRcdFx0fCB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZzsgZ3JvdXA/OiBvYmplY3Q7IGFnZ3JlZ2F0ZT86IG9iamVjdCB9XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRpZiAoIWFnZ3JlZ2F0aW9uPy5oaWVyYXJjaHlRdWFsaWZpZXIgJiYgIWFnZ3JlZ2F0aW9uPy5ncm91cCAmJiAhYWdncmVnYXRpb24/LmFnZ3JlZ2F0ZSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBoaWVyYXJjaGljYWwvYW5hbHl0aWNhbCBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gSWYgd2UncmUgaW4gYSBUcmVlL0FuYWx5dGljYWwgdGFibGUsIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBpbnN0YW5jZSB0aGF0IGhhcyBhIGRyYWZ0LFxuXHRcdFx0Ly8gLS0+IFdlIHRyeSB0byBuYXZpZ2F0ZSB0byB0aGUgZHJhZnQgaW5zdGFuY2UgKGlmIGl0IHN0aWxsIGV4aXN0cylcblx0XHRcdGNvbnN0IGRyYWZ0T3JBY3RpdmVDb250ZXh0ID0gYXdhaXQgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQob3JpZ2luYWxDb250ZXh0KTtcblxuXHRcdFx0aWYgKGRyYWZ0T3JBY3RpdmVDb250ZXh0ICE9PSBudWxsICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkgIT09IGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHQvLyBVc2UgdGhlIGRyYWZ0IGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBkcmFmdE9yQWN0aXZlQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbnRleHRcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIGZyb20gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSBbcGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KGNvbnRleHQ6IENvbnRleHQsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGZvcndhcmRzIHRvIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiBoaXN0b3J5IGlmIHRoZSBjdXJyZW50IGhhc2ggY29ycmVzcG9uZHMgdG8gYSB0cmFuc2llbnQgc3RhdGUuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk6IHZvaWQge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKTtcblxuXHRcdC8vIGlmIHRyaWdnZXJlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvICguLi4pLCB3ZSBuZWVkIHRvIG5hdmlnYXRlIGJhY2tcblx0XHRpZiAoc0hhc2guaW5jbHVkZXMoXCIoLi4uKVwiKSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdkJhY2soKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGxheXMgYW4gZXJyb3IgKGlsbHVzdHJhdGVkIG1lc3NhZ2UpIGluIHRoZSBwYWdlLlxuXHQgKiBAcGFyYW0gc0Vycm9yTWVzc2FnZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBwcm9taXNlXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogc3RyaW5nLCBtUGFyYW1ldGVyczogTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRpZiAodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWNyZWF0ZVwiKSB8fCB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluY2x1ZGVzKFwiaS1hY3Rpb249YXV0b0NyZWF0ZVwiKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZUb0hhc2godGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldERlZmF1bHRDcmVhdGVIYXNoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5RXJyb3JQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzLCB0aGlzLmdldEZDTExldmVsKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdGF0ZSBpcyBpbXBhY3RlZCBieSB0aGUgY29udGV4dFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdF9pc1ZpZXdQYXJ0T2ZSb3V0ZShyb3V0ZUluZm9ybWF0aW9uPzogUm91dGVJbmZvcm1hdGlvbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8ICFhVGFyZ2V0cy5pbmNsdWRlcyh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udGFyZ2V0TmFtZSkpIHtcblx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBoYXMgYSB2aWV3IGxldmVsIGdyZWF0ZXIgdGhhbiB0aGUgcm91dGUgbGV2ZWwsIGl0IG1lYW5zIHRoaXMgdmlldyBjb21lcyBcImFmdGVyXCIgdGhlIHJvdXRlXG5cdFx0XHQvLyBpbiB0ZXJtcyBvZiBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gSW4gc3VjaCBjYXNlLCB3ZSByZW1vdmUgaXRzIGJpbmRpbmcgY29udGV4dCwgdG8gYXZvaWQgdGhpcyB2aWV3IHRvIGhhdmUgZGF0YSBpZiB3ZSBuYXZpZ2F0ZSB0byBpdCBsYXRlciBvblxuXHRcdFx0Ly8gVGhpcyBpcyBkb25lIGluIGEgdGltZW91dCB0byBhbGxvdyBmb3IgZm9jdXNvdXQgZXZlbnRzIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgcHJvcGVybHkgaW4gY29sbGFib3JhdGl2ZSBkcmFmdFxuXHRcdFx0aWYgKCh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udmlld0xldmVsID8/IDApID49IChyb3V0ZUluZm9ybWF0aW9uPy5yb3V0ZUxldmVsID8/IDApKSB7XG5cdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hZGRCaW5kaW5nQ2xlYW51cFByb21pc2UoXG5cdFx0XHRcdFx0bmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSByb3V0ZSBoYXMgbGV2ZWwgMCAtLT4gd2UgbmVlZCB0byBsZWF2ZSB0aGUgY29sbGFib3JhdGlvbiBzZXNzaW9uIGFzIG5vIE9QIGlzIGRpc3BsYXllZFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpOyAvLyBUaGlzIGFsc28gY2FsbCBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9idWlsZEJpbmRpbmdQYXRoKFxuXHRcdHJvdXRlQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+LFxuXHRcdGJpbmRpbmdQYXR0ZXJuOiBzdHJpbmcsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mb1xuXHQpOiB7IHBhdGg6IHN0cmluZzsgZGVmZXJyZWQ6IGJvb2xlYW4gfSB7XG5cdFx0bGV0IHBhdGggPSBiaW5kaW5nUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0bGV0IGRlZmVycmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gcm91dGVBcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IHJvdXRlQXJndW1lbnRzW3NLZXldO1xuXG5cdFx0XHRpZiAodHlwZW9mIHNWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBiaW5kaW5nUGF0dGVybi5pbmNsdWRlcyhgeyR7c0tleX19YCkpIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmICgocm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik/LltcImktYWN0aW9uXCJdPy5pbmNsdWRlcyhcImNyZWF0ZVwiKSkge1xuXHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgcGF0aCBpcyBhbHdheXMgYWJzb2x1dGVcblx0XHRpZiAocGF0aCAmJiBwYXRoWzBdICE9PSBcIi9cIikge1xuXHRcdFx0cGF0aCA9IGAvJHtwYXRofWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgcGF0aCwgZGVmZXJyZWQgfTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChcblx0XHRvRXZlbnQ6IEV2ZW50PHtcblx0XHRcdHJvdXRlSW5mb3JtYXRpb24/OiBSb3V0ZUluZm9ybWF0aW9uO1xuXHRcdFx0cm91dGVQYXR0ZXJuOiBzdHJpbmc7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbzogUm91dGluZ05hdmlnYXRpb25JbmZvO1xuXHRcdFx0YXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+O1xuXHRcdH0+XG5cdCk6IHZvaWQge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzIChpLmUuIGlzIGEgdGFyZ2V0IGZvciB0aGUgY3VycmVudCByb3V0ZSkuXG5cdFx0Ly8gSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGJpbmQgaXQgLS0+IHJldHVyblxuXHRcdGlmICghdGhpcy5faXNWaWV3UGFydE9mUm91dGUob0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IGJpbmRpbmdQYXR0ZXJuO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKCk7XG5cdFx0fVxuXHRcdGJpbmRpbmdQYXR0ZXJuID0gYmluZGluZ1BhdHRlcm4gPz8gdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKGJpbmRpbmdQYXR0ZXJuID09PSBudWxsIHx8IGJpbmRpbmdQYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpLmFyZ3VtZW50cztcblx0XHRjb25zdCBvTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmF2aWdhdGlvbkluZm9cIik7XG5cdFx0Y29uc3QgeyBwYXRoLCBkZWZlcnJlZCB9ID0gdGhpcy5fYnVpbGRCaW5kaW5nUGF0aChtQXJndW1lbnRzLCBiaW5kaW5nUGF0dGVybiwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblxuXHRcdHRoaXMub25Sb3V0ZU1hdGNoZWQoKTtcblxuXHRcdGxldCBiaW5kUHJvbWlzZTtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpO1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kRGVmZXJyZWQocGF0aCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbiAmJlxuXHRcdFx0KHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1lZGl0XCIpIHx8ICh0aGlzLl9vUGFnZUNvbXBvbmVudD8uaXNPcGVuSW5FZGl0TW9kZT8uKCkgPz8gZmFsc2UpKVxuXHRcdCkge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kUGFnZUZvckVkaXQocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlKHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cblx0XHRiaW5kUHJvbWlzZVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGR1cmluZyBwYWdlIGJpbmRpbmcgXCIgKyBlcnJvci50b1N0cmluZygpKTtcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS51cGRhdGVVSVN0YXRlRm9yVmlldyh0aGlzLl9vVmlldywgdGhpcy5nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIF9iaW5kRGVmZXJyZWQodGFyZ2V0UGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsLCB7IGVkaXRhYmxlOiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAoIW5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIHx8IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzLm1vZGUgPT09IFwiRGVmZXJyZWRcIikge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5kYXRhLFxuXHRcdFx0XHRcdCEhbmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcGFnZSBmcm9tIGEgcGF0aCwgaWYgdGhlIGFwcCBpcyBzdGFydGVkIHdpdGggdGhlIHByZWZlcnJlZCBtb2RlIGVkaXQuXG5cdCAqXG5cdCAqIElmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhbiBhY3RpdmUgZW50aXR5LCBpdCBpcyBkaXJlY3RseSBjb252ZXJ0ZWQgdG8gZHJhZnQgdXNpbmcgdGhlIEVkaXRGbG93IGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aFxuXHQgKiBAcGFyYW0gbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIGhhcyBiZWVuIHNldCBvbiB0aGUgcGFnZVxuXHQgKi9cblx0YXN5bmMgX2JpbmRQYWdlRm9yRWRpdCh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkIHwgQ29udGV4dD4ge1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZWNobmljYWxQYXRoOiBzdHJpbmcgPSBhd2FpdCByZXNvbHZlUGF0aCh0YXJnZXRQYXRoLCBtb2RlbCwgdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLCB0aGlzLl9vUm91dGVyKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Ly8gY2hlY2sgZm9yIHN0aWNreSAmIHN0aWNreSBlZGl0IHNlc3Npb25cblx0XHRcdGNvbnN0IGlzU3RpY2t5RWRpdE1vZGUgPSBDb21tb25VdGlscy5pc1N0aWNreUVkaXRNb2RlKHRoaXMuYmFzZS5nZXRWaWV3KCkpO1xuXHRcdFx0Y29uc3QgaXNTdGlja3kgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQobWV0YU1vZGVsKTtcblx0XHRcdGlmICh0ZWNobmljYWxQYXRoLmluY2x1ZGVzKFwiSXNBY3RpdmVFbnRpdHk9dHJ1ZVwiKSB8fCAoaXNTdGlja3kgJiYgIWlzU3RpY2t5RWRpdE1vZGUpKSB7XG5cdFx0XHRcdC8vIGNyZWF0ZSBjb250ZXh0IG9yIHVzZSB0aGUgb25lIHRoZSB1c2VyIGNsaWNrZWQgb25cblx0XHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dCA9XG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dD8uZ2V0UGF0aCgpID09PSB0ZWNobmljYWxQYXRoXG5cdFx0XHRcdFx0XHQ/IG5hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHRcblx0XHRcdFx0XHRcdDogdGhpcy5fY3JlYXRlQ29udGV4dCh0ZWNobmljYWxQYXRoLCBtb2RlbCk7XG5cblx0XHRcdFx0Ly8gZWRpdCBkb2N1bWVudFxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93LmVkaXREb2N1bWVudChhY3RpdmVDb250ZXh0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9iaW5kUGFnZVRvUGF0aCh0ZWNobmljYWxQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdGRlc2NyaXB0aW9uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBvbiB0aGUgcGFnZSBpcyBzZXRcblx0ICovXG5cdGFzeW5jIF9iaW5kUGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IFwiXCIpIHtcblx0XHRcdC8vIFRoZSBwYWdlIGJpbmRpbmcgaXMgZG9uZSBhc3luY2hyb25vdXNseSwgdG8gbWFrZSBzdXJlIF9vblJvdXRlTWF0Y2hlZCBpcyBjYWxsZWQgZm9yIGFsbCB0YXJnZXRzIGJlZm9yZSwgYW5kIHRoZSBiaW5kaW5nIGNsZWFudXAgcHJvbWlzZXMgYXJlIHByb3Blcmx5IHN0b3JlZCBpbiB0aGUgcm91dGluZyBzZXJ2aWNlLlxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdGVjaG5pY2FsUGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCB0aGlzLl9vUm91dGluZ1NlcnZpY2UsIHRoaXMuX29Sb3V0ZXIpO1xuXHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgodGVjaG5pY2FsUGF0aCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHt9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0ICh0aGlzIGlzIGEgcGF0aCBpbiB0aGUgbW9kZWwsIHNvIG9ubHkgdGVjaG5pY2FsIGtleXMgYXJlIGFsbG93ZWQpLlxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9QYXRoKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiB2b2lkIHtcblx0XHRjb25zdCBvQ3VycmVudENvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0c0N1cnJlbnRQYXRoID0gb0N1cnJlbnRDb250ZXh0ICYmIG9DdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvVXNlQ29udGV4dCA9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0IGFzIENvbnRleHQgfCB1bmRlZmluZWQgfCBudWxsO1xuXG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRsZXQgc2hvdWxkUmVmcmVzaENvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0Ly8gV2UgYWxyZWFkeSBoYXZlIHRoZSBjb250ZXh0IHRvIGJlIHVzZWQsIGFuZCBpdCdzIG5vdCB0aGUgY3VycmVudCBvbmVcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0c2hvdWxkUmVmcmVzaENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoc2hvdWxkUmVmcmVzaENvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIG9Vc2VDb250ZXh0LCBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0R3JvdXBJZCgpKVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmVmcmVzaCBjb250ZXh0OiAke2Vycn1gKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IGJ1dCBhbiBlZGl0ZmxvdyBhY3Rpb24gaGFwcGVuZWQgKGUuZy4gQ2FuY2VsRG9jdW1lbnQgaW4gc3RpY2t5IG1vZGUpXG5cdFx0XHRcdC8vIC0tPiBXZSBuZWVkIHRvIGNhbGwgb25CZWZvcmUvQWZ0ZXJCaW5kaW5nIHRvIHJlZnJlc2ggdGhlIG9iamVjdCBwYWdlIHByb3Blcmx5XG5cdFx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0XHRsaXN0QmluZGluZzogb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLFxuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIGl0cyBwYXRoXG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dCh0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLlJlc3RvcmVIaXN0b3J5ICYmXG5cdFx0XHRFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpICYmXG5cdFx0XHQhb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0b0N1cnJlbnRDb250ZXh0XG5cdFx0KSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQgJiYgIXRoaXMuX29BcHBDb21wb25lbnQuaXNFeGl0aW5nICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBiaW5kaW5nIGNvbnRleHQgaXMgcGFydCBvZiBhIGNvbGxhYm9yYXRpdmUgZHJhZnQsIHdlIGNhbGwgYWRkU2VsZiBiZWZvcmUgYmluZGluZyB0aGUgcGFnZSBzbyB0aGF0IHRoZSBTaGFyZSBhY3Rpb25cblx0XHQvLyBpcyBwYXJ0IG9mIHRoZSBzYW1lIGJhdGNoIGFzIHRoZSBwYWdlIGxvYWQsIGFuZCB3ZSBjYW4gZ2V0IHRoZSBsaXN0IG9mIHBhcnRpY2lwYXRpbmcgdXNlcnMgbGF0ZXJcblx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQob01vZGVsLmdldE1ldGFNb2RlbCgpKSAmJiBvQ29udGV4dC5nZXRQYXRoKCkuaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eT1mYWxzZVwiKSkge1xuXHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5leGVjdXRlU2hhcmVBY3Rpb24ob0NvbnRleHQpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRyZWFzb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7IHJlZGlyZWN0ZWRUb05vbkRyYWZ0OiBvTmF2aWdhdGlvblBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0IH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKTogQ29udGV4dCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0aXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBCaW5kQ29udGV4dFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0aWYgKHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdy5pc0lubGluZUVkaXRQb3NzaWJsZSgpKSB7XG5cdFx0XHQvLyBpZiBpbmxpbmUgZWRpdCBpcyBlbmFibGVkIG9uIHRoZSBwYWdlIGFuZCB0aGlzIGlzIHRoZSBhY3RpdmUgZW50aXR5LCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZ3JvdXAgaWQgdG8gaW5saW5lXG5cdFx0XHRtUGFyYW1ldGVycy4kJHVwZGF0ZUdyb3VwSWQgPSBzUGF0aC5pbmNsdWRlcyhcIklzQWN0aXZlRW50aXR5PXRydWVcIikgPyBDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQgOiBcIiRhdXRvXCI7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpIGFuZCBzZW1hbnRpYyBrZXlzIChmb3IgY3JlYXRpbmcgdGhlIHNlbWFudGljIFVSTClcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdCA9IHNDb250ZXh0UGF0aFxuXHRcdFx0PyBvTWV0YU1vZGVsLmdldENvbnRleHQoc0NvbnRleHRQYXRoKSAmJiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCkpXG5cdFx0XHQ6IG51bGw7XG5cdFx0Y29uc3QgYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyA9IE1vZGVsSGVscGVyLmdldEFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMoXG5cdFx0XHRkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVR5cGUgYXMgRW50aXR5VHlwZSxcblx0XHRcdGRhdGFNb2RlbE9iamVjdD8udGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldFxuXHRcdCk7XG5cdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gb0RyYWZ0Um9vdFxuXHRcdFx0PyBkYXRhTW9kZWxPYmplY3Q/LnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TZW1hbnRpY0tleT8ubWFwKChrZXkpID0+IGtleS52YWx1ZSkgPz8gW11cblx0XHRcdDogW107XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb1JlcXVlc3QgPSBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdLmNvbmNhdChzZW1hbnRpY0tleXMpO1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHByb3BlcnRpZXNUb1JlcXVlc3QpO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhvRHJhZnRSb290ID8gcHJvcGVydGllc1RvUmVxdWVzdC5jb25jYXQoW1wiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl0pIDogcHJvcGVydGllc1RvUmVxdWVzdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9TZWxlY3Q6IHN0cmluZ1tdID0gW107XG5cdFx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaChcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdHByb3BlcnRpZXNUb1NlbGVjdC5wdXNoKC4uLnNlbWFudGljS2V5cyk7XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0aWVzVG9TZWxlY3QucHVzaCguLi5hbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzKTtcblxuXHRcdFx0aWYgKGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkICYmIG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0cHJvcGVydGllc1RvU2VsZWN0LnB1c2goXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByb3BlcnRpZXNUb1NlbGVjdC5sZW5ndGgpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHByb3BlcnRpZXNUb1NlbGVjdC5qb2luKFwiLFwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0Y29uc3Qgb1ByZXZpb3VzQmluZGluZyA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9QcmV2aW91c0JpbmRpbmcpIHtcblx0XHRcdFx0XHRvTW9kZWwucmVzZXRDaGFuZ2VzKG9QcmV2aW91c0JpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpKTtcblx0XHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0XHR0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIuaG9sZE1lc3NhZ2VzRm9yQ29udHJvbCh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLm9uRGF0YVJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBvbkRhdGFSZWNlaXZlZChvRXZlbnQ6IEV2ZW50PHsgZXJyb3I6IHsgc3RhdHVzPzogbnVtYmVyOyBjYXVzZT86IHsgc3RhdHVzPzogbnVtYmVyIH07IG1lc3NhZ2U/OiBzdHJpbmcgfSB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGVycm9yID0gb0V2ZW50Py5nZXRQYXJhbWV0ZXIoXCJlcnJvclwiKTtcblx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLl9vVmlldykpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cblx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdC8vIFRPRE86IGluIGNhc2Ugb2YgNDA0IHRoZSB0ZXh0IHNoYWxsIGJlIGRpZmZlcmVudFxuXHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0XHRsZXQgbVBhcmFtczogU2hvd01lc3NhZ2VzUGFyYW1ldGVycyA9IHt9O1xuXHRcdFx0Y29uc3QgZXJyb3JTdGF0dXMgPSBlcnJvci5zdGF0dXMgPz8gZXJyb3IuY2F1c2U/LnN0YXR1cztcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdGlmIChlcnJvclN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoZXJyb3JTdGF0dXMgPT09IDQwMCkge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JfREVTQ1JJUFRJT05cIiksXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogZXJyb3I/Lm1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0bVBhcmFtcy5jb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyhtUGFyYW1zKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyLnJlbGVhc2VIb2xkQnlDb250cm9sKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgc2lkZSBlZmZlY3RzIG9uIGEgYmluZGluZyBjb250ZXh0IHRvIFwicmVmcmVzaFwiIGl0LlxuXHQgKiBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgb25jZSBwcm92aWRlZCBieSB0aGUgbW9kZWxcblx0ICogYSByZWZyZXNoIG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3Qgd29yayBpbiBjYXNlIGEgY3JlYXRpb24gcm93IHdpdGggYSB0cmFuc2llbnQgY29udGV4dCBpc1xuXHQgKiB1c2VkLiBhbHNvIGEgcmVxdWVzdFNpZGVFZmZlY3RzIHdpdGggYW4gZW1wdHkgcGF0aCB3b3VsZCBmYWlsIGR1ZSB0byB0aGUgdHJhbnNpZW50IGNvbnRleHRcblx0ICogdGhlcmVmb3JlIHdlIGdldCBhbGwgZGVwZW5kZW50IGJpbmRpbmdzICh2aWEgcHJpdmF0ZSBtb2RlbCBtZXRob2QpIHRvIGRldGVybWluZSBhbGwgcGF0aHMgYW5kIHRoZW5cblx0ICogcmVxdWVzdCB0aGVtLlxuXHQgKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqL1xuXHRfcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9CaW5kaW5nQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogQmluZGluZyk6IHZvaWQge1xuXHRcdFx0bGV0IGFEZXBlbmRlbnRCaW5kaW5ncztcblx0XHRcdGNvbnN0IHNSZWxhdGl2ZVBhdGggPSAob0JpbmRpbmcuZ2V0Q29udGV4dCgpPy5nZXRQYXRoKCkgPz8gXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBgJHtzUmVsYXRpdmVQYXRoLnNsaWNlKDEpfS9gIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0E8T0RhdGFDb250ZXh0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBvZiBhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdQYXRocyhpdGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKCFhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQTxPRGF0YVByb3BlcnR5QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKCFhUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHQvL2FsbCB0aGlzIGxvZ2ljIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBTaWRlRWZmZWN0cyByZXF1ZXN0IGZvciBhbiBlbXB0eSBwYXRoIChyZWZyZXNoIGV2ZXJ5dGhpbmcpLCBhZnRlciB0ZXN0aW5nIHRyYW5zaWVudCBjb250ZXh0c1xuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gb1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucmVkdWNlKCh0YXJnZXRzOiBzdHJpbmdbXSwgdGFyZ2V0UHJvcGVydHkpID0+IHtcblx0XHRcdGlmICh0YXJnZXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IHRhcmdldFByb3BlcnR5LmluZGV4T2YoXCIvXCIpO1xuXHRcdFx0XHR0YXJnZXRzLnB1c2goaW5kZXggPiAwID8gdGFyZ2V0UHJvcGVydHkuc2xpY2UoMCwgaW5kZXgpIDogdGFyZ2V0UHJvcGVydHkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhcmdldHM7XG5cdFx0fSwgW10pO1xuXHRcdC8vIE9EYXRhIG1vZGVsIHdpbGwgdGFrZSBjYXJlIG9mIGR1cGxpY2F0ZXNcblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbLi4ub1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLCAuLi5vU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllc10sIG9CaW5kaW5nQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdF9nZXRCaW5kaW5nQ29udGV4dCgpOiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsKTogdm9pZCB7XG5cdFx0bGV0IG9QcmV2aW91c0NvbnRleHQsIG9UYXJnZXRDb250cm9sO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dD8uaXNLZWVwQWxpdmUoKSAmJiBvUHJldmlvdXNDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKG9QcmV2aW91c0NvbnRleHQsIGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKiBAcmV0dXJucyBUaGUgbGV2ZWxcblx0ICovXG5cdGdldEZDTExldmVsKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YktlZXBBbGl2ZTogYm9vbGVhbixcblx0XHRmbkJlZm9yZURlc3Ryb3k/OiBQYXJhbWV0ZXJzPENvbnRleHRbXCJzZXRLZWVwQWxpdmVcIl0+WzFdLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzTWV0YVBhdGgpO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sXG5cdFx0cGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVyc1xuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0XG5cdFx0XHQ/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSFcblx0XHRcdDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IGxheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0YXN5bmMgY2xvc2VDb2x1bW4oKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUsXG5cdFx0XHRsYXlvdXQ6IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Nsb3NlQ29sdW1uXCIpLFxuXHRcdFx0Y2FsbEV4dGVuc2lvbjogdHJ1ZVxuXHRcdH07XG5cblx0XHRjb25zdCBpc0RvY3VtZW50TW9kaWZpZWQgPVxuXHRcdFx0ISF0aGlzLmdldFZpZXcoKT8uZ2V0TW9kZWwoXCJ1aVwiKT8uZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkKSB8fCAhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5fb0FwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKT8uSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQpXG5cdFx0XHQuZW5hYmxlZDtcblxuXHRcdGlmICghaXNEb2N1bWVudE1vZGlmaWVkICYmIGlzSGlkZGVuRHJhZnRFbmFibGVkKSB7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlLFxuXHRcdFx0XHRza2lwQmFja05hdmlnYXRpb246IHRydWVcblx0XHRcdH07XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlcyB0cmFuc2l0aW9uIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgY29udGV4dFxuXHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVUcmFuc2lzdGlvbk1lc3NhZ2VGb3JDb250ZXh0KG9Db250ZXh0KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFJvdXRpbmc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7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