@sapui5/sap.fe.core 1.130.1 → 1.131.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +3 -3
  4. package/src/sap/fe/core/ActionRuntime.ts +1 -1
  5. package/src/sap/fe/core/AppComponent.js +4 -11
  6. package/src/sap/fe/core/AppComponent.ts +3 -12
  7. package/src/sap/fe/core/CommonUtils.js +13 -13
  8. package/src/sap/fe/core/CommonUtils.ts +16 -16
  9. package/src/sap/fe/core/TemplateComponent.js +4 -1
  10. package/src/sap/fe/core/TemplateComponent.ts +2 -0
  11. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +248 -0
  12. package/src/sap/fe/core/buildingBlocks/{BuildingBlockBase.ts → BuildingBlock.ts} +73 -132
  13. package/src/sap/fe/core/controllerextensions/EditFlow.js +17 -7
  14. package/src/sap/fe/core/controllerextensions/EditFlow.ts +17 -6
  15. package/src/sap/fe/core/controllerextensions/InternalRouting.js +5 -2
  16. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +4 -0
  17. package/src/sap/fe/core/controllerextensions/KPIManagement.js +47 -19
  18. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +57 -19
  19. package/src/sap/fe/core/controllerextensions/PageReady.js +20 -18
  20. package/src/sap/fe/core/controllerextensions/PageReady.ts +19 -18
  21. package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -1
  22. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -0
  23. package/src/sap/fe/core/controllerextensions/Routing.js +2 -2
  24. package/src/sap/fe/core/controllerextensions/Routing.ts +1 -1
  25. package/src/sap/fe/core/controllerextensions/Share.js +3 -2
  26. package/src/sap/fe/core/controllerextensions/Share.ts +2 -1
  27. package/src/sap/fe/core/controllerextensions/ViewState.js +5 -1
  28. package/src/sap/fe/core/controllerextensions/ViewState.ts +4 -0
  29. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -2
  30. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +0 -1
  31. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +4 -4
  32. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +3 -0
  33. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -4
  34. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +2 -2
  35. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +16 -19
  36. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +29 -28
  37. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +5 -5
  38. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +4 -1
  39. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +77 -35
  40. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +88 -43
  41. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +3 -7
  42. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +0 -4
  43. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +70 -0
  44. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.ts +99 -0
  45. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  46. package/src/sap/fe/core/controls/FormElementWrapper.ts +1 -1
  47. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +14 -2
  48. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +20 -6
  49. package/src/sap/fe/core/converters/ConverterContext.js +10 -3
  50. package/src/sap/fe/core/converters/ConverterContext.ts +8 -1
  51. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  52. package/src/sap/fe/core/converters/ManifestSettings.ts +2 -1
  53. package/src/sap/fe/core/converters/controls/Common/Action.js +2 -2
  54. package/src/sap/fe/core/converters/controls/Common/Action.ts +5 -1
  55. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  56. package/src/sap/fe/core/converters/controls/Common/Chart.ts +10 -5
  57. package/src/sap/fe/core/converters/controls/Common/KPI.js +26 -9
  58. package/src/sap/fe/core/converters/controls/Common/KPI.ts +48 -5
  59. package/src/sap/fe/core/converters/controls/Common/Table.js +43 -46
  60. package/src/sap/fe/core/converters/controls/Common/Table.ts +68 -57
  61. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +2 -1
  62. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +1 -0
  63. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +2 -3
  64. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +2 -2
  65. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -8
  66. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +10 -6
  67. package/src/sap/fe/core/fpm/manifest.json +1 -1
  68. package/src/sap/fe/core/helpers/AppStartupHelper.js +7 -9
  69. package/src/sap/fe/core/helpers/AppStartupHelper.ts +6 -13
  70. package/src/sap/fe/core/helpers/BindingHelper.js +2 -2
  71. package/src/sap/fe/core/helpers/BindingHelper.ts +1 -1
  72. package/src/sap/fe/core/helpers/DeleteHelper.js +3 -2
  73. package/src/sap/fe/core/helpers/DeleteHelper.ts +2 -1
  74. package/src/sap/fe/core/helpers/MetaPath.js +16 -2
  75. package/src/sap/fe/core/helpers/MetaPath.ts +19 -1
  76. package/src/sap/fe/core/helpers/RecommendationHelper.js +2 -2
  77. package/src/sap/fe/core/helpers/RecommendationHelper.ts +1 -1
  78. package/src/sap/fe/core/helpers/ResourceModelHelper.js +8 -3
  79. package/src/sap/fe/core/helpers/ResourceModelHelper.ts +9 -2
  80. package/src/sap/fe/core/library.js +5 -2
  81. package/src/sap/fe/core/library.support.js +3 -3
  82. package/src/sap/fe/core/library.support.ts +2 -1
  83. package/src/sap/fe/core/library.ts +4 -0
  84. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +17 -8
  85. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +16 -14
  86. package/src/sap/fe/core/messagebundle.properties +6 -0
  87. package/src/sap/fe/core/messagebundle_ar.properties +11 -3
  88. package/src/sap/fe/core/messagebundle_bg.properties +14 -6
  89. package/src/sap/fe/core/messagebundle_ca.properties +10 -2
  90. package/src/sap/fe/core/messagebundle_cnr.properties +10 -2
  91. package/src/sap/fe/core/messagebundle_cs.properties +10 -2
  92. package/src/sap/fe/core/messagebundle_cy.properties +10 -2
  93. package/src/sap/fe/core/messagebundle_da.properties +10 -2
  94. package/src/sap/fe/core/messagebundle_de.properties +12 -4
  95. package/src/sap/fe/core/messagebundle_el.properties +10 -2
  96. package/src/sap/fe/core/messagebundle_en.properties +9 -1
  97. package/src/sap/fe/core/messagebundle_en_GB.properties +10 -2
  98. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +10 -2
  99. package/src/sap/fe/core/messagebundle_es.properties +12 -4
  100. package/src/sap/fe/core/messagebundle_es_MX.properties +10 -2
  101. package/src/sap/fe/core/messagebundle_et.properties +10 -2
  102. package/src/sap/fe/core/messagebundle_fi.properties +10 -2
  103. package/src/sap/fe/core/messagebundle_fr.properties +10 -2
  104. package/src/sap/fe/core/messagebundle_fr_CA.properties +11 -3
  105. package/src/sap/fe/core/messagebundle_hi.properties +10 -2
  106. package/src/sap/fe/core/messagebundle_hr.properties +11 -3
  107. package/src/sap/fe/core/messagebundle_hu.properties +11 -3
  108. package/src/sap/fe/core/messagebundle_id.properties +10 -2
  109. package/src/sap/fe/core/messagebundle_it.properties +10 -2
  110. package/src/sap/fe/core/messagebundle_iw.properties +11 -3
  111. package/src/sap/fe/core/messagebundle_ja.properties +10 -2
  112. package/src/sap/fe/core/messagebundle_kk.properties +10 -2
  113. package/src/sap/fe/core/messagebundle_ko.properties +10 -2
  114. package/src/sap/fe/core/messagebundle_lt.properties +10 -2
  115. package/src/sap/fe/core/messagebundle_lv.properties +10 -2
  116. package/src/sap/fe/core/messagebundle_mk.properties +10 -2
  117. package/src/sap/fe/core/messagebundle_ms.properties +10 -2
  118. package/src/sap/fe/core/messagebundle_nl.properties +12 -4
  119. package/src/sap/fe/core/messagebundle_no.properties +11 -3
  120. package/src/sap/fe/core/messagebundle_pl.properties +10 -2
  121. package/src/sap/fe/core/messagebundle_pt.properties +10 -2
  122. package/src/sap/fe/core/messagebundle_pt_PT.properties +10 -2
  123. package/src/sap/fe/core/messagebundle_ro.properties +10 -2
  124. package/src/sap/fe/core/messagebundle_ru.properties +10 -2
  125. package/src/sap/fe/core/messagebundle_sh.properties +10 -2
  126. package/src/sap/fe/core/messagebundle_sk.properties +10 -2
  127. package/src/sap/fe/core/messagebundle_sl.properties +10 -2
  128. package/src/sap/fe/core/messagebundle_sr.properties +10 -2
  129. package/src/sap/fe/core/messagebundle_sv.properties +10 -2
  130. package/src/sap/fe/core/messagebundle_th.properties +12 -4
  131. package/src/sap/fe/core/messagebundle_tr.properties +12 -4
  132. package/src/sap/fe/core/messagebundle_uk.properties +10 -2
  133. package/src/sap/fe/core/messagebundle_vi.properties +11 -3
  134. package/src/sap/fe/core/messagebundle_zh_CN.properties +10 -2
  135. package/src/sap/fe/core/messagebundle_zh_TW.properties +10 -2
  136. package/src/sap/fe/core/operationsHelper.js +4 -4
  137. package/src/sap/fe/core/operationsHelper.ts +4 -4
  138. package/src/sap/fe/core/rootView/Fcl.controller.js +2 -2
  139. package/src/sap/fe/core/rootView/Fcl.controller.ts +4 -1
  140. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +5 -5
  141. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -3
  142. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -28
  143. package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -35
  144. package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -4
  145. package/src/sap/fe/core/services/RoutingServiceFactory.ts +1 -3
  146. package/src/sap/fe/core/services/ShellServicesFactory.js +2 -13
  147. package/src/sap/fe/core/services/ShellServicesFactory.ts +1 -17
  148. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +5 -3
  149. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +3 -1
  150. package/src/sap/fe/core/templating/DataFieldFormatters.js +13 -6
  151. package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -6
  152. package/src/sap/fe/core/templating/UIFormatters.js +3 -3
  153. package/src/sap/fe/core/templating/UIFormatters.ts +4 -3
  154. package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +0 -326
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/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"], function (Log, ClassSupport, CommonUtils, BusyLocker, draft, ContextPathHelper, NavigationReason, EditState, ModelHelper, Component, Library, ControllerExtension, OverrideExecution, MetaModelConverter) {
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", "./messageHandler/messageHandling"], function (Log, ClassSupport, CommonUtils, BusyLocker, draft, ContextPathHelper, NavigationReason, EditState, ModelHelper, Component, Library, ControllerExtension, OverrideExecution, MetaModelConverter, 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;
@@ -963,9 +963,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
963
963
  } else {
964
964
  this.navigateBackFromContext(oContext, navigationParameters);
965
965
  }
966
+
967
+ // Removes transition message for the specified context
968
+ messageHandling.removeTransistionMessageForContext(oContext);
966
969
  };
967
970
  return InternalRouting;
968
971
  }(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);
969
972
  return InternalRouting;
970
973
  }, false);
971
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJfZGVjNCIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM1IiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiQmVmb3JlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiX2luaGVyaXRzTG9vc2UiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0SGFzaEZvck5hdmlnYXRpb24iLCJjb250ZXh0IiwibmF2aWdhdGlvblRhcmdldE5hbWUiLCJfdGhpcyRfb1BhZ2VDb21wb25lbnQiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsImRldGFpbFJvdXRlIiwicm91dGVOYW1lIiwicGFyYW1ldGVyTWFwcGluZyIsImdldEhhc2hGcm9tUm91dGUiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImlzQSIsIl9wYXJhbWV0ZXJzJGNyZWF0ZU9uTiIsIl9wYXJhbWV0ZXJzJGNyZWF0ZU9uTjIiLCJjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycyIsIm1vZGUiLCJhY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJjcmVhdGVDb250ZXh0UHJvbWlzZSIsImNyZWF0ZWRDb250ZXh0IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsInBlcnNpc3RPUFNjcm9sbCIsInVwZGF0ZUZDTExldmVsIiwiZm9yY2VGb2N1cyIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiY2FsbEV4dGVuc2lvbiIsImludGVybmFsTW9kZWwiLCJnZXRNb2RlbCIsInNldFByb3BlcnR5Iiwib3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIlJvd1ByZXNzIiwibW9kZWwiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJpc1BhdGhPbkRyYWZ0Um9vdCIsImdldFBhdGgiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJfb2JqZWN0UGF0aCR0YXJnZXRFbnQiLCJfb2JqZWN0UGF0aCR0YXJnZXRFbnQyIiwib2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwicmVkaXJlY3RlZFRvTm9uRHJhZnQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhlYWRlckluZm8iLCJUeXBlTmFtZSIsIm5hbWUiLCJpc0ZjbEVuYWJsZWQiLCJjb250ZXh0VG9SZXBsYWNlV2l0aCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXBsYWNlV2l0aCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwicGFyZW50QmluZGluZyIsImdldEJpbmRpbmciLCJhZ2dyZWdhdGlvbiIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiZ3JvdXAiLCJhZ2dyZWdhdGUiLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsIl90aGlzJF9vVmlldyRnZXRCaW5kaSIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5jbHVkZXMiLCJuYXZCYWNrIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwic0Vycm9yTWVzc2FnZSIsIm1QYXJhbWV0ZXJzIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwic2V0VGltZW91dCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiZGlzY29ubmVjdCIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9idWlsZEJpbmRpbmdQYXRoIiwicm91dGVBcmd1bWVudHMiLCJiaW5kaW5nUGF0dGVybiIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwiX3JvdXRlQXJndW1lbnRzJFF1ZXIiLCJfcm91dGVBcmd1bWVudHMkUXVlciQiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImJBY3Rpb25DcmVhdGUiLCJvRXZlbnQiLCJfdGhpcyRfb1BhZ2VDb21wb25lbnQyIiwiX3RoaXMkX29QYWdlQ29tcG9uZW50MyIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJiaW5kUHJvbWlzZSIsIm9Nb2RlbCIsIl9iaW5kRGVmZXJyZWQiLCJFZGl0Rmxvd0FjdGlvbiIsImlzT3BlbkluRWRpdE1vZGUiLCJjYWxsIiwiX2JpbmRQYWdlRm9yRWRpdCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ0b1N0cmluZyIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3IiwidGFyZ2V0UGF0aCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsIl9uYXZpZ2F0aW9uUGFyYW1ldGVycyIsIl9uYXZpZ2F0aW9uUGFyYW1ldGVyczIiLCJfbmF2aWdhdGlvblBhcmFtZXRlcnMzIiwibGlzdEJpbmRpbmciLCJwYXJlbnRDb250ZXh0IiwiZGF0YSIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIl9nZXRCaW5kaW5nQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwidGVjaG5pY2FsUGF0aCIsInJlc29sdmVQYXRoIiwiaXNTdGlja3lFZGl0TW9kZSIsImlzU3RpY2t5IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiYWN0aXZlQ29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImtleVByb3BlcnR5IiwiZ2V0T2JqZWN0IiwicmVxdWVzdFByb3BlcnR5IiwiZWRpdEZsb3ciLCJlZGl0RG9jdW1lbnQiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsInNUYXJnZXRQYXRoIiwib0N1cnJlbnRDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJ1c2VDb250ZXh0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsInNob3VsZFJlZnJlc2hDb250ZXh0IiwiaXNEcmFmdFN1cHBvcnRlZCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwiZGF0YU1vZGVsIiwiZ2V0Q29udGV4dCIsImFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMiLCJnZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwidGFyZ2V0RW50aXR5U2V0IiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0T2JqZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJqb2luIiwiX3RoaXMkX29WaWV3JGdldEJpbmRpMiIsIm9QcmV2aW91c0JpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZGVzdHJveSIsIm9IaWRkZW5CaW5kaW5nIiwiYmluZENvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsIm9uRGF0YVJlY2VpdmVkIiwiZ2V0Qm91bmRDb250ZXh0IiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJfZXJyb3IkY2F1c2UiLCJtZXNzYWdlSGFuZGxlciIsIm1lc3NhZ2VIYW5kbGluZ0tleSIsInJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMiLCJtUGFyYW1zIiwiZXJyb3JTdGF0dXMiLCJzdGF0dXMiLCJjYXVzZSIsIm9SZXNvdXJjZUJ1bmRsZSIsImlzSW5pdGlhbExvYWQ1MDNFcnJvciIsInNoZWxsQmFjayIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidW5Ib2xkS2V5Iiwic2hvd01lc3NhZ2VzIiwib0JpbmRpbmdDb250ZXh0Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiX29CaW5kaW5nJGdldENvbnRleHQiLCJhRGVwZW5kZW50QmluZGluZ3MiLCJzUmVsYXRpdmVQYXRoIiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsIml0ZW0iLCJwdXNoIiwiaSIsInJlZHVjZSIsInRhcmdldFByb3BlcnR5IiwiaW5kZXgiLCJpbmRleE9mIiwiX29QcmV2aW91c0NvbnRleHQiLCJvUHJldmlvdXNDb250ZXh0Iiwib1RhcmdldENvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzS2VlcEFsaXZlIiwiYktlZXBBbGl2ZSIsImZuQmVmb3JlRGVzdHJveSIsImJSZXF1ZXN0TWVzc2FnZXMiLCJlbmRzV2l0aCIsInNNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwic3BsaXQiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsIm9LZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwibGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsInNMYXlvdXQiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFRlbXBsYXRlQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZUNvbXBvbmVudFwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHR5cGUgTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0LCB0eXBlIFNob3dNZXNzYWdlc1BhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgeyBnZXREcmFmdE9yQWN0aXZlQ29udGV4dCwgaXNQYXRoT25EcmFmdFJvb3QsIHJlc29sdmVQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvQ29udGV4dFBhdGhIZWxwZXJcIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycywgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nVGFyZ2V0IH0gZnJvbSBcInNhcC91aS9jb3JlL01hbmlmZXN0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB7IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1RhcmdldFR5cGUgfSBmcm9tIFwiLi4vc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuXG50eXBlIFJvdXRlSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldHM/OiB1bmtub3duW107XG5cdHJvdXRlTGV2ZWw6IG51bWJlcjtcbn07XG4vKipcbiAqIHtAbGluayBzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvbiBDb250cm9sbGVyIGV4dGVuc2lvbn1cbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfb1ZpZXchOiBGRVZpZXc7XG5cblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblxuXHRwcml2YXRlIF9vUGFnZUNvbXBvbmVudCE6IEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50PiB8IG51bGw7XG5cblx0cHJpdmF0ZSBfb1JvdXRlciE6IFJvdXRlcjtcblxuXHRwcml2YXRlIF9vUm91dGluZ1NlcnZpY2UhOiBSb3V0aW5nU2VydmljZTtcblxuXHRwcml2YXRlIF9vUm91dGVyUHJveHkhOiBSb3V0ZXJQcm94eTtcblxuXHRwcml2YXRlIF9mblJvdXRlTWF0Y2hlZEJvdW5kITogRnVuY3Rpb247XG5cblx0cHJvdGVjdGVkIF9vVGFyZ2V0SW5mb3JtYXRpb24hOiBSb3V0aW5nVGFyZ2V0O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fb1JvdXRpbmdTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdH1cblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpIGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHR0aGlzLl9vUm91dGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKTtcblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAoIXRoaXMuX29BcHBDb21wb25lbnQgfHwgIXRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb250cm9sZXIgZXh0ZW5zaW9uICdzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZXNpb25zLkludGVybmFsUm91dGluZ1wiKTtcblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50ID09PSB0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXNuJ3QgaG9zdGVkIGluIGEgZGVkaWNhdGVkIFVJQ29tcG9uZW50LCBidXQgZGlyZWN0bHkgaW4gdGhlIGFwcFxuXHRcdFx0Ly8gLS0+IGp1c3Qga2VlcCB0aGUgdmlld1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIilcblx0XHRcdC50aGVuKChvUm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZSA9IG9Sb3V0aW5nU2VydmljZTtcblx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQoe30sIHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdFx0XHR0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24gPSBvUm91dGluZ1NlcnZpY2UuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IodGhpcy5fb1BhZ2VDb21wb25lbnQgfHwgdGhpcy5fb1ZpZXcpISA/PyB7fTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udHJvbGxlciBleHRlbnNpb24gY2Fubm90IHdvcmsgd2l0aG91dCBhICdyb3V0aW5nU2VydmljZScgb24gdGhlIG1haW4gQXBwQ29tcG9uZW50XCIpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcmVkIGV2ZXJ5IHRpbWUgdGhpcyBjb250cm9sbGVyIGlzIGEgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkKCk6IHZvaWQge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWRGaW5pc2hlZCgpOiB2b2lkIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlQmluZGluZyhfYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7fVxuXG5cdGJlZm9yZVNldEJpbmRpbmdDb250ZXh0KGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKGJpbmRpbmdDb250ZXh0LCBfbVBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcoYmluZGluZ0NvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25BZnRlckJpbmRpbmcoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5vbkNvbnRleHRCb3VuZFRvVmlldyhiaW5kaW5nQ29udGV4dCk7XG5cdH1cblxuXHRhZnRlclNldEJpbmRpbmdDb250ZXh0KGJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgX21QYXJhbWV0ZXJzPzogb2JqZWN0KTogdm9pZCB7XG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dCwgeyAuLi5fbVBhcmFtZXRlcnMsIGRlZmVycmVkQ3JlYXRpb246IHRydWUgfSk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkFmdGVyQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25BZnRlckJpbmRpbmcoYmluZGluZ0NvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gYWZ0ZXIgYSB1c2VyIGFjdGlvblxuXHQvLyAoZS5nLiBjbGljayBvbiBhIHRhYmxlIHJvdywgYnV0dG9uLCBldGMuLi4pXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gc05hdmlnYXRpb25UYXJnZXROYW1lIE5hbWUgb2YgdGhlIG5hdmlnYXRpb24gdGFyZ2V0XG5cdCAqIEBwYXJhbSBiUHJlc2VydmVIaXN0b3J5IFRydWUgdG8gZm9yY2UgdGhlIG5ldyBVUkwgdG8gYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgYnJvd3NlciBoaXN0b3J5IChubyByZXBsYWNlKVxuXHQgKiBAcGFyYW0gZGVsYXllZFVzYWdlIFRydWUgdG8gcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGV4ZWN1dGluZyB0aGUgbmF2aWdhdGlvbiwgRmFsc2UgdG8gZXhlY3V0ZSB0aGUgbmF2aWdhdGlvbiBpbW1lZGlhdGVseVxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb1RhcmdldChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRkZWxheWVkVXNhZ2U/OiB0cnVlXG5cdCk6IFByb21pc2U8KCkgPT4gdm9pZD47XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG5hdmlnYXRlVG9UYXJnZXQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0c05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsXG5cdFx0YlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4sXG5cdFx0ZGVsYXllZFVzYWdlPzogYm9vbGVhblxuXHQpOiBQcm9taXNlPCgoKSA9PiB2b2lkKSB8IHZvaWQ+IHtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPVxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihzTmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxSb3V0ZSA9IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCBzUm91dGVOYW1lID0gb0RldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlck1hcHBpbmcgPSBvRGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgc1JvdXRlTmFtZSwgbVBhcmFtZXRlck1hcHBpbmcsIGJQcmVzZXJ2ZUhpc3RvcnksIGRlbGF5ZWRVc2FnZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgbnVsbCwgbnVsbCwgYlByZXNlcnZlSGlzdG9yeSwgZGVsYXllZFVzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBIYXNoIHdlJ3JlIG5hdmlnYXRpbmcgdG8uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG5hdmlnYXRpb25UYXJnZXROYW1lIE5hbWUgb2YgdGhlIG5hdmlnYXRpb24gdGFyZ2V0XG5cdCAqIEByZXR1cm5zIFRoZSBIYXNoIHdlJ3JlIG5hdmlnYXRpbmcgdG9cblx0ICovXG5cdGFzeW5jIGdldEhhc2hGb3JOYXZpZ2F0aW9uKGNvbnRleHQ6IENvbnRleHQsIG5hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG5hdmlnYXRpb25Db25maWd1cmF0aW9uID0gdGhpcz8uX29QYWdlQ29tcG9uZW50Py5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG5hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBkZXRhaWxSb3V0ZSA9IG5hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHJvdXRlTmFtZSA9IGRldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgcGFyYW1ldGVyTWFwcGluZyA9IGRldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldEhhc2hGcm9tUm91dGUoY29udGV4dCwgcm91dGVOYW1lLCBwYXJhbWV0ZXJNYXBwaW5nKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRIYXNoRnJvbVJvdXRlKGNvbnRleHQsIG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldCByb3V0ZS5cblx0ICogQHBhcmFtIHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSBbb1BhcmFtZXRlcnNdIFBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHJvdXRlIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGhhc2hcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgbmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWU6IHN0cmluZywgb1BhcmFtZXRlcnM/OiBvYmplY3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lLCBvUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHRvICd0cnVlJyB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgJ2ZhbHNlJyBpZiB0aGUgbmF2aWdhdGlvbiBkaWQgbm90IGhhcHBlblxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVUb0NvbnRleHQoY29udGV4dDogQ29udGV4dCB8IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKGNvbnRleHQuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlID09PSBcIkFzeW5jXCIpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzLmNyZWF0ZUNvbnRleHRQcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oYXN5bmMgKGNyZWF0ZWRDb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBvbmNlIHRoZSBjb250ZXh0IGlzIHJldHVybmVkIHdlIG5hdmlnYXRlIGludG8gaXRcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNyZWF0ZWRDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiBwYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlLFxuXHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogcGFyYW1ldGVycy5lZGl0YWJsZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdE9QU2Nyb2xsOiBwYXJhbWV0ZXJzLnBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdFx0XHRcdFx0dXBkYXRlRkNMTGV2ZWw6IHBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwsXG5cdFx0XHRcdFx0XHRcdGZvcmNlRm9jdXM6IHBhcmFtZXRlcnMuZm9yY2VGb2N1c1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2l0aCB0aGUgYXN5bmMgY29udGV4dFwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8ubW9kZSAhPT0gXCJEZWZlcnJlZFwiKSB7XG5cdFx0XHRcdC8vIE5hdmlnYXRlIHRvIGEgbGlzdCBiaW5kaW5nIG5vdCB5ZXQgc3VwcG9ydGVkXG5cdFx0XHRcdHRocm93IFwibmF2aWdhdGlvbiB0byBhIGxpc3QgYmluZGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5jYWxsRXh0ZW5zaW9uKSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cblx0XHRcdC8vIFN0b3JpbmcgdGhlIHNlbGVjdGVkIGNvbnRleHQgdG8gdXNlIGl0IGluIGludGVybmFsIHJvdXRlIG5hdmlnYXRpb24gaWYgbmVjY2Vzc2FyeS5cblx0XHRcdGNvbnN0IG92ZXJyaWRlTmF2ID0gYXdhaXQgdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkucm91dGluZy5vbkJlZm9yZU5hdmlnYXRpb24oeyBiaW5kaW5nQ29udGV4dDogY29udGV4dCB9KTtcblx0XHRcdGlmIChvdmVycmlkZU5hdikge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIGNvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0Ly8gSW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIGZyb20gYSB0YWJsZSBpbiBhIExpc3RSZXBvcnQgd2l0aCBkcmFmdCwgdGhlcmUncyBzcGVjaWFsIGhhbmRsaW5nIGZvciBjb2xsYWJvcmF0aW9uIGFuZCB0cmVlIHRhYmxlLlxuXHRcdC8vIFdlIG1heSBub3QgbmF2aWdhdGUgdG8gdGhlIGNvbnRleHQgdGhlIHVzZXIgY2xpY2tlZCBvbi5cblx0XHRpZiAocGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MgJiYgY29udGV4dC5pc0E8Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdFx0aWYgKGlzUGF0aE9uRHJhZnRSb290KGNvbnRleHQuZ2V0UGF0aCgpLCBtZXRhTW9kZWwpKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRGb3JOYXZpZ2F0aW9uID1cblx0XHRcdFx0XHQoYXdhaXQgdGhpcy5nZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uKGNvbnRleHQsIHBhcmFtZXRlcnMpKSA/P1xuXHRcdFx0XHRcdChhd2FpdCB0aGlzLmdldENvbnRleHRGb3JOYXZpZ2F0aW9uRnJvbVRyZWVPckFuYWx5dGljYWxUYWJsZShjb250ZXh0KSk7XG5cblx0XHRcdFx0Ly8gVXNlIGFub3RoZXIgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0aWYgKGNvbnRleHRGb3JOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHRGb3JOYXZpZ2F0aW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIgYW5kIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbi5cblx0ICogQHBhcmFtIG9yaWdpbmFsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29udGV4dCwgbnVsbCBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0Q29udGV4dEZvck5hdmlnYXRpb25XaXRoQ29sbGFib3JhdGlvbihcblx0XHRvcmlnaW5hbENvbnRleHQ6IENvbnRleHQsXG5cdFx0cGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCk6IFByb21pc2U8Q29udGV4dCB8IG51bGw+IHtcblx0XHRjb25zdCBtb2RlbCA9IG9yaWdpbmFsQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gSWYgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLCBhbmQgd2UncmUgbmF2aWdhdGluZyB0byBhIGRyYWZ0IGluc3RhbmNlIGZyb20gdGhlIExSLFxuXHRcdFx0Ly8gV2Ugd2FudCB0byBjaGVjayBpZiB0aGUgZHJhZnQgaW5zdGFuY2UgZXhpc3RzIGZpcnN0LiBPdGhlcndpc2Ugd2UgbmF2aWdhdGUgdG8gdGhlIG9yaWdpbmFsIChkcmFmdCkgdmVyc2lvbi5cblx0XHRcdGNvbnN0IGRyYWZ0T3JBY3RpdmVDb250ZXh0ID0gYXdhaXQgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQob3JpZ2luYWxDb250ZXh0KTtcblxuXHRcdFx0aWYgKGRyYWZ0T3JBY3RpdmVDb250ZXh0ICE9PSBudWxsICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkgIT09IGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHQvLyBOb3RpZnkgdGhlIHVzZXIgdGhhdCB3ZSBoYXZlIG5hdmlnYXRlZCB0byB0aGUgc2F2ZWQgaW5zdGFuY2Vcblx0XHRcdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSkpO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLnJlZGlyZWN0ZWRUb05vbkRyYWZ0ID1cblx0XHRcdFx0XHQob2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZSBhcyB1bmtub3duIGFzIHN0cmluZykgPz9cblx0XHRcdFx0XHRvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUubmFtZTtcblxuXHRcdFx0XHRpZiAodGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIEZDTDogcmVwbGFjZSB0aGUgY29udGV4dCBpbiB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Y29uc3QgY29udGV4dFRvUmVwbGFjZVdpdGggPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0b3JpZ2luYWxDb250ZXh0LnJlcGxhY2VXaXRoKGNvbnRleHRUb1JlcGxhY2VXaXRoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBGdWxsc2NyZWVuOiB0cmlnZ2VyIGEgcmVmcmVzaCBvZiB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVc2UgdGhlIHNhdmVkIGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBkcmFmdE9yQWN0aXZlQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbnRleHRcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGluIGNhc2Ugd2UncmUgbmF2aWdhdGluZyB0byBhbiBhY3RpdmUgaW5zdGFuY2UgZnJvbSB0aGUgTFIgYW5kIHdlJ3JlIGluIGEgVHJlZSBvciBBbmFseXRpY2FsIHRhYmxlLlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUob3JpZ2luYWxDb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IHBhcmVudEJpbmRpbmcgPSBvcmlnaW5hbENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGlmICghcGFyZW50QmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IHBhcmVudEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhc1xuXHRcdFx0fCB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZzsgZ3JvdXA/OiBvYmplY3Q7IGFnZ3JlZ2F0ZT86IG9iamVjdCB9XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRpZiAoIWFnZ3JlZ2F0aW9uPy5oaWVyYXJjaHlRdWFsaWZpZXIgJiYgIWFnZ3JlZ2F0aW9uPy5ncm91cCAmJiAhYWdncmVnYXRpb24/LmFnZ3JlZ2F0ZSkge1xuXHRcdFx0Ly8gVGhlIGNvbnRleHQgZG9lc24ndCBiZWxvbmcgdG8gYSBoaWVyYXJjaGljYWwvYW5hbHl0aWNhbCBsaXN0IGJpbmRpbmdcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJiBvcmlnaW5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gSWYgd2UncmUgaW4gYSBUcmVlL0FuYWx5dGljYWwgdGFibGUsIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBpbnN0YW5jZSB0aGF0IGhhcyBhIGRyYWZ0LFxuXHRcdFx0Ly8gLS0+IFdlIHRyeSB0byBuYXZpZ2F0ZSB0byB0aGUgZHJhZnQgaW5zdGFuY2UgKGlmIGl0IHN0aWxsIGV4aXN0cylcblx0XHRcdGNvbnN0IGRyYWZ0T3JBY3RpdmVDb250ZXh0ID0gYXdhaXQgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQob3JpZ2luYWxDb250ZXh0KTtcblxuXHRcdFx0aWYgKGRyYWZ0T3JBY3RpdmVDb250ZXh0ICE9PSBudWxsICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQYXRoKCkgIT09IGRyYWZ0T3JBY3RpdmVDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHQvLyBVc2UgdGhlIGRyYWZ0IGluc3RhbmNlIGZvciBuYXZpZ2F0aW9uXG5cdFx0XHRcdHJldHVybiBkcmFmdE9yQWN0aXZlQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGNvbnRleHRcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIGZyb20gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSBbcGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KGNvbnRleHQ6IENvbnRleHQsIHBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY29udGV4dCwgcGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGZvcndhcmRzIHRvIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiBoaXN0b3J5IGlmIHRoZSBjdXJyZW50IGhhc2ggY29ycmVzcG9uZHMgdG8gYSB0cmFuc2llbnQgc3RhdGUuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk6IHZvaWQge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKTtcblxuXHRcdC8vIGlmIHRyaWdnZXJlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvICguLi4pLCB3ZSBuZWVkIHRvIG5hdmlnYXRlIGJhY2tcblx0XHRpZiAoc0hhc2guaW5jbHVkZXMoXCIoLi4uKVwiKSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdkJhY2soKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGxheXMgYW4gZXJyb3IgKGlsbHVzdHJhdGVkIG1lc3NhZ2UpIGluIHRoZSBwYWdlLlxuXHQgKiBAcGFyYW0gc0Vycm9yTWVzc2FnZVxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBwcm9taXNlXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogc3RyaW5nLCBtUGFyYW1ldGVyczogTmF2aWdhdGlvblRvRXJyb3JQYWdlUmVzdWx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRpZiAodGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmNsdWRlcyhcImktYWN0aW9uPWNyZWF0ZVwiKSB8fCB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluY2x1ZGVzKFwiaS1hY3Rpb249YXV0b0NyZWF0ZVwiKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZUb0hhc2godGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldERlZmF1bHRDcmVhdGVIYXNoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5RXJyb3JQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzLCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0XG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3RhdGUgaXMgaW1wYWN0ZWQgYnkgdGhlIGNvbnRleHRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dCk7XG5cdH1cblxuXHRfaXNWaWV3UGFydE9mUm91dGUocm91dGVJbmZvcm1hdGlvbj86IFJvdXRlSW5mb3JtYXRpb24pOiBib29sZWFuIHtcblx0XHRjb25zdCBhVGFyZ2V0cyA9IHJvdXRlSW5mb3JtYXRpb24/LnRhcmdldHM7XG5cdFx0aWYgKCFhVGFyZ2V0cyB8fCAhYVRhcmdldHMuaW5jbHVkZXModGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpKSB7XG5cdFx0XHQvLyBJZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaGFzIGEgdmlldyBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHJvdXRlIGxldmVsLCBpdCBtZWFucyB0aGlzIHZpZXcgY29tZXMgXCJhZnRlclwiIHRoZSByb3V0ZVxuXHRcdFx0Ly8gaW4gdGVybXMgb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQsIHRvIGF2b2lkIHRoaXMgdmlldyB0byBoYXZlIGRhdGEgaWYgd2UgbmF2aWdhdGUgdG8gaXQgbGF0ZXIgb25cblx0XHRcdC8vIFRoaXMgaXMgZG9uZSBpbiBhIHRpbWVvdXQgdG8gYWxsb3cgZm9yIGZvY3Vzb3V0IGV2ZW50cyB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHByb3Blcmx5IGluIGNvbGxhYm9yYXRpdmUgZHJhZnRcblx0XHRcdGlmICgodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSkge1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRpZiAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA9PT0gMCAmJiB0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSByb3V0ZSBoYXMgbGV2ZWwgMCAtLT4gd2UgbmVlZCB0byBsZWF2ZSB0aGUgY29sbGFib3JhdGlvbiBzZXNzaW9uIGFzIG5vIE9QIGlzIGRpc3BsYXllZFxuXHRcdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpOyAvLyBUaGlzIGFsc28gY2FsbCBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfYnVpbGRCaW5kaW5nUGF0aChcblx0XHRyb3V0ZUFyZ3VtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgb2JqZWN0Pixcblx0XHRiaW5kaW5nUGF0dGVybjogc3RyaW5nLFxuXHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm9cblx0KTogeyBwYXRoOiBzdHJpbmc7IGRlZmVycmVkOiBib29sZWFuIH0ge1xuXHRcdGxldCBwYXRoID0gYmluZGluZ1BhdHRlcm4ucmVwbGFjZShcIjo/cXVlcnk6XCIsIFwiXCIpO1xuXHRcdGxldCBkZWZlcnJlZCA9IGZhbHNlO1xuXG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIHJvdXRlQXJndW1lbnRzKSB7XG5cdFx0XHRjb25zdCBzVmFsdWUgPSByb3V0ZUFyZ3VtZW50c1tzS2V5XTtcblxuXHRcdFx0aWYgKHR5cGVvZiBzVmFsdWUgIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzVmFsdWUgPT09IFwiLi4uXCIgJiYgYmluZGluZ1BhdHRlcm4uaW5jbHVkZXMoYHske3NLZXl9fWApKSB7XG5cdFx0XHRcdGRlZmVycmVkID0gdHJ1ZTtcblx0XHRcdFx0Ly8gU29tZXRpbWVzIGluIHByZWZlcnJlZE1vZGUgPSBjcmVhdGUsIHRoZSBlZGl0IGJ1dHRvbiBpcyBzaG93biBpbiBiYWNrZ3JvdW5kIHdoZW4gdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIHNob3dzIHVwLCBzZXR0aW5nIGJUYXJnZXRFZGl0YWJsZSBwYXNzZXMgZWRpdGFibGUgYXMgdHJ1ZVxuXHRcdFx0XHQvLyB0byBvbkJlZm9yZUJpbmRpbmcgaW4gX2JpbmRUYXJnZXRQYWdlIGZ1bmN0aW9uXG5cdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKGB7JHtzS2V5fX1gLCBzVmFsdWUpO1xuXHRcdH1cblx0XHRpZiAoKHJvdXRlQXJndW1lbnRzW1wiP3F1ZXJ5XCJdIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pPy5bXCJpLWFjdGlvblwiXT8uaW5jbHVkZXMoXCJjcmVhdGVcIikpIHtcblx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIHRoZSBiaW5kaW5nIHBhdGggaXMgYWx3YXlzIGFic29sdXRlXG5cdFx0aWYgKHBhdGggJiYgcGF0aFswXSAhPT0gXCIvXCIpIHtcblx0XHRcdHBhdGggPSBgLyR7cGF0aH1gO1xuXHRcdH1cblxuXHRcdHJldHVybiB7IHBhdGgsIGRlZmVycmVkIH07XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRvIGJpbmQgdGhlIHBhZ2Ugd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWRcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkLlxuXHQgKiBCdWlsZHMgdGhlIGJpbmRpbmcgY29udGV4dCBmcm9tIHRoZSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMsIGFuZCBiaW5kIHRoZSBwYWdlIGFjY29yZGluZ2x5LlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRfb25Sb3V0ZU1hdGNoZWQoXG5cdFx0b0V2ZW50OiBFdmVudDx7XG5cdFx0XHRyb3V0ZUluZm9ybWF0aW9uPzogUm91dGVJbmZvcm1hdGlvbjtcblx0XHRcdHJvdXRlUGF0dGVybjogc3RyaW5nO1xuXHRcdFx0bmF2aWdhdGlvbkluZm86IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbztcblx0XHRcdGFyZ3VtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgb2JqZWN0Pjtcblx0XHR9PlxuXHQpOiB2b2lkIHtcblx0XHQvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaXMgcGFydCBvZiB0aGUgZXZlbnQgdGFyZ2V0cyAoaS5lLiBpcyBhIHRhcmdldCBmb3IgdGhlIGN1cnJlbnQgcm91dGUpLlxuXHRcdC8vIElmIG5vdCwgd2UgZG9uJ3QgbmVlZCB0byBiaW5kIGl0IC0tPiByZXR1cm5cblx0XHRpZiAoIXRoaXMuX2lzVmlld1BhcnRPZlJvdXRlKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZUluZm9ybWF0aW9uXCIpKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJldHJpZXZlIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGxldCBiaW5kaW5nUGF0dGVybjtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKSB7XG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybigpO1xuXHRcdH1cblx0XHRiaW5kaW5nUGF0dGVybiA9IGJpbmRpbmdQYXR0ZXJuIHx8IHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5jb250ZXh0UGF0dGVybjtcblxuXHRcdGlmIChiaW5kaW5nUGF0dGVybiA9PT0gbnVsbCB8fCBiaW5kaW5nUGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBEb24ndCBkbyB0aGlzIGlmIHdlIGFscmVhZHkgZ290IHNUYXJnZXQgPT0gJycsIHdoaWNoIGlzIGEgdmFsaWQgdGFyZ2V0IHBhdHRlcm5cblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlUGF0dGVyblwiKTtcblx0XHR9XG5cblx0XHQvLyBSZXBsYWNlIHRoZSBwYXJhbWV0ZXJzIGJ5IHRoZWlyIHZhbHVlcyBpbiB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRjb25zdCBtQXJndW1lbnRzID0gb0V2ZW50LmdldFBhcmFtZXRlcnMoKS5hcmd1bWVudHM7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25QYXJhbWV0ZXJzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcIm5hdmlnYXRpb25JbmZvXCIpO1xuXHRcdGNvbnN0IHsgcGF0aCwgZGVmZXJyZWQgfSA9IHRoaXMuX2J1aWxkQmluZGluZ1BhdGgobUFyZ3VtZW50cywgYmluZGluZ1BhdHRlcm4sIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cblx0XHR0aGlzLm9uUm91dGVNYXRjaGVkKCk7XG5cblx0XHRsZXQgYmluZFByb21pc2U7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKTtcblx0XHRpZiAoZGVmZXJyZWQpIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZERlZmVycmVkKHBhdGgsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24gJiZcblx0XHRcdCh0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluY2x1ZGVzKFwiaS1hY3Rpb249ZWRpdFwiKSB8fCAodGhpcy5fb1BhZ2VDb21wb25lbnQ/LmlzT3BlbkluRWRpdE1vZGU/LigpID8/IGZhbHNlKSlcblx0XHQpIHtcblx0XHRcdGJpbmRQcm9taXNlID0gdGhpcy5fYmluZFBhZ2VGb3JFZGl0KHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kUGFnZShwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXG5cdFx0YmluZFByb21pc2Vcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0dGhpcy5vblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciBkdXJpbmcgcGFnZSBiaW5kaW5nIFwiICsgZXJyb3IudG9TdHJpbmcoKSk7XG5cdFx0XHR9KTtcblxuXHRcdHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkudXBkYXRlVUlTdGF0ZUZvclZpZXcodGhpcy5fb1ZpZXcsIHRoaXMuX2dldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgZGVmZmVyZWQgY29udGV4dFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgX2JpbmREZWZlcnJlZCh0YXJnZXRQYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmJlZm9yZVNldEJpbmRpbmdDb250ZXh0KG51bGwsIHsgZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSB9KTtcblxuXHRcdGlmICghbmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMgfHwgbmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMubW9kZSA9PT0gXCJEZWZlcnJlZFwiKSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8ubGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/LnBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/LmRhdGEsXG5cdFx0XHRcdFx0ISFuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRpZiAoY3VycmVudEJpbmRpbmdDb250ZXh0Py5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHQvLyBGb3Igbm93IHJlbW92ZSB0aGUgcGVuZGluZyBjaGFuZ2VzIHRvIGF2b2lkIHRoZSBtb2RlbCByYWlzZXMgZXJyb3JzIGFuZCB0aGUgb2JqZWN0IHBhZ2UgaXMgYXQgbGVhc3QgYm91bmRcblx0XHRcdC8vIElkZWFsbHkgdGhlIHVzZXIgc2hvdWxkIGJlIGFza2VkIGZvclxuXHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyByZW1vdmUgdGhlIGNvbnRleHQgdG8gYXZvaWQgc2hvd2luZyBvbGQgZGF0YVxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBmb3IgdGhlIHBhZ2UgZnJvbSBhIHBhdGgsIGlmIHRoZSBhcHAgaXMgc3RhcnRlZCB3aXRoIHRoZSBwcmVmZXJyZWQgbW9kZSBlZGl0LlxuXHQgKlxuXHQgKiBJZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYW4gYWN0aXZlIGVudGl0eSwgaXQgaXMgZGlyZWN0bHkgY29udmVydGVkIHRvIGRyYWZ0IHVzaW5nIHRoZSBFZGl0RmxvdyBjb250cm9sbGVyIGV4dGVuc2lvbi5cblx0ICogQHBhcmFtIHRhcmdldFBhdGhcblx0ICogQHBhcmFtIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBoYXMgYmVlbiBzZXQgb24gdGhlIHBhZ2Vcblx0ICovXG5cdGFzeW5jIF9iaW5kUGFnZUZvckVkaXQodGFyZ2V0UGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IFByb21pc2U8dm9pZCB8IENvbnRleHQ+IHtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdGVjaG5pY2FsUGF0aDogc3RyaW5nID0gYXdhaXQgcmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgbW9kZWwsIHRoaXMuX29Sb3V0aW5nU2VydmljZSwgdGhpcy5fb1JvdXRlcik7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdC8vIGNoZWNrIGZvciBzdGlja3kgJiBzdGlja3kgZWRpdCBzZXNzaW9uXG5cdFx0XHRjb25zdCBpc1N0aWNreUVkaXRNb2RlID0gQ29tbW9uVXRpbHMuaXNTdGlja3lFZGl0TW9kZSh0aGlzLmJhc2UuZ2V0VmlldygpKTtcblx0XHRcdGNvbnN0IGlzU3RpY2t5ID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG1ldGFNb2RlbCk7XG5cdFx0XHRpZiAodGVjaG5pY2FsUGF0aC5pbmNsdWRlcyhcIklzQWN0aXZlRW50aXR5PXRydWVcIikgfHwgKGlzU3RpY2t5ICYmICFpc1N0aWNreUVkaXRNb2RlKSkge1xuXHRcdFx0XHQvLyBjcmVhdGUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBhY3RpdmVDb250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dCh0ZWNobmljYWxQYXRoLCBtb2RlbCk7XG5cdFx0XHRcdGlmIChpc1N0aWNreSkge1xuXHRcdFx0XHRcdC8vIEtleSBuZWVkcyB0byBiZSBhdmFpbGFibGUgZm9yIHRoZSBlZGl0aW5nIHRvIHdvcmsgaW4gdGhlIHN0aWNreSB1c2UgY2FzZVxuXHRcdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHRlY2huaWNhbFBhdGgpO1xuXHRcdFx0XHRcdGNvbnN0IGtleVByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHttZXRhUGF0aH0vJFR5cGUvJEtleWApO1xuXHRcdFx0XHRcdGF3YWl0IGFjdGl2ZUNvbnRleHQucmVxdWVzdFByb3BlcnR5KGtleVByb3BlcnR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBJc0FjdGl2ZUVudGl0eSBuZWVkcyB0byBiZSBhdmFpbGFibGUgZm9yIHRoZSBlZGl0aW5nIHRvIHdvcmsgaW4gdGhlIGRyYWZ0IHVzZSBjYXNlXG5cdFx0XHRcdFx0YXdhaXQgYWN0aXZlQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBlZGl0IGRvY3VtZW50XG5cdFx0XHRcdHJldHVybiBhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cuZWRpdERvY3VtZW50KGFjdGl2ZUNvbnRleHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2JpbmRQYWdlVG9QYXRoKHRlY2huaWNhbFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblxuXHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0dGl0bGU6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0ZGVzY3JpcHRpb246IChlcnJvciBhcyBFcnJvcikubWVzc2FnZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGNvbnRleHRcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIG9uIHRoZSBwYWdlIGlzIHNldFxuXHQgKi9cblx0YXN5bmMgX2JpbmRQYWdlKHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzb2x2ZVBhdGgodGFyZ2V0UGF0aCwgbW9kZWwsIHRoaXMuX29Sb3V0aW5nU2VydmljZSwgdGhpcy5fb1JvdXRlcilcblx0XHRcdC50aGVuKCh0ZWNobmljYWxQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2JpbmRQYWdlVG9QYXRoKHRlY2huaWNhbFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHQvLyBFcnJvciBoYW5kbGluZyBmb3IgZXJyb25lb3VzIG1ldGFkYXRhIHJlcXVlc3Rcblx0XHRcdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXG5cdFx0XHRcdHRoaXMubmF2aWdhdGVUb01lc3NhZ2VQYWdlKHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0dGl0bGU6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0ICh0aGlzIGlzIGEgcGF0aCBpbiB0aGUgbW9kZWwsIHNvIG9ubHkgdGVjaG5pY2FsIGtleXMgYXJlIGFsbG93ZWQpLlxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9QYXRoKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiB2b2lkIHtcblx0XHRjb25zdCBvQ3VycmVudENvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0c0N1cnJlbnRQYXRoID0gb0N1cnJlbnRDb250ZXh0ICYmIG9DdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRvVXNlQ29udGV4dCA9IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0IGFzIENvbnRleHQgfCB1bmRlZmluZWQgfCBudWxsO1xuXG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRsZXQgc2hvdWxkUmVmcmVzaENvbnRleHQgPSBmYWxzZTtcblx0XHRcdFx0Ly8gV2UgYWxyZWFkeSBoYXZlIHRoZSBjb250ZXh0IHRvIGJlIHVzZWQsIGFuZCBpdCdzIG5vdCB0aGUgY3VycmVudCBvbmVcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0c2hvdWxkUmVmcmVzaENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoc2hvdWxkUmVmcmVzaENvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLl9vQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IFwiXCIgfV0sIG9Vc2VDb250ZXh0LCBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0R3JvdXBJZCgpKVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmVmcmVzaCBjb250ZXh0OiAke2Vycn1gKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSB0aGUgc2FtZSBjb250ZXh0IGJ1dCBhbiBlZGl0ZmxvdyBhY3Rpb24gaGFwcGVuZWQgKGUuZy4gQ2FuY2VsRG9jdW1lbnQgaW4gc3RpY2t5IG1vZGUpXG5cdFx0XHRcdC8vIC0tPiBXZSBuZWVkIHRvIGNhbGwgb25CZWZvcmUvQWZ0ZXJCaW5kaW5nIHRvIHJlZnJlc2ggdGhlIG9iamVjdCBwYWdlIHByb3Blcmx5XG5cdFx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdFx0XHRsaXN0QmluZGluZzogb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLFxuXHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob1VzZUNvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoIHx8IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZm9yIGl0cyBwYXRoXG5cdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dCh0aGlzLl9jcmVhdGVDb250ZXh0KHNUYXJnZXRQYXRoLCBvTW9kZWwpLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmXG5cdFx0XHRvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLlJlc3RvcmVIaXN0b3J5ICYmXG5cdFx0XHRFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpICYmXG5cdFx0XHQhb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0b0N1cnJlbnRDb250ZXh0XG5cdFx0KSB7XG5cdFx0XHR0aGlzLl9yZWZyZXNoQmluZGluZ0NvbnRleHQob0N1cnJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQmluZHMgdGhlIHBhZ2UgdG8gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBib3VuZFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb1BhcmVudExpc3RCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCAhb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBwYXJlbnRCaW5kaW5nIGlzIG5vdCBhIGxpc3RCaW5kaW5nLCB3ZSBjcmVhdGUgYSBuZXcgY29udGV4dFxuXHRcdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUoXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQgJiYgIXRoaXMuX29BcHBDb21wb25lbnQuaXNFeGl0aW5nICYmIG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0ZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUsXG5cdFx0XHRsaXN0QmluZGluZzogb1BhcmVudExpc3RCaW5kaW5nLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRyZWFzb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5hZnRlclNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7IHJlZGlyZWN0ZWRUb05vbkRyYWZ0OiBvTmF2aWdhdGlvblBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0IH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKTogQ29udGV4dCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gc0NvbnRleHRQYXRoXG5cdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpICYmIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvTWV0YU1vZGVsLmdldENvbnRleHQoc0NvbnRleHRQYXRoKSlcblx0XHRcdDogbnVsbDtcblx0XHRjb25zdCBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzID0gTW9kZWxIZWxwZXIuZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyhcblx0XHRcdGRhdGFNb2RlbD8udGFyZ2V0RW50aXR5VHlwZSBhcyBFbnRpdHlUeXBlLFxuXHRcdFx0ZGF0YU1vZGVsPy50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0XG5cdFx0KTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbCwgc1BhdGgsIGZhbHNlLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBrZWVwQWxpdmUgY29udGV4dCAke3NQYXRofWApO1xuXHRcdFx0fSBlbHNlIGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRcdFx0XHRpZiAob0RyYWZ0Um9vdCkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdE9iamVjdChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGRyYWZ0IGFuZCBlZGl0IHdlIG5lZWQgdG8gZW5zdXJlIHRob3NlIHByb3BlcnRpZXMgYXJlIHJlcXVlc3RlZCBhZ2FpbiBldmVuIGlmIHRoZXkgYXJlIGluIHRoZSBiaW5kaW5nJ3MgY2FjaGVcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2hlbiB5b3UgZWRpdCBhbmQgZ28gdG8gdGhlIHNhdmVkIHZlcnNpb24geW91IGhhdmUgbm8gd2F5IG9mIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBlZGl0IHZlcnNpb25cblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRvRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdD8gW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdXG5cdFx0XHRcdFx0XHRcdDogW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob01ldGFNb2RlbCwgc0NvbnRleHRQYXRoKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuJHNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IFwiSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCArPSBcIixIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMubGVuZ3RoKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy4kc2VsZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cy5qb2luKFwiLFwiKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ICs9IFwiLFwiICsgYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cy5qb2luKFwiLFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0Y29uc3Qgb1ByZXZpb3VzQmluZGluZyA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9QcmV2aW91c0JpbmRpbmcpIHtcblx0XHRcdFx0XHRvTW9kZWwucmVzZXRDaGFuZ2VzKG9QcmV2aW91c0JpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpKTtcblx0XHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSk7XG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgdGhpcy5vbkRhdGFSZWNlaXZlZC5iaW5kKHRoaXMpKTtcblx0XHRcdHJldHVybiBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgb25EYXRhUmVjZWl2ZWQob0V2ZW50OiBFdmVudDx7IGVycm9yOiB7IHN0YXR1cz86IG51bWJlcjsgY2F1c2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH0gfT4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBlcnJvciA9IG9FdmVudD8uZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5fb1ZpZXcpKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXG5cdFx0aWYgKGVycm9yKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gbWVzc2FnZUhhbmRsZXIucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdFx0bGV0IG1QYXJhbXM6IFNob3dNZXNzYWdlc1BhcmFtZXRlcnMgPSB7fTtcblx0XHRcdGNvbnN0IGVycm9yU3RhdHVzID0gZXJyb3Iuc3RhdHVzID8/IGVycm9yLmNhdXNlPy5zdGF0dXM7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdFx0XHRpZiAoZXJyb3JTdGF0dXMgPT09IDUwMykge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRpc0luaXRpYWxMb2FkNTAzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGVycm9yU3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IEpTT04uc3RyaW5naWZ5KGVycm9yKSxcblx0XHRcdFx0XHRcdGlzRGF0YVJlY2VpdmVkRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgY29yZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRtUGFyYW1zLnVuSG9sZEtleSA9IG1lc3NhZ2VIYW5kbGluZ0tleTtcblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBCaW5kaW5nKTogdm9pZCB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IChvQmluZGluZy5nZXRDb250ZXh0KCk/LmdldFBhdGgoKSA/PyBcIlwiKS5yZXBsYWNlKHNSb290Q29udGV4dFBhdGgsIFwiXCIpOyAvLyBJZiBubyBjb250ZXh0LCB0aGlzIGlzIGFuIGFic29sdXRlIGJpbmRpbmcgc28gbm8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0Y29uc3Qgc1BhdGggPSAoc1JlbGF0aXZlUGF0aCA/IGAke3NSZWxhdGl2ZVBhdGguc2xpY2UoMSl9L2AgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQTxPRGF0YUNvbnRleHRCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIG9mIGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGl0ZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmNsdWRlcyhzUGF0aCkpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBPE9EYXRhUHJvcGVydHlCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoIWFQcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzQ29udGV4dFBhdGgpO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdC8vYWxsIHRoaXMgbG9naWMgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIFNpZGVFZmZlY3RzIHJlcXVlc3QgZm9yIGFuIGVtcHR5IHBhdGggKHJlZnJlc2ggZXZlcnl0aGluZyksIGFmdGVyIHRlc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzXG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldHM6IHN0cmluZ1tdLCB0YXJnZXRQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHRhcmdldFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdHRhcmdldHMucHVzaChpbmRleCA+IDAgPyB0YXJnZXRQcm9wZXJ0eS5zbGljZSgwLCBpbmRleCkgOiB0YXJnZXRQcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0cztcblx0XHR9LCBbXSk7XG5cdFx0Ly8gT0RhdGEgbW9kZWwgd2lsbCB0YWtlIGNhcmUgb2YgZHVwbGljYXRlc1xuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFsuLi5vU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMsIC4uLm9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzXSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogQ29udGV4dCB8IG51bGwpOiB2b2lkIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0Py5pc0tlZXBBbGl2ZSgpICYmIG9QcmV2aW91c0NvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUob1ByZXZpb3VzQ29udGV4dCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKi9cblx0X2dldEZDTExldmVsKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YktlZXBBbGl2ZTogYm9vbGVhbixcblx0XHRmbkJlZm9yZURlc3Ryb3k/OiBQYXJhbWV0ZXJzPENvbnRleHRbXCJzZXRLZWVwQWxpdmVcIl0+WzFdLFxuXHRcdGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzTWV0YVBhdGgpO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KFxuXHRcdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sXG5cdFx0cGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVyc1xuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCk6IHZvaWQge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0XG5cdFx0XHQ/IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSFcblx0XHRcdDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IGxheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKTogdm9pZCB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF3Q0E7QUFDQTtBQUNBO0FBQ0E7RUFIQSxJQUtNQSxlQUFlLElBQUFDLElBQUEsR0FEcEJDLGNBQWMsQ0FBQyxrREFBa0QsQ0FBQyxFQUFBQyxLQUFBLEdBb0JqRUMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQU9oQkQsY0FBYyxDQUFDLENBQUMsRUFBQUUsS0FBQSxHQXFDaEJDLGVBQWUsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxFQUFBQyxLQUFBLEdBS25DTCxlQUFlLENBQUMsQ0FBQyxFQUFBTSxLQUFBLEdBQ2pCSixVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsRUFBQUcsS0FBQSxHQUtuQ1AsZUFBZSxDQUFDLENBQUMsRUFBQVEsS0FBQSxHQUNqQk4sVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLEVBQUFLLE1BQUEsR0FXbkNULGVBQWUsQ0FBQyxDQUFDLEVBQUFVLE1BQUEsR0FDakJSLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxFQUFBTyxNQUFBLEdBZ0NuQ1gsZUFBZSxDQUFDLENBQUMsRUFBQVksTUFBQSxHQTZDakJaLGVBQWUsQ0FBQyxDQUFDLEVBQUFhLE1BQUEsR0FtTGpCYixlQUFlLENBQUMsQ0FBQyxFQUFBYyxNQUFBLEdBQ2pCQyxjQUFjLENBQUMsQ0FBQyxFQUFBQyxNQUFBLEdBOEJoQmhCLGVBQWUsQ0FBQyxDQUFDLEVBQUFpQixNQUFBLEdBQ2pCRixjQUFjLENBQUMsQ0FBQyxFQUFBRyxNQUFBLEdBZ2RoQmxCLGVBQWUsQ0FBQyxDQUFDLEVBQUFtQixNQUFBLEdBME5qQm5CLGVBQWUsQ0FBQyxD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
974
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJfZGVjNCIsInB1YmxpY0V4dGVuc2lvbiIsIl9kZWM1IiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsIl9kZWMxMSIsIl9kZWMxMiIsIl9kZWMxMyIsIl9kZWMxNCIsIl9kZWMxNSIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiQmVmb3JlIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9Db250cm9sbGVyRXh0ZW5zaW9uIiwiX2luaGVyaXRzTG9vc2UiLCJhcHBseSIsImFyZ3VtZW50cyIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwiX2JpbmRpbmdDb250ZXh0IiwiX21QYXJhbWV0ZXJzIiwiYmVmb3JlU2V0QmluZGluZ0NvbnRleHQiLCJiaW5kaW5nQ29udGV4dCIsIm9Sb3V0aW5nIiwiZ2V0Q29udHJvbGxlciIsInJvdXRpbmciLCJvbkFmdGVyQmluZGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsIm9uQ29udGV4dEJvdW5kVG9WaWV3IiwiYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dCIsImRlZmVycmVkQ3JlYXRpb24iLCJuYXZpZ2F0ZVRvVGFyZ2V0Iiwib0NvbnRleHQiLCJzTmF2aWdhdGlvblRhcmdldE5hbWUiLCJiUHJlc2VydmVIaXN0b3J5IiwiZGVsYXllZFVzYWdlIiwib05hdmlnYXRpb25Db25maWd1cmF0aW9uIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJvRGV0YWlsUm91dGUiLCJkZXRhaWwiLCJzUm91dGVOYW1lIiwicm91dGUiLCJtUGFyYW1ldGVyTWFwcGluZyIsInBhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvIiwiZ2V0SGFzaEZvck5hdmlnYXRpb24iLCJjb250ZXh0IiwibmF2aWdhdGlvblRhcmdldE5hbWUiLCJfdGhpcyRfb1BhZ2VDb21wb25lbnQiLCJuYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsImRldGFpbFJvdXRlIiwicm91dGVOYW1lIiwicGFyYW1ldGVyTWFwcGluZyIsImdldEhhc2hGcm9tUm91dGUiLCJuYXZpZ2F0ZVRvUm91dGUiLCJzVGFyZ2V0Um91dGVOYW1lIiwib1BhcmFtZXRlcnMiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImlzQSIsIl9wYXJhbWV0ZXJzJGNyZWF0ZU9uTiIsIl9wYXJhbWV0ZXJzJGNyZWF0ZU9uTjIiLCJjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycyIsIm1vZGUiLCJhY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24iLCJjcmVhdGVDb250ZXh0UHJvbWlzZSIsImNyZWF0ZWRDb250ZXh0IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsInBlcnNpc3RPUFNjcm9sbCIsInVwZGF0ZUZDTExldmVsIiwiZm9yY2VGb2N1cyIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiY2FsbEV4dGVuc2lvbiIsImludGVybmFsTW9kZWwiLCJnZXRNb2RlbCIsInNldFByb3BlcnR5Iiwib3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIlJvd1ByZXNzIiwibW9kZWwiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJpc1BhdGhPbkRyYWZ0Um9vdCIsImdldFBhdGgiLCJjb250ZXh0Rm9yTmF2aWdhdGlvbiIsImdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24iLCJnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbkZyb21UcmVlT3JBbmFseXRpY2FsVGFibGUiLCJnZXRWaWV3RGF0YSIsIm9yaWdpbmFsQ29udGV4dCIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRQcm9wZXJ0eSIsImRyYWZ0T3JBY3RpdmVDb250ZXh0IiwiZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQiLCJfb2JqZWN0UGF0aCR0YXJnZXRFbnQiLCJfb2JqZWN0UGF0aCR0YXJnZXRFbnQyIiwib2JqZWN0UGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwicmVkaXJlY3RlZFRvTm9uRHJhZnQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhlYWRlckluZm8iLCJUeXBlTmFtZSIsIm5hbWUiLCJpc0ZjbEVuYWJsZWQiLCJjb250ZXh0VG9SZXBsYWNlV2l0aCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXBsYWNlV2l0aCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwicGFyZW50QmluZGluZyIsImdldEJpbmRpbmciLCJhZ2dyZWdhdGlvbiIsImdldEFnZ3JlZ2F0aW9uIiwiaGllcmFyY2h5UXVhbGlmaWVyIiwiZ3JvdXAiLCJhZ2dyZWdhdGUiLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsIl90aGlzJF9vVmlldyRnZXRCaW5kaSIsImdldEJpbmRpbmdDb250ZXh0IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5jbHVkZXMiLCJuYXZCYWNrIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwic0Vycm9yTWVzc2FnZSIsIm1QYXJhbWV0ZXJzIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwic2V0VGltZW91dCIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImlzQ29ubmVjdGVkIiwiZGlzY29ubmVjdCIsIl9zZXRCaW5kaW5nQ29udGV4dCIsIl9idWlsZEJpbmRpbmdQYXRoIiwicm91dGVBcmd1bWVudHMiLCJiaW5kaW5nUGF0dGVybiIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwiX3JvdXRlQXJndW1lbnRzJFF1ZXIiLCJfcm91dGVBcmd1bWVudHMkUXVlciQiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImJBY3Rpb25DcmVhdGUiLCJvRXZlbnQiLCJfdGhpcyRfb1BhZ2VDb21wb25lbnQyIiwiX3RoaXMkX29QYWdlQ29tcG9uZW50MyIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJiaW5kUHJvbWlzZSIsIm9Nb2RlbCIsIl9iaW5kRGVmZXJyZWQiLCJFZGl0Rmxvd0FjdGlvbiIsImlzT3BlbkluRWRpdE1vZGUiLCJjYWxsIiwiX2JpbmRQYWdlRm9yRWRpdCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ0b1N0cmluZyIsInVwZGF0ZVVJU3RhdGVGb3JWaWV3IiwidGFyZ2V0UGF0aCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsIl9uYXZpZ2F0aW9uUGFyYW1ldGVycyIsIl9uYXZpZ2F0aW9uUGFyYW1ldGVyczIiLCJfbmF2aWdhdGlvblBhcmFtZXRlcnMzIiwibGlzdEJpbmRpbmciLCJwYXJlbnRDb250ZXh0IiwiZGF0YSIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIl9nZXRCaW5kaW5nQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwidGVjaG5pY2FsUGF0aCIsInJlc29sdmVQYXRoIiwiaXNTdGlja3lFZGl0TW9kZSIsImlzU3RpY2t5IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiYWN0aXZlQ29udGV4dCIsIl9jcmVhdGVDb250ZXh0IiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImtleVByb3BlcnR5IiwiZ2V0T2JqZWN0IiwicmVxdWVzdFByb3BlcnR5IiwiZWRpdEZsb3ciLCJlZGl0RG9jdW1lbnQiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsInNUYXJnZXRQYXRoIiwib0N1cnJlbnRDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJ1c2VDb250ZXh0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsInNob3VsZFJlZnJlc2hDb250ZXh0IiwiaXNEcmFmdFN1cHBvcnRlZCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0R3JvdXBJZCIsImVyciIsImJQZXJzaXN0T1BTY3JvbGwiLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwiQXBwU3RhdGVDaGFuZ2VkIiwiUmVzdG9yZUhpc3RvcnkiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0V4aXRpbmciLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCRncm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwiZGF0YU1vZGVsIiwiZ2V0Q29udGV4dCIsImFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMiLCJnZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwidGFyZ2V0RW50aXR5U2V0IiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0T2JqZWN0Iiwic01lc3NhZ2VzUGF0aCIsImdldE1lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJqb2luIiwiX3RoaXMkX29WaWV3JGdldEJpbmRpMiIsIm9QcmV2aW91c0JpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZGVzdHJveSIsIm9IaWRkZW5CaW5kaW5nIiwiYmluZENvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsIm9uRGF0YVJlY2VpdmVkIiwiZ2V0Qm91bmRDb250ZXh0IiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJfZXJyb3IkY2F1c2UiLCJtZXNzYWdlSGFuZGxlciIsIm1lc3NhZ2VIYW5kbGluZ0tleSIsInJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMiLCJtUGFyYW1zIiwiZXJyb3JTdGF0dXMiLCJzdGF0dXMiLCJjYXVzZSIsIm9SZXNvdXJjZUJ1bmRsZSIsImlzSW5pdGlhbExvYWQ1MDNFcnJvciIsInNoZWxsQmFjayIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidW5Ib2xkS2V5Iiwic2hvd01lc3NhZ2VzIiwib0JpbmRpbmdDb250ZXh0Iiwib1NpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiX29CaW5kaW5nJGdldENvbnRleHQiLCJhRGVwZW5kZW50QmluZGluZ3MiLCJzUmVsYXRpdmVQYXRoIiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsIml0ZW0iLCJwdXNoIiwiaSIsInJlZHVjZSIsInRhcmdldFByb3BlcnR5IiwiaW5kZXgiLCJpbmRleE9mIiwiX29QcmV2aW91c0NvbnRleHQiLCJvUHJldmlvdXNDb250ZXh0Iiwib1RhcmdldENvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzS2VlcEFsaXZlIiwiYktlZXBBbGl2ZSIsImZuQmVmb3JlRGVzdHJveSIsImJSZXF1ZXN0TWVzc2FnZXMiLCJlbmRzV2l0aCIsInNNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwic3BsaXQiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsIm9LZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwibGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsInNMYXlvdXQiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwibWVzc2FnZUhhbmRsaW5nIiwicmVtb3ZlVHJhbnNpc3Rpb25NZXNzYWdlRm9yQ29udGV4dCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJJbnRlcm5hbFJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQsIEVudGl0eVR5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyB0eXBlIE5hdmlnYXRpb25Ub0Vycm9yUGFnZVJlc3VsdCwgdHlwZSBTaG93TWVzc2FnZXNQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHsgZ2V0RHJhZnRPckFjdGl2ZUNvbnRleHQsIGlzUGF0aE9uRHJhZnRSb290LCByZXNvbHZlUGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL0NvbnRleHRQYXRoSGVscGVyXCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25JbmZvLCBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMsIFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ1RhcmdldCB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgeyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5cbnR5cGUgUm91dGVJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0cz86IHVua25vd25bXTtcblx0cm91dGVMZXZlbDogbnVtYmVyO1xufTtcbi8qKlxuICoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uIENvbnRyb2xsZXIgZXh0ZW5zaW9ufVxuICogQHNpbmNlIDEuNzQuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcIilcbmNsYXNzIEludGVybmFsUm91dGluZyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIF9vVmlldyE6IEZFVmlldztcblxuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgbnVsbDtcblxuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQhOiBGdW5jdGlvbjtcblxuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbiE6IFJvdXRpbmdUYXJnZXQ7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHR0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kID0gdGhpcy5fb25Sb3V0ZU1hdGNoZWQuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldykhID8/IHt9O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKTogdm9pZCB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk6IHZvaWQge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKF9iaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHt9XG5cblx0YmVmb3JlU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiB1bmtub3duKTogdm9pZCB7XG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcoYmluZGluZ0NvbnRleHQsIF9tUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dDogQ29udGV4dCB8IG51bGwsIF9tUGFyYW1ldGVycz86IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KGJpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdGFmdGVyU2V0QmluZGluZ0NvbnRleHQoYmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBfbVBhcmFtZXRlcnM/OiBvYmplY3QpOiB2b2lkIHtcblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKGJpbmRpbmdDb250ZXh0LCB7IC4uLl9tUGFyYW1ldGVycywgZGVmZXJyZWRDcmVhdGlvbjogdHJ1ZSB9KTtcblx0XHRjb25zdCBvUm91dGluZyA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhiaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEBwYXJhbSBkZWxheWVkVXNhZ2UgVHJ1ZSB0byByZXR1cm4gYSBmdW5jdGlvbiBmb3IgZXhlY3V0aW5nIHRoZSBuYXZpZ2F0aW9uLCBGYWxzZSB0byBleGVjdXRlIHRoZSBuYXZpZ2F0aW9uIGltbWVkaWF0ZWx5XG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvVGFyZ2V0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZTogc3RyaW5nLFxuXHRcdGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuLFxuXHRcdGRlbGF5ZWRVc2FnZT86IHRydWVcblx0KTogUHJvbWlzZTwoKSA9PiB2b2lkPjtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgbmF2aWdhdGVUb1RhcmdldChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyxcblx0XHRiUHJlc2VydmVIaXN0b3J5PzogYm9vbGVhbixcblx0XHRkZWxheWVkVXNhZ2U/OiBib29sZWFuXG5cdCk6IFByb21pc2U8KCgpID0+IHZvaWQpIHwgdm9pZD4ge1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiA9XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSk7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbikge1xuXHRcdFx0Y29uc3Qgb0RldGFpbFJvdXRlID0gb05hdmlnYXRpb25Db25maWd1cmF0aW9uLmRldGFpbDtcblx0XHRcdGNvbnN0IHNSb3V0ZU5hbWUgPSBvRGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyTWFwcGluZyA9IG9EZXRhaWxSb3V0ZS5wYXJhbWV0ZXJzO1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSwgZGVsYXllZFVzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5LCBkZWxheWVkVXNhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0by5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHJldHVybnMgVGhlIEhhc2ggd2UncmUgbmF2aWdhdGluZyB0b1xuXHQgKi9cblx0YXN5bmMgZ2V0SGFzaEZvck5hdmlnYXRpb24oY29udGV4dDogQ29udGV4dCwgbmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPSB0aGlzPy5fb1BhZ2VDb21wb25lbnQ/LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAobmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IGRldGFpbFJvdXRlID0gbmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgcm91dGVOYW1lID0gZGV0YWlsUm91dGUucm91dGU7XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJNYXBwaW5nID0gZGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0SGFzaEZyb21Sb3V0ZShjb250ZXh0LCByb3V0ZU5hbWUsIHBhcmFtZXRlck1hcHBpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldEhhc2hGcm9tUm91dGUoY29udGV4dCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gdGFyZ2V0IHJvdXRlLlxuXHQgKiBAcGFyYW0gc1RhcmdldFJvdXRlTmFtZSBOYW1lIG9mIHRoZSB0YXJnZXQgcm91dGVcblx0ICogQHBhcmFtIFtvUGFyYW1ldGVyc10gUGFyYW1ldGVycyB0byBiZSB1c2VkIHdpdGggcm91dGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgaGFzaFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBmaW5hbGl6ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgdG8gJ3RydWUnIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCAnZmFsc2UnIGlmIHRoZSBuYXZpZ2F0aW9uIGRpZCBub3QgaGFwcGVuXG5cdCAqL1xuXHRhc3luYyBuYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoY29udGV4dC5pc0E8T0RhdGFMaXN0QmluZGluZz4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM/Lm1vZGUgPT09IFwiQXN5bmNcIikge1xuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBlaXRoZXIgY3JlYXRlZCBhc3luYyAoUHJvbWlzZSlcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhY3RpdmF0ZSB0aGUgcm91dGVNYXRjaFN5bmNocm8gb24gdGhlIFJvdXRlclByb3h5IHRvIGF2b2lkIHRoYXRcblx0XHRcdFx0Ly8gdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBuYXZpZ2F0ZVRvQ29udGV4dCBjb25mbGljdHMgd2l0aCB0aGUgY3VycmVudCBvbmVcblx0XHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmFjdGl2YXRlUm91dGVNYXRjaFN5bmNocm9uaXphdGlvbigpO1xuXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnMuY3JlYXRlQ29udGV4dFByb21pc2Vcblx0XHRcdFx0XHQudGhlbihhc3luYyAoY3JlYXRlZENvbnRleHQpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQoY3JlYXRlZENvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHBhcmFtZXRlcnMuY2hlY2tOb0hhc2hDaGFuZ2UsXG5cdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiBwYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRwZXJzaXN0T1BTY3JvbGw6IHBhcmFtZXRlcnMucGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogcGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0Zm9yY2VGb2N1czogcGFyYW1ldGVycy5mb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5tb2RlICE9PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3Qgb3ZlcnJpZGVOYXYgPSBhd2FpdCB0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbih7IGJpbmRpbmdDb250ZXh0OiBjb250ZXh0IH0pO1xuXHRcdFx0aWYgKG92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgY29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHQvLyBJbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgZnJvbSBhIHRhYmxlIGluIGEgTGlzdFJlcG9ydCB3aXRoIGRyYWZ0LCB0aGVyZSdzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbGxhYm9yYXRpb24gYW5kIHRyZWUgdGFibGUuXG5cdFx0Ly8gV2UgbWF5IG5vdCBuYXZpZ2F0ZSB0byB0aGUgY29udGV4dCB0aGUgdXNlciBjbGlja2VkIG9uLlxuXHRcdGlmIChwYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcyAmJiBjb250ZXh0LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXG5cdFx0XHRpZiAoaXNQYXRoT25EcmFmdFJvb3QoY29udGV4dC5nZXRQYXRoKCksIG1ldGFNb2RlbCkpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEZvck5hdmlnYXRpb24gPVxuXHRcdFx0XHRcdChhd2FpdCB0aGlzLmdldENvbnRleHRGb3JOYXZpZ2F0aW9uV2l0aENvbGxhYm9yYXRpb24oY29udGV4dCwgcGFyYW1ldGVycykpID8/XG5cdFx0XHRcdFx0KGF3YWl0IHRoaXMuZ2V0Q29udGV4dEZvck5hdmlnYXRpb25Gcm9tVHJlZU9yQW5hbHl0aWNhbFRhYmxlKGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBVc2UgYW5vdGhlciBpbnN0YW5jZSBmb3IgbmF2aWdhdGlvblxuXHRcdFx0XHRpZiAoY29udGV4dEZvck5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dEZvck5hdmlnYXRpb247XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpbiBjYXNlIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uLlxuXHQgKiBAcGFyYW0gb3JpZ2luYWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHRvIHVzZSBmb3IgbmF2aWdhdGlvbiBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb250ZXh0LCBudWxsIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBnZXRDb250ZXh0Rm9yTmF2aWdhdGlvbldpdGhDb2xsYWJvcmF0aW9uKFxuXHRcdG9yaWdpbmFsQ29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0KTogUHJvbWlzZTxDb250ZXh0IHwgbnVsbD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gb3JpZ2luYWxDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0aWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkgJiYgb3JpZ2luYWxDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBJZiB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24sIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQgaW5zdGFuY2UgZnJvbSB0aGUgTFIsXG5cdFx0XHQvLyBXZSB3YW50IHRvIGNoZWNrIGlmIHRoZSBkcmFmdCBpbnN0YW5jZSBleGlzdHMgZmlyc3QuIE90aGVyd2lzZSB3ZSBuYXZpZ2F0ZSB0byB0aGUgb3JpZ2luYWwgKGRyYWZ0KSB2ZXJzaW9uLlxuXHRcdFx0Y29uc3QgZHJhZnRPckFjdGl2ZUNvbnRleHQgPSBhd2FpdCBnZXREcmFmdE9yQWN0aXZlQ29udGV4dChvcmlnaW5hbENvbnRleHQpO1xuXG5cdFx0XHRpZiAoZHJhZnRPckFjdGl2ZUNvbnRleHQgIT09IG51bGwgJiYgb3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSAhPT0gZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdC8vIE5vdGlmeSB0aGUgdXNlciB0aGF0IHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRoZSBzYXZlZCBpbnN0YW5jZVxuXHRcdFx0XHRjb25zdCBvYmplY3RQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvcmlnaW5hbENvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHRcdHBhcmFtZXRlcnMucmVkaXJlY3RlZFRvTm9uRHJhZnQgPVxuXHRcdFx0XHRcdChvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkhlYWRlckluZm8/LlR5cGVOYW1lIGFzIHVua25vd24gYXMgc3RyaW5nKSA/P1xuXHRcdFx0XHRcdG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYW1lO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gRkNMOiByZXBsYWNlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0VG9SZXBsYWNlV2l0aCA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRvcmlnaW5hbENvbnRleHQucmVwbGFjZVdpdGgoY29udGV4dFRvUmVwbGFjZVdpdGgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEZ1bGxzY3JlZW46IHRyaWdnZXIgYSByZWZyZXNoIG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVzZSB0aGUgc2F2ZWQgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0cmV0dXJuIGRyYWZ0T3JBY3RpdmVDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgY29udGV4dFxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY29udGV4dCB0byB1c2UgZm9yIG5hdmlnYXRpb24gaW4gY2FzZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGFuIGFjdGl2ZSBpbnN0YW5jZSBmcm9tIHRoZSBMUiBhbmQgd2UncmUgaW4gYSBUcmVlIG9yIEFuYWx5dGljYWwgdGFibGUuXG5cdCAqIEBwYXJhbSBvcmlnaW5hbENvbnRleHRcblx0ICogQHJldHVybnMgVGhlIGNvbnRleHQgdG8gdXNlIGZvciBuYXZpZ2F0aW9uIGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGNvbnRleHQsIG51bGwgb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGdldENvbnRleHRGb3JOYXZpZ2F0aW9uRnJvbVRyZWVPckFuYWx5dGljYWxUYWJsZShvcmlnaW5hbENvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPENvbnRleHQgfCBudWxsPiB7XG5cdFx0Y29uc3QgcGFyZW50QmluZGluZyA9IG9yaWdpbmFsQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0aWYgKCFwYXJlbnRCaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBUaGUgY29udGV4dCBkb2Vzbid0IGJlbG9uZyB0byBhIGxpc3QgYmluZGluZ1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uID0gcGFyZW50QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzXG5cdFx0XHR8IHsgaGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nOyBncm91cD86IG9iamVjdDsgYWdncmVnYXRlPzogb2JqZWN0IH1cblx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdGlmICghYWdncmVnYXRpb24/LmhpZXJhcmNoeVF1YWxpZmllciAmJiAhYWdncmVnYXRpb24/Lmdyb3VwICYmICFhZ2dyZWdhdGlvbj8uYWdncmVnYXRlKSB7XG5cdFx0XHQvLyBUaGUgY29udGV4dCBkb2Vzbid0IGJlbG9uZyB0byBhIGhpZXJhcmNoaWNhbC9hbmFseXRpY2FsIGxpc3QgYmluZGluZ1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKG9yaWdpbmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmIG9yaWdpbmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpID09PSB0cnVlKSB7XG5cdFx0XHQvLyBJZiB3ZSdyZSBpbiBhIFRyZWUvQW5hbHl0aWNhbCB0YWJsZSwgYW5kIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYW4gYWN0aXZlIGluc3RhbmNlIGluc3RhbmNlIHRoYXQgaGFzIGEgZHJhZnQsXG5cdFx0XHQvLyAtLT4gV2UgdHJ5IHRvIG5hdmlnYXRlIHRvIHRoZSBkcmFmdCBpbnN0YW5jZSAoaWYgaXQgc3RpbGwgZXhpc3RzKVxuXHRcdFx0Y29uc3QgZHJhZnRPckFjdGl2ZUNvbnRleHQgPSBhd2FpdCBnZXREcmFmdE9yQWN0aXZlQ29udGV4dChvcmlnaW5hbENvbnRleHQpO1xuXG5cdFx0XHRpZiAoZHJhZnRPckFjdGl2ZUNvbnRleHQgIT09IG51bGwgJiYgb3JpZ2luYWxDb250ZXh0LmdldFBhdGgoKSAhPT0gZHJhZnRPckFjdGl2ZUNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdC8vIFVzZSB0aGUgZHJhZnQgaW5zdGFuY2UgZm9yIG5hdmlnYXRpb25cblx0XHRcdFx0cmV0dXJuIGRyYWZ0T3JBY3RpdmVDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgY29udGV4dFxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrd2FyZHMgZnJvbSBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIGZyb21cblx0ICogQHBhcmFtIFtwYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoY29udGV4dDogQ29udGV4dCwgcGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRwYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChjb250ZXh0LCBwYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgZm9yd2FyZHMgdG8gYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKi9cblx0YXN5bmMgbmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGNvbnRleHQ6IENvbnRleHQgfCBPRGF0YUxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHR9XG5cblx0XHRwYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KGNvbnRleHQsIHBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrIGluIGhpc3RvcnkgaWYgdGhlIGN1cnJlbnQgaGFzaCBjb3JyZXNwb25kcyB0byBhIHRyYW5zaWVudCBzdGF0ZS5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKTogdm9pZCB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpO1xuXG5cdFx0Ly8gaWYgdHJpZ2dlcmVkIHdoaWxlIG5hdmlnYXRpbmcgdG8gKC4uLiksIHdlIG5lZWQgdG8gbmF2aWdhdGUgYmFja1xuXHRcdGlmIChzSGFzaC5pbmNsdWRlcyhcIiguLi4pXCIpKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkubmF2QmFjaygpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwbGF5cyBhbiBlcnJvciAoaWxsdXN0cmF0ZWQgbWVzc2FnZSkgaW4gdGhlIHBhZ2UuXG5cdCAqIEBwYXJhbSBzRXJyb3JNZXNzYWdlXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIG5hdmlnYXRlVG9NZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlOiBzdHJpbmcsIG1QYXJhbWV0ZXJzOiBOYXZpZ2F0aW9uVG9FcnJvclBhZ2VSZXN1bHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGlmICh0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluY2x1ZGVzKFwiaS1hY3Rpb249Y3JlYXRlXCIpIHx8IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1hdXRvQ3JlYXRlXCIpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvSGFzaCh0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0RGVmYXVsdENyZWF0ZUhhc2goKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmRpc3BsYXlFcnJvclBhZ2Uoc0Vycm9yTWVzc2FnZSwgbVBhcmFtZXRlcnMsIHRoaXMuX2dldEZDTExldmVsKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdGF0ZSBpcyBpbXBhY3RlZCBieSB0aGUgY29udGV4dFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdF9pc1ZpZXdQYXJ0T2ZSb3V0ZShyb3V0ZUluZm9ybWF0aW9uPzogUm91dGVJbmZvcm1hdGlvbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8ICFhVGFyZ2V0cy5pbmNsdWRlcyh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udGFyZ2V0TmFtZSkpIHtcblx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBoYXMgYSB2aWV3IGxldmVsIGdyZWF0ZXIgdGhhbiB0aGUgcm91dGUgbGV2ZWwsIGl0IG1lYW5zIHRoaXMgdmlldyBjb21lcyBcImFmdGVyXCIgdGhlIHJvdXRlXG5cdFx0XHQvLyBpbiB0ZXJtcyBvZiBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gSW4gc3VjaCBjYXNlLCB3ZSByZW1vdmUgaXRzIGJpbmRpbmcgY29udGV4dCwgdG8gYXZvaWQgdGhpcyB2aWV3IHRvIGhhdmUgZGF0YSBpZiB3ZSBuYXZpZ2F0ZSB0byBpdCBsYXRlciBvblxuXHRcdFx0Ly8gVGhpcyBpcyBkb25lIGluIGEgdGltZW91dCB0byBhbGxvdyBmb3IgZm9jdXNvdXQgZXZlbnRzIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgcHJvcGVybHkgaW4gY29sbGFib3JhdGl2ZSBkcmFmdFxuXHRcdFx0aWYgKCh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udmlld0xldmVsID8/IDApID49IChyb3V0ZUluZm9ybWF0aW9uPy5yb3V0ZUxldmVsID8/IDApKSB7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdGlmIChyb3V0ZUluZm9ybWF0aW9uPy5yb3V0ZUxldmVsID09PSAwICYmIHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHJvdXRlIGhhcyBsZXZlbCAwIC0tPiB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBjb2xsYWJvcmF0aW9uIHNlc3Npb24gYXMgbm8gT1AgaXMgZGlzcGxheWVkXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9idWlsZEJpbmRpbmdQYXRoKFxuXHRcdHJvdXRlQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+LFxuXHRcdGJpbmRpbmdQYXR0ZXJuOiBzdHJpbmcsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mb1xuXHQpOiB7IHBhdGg6IHN0cmluZzsgZGVmZXJyZWQ6IGJvb2xlYW4gfSB7XG5cdFx0bGV0IHBhdGggPSBiaW5kaW5nUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0bGV0IGRlZmVycmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gcm91dGVBcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IHJvdXRlQXJndW1lbnRzW3NLZXldO1xuXG5cdFx0XHRpZiAodHlwZW9mIHNWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBiaW5kaW5nUGF0dGVybi5pbmNsdWRlcyhgeyR7c0tleX19YCkpIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmICgocm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik/LltcImktYWN0aW9uXCJdPy5pbmNsdWRlcyhcImNyZWF0ZVwiKSkge1xuXHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgcGF0aCBpcyBhbHdheXMgYWJzb2x1dGVcblx0XHRpZiAocGF0aCAmJiBwYXRoWzBdICE9PSBcIi9cIikge1xuXHRcdFx0cGF0aCA9IGAvJHtwYXRofWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgcGF0aCwgZGVmZXJyZWQgfTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChcblx0XHRvRXZlbnQ6IEV2ZW50PHtcblx0XHRcdHJvdXRlSW5mb3JtYXRpb24/OiBSb3V0ZUluZm9ybWF0aW9uO1xuXHRcdFx0cm91dGVQYXR0ZXJuOiBzdHJpbmc7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbzogUm91dGluZ05hdmlnYXRpb25JbmZvO1xuXHRcdFx0YXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+O1xuXHRcdH0+XG5cdCk6IHZvaWQge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzIChpLmUuIGlzIGEgdGFyZ2V0IGZvciB0aGUgY3VycmVudCByb3V0ZSkuXG5cdFx0Ly8gSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGJpbmQgaXQgLS0+IHJldHVyblxuXHRcdGlmICghdGhpcy5faXNWaWV3UGFydE9mUm91dGUob0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IGJpbmRpbmdQYXR0ZXJuO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKCk7XG5cdFx0fVxuXHRcdGJpbmRpbmdQYXR0ZXJuID0gYmluZGluZ1BhdHRlcm4gfHwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKGJpbmRpbmdQYXR0ZXJuID09PSBudWxsIHx8IGJpbmRpbmdQYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpLmFyZ3VtZW50cztcblx0XHRjb25zdCBvTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmF2aWdhdGlvbkluZm9cIik7XG5cdFx0Y29uc3QgeyBwYXRoLCBkZWZlcnJlZCB9ID0gdGhpcy5fYnVpbGRCaW5kaW5nUGF0aChtQXJndW1lbnRzLCBiaW5kaW5nUGF0dGVybiwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblxuXHRcdHRoaXMub25Sb3V0ZU1hdGNoZWQoKTtcblxuXHRcdGxldCBiaW5kUHJvbWlzZTtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpO1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kRGVmZXJyZWQocGF0aCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbiAmJlxuXHRcdFx0KHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5jbHVkZXMoXCJpLWFjdGlvbj1lZGl0XCIpIHx8ICh0aGlzLl9vUGFnZUNvbXBvbmVudD8uaXNPcGVuSW5FZGl0TW9kZT8uKCkgPz8gZmFsc2UpKVxuXHRcdCkge1xuXHRcdFx0YmluZFByb21pc2UgPSB0aGlzLl9iaW5kUGFnZUZvckVkaXQocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRiaW5kUHJvbWlzZSA9IHRoaXMuX2JpbmRQYWdlKHBhdGgsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cblx0XHRiaW5kUHJvbWlzZVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGR1cmluZyBwYWdlIGJpbmRpbmcgXCIgKyBlcnJvci50b1N0cmluZygpKTtcblx0XHRcdH0pO1xuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS51cGRhdGVVSVN0YXRlRm9yVmlldyh0aGlzLl9vVmlldywgdGhpcy5fZ2V0RkNMTGV2ZWwoKSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmZXJyZWQgYmluZGluZyAoZHVyaW5nIG9iamVjdCBjcmVhdGlvbikuXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBkZWZmZXJlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBwcm9taXNlXG5cdCAqL1xuXHRhc3luYyBfYmluZERlZmVycmVkKHRhcmdldFBhdGg6IHN0cmluZywgbmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuYmVmb3JlU2V0QmluZGluZ0NvbnRleHQobnVsbCwgeyBlZGl0YWJsZTogbmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlIH0pO1xuXG5cdFx0aWYgKCFuYXZpZ2F0aW9uUGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycyB8fCBuYXZpZ2F0aW9uUGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycy5tb2RlID09PSBcIkRlZmVycmVkXCIpIHtcblx0XHRcdC8vIGVpdGhlciB0aGUgY29udGV4dCBzaGFsbCBiZSBjcmVhdGVkIGluIHRoZSB0YXJnZXQgcGFnZSAoZGVmZXJyZWQgQ29udGV4dCkgb3IgaXQgc2hhbGxcblx0XHRcdC8vIGJlIGNyZWF0ZWQgYXN5bmMgYnV0IHRoZSB1c2VyIHJlZnJlc2hlZCB0aGUgcGFnZSAvIGJvb2ttYXJrZWQgdGhpcyBVUkxcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGUgdGFyZ2V0IGNvbXBvbmVudCBjcmVhdGVzIHRoaXMgZG9jdW1lbnQgYnV0IHdlIHNoYWxsIG1vdmUgdGhpcyB0b1xuXHRcdFx0Ly8gYSBjZW50cmFsIHBsYWNlXG5cdFx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dChcblx0XHRcdFx0XHR0YXJnZXRQYXRoLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzPy5saXN0QmluZGluZyxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8ucGFyZW50Q29udGV4dCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5jcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycz8uZGF0YSxcblx0XHRcdFx0XHQhIW5hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmIChjdXJyZW50QmluZGluZ0NvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdC8vIEZvciBub3cgcmVtb3ZlIHRoZSBwZW5kaW5nIGNoYW5nZXMgdG8gYXZvaWQgdGhlIG1vZGVsIHJhaXNlcyBlcnJvcnMgYW5kIHRoZSBvYmplY3QgcGFnZSBpcyBhdCBsZWFzdCBib3VuZFxuXHRcdFx0Ly8gSWRlYWxseSB0aGUgdXNlciBzaG91bGQgYmUgYXNrZWQgZm9yXG5cdFx0XHRjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcGFnZSBmcm9tIGEgcGF0aCwgaWYgdGhlIGFwcCBpcyBzdGFydGVkIHdpdGggdGhlIHByZWZlcnJlZCBtb2RlIGVkaXQuXG5cdCAqXG5cdCAqIElmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhbiBhY3RpdmUgZW50aXR5LCBpdCBpcyBkaXJlY3RseSBjb252ZXJ0ZWQgdG8gZHJhZnQgdXNpbmcgdGhlIEVkaXRGbG93IGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aFxuXHQgKiBAcGFyYW0gbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBiaW5kaW5nIGhhcyBiZWVuIHNldCBvbiB0aGUgcGFnZVxuXHQgKi9cblx0YXN5bmMgX2JpbmRQYWdlRm9yRWRpdCh0YXJnZXRQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogUHJvbWlzZTx2b2lkIHwgQ29udGV4dD4ge1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB0ZWNobmljYWxQYXRoOiBzdHJpbmcgPSBhd2FpdCByZXNvbHZlUGF0aCh0YXJnZXRQYXRoLCBtb2RlbCwgdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLCB0aGlzLl9vUm91dGVyKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Ly8gY2hlY2sgZm9yIHN0aWNreSAmIHN0aWNreSBlZGl0IHNlc3Npb25cblx0XHRcdGNvbnN0IGlzU3RpY2t5RWRpdE1vZGUgPSBDb21tb25VdGlscy5pc1N0aWNreUVkaXRNb2RlKHRoaXMuYmFzZS5nZXRWaWV3KCkpO1xuXHRcdFx0Y29uc3QgaXNTdGlja3kgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQobWV0YU1vZGVsKTtcblx0XHRcdGlmICh0ZWNobmljYWxQYXRoLmluY2x1ZGVzKFwiSXNBY3RpdmVFbnRpdHk9dHJ1ZVwiKSB8fCAoaXNTdGlja3kgJiYgIWlzU3RpY2t5RWRpdE1vZGUpKSB7XG5cdFx0XHRcdC8vIGNyZWF0ZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IGFjdGl2ZUNvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KHRlY2huaWNhbFBhdGgsIG1vZGVsKTtcblx0XHRcdFx0aWYgKGlzU3RpY2t5KSB7XG5cdFx0XHRcdFx0Ly8gS2V5IG5lZWRzIHRvIGJlIGF2YWlsYWJsZSBmb3IgdGhlIGVkaXRpbmcgdG8gd29yayBpbiB0aGUgc3RpY2t5IHVzZSBjYXNlXG5cdFx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGVjaG5pY2FsUGF0aCk7XG5cdFx0XHRcdFx0Y29uc3Qga2V5UHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke21ldGFQYXRofS8kVHlwZS8kS2V5YCk7XG5cdFx0XHRcdFx0YXdhaXQgYWN0aXZlQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoa2V5UHJvcGVydHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIElzQWN0aXZlRW50aXR5IG5lZWRzIHRvIGJlIGF2YWlsYWJsZSBmb3IgdGhlIGVkaXRpbmcgdG8gd29yayBpbiB0aGUgZHJhZnQgdXNlIGNhc2Vcblx0XHRcdFx0XHRhd2FpdCBhY3RpdmVDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGVkaXQgZG9jdW1lbnRcblx0XHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5lZGl0RG9jdW1lbnQoYWN0aXZlQ29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fYmluZFBhZ2VUb1BhdGgodGVjaG5pY2FsUGF0aCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXG5cdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHR0aXRsZTogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgY29udGV4dFxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgb24gdGhlIHBhZ2UgaXMgc2V0XG5cdCAqL1xuXHRhc3luYyBfYmluZFBhZ2UodGFyZ2V0UGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXNvbHZlUGF0aCh0YXJnZXRQYXRoLCBtb2RlbCwgdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLCB0aGlzLl9vUm91dGVyKVxuXHRcdFx0LnRoZW4oKHRlY2huaWNhbFBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fYmluZFBhZ2VUb1BhdGgodGVjaG5pY2FsUGF0aCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdC8vIEVycm9yIGhhbmRsaW5nIGZvciBlcnJvbmVvdXMgbWV0YWRhdGEgcmVxdWVzdFxuXHRcdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHR0aXRsZTogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZm9yIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gYnVpbGQgdGhlIGNvbnRleHQgKHRoaXMgaXMgYSBwYXRoIGluIHRoZSBtb2RlbCwgc28gb25seSB0ZWNobmljYWwga2V5cyBhcmUgYWxsb3dlZCkuXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IHZvaWQge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpIHtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAhPT0gb0N1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGxldCBzaG91bGRSZWZyZXNoQ29udGV4dCA9IGZhbHNlO1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgRkNMLCBpZiB3ZSdyZSByZXVzaW5nIGEgY29udGV4dCBmcm9tIGEgdGFibGUgKHRocm91Z2ggbmF2aWdhdGlvbiksIHdlIHJlZnJlc2ggaXQgdG8gYXZvaWQgb3V0ZGF0ZWQgZGF0YVxuXHRcdFx0XHQvLyBXZSBkb24ndCB3YWl0IGZvciB0aGUgcmVmcmVzaCB0byBiZSBjb21wbGV0ZWQgKHJlcXVlc3RSZWZyZXNoKSwgc28gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBxdWVyeSBnb2VzIGludG8gdGhlIHNhbWVcblx0XHRcdFx0Ly8gYmF0Y2ggYXMgdGhlIG9uZXMgZnJvbSBjb250cm9scyBpbiB0aGUgcGFnZS5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgJiYgb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5Sb3dQcmVzcykge1xuXHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9Vc2VDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0aWYgKCFvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0c2hvdWxkUmVmcmVzaENvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgfHxcblx0XHRcdFx0XHRcdChNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgb1VzZUNvbnRleHQuZ2V0UGF0aCgpKSAmJlxuXHRcdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwpKVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBidXQgd2UncmUgaW4gY29sbGFib3JhdGlvbiBkcmFmdCwgd2UgZm9yY2UgdGhlIHJlZnJlc2ggKGRpc2NhcmRpbmcgcGVuZGluZyBjaGFuZ2VzKSBhcyB3ZSBuZWVkIHRvIGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuXHRcdFx0XHRcdFx0Ly8gV2hlbiBuYXZpZ2F0aW5nIGZyb20gTFIgdG8gT1AsIHRoZSB2aWV3IGlzIG5vdCBjb25uZWN0ZWQgeWV0IC0tPiBjaGVjayBpZiB3ZSdyZSBpbiBkcmFmdCB3aXRoIGNvbGxhYm9yYXRpb24gZnJvbSB0aGUgbWV0YW1vZGVsXG5cdFx0XHRcdFx0XHRvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRzaG91bGRSZWZyZXNoQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG9Vc2VDb250ZXh0LCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChzaG91bGRSZWZyZXNoQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgb1VzZUNvbnRleHQsIG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5nZXRHcm91cElkKCkpXG5cdFx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoYENhbm5vdCByZWZyZXNoIGNvbnRleHQ6ICR7ZXJyfWApO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbikge1xuXHRcdFx0XHQvLyBXZSBoYXZlIHRoZSBzYW1lIGNvbnRleHQgYnV0IGFuIGVkaXRmbG93IGFjdGlvbiBoYXBwZW5lZCAoZS5nLiBDYW5jZWxEb2N1bWVudCBpbiBzdGlja3kgbW9kZSlcblx0XHRcdFx0Ly8gLS0+IFdlIG5lZWQgdG8gY2FsbCBvbkJlZm9yZS9BZnRlckJpbmRpbmcgdG8gcmVmcmVzaCB0aGUgb2JqZWN0IHBhZ2UgcHJvcGVybHlcblx0XHRcdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChvVXNlQ29udGV4dCwge1xuXHRcdFx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nOiBvVXNlQ29udGV4dC5nZXRCaW5kaW5nKCksXG5cdFx0XHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0cmVhc29uOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMucmVhc29uLFxuXHRcdFx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChvVXNlQ29udGV4dCwgeyByZWRpcmVjdGVkVG9Ob25EcmFmdDogb05hdmlnYXRpb25QYXJhbWV0ZXJzPy5yZWRpcmVjdGVkVG9Ob25EcmFmdCB9KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHNDdXJyZW50UGF0aCAhPT0gc1RhcmdldFBhdGggfHwgb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiA9PT0gTmF2aWdhdGlvblJlYXNvbi5FZGl0Rmxvd0FjdGlvbikge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5BcHBTdGF0ZUNoYW5nZWQgJiZcblx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uUmVzdG9yZUhpc3RvcnkgJiZcblx0XHRcdEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkgJiZcblx0XHRcdCFvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRvQ3VycmVudENvbnRleHRcblx0XHQpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKTogdm9pZCB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5iZWZvcmVTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdHRoaXMuYWZ0ZXJTZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCAmJiAhdGhpcy5fb0FwcENvbXBvbmVudC5pc0V4aXRpbmcgJiYgb1Jvb3RWaWV3Q29udHJvbGxlci5pc0NvbnRleHRVc2VkSW5QYWdlcyhvQ29udGV4dCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR0cnVlIC8vIExvYWQgbWVzc2FnZXMsIG90aGVyd2lzZSB0aGV5IGRvbid0IGdldCByZWZyZXNoZWQgbGF0ZXIsIGUuZy4gZm9yIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRcdC8vIHNldEtlZXBBbGl2ZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJlbnQgbGlzdGJpbmRpbmcgZG9lc24ndCBoYXZlICQkb3duUmVxdWVzdD10cnVlXG5cdFx0XHRcdC8vIFRoaXMgY2FzZSBmb3IgY3VzdG9tIGZyYWdtZW50cyBpcyBzdXBwb3J0ZWQsIGJ1dCBhbiBlcnJvciBpcyBsb2dnZWQgdG8gbWFrZSB0aGUgbGFjayBvZiBzeW5jaHJvbml6YXRpb24gYXBwYXJlbnRcblx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdGBWaWV3IGZvciAke29Db250ZXh0LmdldFBhdGgoKX0gd29uJ3QgYmUgc3luY2hyb25pemVkLiBQYXJlbnQgbGlzdEJpbmRpbmcgbXVzdCBoYXZlIGJpbmRpbmcgcGFyYW1ldGVyICQkb3duUmVxdWVzdD10cnVlYFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIW9QYXJlbnRMaXN0QmluZGluZyB8fCBvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIGNvbnRleHQgb3RoZXJ3aXNlIHdlIGdldCBlcnJvcnNcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgd2l0aCB0aGUgcHJvcGVyIGJlZm9yZS9hZnRlciBjYWxsYmFja3Ncblx0XHR0aGlzLmJlZm9yZVNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdHJlYXNvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJTaG93UGxhY2Vob2xkZXJcblx0XHR9KTtcblxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblx0XHR0aGlzLmFmdGVyU2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqL1xuXHRfY3JlYXRlQ29udGV4dChzUGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBDb250ZXh0IHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtUGFyYW1ldGVyczogQmluZENvbnRleHRQYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIsXG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiLFxuXHRcdFx0XHQkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlXG5cdFx0XHR9O1xuXHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgKTtcblx0XHRjb25zdCBkYXRhTW9kZWwgPSBzQ29udGV4dFBhdGhcblx0XHRcdD8gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCkgJiYgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpKVxuXHRcdFx0OiBudWxsO1xuXHRcdGNvbnN0IGFsdGVybmF0ZUFuZFNlY29uZGFyeUtleXMgPSBNb2RlbEhlbHBlci5nZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzKFxuXHRcdFx0ZGF0YU1vZGVsPy50YXJnZXRFbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUsXG5cdFx0XHRkYXRhTW9kZWw/LnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXRcblx0XHQpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsLCBzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGtlZXBBbGl2ZSBjb250ZXh0ICR7c1BhdGh9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdG9EcmFmdFJvb3Rcblx0XHRcdFx0XHRcdFx0PyBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCIsIFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl1cblx0XHRcdFx0XHRcdFx0OiBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBzQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy4kc2VsZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gXCJIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ICs9IFwiLEhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoYWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cy5sZW5ndGgpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzLmpvaW4oXCIsXCIpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsXCIgKyBhbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzLmpvaW4oXCIsXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRjb25zdCBvUHJldmlvdXNCaW5kaW5nID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0QmluZGluZygpO1xuXHRcdFx0XHRpZiAob1ByZXZpb3VzQmluZGluZykge1xuXHRcdFx0XHRcdG9Nb2RlbC5yZXNldENoYW5nZXMob1ByZXZpb3VzQmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHRcdFx0XHRcdG9QcmV2aW91c0JpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9IaWRkZW5CaW5kaW5nID0gb01vZGVsLmJpbmRDb250ZXh0KHNQYXRoLCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlcXVlc3RlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLm9uRGF0YVJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBvbkRhdGFSZWNlaXZlZChvRXZlbnQ6IEV2ZW50PHsgZXJyb3I6IHsgc3RhdHVzPzogbnVtYmVyOyBjYXVzZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGVycm9yID0gb0V2ZW50Py5nZXRQYXJhbWV0ZXIoXCJlcnJvclwiKTtcblx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLl9vVmlldykpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cblx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdC8vIFRPRE86IGluIGNhc2Ugb2YgNDA0IHRoZSB0ZXh0IHNoYWxsIGJlIGRpZmZlcmVudFxuXHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxlci5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0XHRsZXQgbVBhcmFtczogU2hvd01lc3NhZ2VzUGFyYW1ldGVycyA9IHt9O1xuXHRcdFx0Y29uc3QgZXJyb3JTdGF0dXMgPSBlcnJvci5zdGF0dXMgPz8gZXJyb3IuY2F1c2U/LnN0YXR1cztcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdGlmIChlcnJvclN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoZXJyb3JTdGF0dXMgPT09IDQwMCkge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JfREVTQ1JJUFRJT05cIiksXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogSlNPTi5zdHJpbmdpZnkoZXJyb3IpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdG1QYXJhbXMudW5Ib2xkS2V5ID0gbWVzc2FnZUhhbmRsaW5nS2V5O1xuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHNpZGUgZWZmZWN0cyBvbiBhIGJpbmRpbmcgY29udGV4dCB0byBcInJlZnJlc2hcIiBpdC5cblx0ICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcHJvdmlkZWQgYnkgdGhlIG1vZGVsXG5cdCAqIGEgcmVmcmVzaCBvbiB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHdvcmsgaW4gY2FzZSBhIGNyZWF0aW9uIHJvdyB3aXRoIGEgdHJhbnNpZW50IGNvbnRleHQgaXNcblx0ICogdXNlZC4gYWxzbyBhIHJlcXVlc3RTaWRlRWZmZWN0cyB3aXRoIGFuIGVtcHR5IHBhdGggd291bGQgZmFpbCBkdWUgdG8gdGhlIHRyYW5zaWVudCBjb250ZXh0XG5cdCAqIHRoZXJlZm9yZSB3ZSBnZXQgYWxsIGRlcGVuZGVudCBiaW5kaW5ncyAodmlhIHByaXZhdGUgbW9kZWwgbWV0aG9kKSB0byBkZXRlcm1pbmUgYWxsIHBhdGhzIGFuZCB0aGVuXG5cdCAqIHJlcXVlc3QgdGhlbS5cblx0ICogQHBhcmFtIG9CaW5kaW5nQ29udGV4dCBDb250ZXh0IHRvIGJlIHJlZnJlc2hlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID1cblx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDtcblx0XHRjb25zdCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgYVByb3BlcnR5UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBbXVxuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmc6IEJpbmRpbmcpOiB2b2lkIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKG9CaW5kaW5nLmdldENvbnRleHQoKT8uZ2V0UGF0aCgpID8/IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBPE9EYXRhQ29udGV4dEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoaXRlbSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICghYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluY2x1ZGVzKHNQYXRoKSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0E8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmICghYVByb3BlcnR5UGF0aHMuaW5jbHVkZXMoc1BhdGgpKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNDb250ZXh0UGF0aCk7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZGluZyBvZiB0aGUgY29udGV4dCBtdXN0IGhhdmUgJCRQYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyB0cnVlLCB0aGlzIGJvdW5kIGNvbnRleHQgbWF5IGJlIG5lZWRlZCB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nXG5cdFx0Z2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpO1xuXG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzW2ldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydHlQYXRocztcblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHR9XG5cdFx0Ly9hbGwgdGhpcyBsb2dpYyB0byBiZSByZXBsYWNlZCB3aXRoIGEgU2lkZUVmZmVjdHMgcmVxdWVzdCBmb3IgYW4gZW1wdHkgcGF0aCAocmVmcmVzaCBldmVyeXRoaW5nKSwgYWZ0ZXIgdGVzdGluZyB0cmFuc2llbnQgY29udGV4dHNcblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnJlZHVjZSgodGFyZ2V0czogc3RyaW5nW10sIHRhcmdldFByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAodGFyZ2V0UHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSB0YXJnZXRQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0dGFyZ2V0cy5wdXNoKGluZGV4ID4gMCA/IHRhcmdldFByb3BlcnR5LnNsaWNlKDAsIGluZGV4KSA6IHRhcmdldFByb3BlcnR5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YXJnZXRzO1xuXHRcdH0sIFtdKTtcblx0XHQvLyBPRGF0YSBtb2RlbCB3aWxsIHRha2UgY2FyZSBvZiBkdXBsaWNhdGVzXG5cdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoWy4uLm9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcywgLi4ub1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXNdLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0X3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCk6IHZvaWQge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0fVxuXG5cdFx0b1RhcmdldENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0aWYgKG9QcmV2aW91c0NvbnRleHQ/LmlzS2VlcEFsaXZlKCkgJiYgb1ByZXZpb3VzQ29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShvUHJldmlvdXNDb250ZXh0LCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZsZXhpYmxlIGNvbHVtbiBsYXlvdXQgKEZDTCkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgdmlldyAoLTEgaWYgdGhlIGFwcCBpcyBub3QgRkNMKS5cblx0ICogQHJldHVybnMgVGhlIGxldmVsXG5cdCAqL1xuXHRfZ2V0RkNMTGV2ZWwoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLkZDTExldmVsO1xuXHR9XG5cblx0X3NldEtlZXBBbGl2ZShcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRiS2VlcEFsaXZlOiBib29sZWFuLFxuXHRcdGZuQmVmb3JlRGVzdHJveT86IFBhcmFtZXRlcnM8Q29udGV4dFtcInNldEtlZXBBbGl2ZVwiXT5bMV0sXG5cdFx0YlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0aWYgKG9Db250ZXh0LmdldFBhdGgoKS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdC8vIFdlIGtlZXAgdGhlIGNvbnRleHQgYWxpdmUgb25seSBpZiB0aGV5J3JlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCBpLmUuIGlmIHRoZSBwYXRoIGVuZHMgd2l0aCBhICcpJ1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCk7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoYktlZXBBbGl2ZSwgZm5CZWZvcmVEZXN0cm95LCAhIXNNZXNzYWdlc1BhdGggJiYgYlJlcXVlc3RNZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dldEtlZXBBbGl2ZUNvbnRleHQoXG5cdFx0b01vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdHBhdGg6IHN0cmluZyxcblx0XHRiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbixcblx0XHRwYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzXG5cdCk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEdldCB0aGUgcGF0aCBmb3IgdGhlIGNvbnRleHQgdGhhdCBpcyByZWFsbHkga2VwdCBhbGl2ZSAocGFydCBvZiBhIGNvbGxlY3Rpb24pXG5cdFx0Ly8gaS5lLiByZW1vdmUgYWxsIHNlZ21lbnRzIG5vdCBlbmRpbmcgd2l0aCBhICcpJ1xuXHRcdGNvbnN0IGtlcHRBbGl2ZVNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgYWRkaXRpb25uYWxTZWdtZW50czogc3RyaW5nW10gPSBbXTtcblx0XHR3aGlsZSAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoICYmICFrZXB0QWxpdmVTZWdtZW50c1trZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggLSAxXS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucHVzaChrZXB0QWxpdmVTZWdtZW50cy5wb3AoKSEpO1xuXHRcdH1cblxuXHRcdGlmIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2VwdEFsaXZlUGF0aCA9IGtlcHRBbGl2ZVNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdGNvbnN0IG9LZWVwQWxpdmVDb250ZXh0ID0gb01vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoa2VwdEFsaXZlUGF0aCwgYlJlcXVlc3RNZXNzYWdlcywgcGFyYW1ldGVycyk7XG5cblx0XHRpZiAoYWRkaXRpb25uYWxTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBvS2VlcEFsaXZlQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5yZXZlcnNlKCk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbm5hbFBhdGggPSBhZGRpdGlvbm5hbFNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0cmV0dXJuIG9Nb2RlbC5iaW5kQ29udGV4dChhZGRpdGlvbm5hbFBhdGgsIG9LZWVwQWxpdmVDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGwtc2NyZWVuIG1vZGUgd2hlbiBGQ0wgaXMgdXNlZC5cblx0ICpcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN3aXRjaEZ1bGxTY3JlZW4oKTogdm9pZCB7XG5cdFx0Y29uc3Qgb1NvdXJjZSA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ZDTEhlbHBlck1vZGVsID0gb1NvdXJjZS5nZXRNb2RlbChcImZjbGhlbHBlclwiKSxcblx0XHRcdGJJc0Z1bGxTY3JlZW4gPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vaXNGdWxsU2NyZWVuXCIpLFxuXHRcdFx0c05leHRMYXlvdXQgPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXG5cdFx0XHRcdGJJc0Z1bGxTY3JlZW4gPyBcIi9hY3Rpb25CdXR0b25zSW5mby9leGl0RnVsbFNjcmVlblwiIDogXCIvYWN0aW9uQnV0dG9uc0luZm8vZnVsbFNjcmVlblwiXG5cdFx0XHQpLFxuXHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRjb25zdCBvQ29udGV4dCA9IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHRcblx0XHRcdD8gKG9Sb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIVxuXHRcdFx0OiBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHR0aGlzLmJhc2UuX3JvdXRpbmcubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHsgbGF5b3V0OiBzTmV4dExheW91dCB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRMb2cud2FybmluZyhcImNhbm5vdCBzd2l0Y2ggYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGxzY3JlZW5cIik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIHRoZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50IHZpZXcgaW4gYSBGQ0wuXG5cdCAqXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQmVmb3JlKVxuXHRjbG9zZUNvbHVtbigpOiB2b2lkIHtcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBuYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUsXG5cdFx0XHRzTGF5b3V0OiB0aGlzLl9vVmlldy5nZXRNb2RlbChcImZjbGhlbHBlclwiKS5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9jbG9zZUNvbHVtblwiKVxuXHRcdH07XG5cblx0XHRpZiAob1ZpZXdEYXRhPy52aWV3TGV2ZWwgPT09IDEgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBvQ29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5fb1ZpZXcuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmVzIHRyYW5zaXRpb24gbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0XG5cdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVRyYW5zaXN0aW9uTWVzc2FnZUZvckNvbnRleHQob0NvbnRleHQpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF5Q0E7QUFDQTtBQUNBO0FBQ0E7RUFIQSxJQUtNQSxlQUFlLElBQUFDLElBQUEsR0FEcEJDLGNBQWMsQ0FBQyxrREFBa0QsQ0FBQyxFQUFBQyxLQUFBLEdBb0JqRUMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQU9oQkQsY0FBYyxDQUFDLENBQUMsRUFBQUUsS0FBQSxHQXFDaEJDLGVBQWUsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxFQUFBQyxLQUFBLEdBS25DTCxlQUFlLENBQUMsQ0FBQyxFQUFBTSxLQUFBLEdBQ2pCSixVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsRUFBQUcsS0FBQSxHQUtuQ1AsZUFBZSxDQUFDLENBQUMsRUFBQVEsS0FBQSxHQUNqQk4sVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLEVBQUFLLE1BQUEsR0FXbkNULGVBQWUsQ0FBQyxDQUFDLEVBQUFVLE1BQUEsR0FDakJSLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxFQUFBTyxNQUFBLEdBZ0NuQ1gs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