@sapui5/sap.fe.core 1.99.0 → 1.100.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 (246) hide show
  1. package/package.json +4 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +1 -69
  4. package/src/sap/fe/core/AnnotationHelper.ts +0 -70
  5. package/src/sap/fe/core/AppComponent.js +388 -399
  6. package/src/sap/fe/core/AppComponent.ts +403 -0
  7. package/src/sap/fe/core/AppStateHandler.js +127 -158
  8. package/src/sap/fe/core/BaseController.js +82 -58
  9. package/src/sap/fe/core/BaseController.ts +68 -0
  10. package/src/sap/fe/core/CommonUtils.js +111 -20
  11. package/src/sap/fe/core/CommonUtils.ts +131 -32
  12. package/src/sap/fe/core/ExtensionAPI.js +278 -274
  13. package/src/sap/fe/core/ExtensionAPI.ts +250 -0
  14. package/src/sap/fe/core/PageController.js +157 -29
  15. package/src/sap/fe/core/PageController.ts +60 -32
  16. package/src/sap/fe/core/RouterProxy.js +694 -756
  17. package/src/sap/fe/core/RouterProxy.ts +11 -9
  18. package/src/sap/fe/core/Synchronization.js +21 -31
  19. package/src/sap/fe/core/TemplateComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.ts +10 -3
  21. package/src/sap/fe/core/TemplateModel.js +20 -38
  22. package/src/sap/fe/core/TemplateModel.ts +1 -1
  23. package/src/sap/fe/core/TransactionHelper.js +1354 -1370
  24. package/src/sap/fe/core/TransactionHelper.ts +33 -22
  25. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
  26. package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
  27. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
  28. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
  29. package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
  30. package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
  31. package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
  32. package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
  33. package/src/sap/fe/core/actions/draft.js +30 -68
  34. package/src/sap/fe/core/actions/draft.ts +44 -71
  35. package/src/sap/fe/core/actions/messageHandling.js +55 -36
  36. package/src/sap/fe/core/actions/messageHandling.ts +66 -46
  37. package/src/sap/fe/core/actions/operations.js +34 -15
  38. package/src/sap/fe/core/actions/operations.ts +48 -18
  39. package/src/sap/fe/core/actions/sticky.js +17 -4
  40. package/src/sap/fe/core/actions/sticky.ts +21 -4
  41. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
  42. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
  43. package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
  44. package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
  45. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
  47. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
  48. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
  49. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
  50. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
  51. package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
  52. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
  53. package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
  54. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
  55. package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
  56. package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
  57. package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
  58. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
  59. package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
  60. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
  61. package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
  62. package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
  63. package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
  64. package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
  65. package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
  66. package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
  67. package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
  68. package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
  69. package/src/sap/fe/core/controllerextensions/Share.js +230 -268
  70. package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
  71. package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
  72. package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
  73. package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
  74. package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
  75. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
  76. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
  77. package/src/sap/fe/core/controls/CommandExecution.js +67 -66
  78. package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
  79. package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
  80. package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
  81. package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
  82. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
  83. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
  84. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
  85. package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
  86. package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
  87. package/src/sap/fe/core/controls/FilterBar.js +162 -159
  88. package/src/sap/fe/core/controls/FilterBar.ts +143 -0
  89. package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
  90. package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
  91. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
  92. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
  93. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
  94. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
  95. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
  96. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
  97. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
  98. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
  99. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
  100. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
  101. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
  102. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
  103. package/src/sap/fe/core/converters/ConverterContext.js +348 -379
  104. package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
  105. package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
  106. package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
  107. package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
  108. package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
  109. package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
  110. package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
  111. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  112. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
  113. package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
  114. package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
  115. package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
  116. package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
  117. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  118. package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
  119. package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
  120. package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
  121. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
  122. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
  123. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
  124. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
  125. package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
  126. package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
  127. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
  128. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
  129. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
  130. package/src/sap/fe/core/converters/helpers/Key.js +42 -57
  131. package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
  132. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
  133. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
  134. package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
  135. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
  136. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
  137. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
  138. package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
  139. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
  140. package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
  141. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
  142. package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
  143. package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
  144. package/src/sap/fe/core/fpm/Component.js +50 -54
  145. package/src/sap/fe/core/fpm/Component.ts +48 -0
  146. package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
  147. package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
  148. package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
  149. package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
  150. package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
  151. package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
  152. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
  153. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
  154. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  155. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  156. package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
  157. package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
  158. package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
  159. package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
  160. package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
  161. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
  162. package/src/sap/fe/core/library.js +426 -451
  163. package/src/sap/fe/core/library.support.js +22 -33
  164. package/src/sap/fe/core/library.support.ts +23 -0
  165. package/src/sap/fe/core/library.ts +420 -0
  166. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
  167. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
  168. package/src/sap/fe/core/messagebundle.properties +22 -5
  169. package/src/sap/fe/core/messagebundle_ar.properties +27 -7
  170. package/src/sap/fe/core/messagebundle_bg.properties +27 -7
  171. package/src/sap/fe/core/messagebundle_ca.properties +27 -7
  172. package/src/sap/fe/core/messagebundle_cs.properties +27 -7
  173. package/src/sap/fe/core/messagebundle_cy.properties +27 -7
  174. package/src/sap/fe/core/messagebundle_da.properties +27 -7
  175. package/src/sap/fe/core/messagebundle_de.properties +27 -7
  176. package/src/sap/fe/core/messagebundle_el.properties +27 -7
  177. package/src/sap/fe/core/messagebundle_en.properties +27 -7
  178. package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
  179. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
  180. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
  181. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
  182. package/src/sap/fe/core/messagebundle_es.properties +27 -7
  183. package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
  184. package/src/sap/fe/core/messagebundle_et.properties +27 -7
  185. package/src/sap/fe/core/messagebundle_fi.properties +28 -8
  186. package/src/sap/fe/core/messagebundle_fr.properties +28 -8
  187. package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
  188. package/src/sap/fe/core/messagebundle_hi.properties +27 -7
  189. package/src/sap/fe/core/messagebundle_hr.properties +27 -7
  190. package/src/sap/fe/core/messagebundle_hu.properties +27 -7
  191. package/src/sap/fe/core/messagebundle_id.properties +27 -7
  192. package/src/sap/fe/core/messagebundle_it.properties +27 -7
  193. package/src/sap/fe/core/messagebundle_iw.properties +27 -7
  194. package/src/sap/fe/core/messagebundle_ja.properties +26 -6
  195. package/src/sap/fe/core/messagebundle_kk.properties +27 -7
  196. package/src/sap/fe/core/messagebundle_ko.properties +27 -7
  197. package/src/sap/fe/core/messagebundle_lt.properties +27 -7
  198. package/src/sap/fe/core/messagebundle_lv.properties +28 -8
  199. package/src/sap/fe/core/messagebundle_ms.properties +27 -7
  200. package/src/sap/fe/core/messagebundle_nl.properties +27 -7
  201. package/src/sap/fe/core/messagebundle_no.properties +27 -7
  202. package/src/sap/fe/core/messagebundle_pl.properties +27 -7
  203. package/src/sap/fe/core/messagebundle_pt.properties +28 -8
  204. package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
  205. package/src/sap/fe/core/messagebundle_ro.properties +27 -7
  206. package/src/sap/fe/core/messagebundle_ru.properties +27 -7
  207. package/src/sap/fe/core/messagebundle_sh.properties +27 -7
  208. package/src/sap/fe/core/messagebundle_sk.properties +27 -7
  209. package/src/sap/fe/core/messagebundle_sl.properties +27 -7
  210. package/src/sap/fe/core/messagebundle_sv.properties +27 -7
  211. package/src/sap/fe/core/messagebundle_th.properties +26 -6
  212. package/src/sap/fe/core/messagebundle_tr.properties +30 -10
  213. package/src/sap/fe/core/messagebundle_uk.properties +27 -7
  214. package/src/sap/fe/core/messagebundle_vi.properties +27 -7
  215. package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
  216. package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
  217. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
  218. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
  219. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
  220. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
  221. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
  222. package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
  223. package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
  224. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
  225. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
  226. package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
  227. package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
  228. package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
  229. package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
  230. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
  231. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
  232. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
  233. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
  234. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  235. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  236. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  237. package/src/sap/fe/core/support/CommonHelper.ts +1 -1
  238. package/src/sap/fe/core/support/Diagnostics.js +36 -48
  239. package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
  240. package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
  241. package/src/sap/fe/core/templating/FilterHelper.js +25 -32
  242. package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
  243. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  244. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  245. package/src/sap/fe/core/templating/UIFormatters.js +32 -26
  246. package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
@@ -12,26 +12,10 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
12
12
  var Override = ClassSupport.Override;
13
13
  var UI5Class = ClassSupport.UI5Class;
14
14
 
15
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
16
-
17
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
18
-
19
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
20
-
21
15
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
22
16
 
23
17
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
24
18
 
25
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
26
-
27
- function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
28
-
29
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
30
-
31
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
32
-
33
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
34
-
35
19
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
36
20
 
37
21
  var MessageTypeFromCriticality = {
@@ -578,592 +562,574 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
578
562
  var KPIManagementControllerExtension = (_dec = UI5Class("sap.fe.core.controllerextensions.KPIManagement", ControllerExtensionMetadata), _dec2 = Override(), _dec3 = Override(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
579
563
  _inherits(KPIManagementControllerExtension, _ControllerExtension);
580
564
 
581
- var _super = _createSuper(KPIManagementControllerExtension);
582
-
583
565
  function KPIManagementControllerExtension() {
584
- _classCallCheck(this, KPIManagementControllerExtension);
585
-
586
- return _super.apply(this, arguments);
566
+ return _ControllerExtension.apply(this, arguments) || this;
587
567
  }
588
568
 
589
- _createClass(KPIManagementControllerExtension, [{
590
- key: "initCardManifest",
591
- value:
592
- /**
593
- * Creates the card manifest for a KPI definition and stores it in a JSON model.
594
- *
595
- * @param kpiDefinition The KPI definition
596
- * @param oKPIModel The JSON model in which the manifest will be stored
597
- */
598
- function initCardManifest(kpiDefinition, oKPIModel) {
599
- var _kpiDefinition$select;
600
-
601
- var oCardManifest = {
602
- "sap.app": {
603
- id: "sap.fe",
604
- type: "card"
569
+ var _proto = KPIManagementControllerExtension.prototype;
570
+
571
+ /**
572
+ * Creates the card manifest for a KPI definition and stores it in a JSON model.
573
+ *
574
+ * @param kpiDefinition The KPI definition
575
+ * @param oKPIModel The JSON model in which the manifest will be stored
576
+ */
577
+ _proto.initCardManifest = function initCardManifest(kpiDefinition, oKPIModel) {
578
+ var _kpiDefinition$select;
579
+
580
+ var oCardManifest = {
581
+ "sap.app": {
582
+ id: "sap.fe",
583
+ type: "card"
584
+ },
585
+ "sap.ui": {
586
+ technology: "UI5"
587
+ },
588
+ "sap.card": {
589
+ type: "Analytical",
590
+ data: {
591
+ json: {}
605
592
  },
606
- "sap.ui": {
607
- technology: "UI5"
593
+ header: {
594
+ type: "Numeric",
595
+ title: kpiDefinition.datapoint.title,
596
+ subTitle: kpiDefinition.datapoint.description,
597
+ unitOfMeasurement: "{mainUnit}",
598
+ mainIndicator: {
599
+ number: "{mainValueNoScale}",
600
+ unit: "{mainValueScale}",
601
+ state: "{mainState}",
602
+ trend: "{trend}"
603
+ }
608
604
  },
609
- "sap.card": {
610
- type: "Analytical",
611
- data: {
612
- json: {}
613
- },
614
- header: {
615
- type: "Numeric",
616
- title: kpiDefinition.datapoint.title,
617
- subTitle: kpiDefinition.datapoint.description,
618
- unitOfMeasurement: "{mainUnit}",
619
- mainIndicator: {
620
- number: "{mainValueNoScale}",
621
- unit: "{mainValueScale}",
622
- state: "{mainState}",
623
- trend: "{trend}"
605
+ content: {
606
+ minHeight: "25rem",
607
+ chartProperties: {
608
+ plotArea: {},
609
+ title: {
610
+ visible: true,
611
+ alignment: "left"
624
612
  }
625
613
  },
626
- content: {
627
- minHeight: "25rem",
628
- chartProperties: {
629
- plotArea: {},
630
- title: {
631
- visible: true,
632
- alignment: "left"
633
- }
634
- },
635
- data: {
636
- path: "/chartData"
637
- }
614
+ data: {
615
+ path: "/chartData"
638
616
  }
639
617
  }
640
- }; // Add side indicators in the card header if a target is defined for the KPI
641
-
642
- if (kpiDefinition.datapoint.targetPath || kpiDefinition.datapoint.targetValue !== undefined) {
643
- var resBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
644
- oCardManifest["sap.card"].header.sideIndicators = [{
645
- title: resBundle.getText("C_KPICARD_INDICATOR_TARGET"),
646
- number: "{targetNumber}",
647
- unit: "{targetUnit}"
648
- }, {
649
- title: resBundle.getText("C_KPICARD_INDICATOR_DEVIATION"),
650
- number: "{deviationNumber}",
651
- unit: "%"
652
- }];
653
- } // Details of the card: filter descriptions
654
-
655
-
656
- if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select !== void 0 && _kpiDefinition$select.length) {
657
- var aDescriptions = [];
658
- kpiDefinition.selectionVariantFilterDefinitions.forEach(function (filterDefinition) {
659
- var desc = getFilterStringFromDefinition(filterDefinition);
660
-
661
- if (desc) {
662
- aDescriptions.push(desc);
663
- }
664
- });
618
+ }
619
+ }; // Add side indicators in the card header if a target is defined for the KPI
620
+
621
+ if (kpiDefinition.datapoint.targetPath || kpiDefinition.datapoint.targetValue !== undefined) {
622
+ var resBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
623
+ oCardManifest["sap.card"].header.sideIndicators = [{
624
+ title: resBundle.getText("C_KPICARD_INDICATOR_TARGET"),
625
+ number: "{targetNumber}",
626
+ unit: "{targetUnit}"
627
+ }, {
628
+ title: resBundle.getText("C_KPICARD_INDICATOR_DEVIATION"),
629
+ number: "{deviationNumber}",
630
+ unit: "%"
631
+ }];
632
+ } // Details of the card: filter descriptions
665
633
 
666
- if (aDescriptions.length) {
667
- oCardManifest["sap.card"].header.details = aDescriptions.join(", ");
668
- }
669
- } // Chart settings: type, title, dimensions and measures in the manifest
670
634
 
635
+ if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select !== void 0 && _kpiDefinition$select.length) {
636
+ var aDescriptions = [];
637
+ kpiDefinition.selectionVariantFilterDefinitions.forEach(function (filterDefinition) {
638
+ var desc = getFilterStringFromDefinition(filterDefinition);
671
639
 
672
- oCardManifest["sap.card"].content.chartType = kpiDefinition.chart.chartType;
673
- updateChartLabelSettings(kpiDefinition.chart, oCardManifest["sap.card"].content.chartProperties);
674
- oCardManifest["sap.card"].content.chartProperties.title.text = formatChartTitle(kpiDefinition);
675
- oCardManifest["sap.card"].content.dimensions = kpiDefinition.chart.dimensions.map(function (dimension) {
676
- return {
677
- label: dimension.label,
678
- value: "{" + dimension.name + "}"
679
- };
680
- });
681
- oCardManifest["sap.card"].content.measures = kpiDefinition.chart.measures.map(function (measure) {
682
- return {
683
- label: measure.label,
684
- value: "{" + measure.name + "}"
685
- };
686
- });
687
- oCardManifest["sap.card"].content.feeds = getChartFeeds(kpiDefinition.chart);
688
- oKPIModel.setProperty("/" + kpiDefinition.id, {
689
- manifest: oCardManifest
640
+ if (desc) {
641
+ aDescriptions.push(desc);
642
+ }
690
643
  });
691
- }
692
- }, {
693
- key: "initNavigationInfo",
694
- value: function initNavigationInfo(kpiDefinition, oKPIModel, oShellService) {
695
- // Add navigation
696
- if (kpiDefinition.navigation) {
697
- return getNavigationParameters(kpiDefinition.navigation, oShellService).then(function (oNavInfo) {
698
- if (oNavInfo) {
699
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/header/actions", [{
700
- type: "Navigation",
701
- parameters: oNavInfo
702
- }]);
703
- }
704
- });
705
- } else {
706
- return Promise.resolve();
644
+
645
+ if (aDescriptions.length) {
646
+ oCardManifest["sap.card"].header.details = aDescriptions.join(", ");
707
647
  }
648
+ } // Chart settings: type, title, dimensions and measures in the manifest
649
+
650
+
651
+ oCardManifest["sap.card"].content.chartType = kpiDefinition.chart.chartType;
652
+ updateChartLabelSettings(kpiDefinition.chart, oCardManifest["sap.card"].content.chartProperties);
653
+ oCardManifest["sap.card"].content.chartProperties.title.text = formatChartTitle(kpiDefinition);
654
+ oCardManifest["sap.card"].content.dimensions = kpiDefinition.chart.dimensions.map(function (dimension) {
655
+ return {
656
+ label: dimension.label,
657
+ value: "{" + dimension.name + "}"
658
+ };
659
+ });
660
+ oCardManifest["sap.card"].content.measures = kpiDefinition.chart.measures.map(function (measure) {
661
+ return {
662
+ label: measure.label,
663
+ value: "{" + measure.name + "}"
664
+ };
665
+ });
666
+ oCardManifest["sap.card"].content.feeds = getChartFeeds(kpiDefinition.chart);
667
+ oKPIModel.setProperty("/" + kpiDefinition.id, {
668
+ manifest: oCardManifest
669
+ });
670
+ };
671
+
672
+ _proto.initNavigationInfo = function initNavigationInfo(kpiDefinition, oKPIModel, oShellService) {
673
+ // Add navigation
674
+ if (kpiDefinition.navigation) {
675
+ return getNavigationParameters(kpiDefinition.navigation, oShellService).then(function (oNavInfo) {
676
+ if (oNavInfo) {
677
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/header/actions", [{
678
+ type: "Navigation",
679
+ parameters: oNavInfo
680
+ }]);
681
+ }
682
+ });
683
+ } else {
684
+ return Promise.resolve();
708
685
  }
709
- }, {
710
- key: "onInit",
711
- value: function onInit() {
712
- var _this = this;
686
+ };
713
687
 
714
- this.aKPIDefinitions = this.getKPIData();
688
+ _proto.onInit = function onInit() {
689
+ var _this = this;
715
690
 
716
- if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
717
- var oView = this.getView();
718
- var oAppComponent = oView.getController().getAppComponent(); // Create a JSON model to store KPI data
691
+ this.aKPIDefinitions = this.getKPIData();
719
692
 
720
- var oKPIModel = new JSONModel();
721
- oView.setModel(oKPIModel, "kpiModel");
722
- this.aKPIDefinitions.forEach(function (kpiDefinition) {
723
- // Create the manifest for the KPI card and store it in the KPI model
724
- _this.initCardManifest(kpiDefinition, oKPIModel); // Set the navigation information in the manifest
693
+ if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
694
+ var oView = this.getView();
695
+ var oAppComponent = oView.getController().getAppComponent(); // Create a JSON model to store KPI data
725
696
 
697
+ var oKPIModel = new JSONModel();
698
+ oView.setModel(oKPIModel, "kpiModel");
699
+ this.aKPIDefinitions.forEach(function (kpiDefinition) {
700
+ // Create the manifest for the KPI card and store it in the KPI model
701
+ _this.initCardManifest(kpiDefinition, oKPIModel); // Set the navigation information in the manifest
726
702
 
727
- _this.initNavigationInfo(kpiDefinition, oKPIModel, oAppComponent.getShellServices()).catch(function (err) {
728
- Log.error(err);
729
- }); // Load tag data for the KPI
730
703
 
704
+ _this.initNavigationInfo(kpiDefinition, oKPIModel, oAppComponent.getShellServices()).catch(function (err) {
705
+ Log.error(err);
706
+ }); // Load tag data for the KPI
731
707
 
732
- _this.loadKPITagData(kpiDefinition, oAppComponent.getModel(), oKPIModel).catch(function (err) {
733
- Log.error(err);
734
- });
708
+
709
+ _this.loadKPITagData(kpiDefinition, oAppComponent.getModel(), oKPIModel).catch(function (err) {
710
+ Log.error(err);
735
711
  });
736
- }
712
+ });
737
713
  }
738
- }, {
739
- key: "onExit",
740
- value: function onExit() {
741
- var oKPIModel = this.getView().getModel("kpiModel");
714
+ };
742
715
 
743
- if (oKPIModel) {
744
- oKPIModel.destroy();
745
- }
716
+ _proto.onExit = function onExit() {
717
+ var oKPIModel = this.getView().getModel("kpiModel");
718
+
719
+ if (oKPIModel) {
720
+ oKPIModel.destroy();
746
721
  }
747
- }, {
748
- key: "getKPIData",
749
- value: function getKPIData() {
750
- var oView = this.getView(),
751
- sCustomData = oView.getContent()[0].data("KPIData");
722
+ };
752
723
 
753
- if (sCustomData) {
754
- var vData = typeof sCustomData === "string" ? JSON.parse(sCustomData) : sCustomData;
724
+ _proto.getKPIData = function getKPIData() {
725
+ var oView = this.getView(),
726
+ sCustomData = oView.getContent()[0].data("KPIData");
755
727
 
756
- if ("customData" in vData) {
757
- return vData["customData"];
758
- } else {
759
- return vData;
760
- }
728
+ if (sCustomData) {
729
+ var vData = typeof sCustomData === "string" ? JSON.parse(sCustomData) : sCustomData;
730
+
731
+ if ("customData" in vData) {
732
+ return vData["customData"];
761
733
  } else {
762
- return undefined;
734
+ return vData;
763
735
  }
736
+ } else {
737
+ return undefined;
764
738
  }
765
- }, {
766
- key: "updateDatapointValueAndCurrency",
767
- value: function updateDatapointValueAndCurrency(kpiDefinition, kpiContext, oKPIModel) {
768
- var _kpiDefinition$datapo, _kpiDefinition$datapo2, _kpiDefinition$datapo3;
769
-
770
- var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
771
- var rawUnit = (_kpiDefinition$datapo = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo !== void 0 && _kpiDefinition$datapo.isPath ? kpiContext.getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo2 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo2 === void 0 ? void 0 : _kpiDefinition$datapo2.value;
772
- var isPercentage = ((_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.isCurrency) === false && rawUnit === "%"; // /////////////////////
773
- // Main KPI value
774
-
775
- var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath)); // Value formatted with a scale
776
-
777
- var kpiValue = NumberFormat.getFloatInstance({
778
- style: isPercentage ? undefined : "short",
779
- minFractionDigits: 0,
780
- maxFractionDigits: 1,
781
- showScale: !isPercentage
782
- }, currentLocale).format(rawValue);
783
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", kpiValue); // Value without a scale
784
-
785
- var kpiValueUnscaled = NumberFormat.getFloatInstance({
786
- maxFractionDigits: 2,
787
- showScale: false,
788
- groupingEnabled: true
789
- }, currentLocale).format(rawValue);
790
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", kpiValueUnscaled); // Value formatted with the scale omitted
791
-
792
- var kpiValueNoScale = NumberFormat.getFloatInstance({
793
- style: isPercentage ? undefined : "short",
794
- minFractionDigits: 0,
795
- maxFractionDigits: 1,
796
- showScale: false
797
- }, currentLocale).format(rawValue);
798
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueNoScale", kpiValueNoScale); // Scale of the value
799
-
800
- var kpiValueScale = NumberFormat.getFloatInstance({
801
- style: isPercentage ? undefined : "short",
802
- decimals: 0,
803
- maxIntegerDigits: 0,
804
- showScale: true
805
- }, currentLocale).format(rawValue);
806
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueScale", kpiValueScale); // /////////////////////
807
- // Unit or currency
808
-
809
- if (kpiDefinition.datapoint.unit && rawUnit) {
810
- if (kpiDefinition.datapoint.unit.isCurrency) {
811
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", rawUnit);
812
- } else {
813
- // In case of unit of measure, we have to format it properly
814
- var kpiUnit = NumberFormat.getUnitInstance({
815
- showNumber: false
816
- }, currentLocale).format(rawValue, rawUnit);
817
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", kpiUnit);
818
- }
739
+ };
740
+
741
+ _proto.updateDatapointValueAndCurrency = function updateDatapointValueAndCurrency(kpiDefinition, kpiContext, oKPIModel) {
742
+ var _kpiDefinition$datapo, _kpiDefinition$datapo2, _kpiDefinition$datapo3;
743
+
744
+ var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
745
+ var rawUnit = (_kpiDefinition$datapo = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo !== void 0 && _kpiDefinition$datapo.isPath ? kpiContext.getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo2 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo2 === void 0 ? void 0 : _kpiDefinition$datapo2.value;
746
+ var isPercentage = ((_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.isCurrency) === false && rawUnit === "%"; // /////////////////////
747
+ // Main KPI value
748
+
749
+ var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath)); // Value formatted with a scale
750
+
751
+ var kpiValue = NumberFormat.getFloatInstance({
752
+ style: isPercentage ? undefined : "short",
753
+ minFractionDigits: 0,
754
+ maxFractionDigits: 1,
755
+ showScale: !isPercentage
756
+ }, currentLocale).format(rawValue);
757
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", kpiValue); // Value without a scale
758
+
759
+ var kpiValueUnscaled = NumberFormat.getFloatInstance({
760
+ maxFractionDigits: 2,
761
+ showScale: false,
762
+ groupingEnabled: true
763
+ }, currentLocale).format(rawValue);
764
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", kpiValueUnscaled); // Value formatted with the scale omitted
765
+
766
+ var kpiValueNoScale = NumberFormat.getFloatInstance({
767
+ style: isPercentage ? undefined : "short",
768
+ minFractionDigits: 0,
769
+ maxFractionDigits: 1,
770
+ showScale: false
771
+ }, currentLocale).format(rawValue);
772
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueNoScale", kpiValueNoScale); // Scale of the value
773
+
774
+ var kpiValueScale = NumberFormat.getFloatInstance({
775
+ style: isPercentage ? undefined : "short",
776
+ decimals: 0,
777
+ maxIntegerDigits: 0,
778
+ showScale: true
779
+ }, currentLocale).format(rawValue);
780
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueScale", kpiValueScale); // /////////////////////
781
+ // Unit or currency
782
+
783
+ if (kpiDefinition.datapoint.unit && rawUnit) {
784
+ if (kpiDefinition.datapoint.unit.isCurrency) {
785
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", rawUnit);
786
+ } else {
787
+ // In case of unit of measure, we have to format it properly
788
+ var kpiUnit = NumberFormat.getUnitInstance({
789
+ showNumber: false
790
+ }, currentLocale).format(rawValue, rawUnit);
791
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", kpiUnit);
819
792
  }
820
793
  }
821
- }, {
822
- key: "updateDatapointCriticality",
823
- value: function updateDatapointCriticality(kpiDefinition, kpiContext, oKPIModel) {
824
- var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
825
- var criticalityValue = MessageType.None;
826
-
827
- if (kpiDefinition.datapoint.criticalityValue) {
828
- // Criticality is a fixed value
829
- criticalityValue = kpiDefinition.datapoint.criticalityValue;
830
- } else if (kpiDefinition.datapoint.criticalityPath) {
831
- // Criticality comes from another property (via a path)
832
- criticalityValue = MessageTypeFromCriticality[kpiContext.getProperty(kpiDefinition.datapoint.criticalityPath)] || MessageType.None;
833
- } else if (kpiDefinition.datapoint.criticalityCalculationThresholds && kpiDefinition.datapoint.criticalityCalculationMode) {
834
- // Criticality calculation
835
- switch (kpiDefinition.datapoint.criticalityCalculationMode) {
836
- case "UI.ImprovementDirectionType/Target":
837
- criticalityValue = messageTypeFromTargetCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
838
- break;
839
-
840
- case "UI.ImprovementDirectionType/Minimize":
841
- criticalityValue = messageTypeFromMinimizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
842
- break;
843
-
844
- case "UI.ImprovementDirectionType/Maximize":
845
- default:
846
- criticalityValue = messageTypeFromMaximizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
847
- break;
848
- }
794
+ };
795
+
796
+ _proto.updateDatapointCriticality = function updateDatapointCriticality(kpiDefinition, kpiContext, oKPIModel) {
797
+ var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
798
+ var criticalityValue = MessageType.None;
799
+
800
+ if (kpiDefinition.datapoint.criticalityValue) {
801
+ // Criticality is a fixed value
802
+ criticalityValue = kpiDefinition.datapoint.criticalityValue;
803
+ } else if (kpiDefinition.datapoint.criticalityPath) {
804
+ // Criticality comes from another property (via a path)
805
+ criticalityValue = MessageTypeFromCriticality[kpiContext.getProperty(kpiDefinition.datapoint.criticalityPath)] || MessageType.None;
806
+ } else if (kpiDefinition.datapoint.criticalityCalculationThresholds && kpiDefinition.datapoint.criticalityCalculationMode) {
807
+ // Criticality calculation
808
+ switch (kpiDefinition.datapoint.criticalityCalculationMode) {
809
+ case "UI.ImprovementDirectionType/Target":
810
+ criticalityValue = messageTypeFromTargetCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
811
+ break;
812
+
813
+ case "UI.ImprovementDirectionType/Minimize":
814
+ criticalityValue = messageTypeFromMinimizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
815
+ break;
816
+
817
+ case "UI.ImprovementDirectionType/Maximize":
818
+ default:
819
+ criticalityValue = messageTypeFromMaximizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
820
+ break;
849
821
  }
850
-
851
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", criticalityValue);
852
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainState", ValueColorFromMessageType[criticalityValue] || "None");
853
822
  }
854
- }, {
855
- key: "updateDatapointTrend",
856
- value: function updateDatapointTrend(kpiDefinition, kpiContext, oKPIModel) {
857
- var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
858
- var trendValue = "None";
859
-
860
- if (kpiDefinition.datapoint.trendValue) {
861
- // Trend is a fixed value
862
- trendValue = kpiDefinition.datapoint.trendValue;
863
- } else if (kpiDefinition.datapoint.trendPath) {
864
- // Trend comes from another property via a path
865
- trendValue = deviationIndicatorFromTrendType(kpiContext.getProperty(kpiDefinition.datapoint.trendPath));
866
- } else if (kpiDefinition.datapoint.trendCalculationReferenceValue !== undefined || kpiDefinition.datapoint.trendCalculationReferencePath) {
867
- // Calculated trend
868
- var trendReferenceValue;
869
-
870
- if (kpiDefinition.datapoint.trendCalculationReferenceValue !== undefined) {
871
- trendReferenceValue = kpiDefinition.datapoint.trendCalculationReferenceValue;
872
- } else {
873
- trendReferenceValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.trendCalculationReferencePath || ""));
874
- }
875
823
 
876
- trendValue = deviationIndicatorFromCalculation(rawValue, trendReferenceValue, !!kpiDefinition.datapoint.trendCalculationIsRelative, kpiDefinition.datapoint.trendCalculationTresholds);
824
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", criticalityValue);
825
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainState", ValueColorFromMessageType[criticalityValue] || "None");
826
+ };
827
+
828
+ _proto.updateDatapointTrend = function updateDatapointTrend(kpiDefinition, kpiContext, oKPIModel) {
829
+ var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
830
+ var trendValue = "None";
831
+
832
+ if (kpiDefinition.datapoint.trendValue) {
833
+ // Trend is a fixed value
834
+ trendValue = kpiDefinition.datapoint.trendValue;
835
+ } else if (kpiDefinition.datapoint.trendPath) {
836
+ // Trend comes from another property via a path
837
+ trendValue = deviationIndicatorFromTrendType(kpiContext.getProperty(kpiDefinition.datapoint.trendPath));
838
+ } else if (kpiDefinition.datapoint.trendCalculationReferenceValue !== undefined || kpiDefinition.datapoint.trendCalculationReferencePath) {
839
+ // Calculated trend
840
+ var trendReferenceValue;
841
+
842
+ if (kpiDefinition.datapoint.trendCalculationReferenceValue !== undefined) {
843
+ trendReferenceValue = kpiDefinition.datapoint.trendCalculationReferenceValue;
844
+ } else {
845
+ trendReferenceValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.trendCalculationReferencePath || ""));
877
846
  }
878
847
 
879
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/trend", trendValue);
848
+ trendValue = deviationIndicatorFromCalculation(rawValue, trendReferenceValue, !!kpiDefinition.datapoint.trendCalculationIsRelative, kpiDefinition.datapoint.trendCalculationTresholds);
880
849
  }
881
- }, {
882
- key: "updateTargetValue",
883
- value: function updateTargetValue(kpiDefinition, kpiContext, oKPIModel) {
884
- if (kpiDefinition.datapoint.targetValue === undefined && kpiDefinition.datapoint.targetPath === undefined) {
885
- return; // No target set for the KPI
886
- }
887
850
 
888
- var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
889
- var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
890
- var targetRawValue;
851
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/trend", trendValue);
852
+ };
891
853
 
892
- if (kpiDefinition.datapoint.targetValue !== undefined) {
893
- targetRawValue = kpiDefinition.datapoint.targetValue;
894
- } else {
895
- targetRawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.targetPath || ""));
896
- }
854
+ _proto.updateTargetValue = function updateTargetValue(kpiDefinition, kpiContext, oKPIModel) {
855
+ if (kpiDefinition.datapoint.targetValue === undefined && kpiDefinition.datapoint.targetPath === undefined) {
856
+ return; // No target set for the KPI
857
+ }
858
+
859
+ var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
860
+ var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
861
+ var targetRawValue;
897
862
 
898
- var deviationRawValue = targetRawValue !== 0 ? (rawValue - targetRawValue) / targetRawValue * 100 : undefined; // Formatting
863
+ if (kpiDefinition.datapoint.targetValue !== undefined) {
864
+ targetRawValue = kpiDefinition.datapoint.targetValue;
865
+ } else {
866
+ targetRawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.targetPath || ""));
867
+ }
899
868
 
900
- var targetValue = NumberFormat.getFloatInstance({
901
- style: "short",
869
+ var deviationRawValue = targetRawValue !== 0 ? (rawValue - targetRawValue) / targetRawValue * 100 : undefined; // Formatting
870
+
871
+ var targetValue = NumberFormat.getFloatInstance({
872
+ style: "short",
873
+ minFractionDigits: 0,
874
+ maxFractionDigits: 1,
875
+ showScale: false
876
+ }, currentLocale).format(targetRawValue);
877
+ var targetScale = NumberFormat.getFloatInstance({
878
+ style: "short",
879
+ decimals: 0,
880
+ maxIntegerDigits: 0,
881
+ showScale: true
882
+ }, currentLocale).format(targetRawValue);
883
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetNumber", targetValue);
884
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetUnit", targetScale);
885
+
886
+ if (deviationRawValue !== undefined) {
887
+ var deviationValue = NumberFormat.getFloatInstance({
902
888
  minFractionDigits: 0,
903
889
  maxFractionDigits: 1,
904
890
  showScale: false
905
- }, currentLocale).format(targetRawValue);
906
- var targetScale = NumberFormat.getFloatInstance({
907
- style: "short",
908
- decimals: 0,
909
- maxIntegerDigits: 0,
910
- showScale: true
911
- }, currentLocale).format(targetRawValue);
912
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetNumber", targetValue);
913
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetUnit", targetScale);
914
-
915
- if (deviationRawValue !== undefined) {
916
- var deviationValue = NumberFormat.getFloatInstance({
917
- minFractionDigits: 0,
918
- maxFractionDigits: 1,
919
- showScale: false
920
- }, currentLocale).format(deviationRawValue);
921
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/deviationNumber", deviationValue);
922
- } else {
923
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/deviationNumber", "N/A");
924
- }
891
+ }, currentLocale).format(deviationRawValue);
892
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/deviationNumber", deviationValue);
893
+ } else {
894
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/deviationNumber", "N/A");
925
895
  }
926
- /**
927
- * Loads tag data for a KPI, and stores it in the JSON KPI model.
928
- *
929
- * @param {KPIDefinition} kpiDefinition The definition of the KPI.
930
- * @param {ODataModel} oMainModel The model used to load the data.
931
- * @param {JSONModel} oKPIModel The JSON model where the data will be stored
932
- * @param loadFull If not true, loads only data for the KPI tag
933
- * @returns {Promise} Returns the promise that is resolved when data is loaded.
934
- */
935
-
936
- }, {
937
- key: "loadKPITagData",
938
- value: function loadKPITagData(kpiDefinition, oMainModel, oKPIModel, loadFull) {
939
- var _kpiDefinition$datapo4,
940
- _kpiDefinition$select2,
941
- _this2 = this;
942
-
943
- // If loadFull=false, then we're just loading data for the tag and we use the "$auto.LongRunners" groupID
944
- // If loadFull=true, we're loading data for the whole KPI (tag + card) and we use the default ("$auto") groupID
945
- var oListBinding = loadFull ? oMainModel.bindList("/" + kpiDefinition.entitySet) : oMainModel.bindList("/" + kpiDefinition.entitySet, undefined, undefined, undefined, {
946
- $$groupId: "$auto.LongRunners"
947
- });
948
- var oAggregate = {}; // Main value + currency/unit
896
+ }
897
+ /**
898
+ * Loads tag data for a KPI, and stores it in the JSON KPI model.
899
+ *
900
+ * @param {KPIDefinition} kpiDefinition The definition of the KPI.
901
+ * @param {ODataModel} oMainModel The model used to load the data.
902
+ * @param {JSONModel} oKPIModel The JSON model where the data will be stored
903
+ * @param loadFull If not true, loads only data for the KPI tag
904
+ * @returns {Promise} Returns the promise that is resolved when data is loaded.
905
+ */
906
+ ;
907
+
908
+ _proto.loadKPITagData = function loadKPITagData(kpiDefinition, oMainModel, oKPIModel, loadFull) {
909
+ var _kpiDefinition$datapo4,
910
+ _kpiDefinition$select2,
911
+ _this2 = this;
912
+
913
+ // If loadFull=false, then we're just loading data for the tag and we use the "$auto.LongRunners" groupID
914
+ // If loadFull=true, we're loading data for the whole KPI (tag + card) and we use the default ("$auto") groupID
915
+ var oListBinding = loadFull ? oMainModel.bindList("/" + kpiDefinition.entitySet) : oMainModel.bindList("/" + kpiDefinition.entitySet, undefined, undefined, undefined, {
916
+ $$groupId: "$auto.LongRunners"
917
+ });
918
+ var oAggregate = {}; // Main value + currency/unit
949
919
 
950
- if ((_kpiDefinition$datapo4 = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo4 !== void 0 && _kpiDefinition$datapo4.isPath) {
951
- oAggregate[kpiDefinition.datapoint.propertyPath] = {
952
- unit: kpiDefinition.datapoint.unit.value
953
- };
954
- } else {
955
- oAggregate[kpiDefinition.datapoint.propertyPath] = {};
956
- } // Property for criticality
920
+ if ((_kpiDefinition$datapo4 = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo4 !== void 0 && _kpiDefinition$datapo4.isPath) {
921
+ oAggregate[kpiDefinition.datapoint.propertyPath] = {
922
+ unit: kpiDefinition.datapoint.unit.value
923
+ };
924
+ } else {
925
+ oAggregate[kpiDefinition.datapoint.propertyPath] = {};
926
+ } // Property for criticality
957
927
 
958
928
 
959
- if (kpiDefinition.datapoint.criticalityPath) {
960
- oAggregate[kpiDefinition.datapoint.criticalityPath] = {};
961
- } // Properties for trend and trend calculation
929
+ if (kpiDefinition.datapoint.criticalityPath) {
930
+ oAggregate[kpiDefinition.datapoint.criticalityPath] = {};
931
+ } // Properties for trend and trend calculation
962
932
 
963
933
 
964
- if (loadFull) {
965
- if (kpiDefinition.datapoint.trendPath) {
966
- oAggregate[kpiDefinition.datapoint.trendPath] = {};
967
- }
934
+ if (loadFull) {
935
+ if (kpiDefinition.datapoint.trendPath) {
936
+ oAggregate[kpiDefinition.datapoint.trendPath] = {};
937
+ }
968
938
 
969
- if (kpiDefinition.datapoint.trendCalculationReferencePath) {
970
- oAggregate[kpiDefinition.datapoint.trendCalculationReferencePath] = {};
971
- }
939
+ if (kpiDefinition.datapoint.trendCalculationReferencePath) {
940
+ oAggregate[kpiDefinition.datapoint.trendCalculationReferencePath] = {};
941
+ }
972
942
 
973
- if (kpiDefinition.datapoint.targetPath) {
974
- oAggregate[kpiDefinition.datapoint.targetPath] = {};
975
- }
943
+ if (kpiDefinition.datapoint.targetPath) {
944
+ oAggregate[kpiDefinition.datapoint.targetPath] = {};
976
945
  }
946
+ }
977
947
 
978
- oListBinding.setAggregation({
979
- aggregate: oAggregate
980
- }); // Manage SelectionVariant filters
948
+ oListBinding.setAggregation({
949
+ aggregate: oAggregate
950
+ }); // Manage SelectionVariant filters
981
951
 
982
- if ((_kpiDefinition$select2 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select2 !== void 0 && _kpiDefinition$select2.length) {
983
- var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
984
- return filter !== undefined;
985
- });
986
- oListBinding.filter(aFilters);
987
- }
952
+ if ((_kpiDefinition$select2 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select2 !== void 0 && _kpiDefinition$select2.length) {
953
+ var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
954
+ return filter !== undefined;
955
+ });
956
+ oListBinding.filter(aFilters);
957
+ }
988
958
 
989
- return oListBinding.requestContexts(0, 1).then(function (aContexts) {
990
- if (aContexts.length) {
991
- var _kpiDefinition$datapo5, _kpiDefinition$datapo6;
992
-
993
- var rawUnit = (_kpiDefinition$datapo5 = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo5 !== void 0 && _kpiDefinition$datapo5.isPath ? aContexts[0].getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo6 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo6 === void 0 ? void 0 : _kpiDefinition$datapo6.value;
994
-
995
- if (kpiDefinition.datapoint.unit && !rawUnit) {
996
- // A unit/currency is defined, but its value is undefined --> multi-unit situation
997
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", "*");
998
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", "*");
999
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueNoScale", "*");
1000
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueScale", "");
1001
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", undefined);
1002
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", MessageType.None);
1003
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainState", "None");
1004
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/trend", "None");
1005
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetNumber", undefined);
1006
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetUnit", undefined);
1007
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/deviationNumber", undefined);
1008
- } else {
1009
- _this2.updateDatapointValueAndCurrency(kpiDefinition, aContexts[0], oKPIModel);
1010
-
1011
- _this2.updateDatapointCriticality(kpiDefinition, aContexts[0], oKPIModel);
1012
-
1013
- if (loadFull) {
1014
- _this2.updateDatapointTrend(kpiDefinition, aContexts[0], oKPIModel);
1015
-
1016
- _this2.updateTargetValue(kpiDefinition, aContexts[0], oKPIModel);
1017
- }
959
+ return oListBinding.requestContexts(0, 1).then(function (aContexts) {
960
+ if (aContexts.length) {
961
+ var _kpiDefinition$datapo5, _kpiDefinition$datapo6;
962
+
963
+ var rawUnit = (_kpiDefinition$datapo5 = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo5 !== void 0 && _kpiDefinition$datapo5.isPath ? aContexts[0].getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo6 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo6 === void 0 ? void 0 : _kpiDefinition$datapo6.value;
964
+
965
+ if (kpiDefinition.datapoint.unit && !rawUnit) {
966
+ // A unit/currency is defined, but its value is undefined --> multi-unit situation
967
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValue", "*");
968
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueUnscaled", "*");
969
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueNoScale", "*");
970
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainValueScale", "");
971
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainUnit", undefined);
972
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainCriticality", MessageType.None);
973
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/mainState", "None");
974
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/trend", "None");
975
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetNumber", undefined);
976
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/targetUnit", undefined);
977
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/deviationNumber", undefined);
978
+ } else {
979
+ _this2.updateDatapointValueAndCurrency(kpiDefinition, aContexts[0], oKPIModel);
980
+
981
+ _this2.updateDatapointCriticality(kpiDefinition, aContexts[0], oKPIModel);
982
+
983
+ if (loadFull) {
984
+ _this2.updateDatapointTrend(kpiDefinition, aContexts[0], oKPIModel);
985
+
986
+ _this2.updateTargetValue(kpiDefinition, aContexts[0], oKPIModel);
1018
987
  }
1019
988
  }
989
+ }
990
+ });
991
+ }
992
+ /**
993
+ * Loads card data for a KPI, and stores it in the JSON KPI model.
994
+ *
995
+ * @param {KPIDefinition} kpiDefinition The definition of the KPI.
996
+ * @param {ODataModel} oMainModel The model used to load the data.
997
+ * @param {JSONModel} oKPIModel The JSON model where the data will be stored
998
+ * @returns {Promise} Returns the promise that is resolved when data is loaded.
999
+ */
1000
+ ;
1001
+
1002
+ _proto.loadKPICardData = function loadKPICardData(kpiDefinition, oMainModel, oKPIModel) {
1003
+ var _kpiDefinition$select3;
1004
+
1005
+ var oListBinding = oMainModel.bindList("/" + kpiDefinition.entitySet);
1006
+ var oGroup = {};
1007
+ var oAggregate = {};
1008
+ kpiDefinition.chart.dimensions.forEach(function (dimension) {
1009
+ oGroup[dimension.name] = {};
1010
+ });
1011
+ kpiDefinition.chart.measures.forEach(function (measure) {
1012
+ oAggregate[measure.name] = {};
1013
+ });
1014
+ oListBinding.setAggregation({
1015
+ group: oGroup,
1016
+ aggregate: oAggregate
1017
+ }); // Manage SelectionVariant filters
1018
+
1019
+ if ((_kpiDefinition$select3 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select3 !== void 0 && _kpiDefinition$select3.length) {
1020
+ var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
1021
+ return filter !== undefined;
1020
1022
  });
1023
+ oListBinding.filter(aFilters);
1024
+ } // Sorting
1025
+
1026
+
1027
+ if (kpiDefinition.chart.sortOrder) {
1028
+ oListBinding.sort(kpiDefinition.chart.sortOrder.map(function (sortInfo) {
1029
+ return new Sorter(sortInfo.name, sortInfo.descending);
1030
+ }));
1021
1031
  }
1022
- /**
1023
- * Loads card data for a KPI, and stores it in the JSON KPI model.
1024
- *
1025
- * @param {KPIDefinition} kpiDefinition The definition of the KPI.
1026
- * @param {ODataModel} oMainModel The model used to load the data.
1027
- * @param {JSONModel} oKPIModel The JSON model where the data will be stored
1028
- * @returns {Promise} Returns the promise that is resolved when data is loaded.
1029
- */
1030
1032
 
1031
- }, {
1032
- key: "loadKPICardData",
1033
- value: function loadKPICardData(kpiDefinition, oMainModel, oKPIModel) {
1034
- var _kpiDefinition$select3;
1035
-
1036
- var oListBinding = oMainModel.bindList("/" + kpiDefinition.entitySet);
1037
- var oGroup = {};
1038
- var oAggregate = {};
1039
- kpiDefinition.chart.dimensions.forEach(function (dimension) {
1040
- oGroup[dimension.name] = {};
1041
- });
1042
- kpiDefinition.chart.measures.forEach(function (measure) {
1043
- oAggregate[measure.name] = {};
1044
- });
1045
- oListBinding.setAggregation({
1046
- group: oGroup,
1047
- aggregate: oAggregate
1048
- }); // Manage SelectionVariant filters
1049
-
1050
- if ((_kpiDefinition$select3 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select3 !== void 0 && _kpiDefinition$select3.length) {
1051
- var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
1052
- return filter !== undefined;
1033
+ return oListBinding.requestContexts(0, kpiDefinition.chart.maxItems).then(function (aContexts) {
1034
+ var chartData = aContexts.map(function (oContext) {
1035
+ var oData = {};
1036
+ kpiDefinition.chart.dimensions.forEach(function (dimension) {
1037
+ oData[dimension.name] = oContext.getProperty(dimension.name);
1038
+ });
1039
+ kpiDefinition.chart.measures.forEach(function (measure) {
1040
+ oData[measure.name] = oContext.getProperty(measure.name);
1053
1041
  });
1054
- oListBinding.filter(aFilters);
1055
- } // Sorting
1042
+ return oData;
1043
+ });
1044
+ oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/chartData", chartData);
1045
+ });
1046
+ }
1047
+ /**
1048
+ * Gets the popover to display the KPI card
1049
+ * The popover and the contained card for the KPIs are created if necessary.
1050
+ * The popover is shared between all KPIs, so it's created only once.
1051
+ *
1052
+ * @param oKPITag The tag that triggered the popover opening.
1053
+ * @returns The shared popover as a promise.
1054
+ */
1055
+ ;
1056
+
1057
+ _proto.getPopover = function getPopover(oKPITag) {
1058
+ var _this3 = this;
1059
+
1060
+ if (!this.oPopover) {
1061
+ return new Promise(function (resolve, reject) {
1062
+ sap.ui.getCore().loadLibrary("sap/ui/integration", {
1063
+ async: true
1064
+ }).then(function () {
1065
+ sap.ui.require(["sap/ui/integration/widgets/Card", "sap/ui/integration/Host"], function (Card, Host) {
1066
+ var oHost = new Host();
1067
+ oHost.attachAction(function (oEvent) {
1068
+ var sType = oEvent.getParameter("type");
1069
+ var oParams = oEvent.getParameter("parameters");
1070
+
1071
+ if (sType === "Navigation") {
1072
+ if (oParams.semanticObject) {
1073
+ _this3.getView().getController()._intentBasedNavigation.navigate(oParams.semanticObject, oParams.action);
1074
+ } else {
1075
+ _this3.getView().getController()._intentBasedNavigation.navigateOutbound(oParams.outbound);
1076
+ }
1077
+ }
1078
+ });
1079
+ _this3.oCard = new Card({
1080
+ width: "25rem",
1081
+ height: "auto"
1082
+ });
1056
1083
 
1084
+ _this3.oCard.setHost(oHost);
1057
1085
 
1058
- if (kpiDefinition.chart.sortOrder) {
1059
- oListBinding.sort(kpiDefinition.chart.sortOrder.map(function (sortInfo) {
1060
- return new Sorter(sortInfo.name, sortInfo.descending);
1061
- }));
1062
- }
1086
+ _this3.oPopover = new Popover("kpi-Popover", {
1087
+ showHeader: false,
1088
+ placement: "Auto",
1089
+ content: [_this3.oCard]
1090
+ });
1091
+ oKPITag.addDependent(_this3.oPopover); // The first clicked tag gets the popover as dependent
1063
1092
 
1064
- return oListBinding.requestContexts(0, kpiDefinition.chart.maxItems).then(function (aContexts) {
1065
- var chartData = aContexts.map(function (oContext) {
1066
- var oData = {};
1067
- kpiDefinition.chart.dimensions.forEach(function (dimension) {
1068
- oData[dimension.name] = oContext.getProperty(dimension.name);
1069
- });
1070
- kpiDefinition.chart.measures.forEach(function (measure) {
1071
- oData[measure.name] = oContext.getProperty(measure.name);
1093
+ resolve(_this3.oPopover);
1072
1094
  });
1073
- return oData;
1095
+ }).catch(function () {
1096
+ reject();
1074
1097
  });
1075
- oKPIModel.setProperty("/" + kpiDefinition.id + "/manifest/sap.card/data/json/chartData", chartData);
1076
1098
  });
1099
+ } else {
1100
+ return Promise.resolve(this.oPopover);
1077
1101
  }
1078
- /**
1079
- * Gets the popover to display the KPI card
1080
- * The popover and the contained card for the KPIs are created if necessary.
1081
- * The popover is shared between all KPIs, so it's created only once.
1082
- *
1083
- * @param oKPITag The tag that triggered the popover opening.
1084
- * @returns The shared popover as a promise.
1085
- */
1102
+ };
1086
1103
 
1087
- }, {
1088
- key: "getPopover",
1089
- value: function getPopover(oKPITag) {
1090
- var _this3 = this;
1091
-
1092
- if (!this.oPopover) {
1093
- return new Promise(function (resolve, reject) {
1094
- sap.ui.getCore().loadLibrary("sap/ui/integration", {
1095
- async: true
1096
- }).then(function () {
1097
- sap.ui.require(["sap/ui/integration/widgets/Card", "sap/ui/integration/Host"], function (Card, Host) {
1098
- var oHost = new Host();
1099
- oHost.attachAction(function (oEvent) {
1100
- var sType = oEvent.getParameter("type");
1101
- var oParams = oEvent.getParameter("parameters");
1102
-
1103
- if (sType === "Navigation") {
1104
- if (oParams.semanticObject) {
1105
- _this3.getView().getController()._intentBasedNavigation.navigate(oParams.semanticObject, oParams.action);
1106
- } else {
1107
- _this3.getView().getController()._intentBasedNavigation.navigateOutbound(oParams.outbound);
1108
- }
1109
- }
1110
- });
1111
- _this3.oCard = new Card({
1112
- width: "25rem",
1113
- height: "auto"
1114
- });
1115
-
1116
- _this3.oCard.setHost(oHost);
1117
-
1118
- _this3.oPopover = new Popover("kpi-Popover", {
1119
- showHeader: false,
1120
- placement: "Auto",
1121
- content: [_this3.oCard]
1122
- });
1123
- oKPITag.addDependent(_this3.oPopover); // The first clicked tag gets the popover as dependent
1124
-
1125
- resolve(_this3.oPopover);
1126
- });
1127
- }).catch(function () {
1128
- reject();
1129
- });
1130
- });
1131
- } else {
1132
- return Promise.resolve(this.oPopover);
1133
- }
1134
- }
1135
- }, {
1136
- key: "onKPIPressed",
1137
- value: function onKPIPressed(oKPITag, kpiID) {
1138
- var _this4 = this;
1104
+ _proto.onKPIPressed = function onKPIPressed(oKPITag, kpiID) {
1105
+ var _this4 = this;
1139
1106
 
1140
- var oKPIModel = oKPITag.getModel("kpiModel");
1107
+ var oKPIModel = oKPITag.getModel("kpiModel");
1141
1108
 
1142
- if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
1143
- var kpiDefinition = this.aKPIDefinitions.find(function (oDef) {
1144
- return oDef.id === kpiID;
1145
- });
1109
+ if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
1110
+ var kpiDefinition = this.aKPIDefinitions.find(function (oDef) {
1111
+ return oDef.id === kpiID;
1112
+ });
1146
1113
 
1147
- if (kpiDefinition) {
1148
- var oModel = oKPITag.getModel();
1149
- var aPromises = [this.loadKPITagData(kpiDefinition, oModel, oKPIModel, true), this.loadKPICardData(kpiDefinition, oModel, oKPIModel), this.getPopover(oKPITag)];
1150
- Promise.all(aPromises).then(function (aResults) {
1151
- _this4.oCard.setManifest(oKPIModel.getProperty("/" + kpiID + "/manifest"));
1114
+ if (kpiDefinition) {
1115
+ var oModel = oKPITag.getModel();
1116
+ var aPromises = [this.loadKPITagData(kpiDefinition, oModel, oKPIModel, true), this.loadKPICardData(kpiDefinition, oModel, oKPIModel), this.getPopover(oKPITag)];
1117
+ Promise.all(aPromises).then(function (aResults) {
1118
+ _this4.oCard.setManifest(oKPIModel.getProperty("/" + kpiID + "/manifest"));
1152
1119
 
1153
- _this4.oCard.refresh();
1120
+ _this4.oCard.refresh();
1154
1121
 
1155
- var oPopover = aResults[2];
1156
- oPopover.openBy(oKPITag, false);
1157
- }).catch(function (err) {
1158
- Log.error(err);
1159
- });
1160
- }
1122
+ var oPopover = aResults[2];
1123
+ oPopover.openBy(oKPITag, false);
1124
+ }).catch(function (err) {
1125
+ Log.error(err);
1126
+ });
1161
1127
  }
1162
1128
  }
1163
- }]);
1129
+ };
1164
1130
 
1165
1131
  return KPIManagementControllerExtension;
1166
1132
  }(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onKPIPressed", [Public], Object.getOwnPropertyDescriptor(_class2.prototype, "onKPIPressed"), _class2.prototype)), _class2)) || _class);
1167
1133
  return KPIManagementControllerExtension;
1168
1134
  }, false);
1169
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOlsiTWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHkiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiV2FybmluZyIsIlN1Y2Nlc3MiLCJJbmZvcm1hdGlvbiIsIlZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGUiLCJOb25lIiwibWVzc2FnZVR5cGVGcm9tVGFyZ2V0Q2FsY3VsYXRpb24iLCJrcGlWYWx1ZSIsImFUaHJlc2hvbGRzIiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsInVuZGVmaW5lZCIsIm1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24iLCJtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uIiwiZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSIsInRyZW5kVmFsdWUiLCJkZXZpYXRpb25JbmRpY2F0b3IiLCJkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24iLCJyZWZlcmVuY2VWYWx1ZSIsImlzUmVsYXRpdmUiLCJjb21wVmFsdWUiLCJjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbiIsImZpbHRlckRlZmluaXRpb24iLCJyYW5nZXMiLCJsZW5ndGgiLCJGaWx0ZXIiLCJwcm9wZXJ0eVBhdGgiLCJvcGVyYXRvciIsInJhbmdlTG93IiwicmFuZ2VIaWdoIiwiYVJhbmdlRmlsdGVycyIsIm1hcCIsInJhbmdlIiwiZmlsdGVycyIsImFuZCIsImdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uIiwiY3VycmVudExvY2FsZSIsIkxvY2FsZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldENvbmZpZ3VyYXRpb24iLCJnZXRMYW5ndWFnZSIsInJlc0J1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImRhdGVGb3JtYXQiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZUluc3RhbmNlIiwic3R5bGUiLCJmb3JtYXRSYW5nZSIsInZhbHVlTG93IiwicHJvcGVydHlUeXBlIiwiaW5kZXhPZiIsImZvcm1hdCIsIkRhdGUiLCJ2YWx1ZUhpZ2giLCJnZXRUZXh0Iiwiam9pbiIsImZvcm1hdENoYXJ0VGl0bGUiLCJrcGlEZWYiLCJmb3JtYXRMaXN0IiwiaXRlbXMiLCJsYWJlbCIsInJlcyIsIkkiLCJjaGFydCIsIm1lYXN1cmVzIiwiZGltZW5zaW9ucyIsInVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyIsImNoYXJ0RGVmaW5pdGlvbiIsIm9DaGFydFByb3BlcnRpZXMiLCJjaGFydFR5cGUiLCJjYXRlZ29yeUF4aXMiLCJ0aXRsZSIsInZpc2libGUiLCJ2YWx1ZUF4aXMiLCJmb3JtYXRTdHJpbmciLCJwbG90QXJlYSIsImRhdGFMYWJlbCIsInR5cGUiLCJ2YWx1ZUF4aXMyIiwibGVnZW5kR3JvdXAiLCJsYXlvdXQiLCJwb3NpdGlvbiIsImFsaWdubWVudCIsInNpemVMZWdlbmQiLCJmaWx0ZXJNYXAiLCJhT2JqZWN0cyIsImFSb2xlcyIsImZpbHRlciIsImRpbWVuc2lvbiIsInJvbGUiLCJnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyIsImF4aXMxTWVhc3VyZXMiLCJheGlzMk1lYXN1cmVzIiwiYXhpczNNZWFzdXJlcyIsIm90aGVyTWVhc3VyZXMiLCJzZXJpZXNEaW1lbnNpb25zIiwic2hhcGVEaW1lbnNpb24iLCJmaW5kIiwieE1lYXN1cmUiLCJzaGlmdCIsInlNZWFzdXJlIiwic2l6ZU1lYXN1cmUiLCJwdXNoIiwiZ2V0Q2hhcnRGZWVkcyIsImdldE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibmF2SW5mbyIsIm9TaGVsbFNlcnZpY2UiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsImdldExpbmtzIiwidGhlbiIsImFMaW5rcyIsImdldFByaW1hcnlJbnRlbnQiLCJvTGluayIsIm9JbmZvIiwicGFyc2VTaGVsbEhhc2giLCJpbnRlbnQiLCJ1bmF2YWlsYWJsZUFjdGlvbnMiLCJvdXRib3VuZE5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIm91dGJvdW5kIiwiS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb24iLCJVSTVDbGFzcyIsIkNvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSIsIk92ZXJyaWRlIiwia3BpRGVmaW5pdGlvbiIsIm9LUElNb2RlbCIsIm9DYXJkTWFuaWZlc3QiLCJpZCIsInRlY2hub2xvZ3kiLCJkYXRhIiwianNvbiIsImhlYWRlciIsImRhdGFwb2ludCIsInN1YlRpdGxlIiwiZGVzY3JpcHRpb24iLCJ1bml0T2ZNZWFzdXJlbWVudCIsIm1haW5JbmRpY2F0b3IiLCJudW1iZXIiLCJ1bml0Iiwic3RhdGUiLCJ0cmVuZCIsImNvbnRlbnQiLCJtaW5IZWlnaHQiLCJjaGFydFByb3BlcnRpZXMiLCJwYXRoIiwidGFyZ2V0UGF0aCIsInRhcmdldFZhbHVlIiwic2lkZUluZGljYXRvcnMiLCJzZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMiLCJhRGVzY3JpcHRpb25zIiwiZm9yRWFjaCIsImRlc2MiLCJkZXRhaWxzIiwidGV4dCIsInZhbHVlIiwibmFtZSIsIm1lYXN1cmUiLCJmZWVkcyIsInNldFByb3BlcnR5IiwibWFuaWZlc3QiLCJuYXZpZ2F0aW9uIiwib05hdkluZm8iLCJwYXJhbWV0ZXJzIiwiYUtQSURlZmluaXRpb25zIiwiZ2V0S1BJRGF0YSIsIm9WaWV3IiwiZ2V0VmlldyIsIm9BcHBDb21wb25lbnQiLCJnZXRDb250cm9sbGVyIiwiZ2V0QXBwQ29tcG9uZW50IiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJpbml0Q2FyZE1hbmlmZXN0IiwiaW5pdE5hdmlnYXRpb25JbmZvIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJsb2FkS1BJVGFnRGF0YSIsImdldE1vZGVsIiwiZGVzdHJveSIsInNDdXN0b21EYXRhIiwiZ2V0Q29udGVudCIsInZEYXRhIiwiSlNPTiIsInBhcnNlIiwia3BpQ29udGV4dCIsInJhd1VuaXQiLCJpc1BhdGgiLCJnZXRQcm9wZXJ0eSIsImlzUGVyY2VudGFnZSIsImlzQ3VycmVuY3kiLCJyYXdWYWx1ZSIsIk51bWJlciIsInBhcnNlRmxvYXQiLCJOdW1iZXJGb3JtYXQiLCJnZXRGbG9hdEluc3RhbmNlIiwibWluRnJhY3Rpb25EaWdpdHMiLCJtYXhGcmFjdGlvbkRpZ2l0cyIsInNob3dTY2FsZSIsImtwaVZhbHVlVW5zY2FsZWQiLCJncm91cGluZ0VuYWJsZWQiLCJrcGlWYWx1ZU5vU2NhbGUiLCJrcGlWYWx1ZVNjYWxlIiwiZGVjaW1hbHMiLCJtYXhJbnRlZ2VyRGlnaXRzIiwia3BpVW5pdCIsImdldFVuaXRJbnN0YW5jZSIsInNob3dOdW1iZXIiLCJjcml0aWNhbGl0eVZhbHVlIiwiY3JpdGljYWxpdHlQYXRoIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMiLCJjcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSIsInRyZW5kUGF0aCIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoIiwidHJlbmRSZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwidHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyIsInRhcmdldFJhd1ZhbHVlIiwiZGV2aWF0aW9uUmF3VmFsdWUiLCJ0YXJnZXRTY2FsZSIsImRldmlhdGlvblZhbHVlIiwib01haW5Nb2RlbCIsImxvYWRGdWxsIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJlbnRpdHlTZXQiLCIkJGdyb3VwSWQiLCJvQWdncmVnYXRlIiwic2V0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGUiLCJhRmlsdGVycyIsInJlcXVlc3RDb250ZXh0cyIsImFDb250ZXh0cyIsInVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3kiLCJ1cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eSIsInVwZGF0ZURhdGFwb2ludFRyZW5kIiwidXBkYXRlVGFyZ2V0VmFsdWUiLCJvR3JvdXAiLCJncm91cCIsInNvcnRPcmRlciIsInNvcnQiLCJzb3J0SW5mbyIsIlNvcnRlciIsImRlc2NlbmRpbmciLCJtYXhJdGVtcyIsImNoYXJ0RGF0YSIsIm9Db250ZXh0Iiwib0RhdGEiLCJvS1BJVGFnIiwib1BvcG92ZXIiLCJyZWplY3QiLCJsb2FkTGlicmFyeSIsImFzeW5jIiwicmVxdWlyZSIsIkNhcmQiLCJIb3N0Iiwib0hvc3QiLCJhdHRhY2hBY3Rpb24iLCJvRXZlbnQiLCJzVHlwZSIsImdldFBhcmFtZXRlciIsIm9QYXJhbXMiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwibmF2aWdhdGUiLCJuYXZpZ2F0ZU91dGJvdW5kIiwib0NhcmQiLCJ3aWR0aCIsImhlaWdodCIsInNldEhvc3QiLCJQb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsImFkZERlcGVuZGVudCIsImtwaUlEIiwib0RlZiIsIm9Nb2RlbCIsImFQcm9taXNlcyIsImxvYWRLUElDYXJkRGF0YSIsImdldFBvcG92ZXIiLCJhbGwiLCJhUmVzdWx0cyIsInNldE1hbmlmZXN0IiwicmVmcmVzaCIsIm9wZW5CeSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxNQUFNQSwwQkFBdUQsR0FBRztBQUMvRCxTQUFLQyxXQUFXLENBQUNDLEtBRDhDO0FBRS9ELFNBQUtELFdBQVcsQ0FBQ0UsT0FGOEM7QUFHL0QsU0FBS0YsV0FBVyxDQUFDRyxPQUg4QztBQUkvRCxTQUFLSCxXQUFXLENBQUNJO0FBSjhDLEdBQWhFO0FBT0EsTUFBTUMseUJBQXNELEdBQUc7QUFDOURKLElBQUFBLEtBQUssRUFBRSxPQUR1RDtBQUU5REMsSUFBQUEsT0FBTyxFQUFFLFVBRnFEO0FBRzlEQyxJQUFBQSxPQUFPLEVBQUUsTUFIcUQ7QUFJOURDLElBQUFBLFdBQVcsRUFBRSxNQUppRDtBQUs5REUsSUFBQUEsSUFBSSxFQUFFO0FBTHdELEdBQS9EO0FBUUE7QUFDQTtBQUNBO0FB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QUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVRixHQUFWO0FBQ0EsYUFWRjtBQVdBO0FBQ0Q7QUFDRDs7OztJQXhtQjZDK0csbUIsc1dBMGtCN0NDLE07U0FpQ2F4SyxnQyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnNcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSwgUHVibGljIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IEtQSUNoYXJ0RGVmaW5pdGlvbiwgS1BJRGVmaW5pdGlvbiwgTmF2aWdhdGlvbkluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vS1BJXCI7XG5pbXBvcnQgeyBCYXNlQ29udHJvbGxlciB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQgeyBGaWx0ZXJEZWZpbml0aW9uLCBSYW5nZURlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL1NlbGVjdGlvblZhcmlhbnRIZWxwZXJcIjtcbmltcG9ydCBOdW1iZXJGb3JtYXQgZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdC9OdW1iZXJGb3JtYXRcIjtcbmltcG9ydCBEYXRlRm9ybWF0IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXQvRGF0ZUZvcm1hdFwiO1xuaW1wb3J0IExvY2FsZSBmcm9tIFwic2FwL3VpL2NvcmUvTG9jYWxlXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IEdlbmVyaWNUYWcgZnJvbSBcInNhcC9tL0dlbmVyaWNUYWdcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcblxuY29uc3QgTWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHk6IFJlY29yZDxzdHJpbmcsIE1lc3NhZ2VUeXBlPiA9IHtcblx0XCIxXCI6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcIjJcIjogTWVzc2FnZVR5cGUuV2FybmluZyxcblx0XCIzXCI6IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MsXG5cdFwiNVwiOiBNZXNzYWdlVHlwZS5JbmZvcm1hdGlvblxufTtcblxuY29uc3QgVmFsdWVDb2xvckZyb21NZXNzYWdlVHlwZTogUmVjb3JkPE1lc3NhZ2VUeXBlLCBzdHJpbmc+ID0ge1xuXHRFcnJvcjogXCJFcnJvclwiLFxuXHRXYXJuaW5nOiBcIkNyaXRpY2FsXCIsXG5cdFN1Y2Nlc3M6IFwiR29vZFwiLFxuXHRJbmZvcm1hdGlvbjogXCJOb25lXCIsXG5cdE5vbmU6IFwiTm9uZVwiXG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNhbGN1bGF0ZWQgY3JpdGljYWxpdHkgb2YgdHlwZSAnVGFyZ2V0Jy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbNV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1s1XSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzVdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzRdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s0XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1szXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IGEgbWVzc2FnZSBzdGF0ZSBmcm9tIGEgY2FsY3VsYXRlZCBjcml0aWNhbGl0eSBvZiB0eXBlICdNaW5pbWl6ZScuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJIHRvIGJlIHRlc3RlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHtudW1iZXJbXX0gYVRocmVzaG9sZHMgVGhyZXNob2xkcyB0byBiZSB1c2VkIFtBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMge01lc3NhZ2VUeXBlfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24oa3BpVmFsdWU6IG51bWJlciwgYVRocmVzaG9sZHM6IChudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKVtdKTogTWVzc2FnZVR5cGUge1xuXHRsZXQgY3JpdGljYWxpdHlQcm9wZXJ0eTogTWVzc2FnZVR5cGU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1sxXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzFdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbMV0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0fSBlbHNlIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fVxuXG5cdHJldHVybiBjcml0aWNhbGl0eVByb3BlcnR5O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNhbGN1bGF0ZWQgY3JpdGljYWxpdHkgb2YgdHlwZSAnTWF4aW1pemUnLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSB7bnVtYmVyW119IGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSxUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlLEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlXS5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWUgZnJvbSBhIHRyZW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdHJlbmRWYWx1ZSBUaGUgY3JpdGljYWxpdHkgdmFsdWVzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWVcbiAqL1xuZnVuY3Rpb24gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSh0cmVuZFZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgZGV2aWF0aW9uSW5kaWNhdG9yOiBzdHJpbmc7XG5cblx0c3dpdGNoICh0cmVuZFZhbHVlKSB7XG5cdFx0Y2FzZSAxOiAvLyBTdHJvbmdVcFxuXHRcdGNhc2UgXCIxXCI6XG5cdFx0Y2FzZSAyOiAvLyBVcFxuXHRcdGNhc2UgXCIyXCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIlVwXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgNDogLy8gRG93blxuXHRcdGNhc2UgXCI0XCI6XG5cdFx0Y2FzZSA1OiAvLyBTdHJvbmdEb3duXG5cdFx0Y2FzZSBcIjVcIjpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIERldmlhdGlvbkluZGljYXRvciBmcm9tIGEgVHJlbmRDYWxjdWxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUElcbiAqIEBwYXJhbSByZWZlcmVuY2VWYWx1ZSBUaGUgcmVmZXJlbmNlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aFxuICogQHBhcmFtIGlzUmVsYXRpdmUgVHJ1ZSBpcyB0aGUgY29tcGFyaXNvbiBpcyByZWxhdGl2ZVxuICogQHBhcmFtIGFUaHJlc2hvbGRzIEFycmF5IG9mIHRocmVzaG9sZHMgW1N0cm9uZ0Rvd25EaWZmZXJlbmNlLCBEb3duRGlmZmVyZW5jZSwgVXBEaWZmZXJlbmNlLCBTdHJvbmdVcERpZmZlcmVuY2VdXG4gKiBAcmV0dXJucyB7c2FwLm0uRGV2aWF0aW9uSW5kaWNhdG9yfSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIERldmlhdGlvbkluZGljYXRvciB2YWx1ZVxuICovXG5mdW5jdGlvbiBkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24oXG5cdGtwaVZhbHVlOiBudW1iZXIsXG5cdHJlZmVyZW5jZVZhbHVlOiBudW1iZXIsXG5cdGlzUmVsYXRpdmU6IGJvb2xlYW4sXG5cdGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXG5cdGlmICghYVRocmVzaG9sZHMgfHwgKGlzUmVsYXRpdmUgJiYgIXJlZmVyZW5jZVZhbHVlKSkge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxuXG5cdGNvbnN0IGNvbXBWYWx1ZSA9IGlzUmVsYXRpdmUgPyAoa3BpVmFsdWUgLSByZWZlcmVuY2VWYWx1ZSkgLyByZWZlcmVuY2VWYWx1ZSA6IGtwaVZhbHVlIC0gcmVmZXJlbmNlVmFsdWU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Ly8gU3Ryb25nRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Ly8gRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzNdKSB7XG5cdFx0Ly8gU3Ryb25nVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Ly8gVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFNpZGV3YXlzIC0tPiBOb25lXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gYSBmaWx0ZXIgZGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyRGVmaW5pdGlvbiBUaGUgZmlsdGVyIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFJldHVybnMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gdGhlIGRlZmluaXRpb24sIG9yIHVuZGVmaW5lZCBpZiB0aGUgZGVmaW5pdGlvbiBpcyBlbXB0eSAobm8gcmFuZ2VzKVxuICovXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogRmlsdGVyIHwgdW5kZWZpbmVkIHtcblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VMb3csXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5yYW5nZUhpZ2hcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGFSYW5nZUZpbHRlcnMgPSBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAocmFuZ2UgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsIHJhbmdlLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCByYW5nZS5yYW5nZUxvdywgcmFuZ2UucmFuZ2VIaWdoKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBhUmFuZ2VGaWx0ZXJzLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb246IEZpbHRlckRlZmluaXRpb24pOiBzdHJpbmcge1xuXHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdC5nZXRMYW5ndWFnZSgpXG5cdCk7XG5cdGNvbnN0IHJlc0J1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdGNvbnN0IGRhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSh7IHN0eWxlOiBcIm1lZGl1bVwiIH0sIGN1cnJlbnRMb2NhbGUpO1xuXG5cdGZ1bmN0aW9uIGZvcm1hdFJhbmdlKHJhbmdlOiBSYW5nZURlZmluaXRpb24pOiBzdHJpbmcge1xuXHRcdGNvbnN0IHZhbHVlTG93ID1cblx0XHRcdGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlUeXBlLmluZGV4T2YoXCJFZG0uRGF0ZVwiKSA9PT0gMCA/IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKHJhbmdlLnJhbmdlTG93KSkgOiByYW5nZS5yYW5nZUxvdztcblx0XHRjb25zdCB2YWx1ZUhpZ2ggPVxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVR5cGUuaW5kZXhPZihcIkVkbS5EYXRlXCIpID09PSAwID8gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUocmFuZ2UucmFuZ2VIaWdoKSkgOiByYW5nZS5yYW5nZUhpZ2g7XG5cblx0XHRzd2l0Y2ggKHJhbmdlLm9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiQlRcIjpcblx0XHRcdFx0cmV0dXJuIFwiW1wiICsgdmFsdWVMb3cgKyBcIiAtIFwiICsgdmFsdWVIaWdoICsgXCJdXCI7XG5cblx0XHRcdGNhc2UgXCJDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gXCIqXCIgKyB2YWx1ZUxvdyArIFwiKlwiO1xuXG5cdFx0XHRjYXNlIFwiR0VcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFx1MjI2NVwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJHVFwiOlxuXHRcdFx0XHRyZXR1cm4gXCI+XCIgKyB2YWx1ZUxvdztcblxuXHRcdFx0Y2FzZSBcIkxFXCI6XG5cdFx0XHRcdHJldHVybiBcIlxcdTIyNjRcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiTFRcIjpcblx0XHRcdFx0cmV0dXJuIFwiPFwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJOQlwiOlxuXHRcdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfRklMVEVSU1RSSU5HX05PVFwiLCBbXCJbXCIgKyB2YWx1ZUxvdyArIFwiIC0gXCIgKyB2YWx1ZUhpZ2ggKyBcIl1cIl0pO1xuXG5cdFx0XHRjYXNlIFwiTkVcIjpcblx0XHRcdFx0cmV0dXJuIFwiXFx1MjI2MFwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJOb3RDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfRklMVEVSU1RSSU5HX05PVFwiLCBbXCIqXCIgKyB2YWx1ZUxvdyArIFwiKlwiXSk7XG5cblx0XHRcdGNhc2UgXCJFUVwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlTG93O1xuXHRcdH1cblx0fVxuXHRpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIGZvcm1hdFJhbmdlKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gXCIoXCIgKyBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAoZm9ybWF0UmFuZ2UpLmpvaW4oXCIsXCIpICsgXCIpXCI7XG5cdH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUaXRsZShrcGlEZWY6IEtQSURlZmluaXRpb24pOiBzdHJpbmcge1xuXHRjb25zdCByZXNCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXG5cdGZ1bmN0aW9uIGZvcm1hdExpc3QoaXRlbXM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkge1xuXHRcdGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH0gZWxzZSBpZiAoaXRlbXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gaXRlbXNbMF0ubGFiZWw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxldCByZXMgPSBpdGVtc1swXS5sYWJlbDtcblx0XHRcdGZvciAobGV0IEkgPSAxOyBJIDwgaXRlbXMubGVuZ3RoIC0gMTsgSSsrKSB7XG5cdFx0XHRcdHJlcyArPSBcIiwgXCIgKyBpdGVtc1tJXS5sYWJlbDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lURU1TTElTVFwiLCBbcmVzLCBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5sYWJlbF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9DSEFSVFRJVExFXCIsIFtmb3JtYXRMaXN0KGtwaURlZi5jaGFydC5tZWFzdXJlcyksIGZvcm1hdExpc3Qoa3BpRGVmLmNoYXJ0LmRpbWVuc2lvbnMpXSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyhjaGFydERlZmluaXRpb246IEtQSUNoYXJ0RGVmaW5pdGlvbiwgb0NoYXJ0UHJvcGVydGllczogYW55KTogdm9pZCB7XG5cdHN3aXRjaCAoY2hhcnREZWZpbml0aW9uLmNoYXJ0VHlwZSkge1xuXHRcdGNhc2UgXCJEb251dFwiOlxuXHRcdFx0Ly8gU2hvdyBkYXRhIGxhYmVscywgZG8gbm90IHNob3cgYXhpcyB0aXRsZXNcblx0XHRcdG9DaGFydFByb3BlcnRpZXMuY2F0ZWdvcnlBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMucGxvdEFyZWEuZGF0YUxhYmVsID0ge1xuXHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHR0eXBlOiBcInZhbHVlXCIsXG5cdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0X01GRDJcIlxuXHRcdFx0fTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcImJ1YmJsZVwiOlxuXHRcdFx0Ly8gU2hvdyBheGlzIHRpdGxlLCBidWJibGUgc2l6ZSBsZWdlbmQsIGRvIG5vdCBzaG93IGRhdGEgbGFiZWxzXG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMyID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLmxlZ2VuZEdyb3VwID0ge1xuXHRcdFx0XHRsYXlvdXQ6IHtcblx0XHRcdFx0XHRwb3NpdGlvbjogXCJib3R0b21cIixcblx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwidG9wTGVmdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnNpemVMZWdlbmQgPSB7XG5cdFx0XHRcdHZpc2libGU6IHRydWVcblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHsgdmlzaWJsZTogZmFsc2UgfTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcInNjYXR0ZXJcIjpcblx0XHRcdC8vIERvIG5vdCBzaG93IGRhdGEgbGFiZWxzIGFuZCBheGlzIHRpdGxlc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpczIgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHsgdmlzaWJsZTogZmFsc2UgfTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8vIERvIG5vdCBzaG93IGRhdGEgbGFiZWxzIGFuZCBheGlzIHRpdGxlc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5jYXRlZ29yeUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5wbG90QXJlYS5kYXRhTGFiZWwgPSB7IHZpc2libGU6IGZhbHNlIH07XG5cdH1cbn1cbmZ1bmN0aW9uIGZpbHRlck1hcChhT2JqZWN0czogeyBuYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHJvbGU/OiBzdHJpbmcgfVtdLCBhUm9sZXM/OiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdKTogc3RyaW5nW10ge1xuXHRpZiAoYVJvbGVzICYmIGFSb2xlcy5sZW5ndGgpIHtcblx0XHRyZXR1cm4gYU9iamVjdHNcblx0XHRcdC5maWx0ZXIoZGltZW5zaW9uID0+IHtcblx0XHRcdFx0cmV0dXJuIGFSb2xlcy5pbmRleE9mKGRpbWVuc2lvbi5yb2xlKSA+PSAwO1xuXHRcdFx0fSlcblx0XHRcdC5tYXAoZGltZW5zaW9uID0+IHtcblx0XHRcdFx0cmV0dXJuIGRpbWVuc2lvbi5sYWJlbDtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBhT2JqZWN0cy5tYXAoZGltZW5zaW9uID0+IHtcblx0XHRcdHJldHVybiBkaW1lbnNpb24ubGFiZWw7XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0U2NhdHRlckJ1YmJsZUNoYXJ0RmVlZHMoY2hhcnREZWZpbml0aW9uOiBLUElDaGFydERlZmluaXRpb24pOiB7IHVpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlczogc3RyaW5nW10gfVtdIHtcblx0Y29uc3QgYXhpczFNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMxXCJdKTtcblx0Y29uc3QgYXhpczJNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMyXCJdKTtcblx0Y29uc3QgYXhpczNNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMzXCJdKTtcblx0Y29uc3Qgb3RoZXJNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFt1bmRlZmluZWRdKTtcblx0Y29uc3Qgc2VyaWVzRGltZW5zaW9ucyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW1wiU2VyaWVzXCJdKTtcblxuXHQvLyBHZXQgdGhlIGZpcnN0IGRpbWVuc2lvbiB3aXRoIHJvbGUgXCJDYXRlZ29yeVwiIGZvciB0aGUgc2hhcGVcblx0Y29uc3Qgc2hhcGVEaW1lbnNpb24gPSBjaGFydERlZmluaXRpb24uZGltZW5zaW9ucy5maW5kKGRpbWVuc2lvbiA9PiB7XG5cdFx0cmV0dXJuIGRpbWVuc2lvbi5yb2xlID09PSBcIkNhdGVnb3J5XCI7XG5cdH0pO1xuXG5cdC8vIE1lYXN1cmUgZm9yIHRoZSB4LUF4aXMgOiBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMSwgb3IgZm9yIEF4aXMyIGlmIG5vdCBmb3VuZCwgb3IgZm9yIEF4aXMzIGlmIG5vdCBmb3VuZFxuXHRjb25zdCB4TWVhc3VyZSA9IGF4aXMxTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzMk1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczNNZWFzdXJlcy5zaGlmdCgpIHx8IG90aGVyTWVhc3VyZXMuc2hpZnQoKSB8fCBcIlwiO1xuXHQvLyBNZWFzdXJlIGZvciB0aGUgeS1BeGlzIDogZmlyc3QgbWVhc3VyZSBmb3IgQXhpczIsIG9yIHNlY29uZCBtZWFzdXJlIGZvciBBeGlzMSBpZiBub3QgZm91bmQsIG9yIGZpcnN0IG1lYXN1cmUgZm9yIEF4aXMzIGlmIG5vdCBmb3VuZFxuXHRjb25zdCB5TWVhc3VyZSA9IGF4aXMyTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzMU1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczNNZWFzdXJlcy5zaGlmdCgpIHx8IG90aGVyTWVhc3VyZXMuc2hpZnQoKSB8fCBcIlwiO1xuXHRjb25zdCByZXMgPSBbXG5cdFx0e1xuXHRcdFx0XCJ1aWRcIjogXCJ2YWx1ZUF4aXNcIixcblx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFwidmFsdWVzXCI6IFt4TWVhc3VyZV1cblx0XHR9LFxuXHRcdHtcblx0XHRcdFwidWlkXCI6IFwidmFsdWVBeGlzMlwiLFxuXHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogW3lNZWFzdXJlXVxuXHRcdH1cblx0XTtcblxuXHRpZiAoY2hhcnREZWZpbml0aW9uLmNoYXJ0VHlwZSA9PT0gXCJidWJibGVcIikge1xuXHRcdC8vIE1lYXN1cmUgZm9yIHRoZSBzaXplIG9mIHRoZSBidWJibGU6IGZpcnN0IG1lYXN1cmUgZm9yIEF4aXMzLCBvciByZW1haW5pbmcgbWVhc3VyZSBmb3IgQXhpczEvQXhpczIgaWYgbm90IGZvdW5kXG5cdFx0Y29uc3Qgc2l6ZU1lYXN1cmUgPSBheGlzM01lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczFNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMyTWVhc3VyZXMuc2hpZnQoKSB8fCBvdGhlck1lYXN1cmVzLnNoaWZ0KCkgfHwgXCJcIjtcblx0XHRyZXMucHVzaCh7XG5cdFx0XHRcInVpZFwiOiBcImJ1YmJsZVdpZHRoXCIsXG5cdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcInZhbHVlc1wiOiBbc2l6ZU1lYXN1cmVdXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBDb2xvciAob3B0aW9uYWwpXG5cdGlmIChzZXJpZXNEaW1lbnNpb25zLmxlbmd0aCkge1xuXHRcdHJlcy5wdXNoKHtcblx0XHRcdFwidWlkXCI6IFwiY29sb3JcIixcblx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogc2VyaWVzRGltZW5zaW9uc1xuXHRcdH0pO1xuXHR9XG5cdC8vIFNoYXBlIChvcHRpb25hbClcblx0aWYgKHNoYXBlRGltZW5zaW9uKSB7XG5cdFx0cmVzLnB1c2goe1xuXHRcdFx0XCJ1aWRcIjogXCJzaGFwZVwiLFxuXHRcdFx0XCJ0eXBlXCI6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcInZhbHVlc1wiOiBbc2hhcGVEaW1lbnNpb24ubGFiZWxdXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhcnRGZWVkcyhjaGFydERlZmluaXRpb246IEtQSUNoYXJ0RGVmaW5pdGlvbik6IHsgdWlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgdmFsdWVzOiBzdHJpbmdbXSB9W10ge1xuXHRsZXQgcmVzOiB7IHVpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlczogc3RyaW5nW10gfVtdO1xuXG5cdHN3aXRjaCAoY2hhcnREZWZpbml0aW9uLmNoYXJ0VHlwZSkge1xuXHRcdGNhc2UgXCJEb251dFwiOlxuXHRcdFx0cmVzID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJzaXplXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImNvbG9yXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zKVxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiYnViYmxlXCI6XG5cdFx0Y2FzZSBcInNjYXR0ZXJcIjpcblx0XHRcdHJlcyA9IGdldFNjYXR0ZXJCdWJibGVDaGFydEZlZWRzKGNoYXJ0RGVmaW5pdGlvbik7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJ2ZXJ0aWNhbF9idWxsZXRcIjpcblx0XHRcdHJlcyA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiYWN0dWFsVmFsdWVzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFt1bmRlZmluZWQsIFwiQXhpczFcIl0pXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcInRhcmdldFZhbHVlc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbXCJBeGlzMlwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY2F0ZWdvcnlBeGlzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zLCBbdW5kZWZpbmVkLCBcIkNhdGVnb3J5XCJdKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJjb2xvclwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW1wiU2VyaWVzXCJdKVxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmVzID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJ2YWx1ZUF4aXNcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcylcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY2F0ZWdvcnlBeGlzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zLCBbdW5kZWZpbmVkLCBcIkNhdGVnb3J5XCJdKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJjb2xvclwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW1wiU2VyaWVzXCJdKVxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHR9XG5cblx0cmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdG5hdkluZm86IE5hdmlnYXRpb25JbmZvLFxuXHRvU2hlbGxTZXJ2aWNlOiBhbnlcbik6IFByb21pc2U8eyBzZW1hbnRpY09iamVjdD86IHN0cmluZzsgYWN0aW9uPzogc3RyaW5nOyBvdXRib3VuZD86IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG5cdGlmIChuYXZJbmZvLnNlbWFudGljT2JqZWN0KSB7XG5cdFx0aWYgKG5hdkluZm8uYWN0aW9uKSB7XG5cdFx0XHQvLyBBY3Rpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQ6IGNoZWNrIGlmIGl0J3MgYXZhaWxhYmxlIGluIHRoZSBzaGVsbFxuXHRcdFx0cmV0dXJuIG9TaGVsbFNlcnZpY2UuZ2V0TGlua3MoeyBzZW1hbnRpY09iamVjdDogbmF2SW5mby5zZW1hbnRpY09iamVjdCwgYWN0aW9uOiBuYXZJbmZvLmFjdGlvbiB9KS50aGVuKChhTGlua3M6IGFueVtdKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhTGlua3MubGVuZ3RoID8geyBzZW1hbnRpY09iamVjdDogbmF2SW5mby5zZW1hbnRpY09iamVjdCwgYWN0aW9uOiBuYXZJbmZvLmFjdGlvbiB9IDogdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdlIGdldCB0aGUgcHJpbWFyeSBpbnRlbnQgZnJvbSB0aGUgc2hlbGxcblx0XHRcdHJldHVybiBvU2hlbGxTZXJ2aWNlLmdldFByaW1hcnlJbnRlbnQobmF2SW5mby5zZW1hbnRpY09iamVjdCkudGhlbigob0xpbms6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoIW9MaW5rKSB7XG5cdFx0XHRcdFx0Ly8gTm8gcHJpbWFyeSBpbnRlbnQuLi5cblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2hlY2sgdGhhdCB0aGUgcHJpbWFyeSBpbnRlbnQgaXMgbm90IHBhcnQgb2YgdGhlIHVuYXZhaWxhYmxlIGFjdGlvbnNcblx0XHRcdFx0Y29uc3Qgb0luZm8gPSBvU2hlbGxTZXJ2aWNlLnBhcnNlU2hlbGxIYXNoKG9MaW5rLmludGVudCk7XG5cdFx0XHRcdHJldHVybiBuYXZJbmZvLnVuYXZhaWxhYmxlQWN0aW9ucyAmJiBuYXZJbmZvLnVuYXZhaWxhYmxlQWN0aW9ucy5pbmRleE9mKG9JbmZvLmFjdGlvbikgPj0gMFxuXHRcdFx0XHRcdD8gdW5kZWZpbmVkXG5cdFx0XHRcdFx0OiB7IHNlbWFudGljT2JqZWN0OiBvSW5mby5zZW1hbnRpY09iamVjdCwgYWN0aW9uOiBvSW5mby5hY3Rpb24gfTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBPdXRib3VuZCBuYXZpZ2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRyZXR1cm4gbmF2SW5mby5vdXRib3VuZE5hdmlnYXRpb24gPyBQcm9taXNlLnJlc29sdmUoeyBvdXRib3VuZDogbmF2SW5mby5vdXRib3VuZE5hdmlnYXRpb24gfSkgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0fVxufVxuXG4vKipcbiAqIEBjbGFzcyBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGZvciBtYW5hZ2luZyB0aGUgS1BJcyBpbiBhbiBhbmFseXRpY2FsIGxpc3QgcGFnZVxuICpcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLktQSU1hbmFnZW1lbnRcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuOTMuMFxuICovXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIEtQSU1hbmFnZW1lbnRDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBhS1BJRGVmaW5pdGlvbnM/OiBLUElEZWZpbml0aW9uW107XG5cdHByb3RlY3RlZCBvQ2FyZDogYW55O1xuXHRwcm90ZWN0ZWQgb1BvcG92ZXIhOiBQb3BvdmVyO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBjYXJkIG1hbmlmZXN0IGZvciBhIEtQSSBkZWZpbml0aW9uIGFuZCBzdG9yZXMgaXQgaW4gYSBKU09OIG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ga3BpRGVmaW5pdGlvbiBUaGUgS1BJIGRlZmluaXRpb25cblx0ICogQHBhcmFtIG9LUElNb2RlbCBUaGUgSlNPTiBtb2RlbCBpbiB3aGljaCB0aGUgbWFuaWZlc3Qgd2lsbCBiZSBzdG9yZWRcblx0ICovXG5cdHByb3RlY3RlZCBpbml0Q2FyZE1hbmlmZXN0KGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIG9LUElNb2RlbDogSlNPTk1vZGVsKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0NhcmRNYW5pZmVzdDogYW55ID0ge1xuXHRcdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdFx0aWQ6IFwic2FwLmZlXCIsXG5cdFx0XHRcdHR5cGU6IFwiY2FyZFwiXG5cdFx0XHR9LFxuXHRcdFx0XCJzYXAudWlcIjoge1xuXHRcdFx0XHR0ZWNobm9sb2d5OiBcIlVJNVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJzYXAuY2FyZFwiOiB7XG5cdFx0XHRcdHR5cGU6IFwiQW5hbHl0aWNhbFwiLFxuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0anNvbjoge31cblx0XHRcdFx0fSxcblx0XHRcdFx0aGVhZGVyOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJOdW1lcmljXCIsXG5cdFx0XHRcdFx0dGl0bGU6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRpdGxlLFxuXHRcdFx0XHRcdHN1YlRpdGxlOiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHR1bml0T2ZNZWFzdXJlbWVudDogXCJ7bWFpblVuaXR9XCIsXG5cdFx0XHRcdFx0bWFpbkluZGljYXRvcjoge1xuXHRcdFx0XHRcdFx0bnVtYmVyOiBcInttYWluVmFsdWVOb1NjYWxlfVwiLFxuXHRcdFx0XHRcdFx0dW5pdDogXCJ7bWFpblZhbHVlU2NhbGV9XCIsXG5cdFx0XHRcdFx0XHRzdGF0ZTogXCJ7bWFpblN0YXRlfVwiLFxuXHRcdFx0XHRcdFx0dHJlbmQ6IFwie3RyZW5kfVwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0bWluSGVpZ2h0OiBcIjI1cmVtXCIsXG5cdFx0XHRcdFx0Y2hhcnRQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRwbG90QXJlYToge30sXG5cdFx0XHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwibGVmdFwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jaGFydERhdGFcIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBBZGQgc2lkZSBpbmRpY2F0b3JzIGluIHRoZSBjYXJkIGhlYWRlciBpZiBhIHRhcmdldCBpcyBkZWZpbmVkIGZvciB0aGUgS1BJXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggfHwga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgcmVzQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblx0XHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5oZWFkZXIuc2lkZUluZGljYXRvcnMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aXRsZTogcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSU5ESUNBVE9SX1RBUkdFVFwiKSxcblx0XHRcdFx0XHRudW1iZXI6IFwie3RhcmdldE51bWJlcn1cIixcblx0XHRcdFx0XHR1bml0OiBcInt0YXJnZXRVbml0fVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aXRsZTogcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSU5ESUNBVE9SX0RFVklBVElPTlwiKSxcblx0XHRcdFx0XHRudW1iZXI6IFwie2RldmlhdGlvbk51bWJlcn1cIixcblx0XHRcdFx0XHR1bml0OiBcIiVcIlxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHRcdH1cblxuXHRcdC8vIERldGFpbHMgb2YgdGhlIGNhcmQ6IGZpbHRlciBkZXNjcmlwdGlvbnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLmZvckVhY2goZmlsdGVyRGVmaW5pdGlvbiA9PiB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBnZXRGaWx0ZXJTdHJpbmdGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uKTtcblx0XHRcdFx0aWYgKGRlc2MpIHtcblx0XHRcdFx0XHRhRGVzY3JpcHRpb25zLnB1c2goZGVzYyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYURlc2NyaXB0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmhlYWRlci5kZXRhaWxzID0gYURlc2NyaXB0aW9ucy5qb2luKFwiLCBcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2hhcnQgc2V0dGluZ3M6IHR5cGUsIHRpdGxlLCBkaW1lbnNpb25zIGFuZCBtZWFzdXJlcyBpbiB0aGUgbWFuaWZlc3Rcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFR5cGUgPSBrcGlEZWZpbml0aW9uLmNoYXJ0LmNoYXJ0VHlwZTtcblx0XHR1cGRhdGVDaGFydExhYmVsU2V0dGluZ3Moa3BpRGVmaW5pdGlvbi5jaGFydCwgb0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuY2hhcnRQcm9wZXJ0aWVzKTtcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFByb3BlcnRpZXMudGl0bGUudGV4dCA9IGZvcm1hdENoYXJ0VGl0bGUoa3BpRGVmaW5pdGlvbik7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuZGltZW5zaW9ucyA9IGtwaURlZmluaXRpb24uY2hhcnQuZGltZW5zaW9ucy5tYXAoZGltZW5zaW9uID0+IHtcblx0XHRcdHJldHVybiB7IGxhYmVsOiBkaW1lbnNpb24ubGFiZWwsIHZhbHVlOiBcIntcIiArIGRpbWVuc2lvbi5uYW1lICsgXCJ9XCIgfTtcblx0XHR9KTtcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5tZWFzdXJlcyA9IGtwaURlZmluaXRpb24uY2hhcnQubWVhc3VyZXMubWFwKG1lYXN1cmUgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbGFiZWw6IG1lYXN1cmUubGFiZWwsIHZhbHVlOiBcIntcIiArIG1lYXN1cmUubmFtZSArIFwifVwiIH07XG5cdFx0fSk7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuZmVlZHMgPSBnZXRDaGFydEZlZWRzKGtwaURlZmluaXRpb24uY2hhcnQpO1xuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCwge1xuXHRcdFx0bWFuaWZlc3Q6IG9DYXJkTWFuaWZlc3Rcblx0XHR9KTtcblx0fVxuXG5cdHByb3RlY3RlZCBpbml0TmF2aWdhdGlvbkluZm8oa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwgb0tQSU1vZGVsOiBKU09OTW9kZWwsIG9TaGVsbFNlcnZpY2U6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIEFkZCBuYXZpZ2F0aW9uXG5cdFx0aWYgKGtwaURlZmluaXRpb24ubmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIGdldE5hdmlnYXRpb25QYXJhbWV0ZXJzKGtwaURlZmluaXRpb24ubmF2aWdhdGlvbiwgb1NoZWxsU2VydmljZSkudGhlbihvTmF2SW5mbyA9PiB7XG5cdFx0XHRcdGlmIChvTmF2SW5mbykge1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9oZWFkZXIvYWN0aW9uc1wiLCBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblwiLFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvTmF2SW5mb1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5hS1BJRGVmaW5pdGlvbnMgPSB0aGlzLmdldEtQSURhdGEoKTtcblxuXHRcdGlmICh0aGlzLmFLUElEZWZpbml0aW9ucyAmJiB0aGlzLmFLUElEZWZpbml0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gKG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBCYXNlQ29udHJvbGxlcikuZ2V0QXBwQ29tcG9uZW50KCkgYXMgYW55O1xuXG5cdFx0XHQvLyBDcmVhdGUgYSBKU09OIG1vZGVsIHRvIHN0b3JlIEtQSSBkYXRhXG5cdFx0XHRjb25zdCBvS1BJTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0XHRvVmlldy5zZXRNb2RlbChvS1BJTW9kZWwsIFwia3BpTW9kZWxcIik7XG5cblx0XHRcdHRoaXMuYUtQSURlZmluaXRpb25zLmZvckVhY2goa3BpRGVmaW5pdGlvbiA9PiB7XG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgbWFuaWZlc3QgZm9yIHRoZSBLUEkgY2FyZCBhbmQgc3RvcmUgaXQgaW4gdGhlIEtQSSBtb2RlbFxuXHRcdFx0XHR0aGlzLmluaXRDYXJkTWFuaWZlc3Qoa3BpRGVmaW5pdGlvbiwgb0tQSU1vZGVsKTtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIG5hdmlnYXRpb24gaW5mb3JtYXRpb24gaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdHRoaXMuaW5pdE5hdmlnYXRpb25JbmZvKGtwaURlZmluaXRpb24sIG9LUElNb2RlbCwgb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkpLmNhdGNoKGZ1bmN0aW9uKGVycjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIExvYWQgdGFnIGRhdGEgZm9yIHRoZSBLUElcblx0XHRcdFx0dGhpcy5sb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uLCBvQXBwQ29tcG9uZW50LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCwgb0tQSU1vZGVsKS5jYXRjaChmdW5jdGlvbihlcnI6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHRpZiAob0tQSU1vZGVsKSB7XG5cdFx0XHRvS1BJTW9kZWwuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0S1BJRGF0YSgpOiBLUElEZWZpbml0aW9uW10gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRzQ3VzdG9tRGF0YSA9IG9WaWV3LmdldENvbnRlbnQoKVswXS5kYXRhKFwiS1BJRGF0YVwiKTtcblxuXHRcdGlmIChzQ3VzdG9tRGF0YSkge1xuXHRcdFx0Y29uc3QgdkRhdGEgPSB0eXBlb2Ygc0N1c3RvbURhdGEgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHNDdXN0b21EYXRhKSA6IHNDdXN0b21EYXRhO1xuXHRcdFx0aWYgKFwiY3VzdG9tRGF0YVwiIGluIHZEYXRhKSB7XG5cdFx0XHRcdHJldHVybiB2RGF0YVtcImN1c3RvbURhdGFcIl07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdkRhdGE7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVEYXRhcG9pbnRWYWx1ZUFuZEN1cnJlbmN5KGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQsIG9LUElNb2RlbDogSlNPTk1vZGVsKSB7XG5cdFx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoXG5cdFx0XHRzYXAudWlcblx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHRcdC5nZXRMYW5ndWFnZSgpXG5cdFx0KTtcblx0XHRjb25zdCByYXdVbml0ID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoXG5cdFx0XHQ/IGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSlcblx0XHRcdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8udmFsdWU7XG5cblx0XHRjb25zdCBpc1BlcmNlbnRhZ2UgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc0N1cnJlbmN5ID09PSBmYWxzZSAmJiByYXdVbml0ID09PSBcIiVcIjtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIE1haW4gS1BJIHZhbHVlXG5cdFx0Y29uc3QgcmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXG5cdFx0Ly8gVmFsdWUgZm9ybWF0dGVkIHdpdGggYSBzY2FsZVxuXHRcdGNvbnN0IGtwaVZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0c2hvd1NjYWxlOiAhaXNQZXJjZW50YWdlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVwiLCBrcGlWYWx1ZSk7XG5cblx0XHQvLyBWYWx1ZSB3aXRob3V0IGEgc2NhbGVcblx0XHRjb25zdCBrcGlWYWx1ZVVuc2NhbGVkID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAyLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlLFxuXHRcdFx0XHRncm91cGluZ0VuYWJsZWQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlVW5zY2FsZWRcIiwga3BpVmFsdWVVbnNjYWxlZCk7XG5cblx0XHQvLyBWYWx1ZSBmb3JtYXR0ZWQgd2l0aCB0aGUgc2NhbGUgb21pdHRlZFxuXHRcdGNvbnN0IGtwaVZhbHVlTm9TY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlTm9TY2FsZVwiLCBrcGlWYWx1ZU5vU2NhbGUpO1xuXG5cdFx0Ly8gU2NhbGUgb2YgdGhlIHZhbHVlXG5cdFx0Y29uc3Qga3BpVmFsdWVTY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRkZWNpbWFsczogMCxcblx0XHRcdFx0bWF4SW50ZWdlckRpZ2l0czogMCxcblx0XHRcdFx0c2hvd1NjYWxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVNjYWxlXCIsIGtwaVZhbHVlU2NhbGUpO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gVW5pdCBvciBjdXJyZW5jeVxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmIHJhd1VuaXQpIHtcblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LmlzQ3VycmVuY3kpIHtcblx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVW5pdFwiLCByYXdVbml0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgdW5pdCBvZiBtZWFzdXJlLCB3ZSBoYXZlIHRvIGZvcm1hdCBpdCBwcm9wZXJseVxuXHRcdFx0XHRjb25zdCBrcGlVbml0ID0gTnVtYmVyRm9ybWF0LmdldFVuaXRJbnN0YW5jZSh7IHNob3dOdW1iZXI6IGZhbHNlIH0sIGN1cnJlbnRMb2NhbGUpLmZvcm1hdChyYXdWYWx1ZSwgcmF3VW5pdCk7XG5cdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwga3BpVW5pdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbCkge1xuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblxuXHRcdGxldCBjcml0aWNhbGl0eVZhbHVlID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSkge1xuXHRcdFx0Ly8gQ3JpdGljYWxpdHkgaXMgYSBmaXhlZCB2YWx1ZVxuXHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWU7XG5cdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGNvbWVzIGZyb20gYW5vdGhlciBwcm9wZXJ0eSAodmlhIGEgcGF0aClcblx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPVxuXHRcdFx0XHRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVtrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCldIHx8IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyAmJiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSkge1xuXHRcdFx0Ly8gQ3JpdGljYWxpdHkgY2FsY3VsYXRpb25cblx0XHRcdHN3aXRjaCAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUpIHtcblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9UYXJnZXRcIjpcblx0XHRcdFx0XHRjcml0aWNhbGl0eVZhbHVlID0gbWVzc2FnZVR5cGVGcm9tVGFyZ2V0Q2FsY3VsYXRpb24ocmF3VmFsdWUsIGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01pbmltaXplXCI6XG5cdFx0XHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IG1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24oXG5cdFx0XHRcdFx0XHRyYXdWYWx1ZSxcblx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01heGltaXplXCI6XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IG1lc3NhZ2VUeXBlRnJvbU1heGltaXplQ2FsY3VsYXRpb24oXG5cdFx0XHRcdFx0XHRyYXdWYWx1ZSxcblx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Dcml0aWNhbGl0eVwiLCBjcml0aWNhbGl0eVZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblN0YXRlXCIsXG5cdFx0XHRWYWx1ZUNvbG9yRnJvbU1lc3NhZ2VUeXBlW2NyaXRpY2FsaXR5VmFsdWVdIHx8IFwiTm9uZVwiXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRGF0YXBvaW50VHJlbmQoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCwgb0tQSU1vZGVsOiBKU09OTW9kZWwpIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cblx0XHRsZXQgdHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kVmFsdWUpIHtcblx0XHRcdC8vIFRyZW5kIGlzIGEgZml4ZWQgdmFsdWVcblx0XHRcdHRyZW5kVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHQvLyBUcmVuZCBjb21lcyBmcm9tIGFub3RoZXIgcHJvcGVydHkgdmlhIGEgcGF0aFxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGgpKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQgfHxcblx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoXG5cdFx0KSB7XG5cdFx0XHQvLyBDYWxjdWxhdGVkIHRyZW5kXG5cdFx0XHRsZXQgdHJlbmRSZWZlcmVuY2VWYWx1ZTogbnVtYmVyO1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoXG5cdFx0XHRcdFx0a3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCB8fCBcIlwiKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21DYWxjdWxhdGlvbihcblx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUsXG5cdFx0XHRcdCEha3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUsXG5cdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25UcmVzaG9sZHNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZFwiLCB0cmVuZFZhbHVlKTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlVGFyZ2V0VmFsdWUoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCwgb0tQSU1vZGVsOiBKU09OTW9kZWwpIHtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjsgLy8gTm8gdGFyZ2V0IHNldCBmb3IgdGhlIEtQSVxuXHRcdH1cblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cdFx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoXG5cdFx0XHRzYXAudWlcblx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHRcdC5nZXRMYW5ndWFnZSgpXG5cdFx0KTtcblxuXHRcdGxldCB0YXJnZXRSYXdWYWx1ZTogbnVtYmVyO1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0YXJnZXRSYXdWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXRSYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aCB8fCBcIlwiKSk7XG5cdFx0fVxuXHRcdGNvbnN0IGRldmlhdGlvblJhd1ZhbHVlID0gdGFyZ2V0UmF3VmFsdWUgIT09IDAgPyAoKHJhd1ZhbHVlIC0gdGFyZ2V0UmF3VmFsdWUpIC8gdGFyZ2V0UmF3VmFsdWUpICogMTAwIDogdW5kZWZpbmVkO1xuXG5cdFx0Ly8gRm9ybWF0dGluZ1xuXHRcdGNvbnN0IHRhcmdldFZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBcInNob3J0XCIsXG5cdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdCh0YXJnZXRSYXdWYWx1ZSk7XG5cdFx0Y29uc3QgdGFyZ2V0U2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IFwic2hvcnRcIixcblx0XHRcdFx0ZGVjaW1hbHM6IDAsXG5cdFx0XHRcdG1heEludGVnZXJEaWdpdHM6IDAsXG5cdFx0XHRcdHNob3dTY2FsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdCh0YXJnZXRSYXdWYWx1ZSk7XG5cblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldE51bWJlclwiLCB0YXJnZXRWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXRVbml0XCIsIHRhcmdldFNjYWxlKTtcblxuXHRcdGlmIChkZXZpYXRpb25SYXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBkZXZpYXRpb25WYWx1ZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0XHQpLmZvcm1hdChkZXZpYXRpb25SYXdWYWx1ZSk7XG5cdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2RldmlhdGlvbk51bWJlclwiLCBkZXZpYXRpb25WYWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vZGV2aWF0aW9uTnVtYmVyXCIsIFwiTi9BXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkcyB0YWcgZGF0YSBmb3IgYSBLUEksIGFuZCBzdG9yZXMgaXQgaW4gdGhlIEpTT04gS1BJIG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0tQSURlZmluaXRpb259IGtwaURlZmluaXRpb24gVGhlIGRlZmluaXRpb24gb2YgdGhlIEtQSS5cblx0ICogQHBhcmFtIHtPRGF0YU1vZGVsfSBvTWFpbk1vZGVsIFRoZSBtb2RlbCB1c2VkIHRvIGxvYWQgdGhlIGRhdGEuXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBvS1BJTW9kZWwgVGhlIEpTT04gbW9kZWwgd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSBzdG9yZWRcblx0ICogQHBhcmFtIGxvYWRGdWxsIElmIG5vdCB0cnVlLCBsb2FkcyBvbmx5IGRhdGEgZm9yIHRoZSBLUEkgdGFnXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkYXRhIGlzIGxvYWRlZC5cblx0ICovXG5cdHByb3RlY3RlZCBsb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvTWFpbk1vZGVsOiBPRGF0YU1vZGVsLCBvS1BJTW9kZWw6IEpTT05Nb2RlbCwgbG9hZEZ1bGw/OiBib29sZWFuKTogYW55IHtcblx0XHQvLyBJZiBsb2FkRnVsbD1mYWxzZSwgdGhlbiB3ZSdyZSBqdXN0IGxvYWRpbmcgZGF0YSBmb3IgdGhlIHRhZyBhbmQgd2UgdXNlIHRoZSBcIiRhdXRvLkxvbmdSdW5uZXJzXCIgZ3JvdXBJRFxuXHRcdC8vIElmIGxvYWRGdWxsPXRydWUsIHdlJ3JlIGxvYWRpbmcgZGF0YSBmb3IgdGhlIHdob2xlIEtQSSAodGFnICsgY2FyZCkgYW5kIHdlIHVzZSB0aGUgZGVmYXVsdCAoXCIkYXV0b1wiKSBncm91cElEXG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gbG9hZEZ1bGxcblx0XHRcdD8gb01haW5Nb2RlbC5iaW5kTGlzdChcIi9cIiArIGtwaURlZmluaXRpb24uZW50aXR5U2V0KVxuXHRcdFx0OiBvTWFpbk1vZGVsLmJpbmRMaXN0KFwiL1wiICsga3BpRGVmaW5pdGlvbi5lbnRpdHlTZXQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHsgJCRncm91cElkOiBcIiRhdXRvLkxvbmdSdW5uZXJzXCIgfSk7XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZTogUmVjb3JkPHN0cmluZywgeyB1bml0Pzogc3RyaW5nIH0+ID0ge307XG5cblx0XHQvLyBNYWluIHZhbHVlICsgY3VycmVuY3kvdW5pdFxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGgpIHtcblx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoXSA9IHsgdW5pdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aF0gPSB7fTtcblx0XHR9XG5cblx0XHQvLyBQcm9wZXJ0eSBmb3IgY3JpdGljYWxpdHlcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoKSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aF0gPSB7fTtcblx0XHR9XG5cblx0XHQvLyBQcm9wZXJ0aWVzIGZvciB0cmVuZCBhbmQgdHJlbmQgY2FsY3VsYXRpb25cblx0XHRpZiAobG9hZEZ1bGwpIHtcblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGgpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aF0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aF0gPSB7fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvTGlzdEJpbmRpbmcuc2V0QWdncmVnYXRpb24oeyBhZ2dyZWdhdGU6IG9BZ2dyZWdhdGUgfSk7XG5cblx0XHQvLyBNYW5hZ2UgU2VsZWN0aW9uVmFyaWFudCBmaWx0ZXJzXG5cdFx0aWYgKGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFGaWx0ZXJzID0ga3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMubWFwKGNyZWF0ZUZpbHRlckZyb21EZWZpbml0aW9uKS5maWx0ZXIoZmlsdGVyID0+IHtcblx0XHRcdFx0cmV0dXJuIGZpbHRlciAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0fSkgYXMgRmlsdGVyW107XG5cdFx0XHRvTGlzdEJpbmRpbmcuZmlsdGVyKGFGaWx0ZXJzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAxKS50aGVuKChhQ29udGV4dHM6IENvbnRleHRbXSkgPT4ge1xuXHRcdFx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgcmF3VW5pdCA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzUGF0aFxuXHRcdFx0XHRcdD8gYUNvbnRleHRzWzBdLmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUpXG5cdFx0XHRcdFx0OiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py52YWx1ZTtcblxuXHRcdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdCAmJiAhcmF3VW5pdCkge1xuXHRcdFx0XHRcdC8vIEEgdW5pdC9jdXJyZW5jeSBpcyBkZWZpbmVkLCBidXQgaXRzIHZhbHVlIGlzIHVuZGVmaW5lZCAtLT4gbXVsdGktdW5pdCBzaXR1YXRpb25cblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVwiLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVVbnNjYWxlZFwiLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVOb1NjYWxlXCIsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVNjYWxlXCIsIFwiXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Dcml0aWNhbGl0eVwiLCBNZXNzYWdlVHlwZS5Ob25lKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZVwiLCBcIk5vbmVcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZFwiLCBcIk5vbmVcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXROdW1iZXJcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldFVuaXRcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2RldmlhdGlvbk51bWJlclwiLCB1bmRlZmluZWQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeShrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0sIG9LUElNb2RlbCk7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eShrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0sIG9LUElNb2RlbCk7XG5cblx0XHRcdFx0XHRpZiAobG9hZEZ1bGwpIHtcblx0XHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50VHJlbmQoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVUYXJnZXRWYWx1ZShrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0sIG9LUElNb2RlbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZHMgY2FyZCBkYXRhIGZvciBhIEtQSSwgYW5kIHN0b3JlcyBpdCBpbiB0aGUgSlNPTiBLUEkgbW9kZWwuXG5cdCAqXG5cdCAqIEBwYXJhbSB7S1BJRGVmaW5pdGlvbn0ga3BpRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgS1BJLlxuXHQgKiBAcGFyYW0ge09EYXRhTW9kZWx9IG9NYWluTW9kZWwgVGhlIG1vZGVsIHVzZWQgdG8gbG9hZCB0aGUgZGF0YS5cblx0ICogQHBhcmFtIHtKU09OTW9kZWx9IG9LUElNb2RlbCBUaGUgSlNPTiBtb2RlbCB3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyB0aGUgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gZGF0YSBpcyBsb2FkZWQuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgbG9hZEtQSUNhcmREYXRhKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIG9NYWluTW9kZWw6IE9EYXRhTW9kZWwsIG9LUElNb2RlbDogSlNPTk1vZGVsKTogYW55IHtcblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTWFpbk1vZGVsLmJpbmRMaXN0KFwiL1wiICsga3BpRGVmaW5pdGlvbi5lbnRpdHlTZXQpO1xuXHRcdGNvbnN0IG9Hcm91cDogUmVjb3JkPHN0cmluZywgT2JqZWN0PiA9IHt9O1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGU6IFJlY29yZDxzdHJpbmcsIE9iamVjdD4gPSB7fTtcblxuXHRcdGtwaURlZmluaXRpb24uY2hhcnQuZGltZW5zaW9ucy5mb3JFYWNoKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRvR3JvdXBbZGltZW5zaW9uLm5hbWVdID0ge307XG5cdFx0fSk7XG5cdFx0a3BpRGVmaW5pdGlvbi5jaGFydC5tZWFzdXJlcy5mb3JFYWNoKG1lYXN1cmUgPT4ge1xuXHRcdFx0b0FnZ3JlZ2F0ZVttZWFzdXJlLm5hbWVdID0ge307XG5cdFx0fSk7XG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHtcblx0XHRcdGdyb3VwOiBvR3JvdXAsXG5cdFx0XHRhZ2dyZWdhdGU6IG9BZ2dyZWdhdGVcblx0XHR9KTtcblxuXHRcdC8vIE1hbmFnZSBTZWxlY3Rpb25WYXJpYW50IGZpbHRlcnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYUZpbHRlcnMgPSBrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5tYXAoY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24pLmZpbHRlcihmaWx0ZXIgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZmlsdGVyICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR9KSBhcyBGaWx0ZXJbXTtcblx0XHRcdG9MaXN0QmluZGluZy5maWx0ZXIoYUZpbHRlcnMpO1xuXHRcdH1cblxuXHRcdC8vIFNvcnRpbmdcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5jaGFydC5zb3J0T3JkZXIpIHtcblx0XHRcdG9MaXN0QmluZGluZy5zb3J0KFxuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0LnNvcnRPcmRlci5tYXAoc29ydEluZm8gPT4ge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgU29ydGVyKHNvcnRJbmZvLm5hbWUsIHNvcnRJbmZvLmRlc2NlbmRpbmcpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0xpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCBrcGlEZWZpbml0aW9uLmNoYXJ0Lm1heEl0ZW1zKS50aGVuKChhQ29udGV4dHM6IENvbnRleHRbXSkgPT4ge1xuXHRcdFx0Y29uc3QgY2hhcnREYXRhID0gYUNvbnRleHRzLm1hcChmdW5jdGlvbihvQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBvRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0LmRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuXHRcdFx0XHRcdG9EYXRhW2RpbWVuc2lvbi5uYW1lXSA9IG9Db250ZXh0LmdldFByb3BlcnR5KGRpbWVuc2lvbi5uYW1lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGtwaURlZmluaXRpb24uY2hhcnQubWVhc3VyZXMuZm9yRWFjaChtZWFzdXJlID0+IHtcblx0XHRcdFx0XHRvRGF0YVttZWFzdXJlLm5hbWVdID0gb0NvbnRleHQuZ2V0UHJvcGVydHkobWVhc3VyZS5uYW1lKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIG9EYXRhO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vY2hhcnREYXRhXCIsIGNoYXJ0RGF0YSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcG9wb3ZlciB0byBkaXNwbGF5IHRoZSBLUEkgY2FyZFxuXHQgKiBUaGUgcG9wb3ZlciBhbmQgdGhlIGNvbnRhaW5lZCBjYXJkIGZvciB0aGUgS1BJcyBhcmUgY3JlYXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqIFRoZSBwb3BvdmVyIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBLUElzLCBzbyBpdCdzIGNyZWF0ZWQgb25seSBvbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0tQSVRhZyBUaGUgdGFnIHRoYXQgdHJpZ2dlcmVkIHRoZSBwb3BvdmVyIG9wZW5pbmcuXG5cdCAqIEByZXR1cm5zIFRoZSBzaGFyZWQgcG9wb3ZlciBhcyBhIHByb21pc2UuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgZ2V0UG9wb3ZlcihvS1BJVGFnOiBHZW5lcmljVGFnKTogUHJvbWlzZTxQb3BvdmVyPiB7XG5cdFx0aWYgKCF0aGlzLm9Qb3BvdmVyKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHQoc2FwLnVpLmdldENvcmUoKS5sb2FkTGlicmFyeShcInNhcC91aS9pbnRlZ3JhdGlvblwiLCB7IGFzeW5jOiB0cnVlIH0pIGFzIFByb21pc2U8b2JqZWN0Pilcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRzYXAudWkucmVxdWlyZShbXCJzYXAvdWkvaW50ZWdyYXRpb24vd2lkZ2V0cy9DYXJkXCIsIFwic2FwL3VpL2ludGVncmF0aW9uL0hvc3RcIl0sIChDYXJkOiBhbnksIEhvc3Q6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvSG9zdCA9IG5ldyBIb3N0KCk7XG5cblx0XHRcdFx0XHRcdFx0b0hvc3QuYXR0YWNoQWN0aW9uKChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNUeXBlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInR5cGVcIik7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1BhcmFtcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwYXJhbWV0ZXJzXCIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNUeXBlID09PSBcIk5hdmlnYXRpb25cIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbXMuc2VtYW50aWNPYmplY3QpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGUoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtcy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zLmFjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGVPdXRib3VuZChvUGFyYW1zLm91dGJvdW5kKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMub0NhcmQgPSBuZXcgQ2FyZCh7XG5cdFx0XHRcdFx0XHRcdFx0d2lkdGg6IFwiMjVyZW1cIixcblx0XHRcdFx0XHRcdFx0XHRoZWlnaHQ6IFwiYXV0b1wiXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnNldEhvc3Qob0hvc3QgYXMgYW55KTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLm9Qb3BvdmVyID0gbmV3IFBvcG92ZXIoXCJrcGktUG9wb3ZlclwiLCB7XG5cdFx0XHRcdFx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGxhY2VtZW50OiBcIkF1dG9cIixcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiBbdGhpcy5vQ2FyZF1cblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0b0tQSVRhZy5hZGREZXBlbmRlbnQodGhpcy5vUG9wb3Zlcik7IC8vIFRoZSBmaXJzdCBjbGlja2VkIHRhZyBnZXRzIHRoZSBwb3BvdmVyIGFzIGRlcGVuZGVudFxuXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUodGhpcy5vUG9wb3Zlcik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vUG9wb3Zlcik7XG5cdFx0fVxuXHR9XG5cblx0QFB1YmxpY1xuXHRwdWJsaWMgb25LUElQcmVzc2VkKG9LUElUYWc6IGFueSwga3BpSUQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG9LUElNb2RlbCA9IG9LUElUYWcuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHRpZiAodGhpcy5hS1BJRGVmaW5pdGlvbnMgJiYgdGhpcy5hS1BJRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBrcGlEZWZpbml0aW9uID0gdGhpcy5hS1BJRGVmaW5pdGlvbnMuZmluZChmdW5jdGlvbihvRGVmKSB7XG5cdFx0XHRcdHJldHVybiBvRGVmLmlkID09PSBrcGlJRDtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbikge1xuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvS1BJVGFnLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGFQcm9taXNlcyA9IFtcblx0XHRcdFx0XHR0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24sIG9Nb2RlbCwgb0tQSU1vZGVsLCB0cnVlKSxcblx0XHRcdFx0XHR0aGlzLmxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uLCBvTW9kZWwsIG9LUElNb2RlbCksXG5cdFx0XHRcdFx0dGhpcy5nZXRQb3BvdmVyKG9LUElUYWcpXG5cdFx0XHRcdF07XG5cblx0XHRcdFx0UHJvbWlzZS5hbGwoYVByb21pc2VzKVxuXHRcdFx0XHRcdC50aGVuKGFSZXN1bHRzID0+IHtcblx0XHRcdFx0XHRcdHRoaXMub0NhcmQuc2V0TWFuaWZlc3Qob0tQSU1vZGVsLmdldFByb3BlcnR5KFwiL1wiICsga3BpSUQgKyBcIi9tYW5pZmVzdFwiKSk7XG5cdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnJlZnJlc2goKTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgb1BvcG92ZXIgPSBhUmVzdWx0c1syXTtcblx0XHRcdFx0XHRcdG9Qb3BvdmVyLm9wZW5CeShvS1BJVGFnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZXJyID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbjtcbiJdfQ==
1135
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOlsiTWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHkiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiV2FybmluZyIsIlN1Y2Nlc3MiLCJJbmZvcm1hdGlvbiIsIlZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGUiLCJOb25lIiwibWVzc2FnZVR5cGVGcm9tVGFyZ2V0Q2FsY3VsYXRpb24iLCJrcGlWYWx1ZSIsImFUaHJlc2hvbGRzIiwiY3JpdGljYWxpdHlQcm9wZXJ0eSIsInVuZGVmaW5lZCIsIm1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24iLCJtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uIiwiZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSIsInRyZW5kVmFsdWUiLCJkZXZpYXRpb25JbmRpY2F0b3IiLCJkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24iLCJyZWZlcmVuY2VWYWx1ZSIsImlzUmVsYXRpdmUiLCJjb21wVmFsdWUiLCJjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbiIsImZpbHRlckRlZmluaXRpb24iLCJyYW5nZXMiLCJsZW5ndGgiLCJGaWx0ZXIiLCJwcm9wZXJ0eVBhdGgiLCJvcGVyYXRvciIsInJhbmdlTG93IiwicmFuZ2VIaWdoIiwiYVJhbmdlRmlsdGVycyIsIm1hcCIsInJhbmdlIiwiZmlsdGVycyIsImFuZCIsImdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uIiwiY3VycmVudExvY2FsZSIsIkxvY2FsZSIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldENvbmZpZ3VyYXRpb24iLCJnZXRMYW5ndWFnZSIsInJlc0J1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImRhdGVGb3JtYXQiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZUluc3RhbmNlIiwic3R5bGUiLCJmb3JtYXRSYW5nZSIsInZhbHVlTG93IiwicHJvcGVydHlUeXBlIiwiaW5kZXhPZiIsImZvcm1hdCIsIkRhdGUiLCJ2YWx1ZUhpZ2giLCJnZXRUZXh0Iiwiam9pbiIsImZvcm1hdENoYXJ0VGl0bGUiLCJrcGlEZWYiLCJmb3JtYXRMaXN0IiwiaXRlbXMiLCJsYWJlbCIsInJlcyIsIkkiLCJjaGFydCIsIm1lYXN1cmVzIiwiZGltZW5zaW9ucyIsInVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyIsImNoYXJ0RGVmaW5pdGlvbiIsIm9DaGFydFByb3BlcnRpZXMiLCJjaGFydFR5cGUiLCJjYXRlZ29yeUF4aXMiLCJ0aXRsZSIsInZpc2libGUiLCJ2YWx1ZUF4aXMiLCJmb3JtYXRTdHJpbmciLCJwbG90QXJlYSIsImRhdGFMYWJlbCIsInR5cGUiLCJ2YWx1ZUF4aXMyIiwibGVnZW5kR3JvdXAiLCJsYXlvdXQiLCJwb3NpdGlvbiIsImFsaWdubWVudCIsInNpemVMZWdlbmQiLCJmaWx0ZXJNYXAiLCJhT2JqZWN0cyIsImFSb2xlcyIsImZpbHRlciIsImRpbWVuc2lvbiIsInJvbGUiLCJnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyIsImF4aXMxTWVhc3VyZXMiLCJheGlzMk1lYXN1cmVzIiwiYXhpczNNZWFzdXJlcyIsIm90aGVyTWVhc3VyZXMiLCJzZXJpZXNEaW1lbnNpb25zIiwic2hhcGVEaW1lbnNpb24iLCJmaW5kIiwieE1lYXN1cmUiLCJzaGlmdCIsInlNZWFzdXJlIiwic2l6ZU1lYXN1cmUiLCJwdXNoIiwiZ2V0Q2hhcnRGZWVkcyIsImdldE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibmF2SW5mbyIsIm9TaGVsbFNlcnZpY2UiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsImdldExpbmtzIiwidGhlbiIsImFMaW5rcyIsImdldFByaW1hcnlJbnRlbnQiLCJvTGluayIsIm9JbmZvIiwicGFyc2VTaGVsbEhhc2giLCJpbnRlbnQiLCJ1bmF2YWlsYWJsZUFjdGlvbnMiLCJvdXRib3VuZE5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIm91dGJvdW5kIiwiS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb24iLCJVSTVDbGFzcyIsIkNvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSIsIk92ZXJyaWRlIiwiaW5pdENhcmRNYW5pZmVzdCIsImtwaURlZmluaXRpb24iLCJvS1BJTW9kZWwiLCJvQ2FyZE1hbmlmZXN0IiwiaWQiLCJ0ZWNobm9sb2d5IiwiZGF0YSIsImpzb24iLCJoZWFkZXIiLCJkYXRhcG9pbnQiLCJzdWJUaXRsZSIsImRlc2NyaXB0aW9uIiwidW5pdE9mTWVhc3VyZW1lbnQiLCJtYWluSW5kaWNhdG9yIiwibnVtYmVyIiwidW5pdCIsInN0YXRlIiwidHJlbmQiLCJjb250ZW50IiwibWluSGVpZ2h0IiwiY2hhcnRQcm9wZXJ0aWVzIiwicGF0aCIsInRhcmdldFBhdGgiLCJ0YXJnZXRWYWx1ZSIsInNpZGVJbmRpY2F0b3JzIiwic2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zIiwiYURlc2NyaXB0aW9ucyIsImZvckVhY2giLCJkZXNjIiwiZGV0YWlscyIsInRleHQiLCJ2YWx1ZSIsIm5hbWUiLCJtZWFzdXJlIiwiZmVlZHMiLCJzZXRQcm9wZXJ0eSIsIm1hbmlmZXN0IiwiaW5pdE5hdmlnYXRpb25JbmZvIiwibmF2aWdhdGlvbiIsIm9OYXZJbmZvIiwicGFyYW1ldGVycyIsIm9uSW5pdCIsImFLUElEZWZpbml0aW9ucyIsImdldEtQSURhdGEiLCJvVmlldyIsImdldFZpZXciLCJvQXBwQ29tcG9uZW50IiwiZ2V0Q29udHJvbGxlciIsImdldEFwcENvbXBvbmVudCIsIkpTT05Nb2RlbCIsInNldE1vZGVsIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJsb2FkS1BJVGFnRGF0YSIsImdldE1vZGVsIiwib25FeGl0IiwiZGVzdHJveSIsInNDdXN0b21EYXRhIiwiZ2V0Q29udGVudCIsInZEYXRhIiwiSlNPTiIsInBhcnNlIiwidXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeSIsImtwaUNvbnRleHQiLCJyYXdVbml0IiwiaXNQYXRoIiwiZ2V0UHJvcGVydHkiLCJpc1BlcmNlbnRhZ2UiLCJpc0N1cnJlbmN5IiwicmF3VmFsdWUiLCJOdW1iZXIiLCJwYXJzZUZsb2F0IiwiTnVtYmVyRm9ybWF0IiwiZ2V0RmxvYXRJbnN0YW5jZSIsIm1pbkZyYWN0aW9uRGlnaXRzIiwibWF4RnJhY3Rpb25EaWdpdHMiLCJzaG93U2NhbGUiLCJrcGlWYWx1ZVVuc2NhbGVkIiwiZ3JvdXBpbmdFbmFibGVkIiwia3BpVmFsdWVOb1NjYWxlIiwia3BpVmFsdWVTY2FsZSIsImRlY2ltYWxzIiwibWF4SW50ZWdlckRpZ2l0cyIsImtwaVVuaXQiLCJnZXRVbml0SW5zdGFuY2UiLCJzaG93TnVtYmVyIiwidXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVZhbHVlIiwiY3JpdGljYWxpdHlQYXRoIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMiLCJjcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSIsInVwZGF0ZURhdGFwb2ludFRyZW5kIiwidHJlbmRQYXRoIiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlIiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgiLCJ0cmVuZFJlZmVyZW5jZVZhbHVlIiwidHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUiLCJ0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzIiwidXBkYXRlVGFyZ2V0VmFsdWUiLCJ0YXJnZXRSYXdWYWx1ZSIsImRldmlhdGlvblJhd1ZhbHVlIiwidGFyZ2V0U2NhbGUiLCJkZXZpYXRpb25WYWx1ZSIsIm9NYWluTW9kZWwiLCJsb2FkRnVsbCIsIm9MaXN0QmluZGluZyIsImJpbmRMaXN0IiwiZW50aXR5U2V0IiwiJCRncm91cElkIiwib0FnZ3JlZ2F0ZSIsInNldEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRlIiwiYUZpbHRlcnMiLCJyZXF1ZXN0Q29udGV4dHMiLCJhQ29udGV4dHMiLCJsb2FkS1BJQ2FyZERhdGEiLCJvR3JvdXAiLCJncm91cCIsInNvcnRPcmRlciIsInNvcnQiLCJzb3J0SW5mbyIsIlNvcnRlciIsImRlc2NlbmRpbmciLCJtYXhJdGVtcyIsImNoYXJ0RGF0YSIsIm9Db250ZXh0Iiwib0RhdGEiLCJnZXRQb3BvdmVyIiwib0tQSVRhZyIsIm9Qb3BvdmVyIiwicmVqZWN0IiwibG9hZExpYnJhcnkiLCJhc3luYyIsInJlcXVpcmUiLCJDYXJkIiwiSG9zdCIsIm9Ib3N0IiwiYXR0YWNoQWN0aW9uIiwib0V2ZW50Iiwic1R5cGUiLCJnZXRQYXJhbWV0ZXIiLCJvUGFyYW1zIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsIm5hdmlnYXRlIiwibmF2aWdhdGVPdXRib3VuZCIsIm9DYXJkIiwid2lkdGgiLCJoZWlnaHQiLCJzZXRIb3N0IiwiUG9wb3ZlciIsInNob3dIZWFkZXIiLCJwbGFjZW1lbnQiLCJhZGREZXBlbmRlbnQiLCJvbktQSVByZXNzZWQiLCJrcGlJRCIsIm9EZWYiLCJvTW9kZWwiLCJhUHJvbWlzZXMiLCJhbGwiLCJhUmVzdWx0cyIsInNldE1hbmlmZXN0IiwicmVmcmVzaCIsIm9wZW5CeSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLE1BQU1BLDBCQUF1RCxHQUFHO0FBQy9ELFNBQUtDLFdBQVcsQ0FBQ0MsS0FEOEM7QUFFL0QsU0FBS0QsV0FBVyxDQUFDRSxPQUY4QztBQUcvRCxTQUFLRixXQUFXLENBQUNHLE9BSDhDO0FBSS9ELFNBQUtILFdBQVcsQ0FBQ0k7QUFKOEMsR0FBaEU7QUFPQSxNQUFNQyx5QkFBc0QsR0FBRztBQUM5REosSUFBQUEsS0FBSyxFQUFFLE9BRHVEO0FBRTlEQyxJQUFBQSxPQUFPLEVBQUUsVUFGcUQ7QUFHOURDLElBQUFBLE9BQU8sRUFBRSxNQUhxRDtBQUk5REMsSUFBQUEsV0FBVyxFQUFFLE1BSmlEO0FBSzlERSxJQUFBQSxJQUFJLEVBQUU7QUFMd0QsR0FBL0Q7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USxDQUFDaUMsTUFBVCxDQUFnQmxDLE9BQWhCLEVBQXlCLEtBQXpCO0FBQ0EsV0FQRixFQVFFL0UsS0FSRixDQVFRLFVBQUFDLEdBQUcsRUFBSTtBQUNiQyxZQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVUYsR0FBVjtBQUNBLFdBVkY7QUFXQTtBQUNEO0FBQ0QsSzs7O0lBeG1CNkNpSCxtQixzV0Ewa0I3Q0MsTTtTQWlDYTNLLGdDIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0NvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YVwiO1xuaW1wb3J0IHsgVUk1Q2xhc3MsIE92ZXJyaWRlLCBQdWJsaWMgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHsgS1BJQ2hhcnREZWZpbml0aW9uLCBLUElEZWZpbml0aW9uLCBOYXZpZ2F0aW9uSW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9LUElcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJUeXBlc1wiO1xuaW1wb3J0IHsgRmlsdGVyRGVmaW5pdGlvbiwgUmFuZ2VEZWZpbml0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9TZWxlY3Rpb25WYXJpYW50SGVscGVyXCI7XG5pbXBvcnQgTnVtYmVyRm9ybWF0IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXQvTnVtYmVyRm9ybWF0XCI7XG5pbXBvcnQgRGF0ZUZvcm1hdCBmcm9tIFwic2FwL3VpL2NvcmUvZm9ybWF0L0RhdGVGb3JtYXRcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcInNhcC91aS9jb3JlL0xvY2FsZVwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCBTb3J0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9Tb3J0ZXJcIjtcbmltcG9ydCBHZW5lcmljVGFnIGZyb20gXCJzYXAvbS9HZW5lcmljVGFnXCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5cbmNvbnN0IE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5OiBSZWNvcmQ8c3RyaW5nLCBNZXNzYWdlVHlwZT4gPSB7XG5cdFwiMVwiOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XCIyXCI6IE1lc3NhZ2VUeXBlLldhcm5pbmcsXG5cdFwiM1wiOiBNZXNzYWdlVHlwZS5TdWNjZXNzLFxuXHRcIjVcIjogTWVzc2FnZVR5cGUuSW5mb3JtYXRpb25cbn07XG5cbmNvbnN0IFZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGU6IFJlY29yZDxNZXNzYWdlVHlwZSwgc3RyaW5nPiA9IHtcblx0RXJyb3I6IFwiRXJyb3JcIixcblx0V2FybmluZzogXCJDcml0aWNhbFwiLFxuXHRTdWNjZXNzOiBcIkdvb2RcIixcblx0SW5mb3JtYXRpb246IFwiTm9uZVwiLFxuXHROb25lOiBcIk5vbmVcIlxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgYSBtZXNzYWdlIHN0YXRlIGZyb20gYSBjYWxjdWxhdGVkIGNyaXRpY2FsaXR5IG9mIHR5cGUgJ1RhcmdldCcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJIHRvIGJlIHRlc3RlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHtudW1iZXJbXX0gYVRocmVzaG9sZHMgVGhyZXNob2xkcyB0byBiZSB1c2VkIFtEZXZpYXRpb25SYW5nZUxvd1ZhbHVlLFRvbGVyYW5jZVJhbmdlTG93VmFsdWUsQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUsQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlLFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlLERldmlhdGlvblJhbmdlSGlnaFZhbHVlXS5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21UYXJnZXRDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzVdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNV0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s1XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1s0XSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzRdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbNF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1szXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzNdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbM10pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0fSBlbHNlIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fVxuXG5cdHJldHVybiBjcml0aWNhbGl0eVByb3BlcnR5O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNhbGN1bGF0ZWQgY3JpdGljYWxpdHkgb2YgdHlwZSAnTWluaW1pemUnLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSB7bnVtYmVyW119IGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlLFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlLERldmlhdGlvblJhbmdlSGlnaFZhbHVlXS5cbiAqIEByZXR1cm5zIHtNZXNzYWdlVHlwZX0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21NaW5pbWl6ZUNhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1syXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzJdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbMl0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdH1cblxuXHRyZXR1cm4gY3JpdGljYWxpdHlQcm9wZXJ0eTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgYSBtZXNzYWdlIHN0YXRlIGZyb20gYSBjYWxjdWxhdGVkIGNyaXRpY2FsaXR5IG9mIHR5cGUgJ01heGltaXplJy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUEkgdG8gYmUgdGVzdGVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge251bWJlcltdfSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZV0uXG4gKiBAcmV0dXJucyB7TWVzc2FnZVR5cGV9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWF4aW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGEgRGV2aWF0aW9uSW5kaWNhdG9yIHZhbHVlIGZyb20gYSB0cmVuZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHRyZW5kVmFsdWUgVGhlIGNyaXRpY2FsaXR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgRGV2aWF0aW9uSW5kaWNhdG9yIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGRldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUodHJlbmRWYWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXG5cdHN3aXRjaCAodHJlbmRWYWx1ZSkge1xuXHRcdGNhc2UgMTogLy8gU3Ryb25nVXBcblx0XHRjYXNlIFwiMVwiOlxuXHRcdGNhc2UgMjogLy8gVXBcblx0XHRjYXNlIFwiMlwiOlxuXHRcdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIDQ6IC8vIERvd25cblx0XHRjYXNlIFwiNFwiOlxuXHRcdGNhc2UgNTogLy8gU3Ryb25nRG93blxuXHRcdGNhc2UgXCI1XCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiTm9uZVwiO1xuXHR9XG5cblx0cmV0dXJuIGRldmlhdGlvbkluZGljYXRvcjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBEZXZpYXRpb25JbmRpY2F0b3IgZnJvbSBhIFRyZW5kQ2FsY3VsYXRpb24uXG4gKlxuICogQHBhcmFtIGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJXG4gKiBAcGFyYW0gcmVmZXJlbmNlVmFsdWUgVGhlIHJlZmVyZW5jZSB2YWx1ZSB0byBjb21wYXJlIHdpdGhcbiAqIEBwYXJhbSBpc1JlbGF0aXZlIFRydWUgaXMgdGhlIGNvbXBhcmlzb24gaXMgcmVsYXRpdmVcbiAqIEBwYXJhbSBhVGhyZXNob2xkcyBBcnJheSBvZiB0aHJlc2hvbGRzIFtTdHJvbmdEb3duRGlmZmVyZW5jZSwgRG93bkRpZmZlcmVuY2UsIFVwRGlmZmVyZW5jZSwgU3Ryb25nVXBEaWZmZXJlbmNlXVxuICogQHJldHVybnMge3NhcC5tLkRldmlhdGlvbkluZGljYXRvcn0gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWVcbiAqL1xuZnVuY3Rpb24gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbUNhbGN1bGF0aW9uKFxuXHRrcGlWYWx1ZTogbnVtYmVyLFxuXHRyZWZlcmVuY2VWYWx1ZTogbnVtYmVyLFxuXHRpc1JlbGF0aXZlOiBib29sZWFuLFxuXHRhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10gfCB1bmRlZmluZWRcbik6IHN0cmluZyB7XG5cdGxldCBkZXZpYXRpb25JbmRpY2F0b3I6IHN0cmluZztcblxuXHRpZiAoIWFUaHJlc2hvbGRzIHx8IChpc1JlbGF0aXZlICYmICFyZWZlcmVuY2VWYWx1ZSkpIHtcblx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdH1cblxuXHRjb25zdCBjb21wVmFsdWUgPSBpc1JlbGF0aXZlID8gKGtwaVZhbHVlIC0gcmVmZXJlbmNlVmFsdWUpIC8gcmVmZXJlbmNlVmFsdWUgOiBrcGlWYWx1ZSAtIHJlZmVyZW5jZVZhbHVlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA8PSBhVGhyZXNob2xkc1swXSkge1xuXHRcdC8vIFN0cm9uZ0Rvd24gLS0+IERvd25cblx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1sxXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzFdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA8PSBhVGhyZXNob2xkc1sxXSkge1xuXHRcdC8vIERvd24gLS0+IERvd25cblx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1szXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzNdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA+PSBhVGhyZXNob2xkc1szXSkge1xuXHRcdC8vIFN0cm9uZ1VwIC0tPiBVcFxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiVXBcIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1syXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzJdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA+PSBhVGhyZXNob2xkc1syXSkge1xuXHRcdC8vIFVwIC0tPiBVcFxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiVXBcIjtcblx0fSBlbHNlIHtcblx0XHQvLyBTaWRld2F5cyAtLT4gTm9uZVxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiTm9uZVwiO1xuXHR9XG5cblx0cmV0dXJuIGRldmlhdGlvbkluZGljYXRvcjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2FwLnVpLm1vZGVsLkZpbHRlciBmcm9tIGEgZmlsdGVyIGRlZmluaXRpb24uXG4gKlxuICogQHBhcmFtIGZpbHRlckRlZmluaXRpb24gVGhlIGZpbHRlciBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBSZXR1cm5zIGEgc2FwLnVpLm1vZGVsLkZpbHRlciBmcm9tIHRoZSBkZWZpbml0aW9uLCBvciB1bmRlZmluZWQgaWYgdGhlIGRlZmluaXRpb24gaXMgZW1wdHkgKG5vIHJhbmdlcylcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24oZmlsdGVyRGVmaW5pdGlvbjogRmlsdGVyRGVmaW5pdGlvbik6IEZpbHRlciB8IHVuZGVmaW5lZCB7XG5cdGlmIChmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBuZXcgRmlsdGVyKFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5vcGVyYXRvciBhcyBGaWx0ZXJPcGVyYXRvcixcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLnJhbmdlTG93LFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VIaWdoXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBhUmFuZ2VGaWx0ZXJzID0gZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubWFwKHJhbmdlID0+IHtcblx0XHRcdHJldHVybiBuZXcgRmlsdGVyKGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlQYXRoLCByYW5nZS5vcGVyYXRvciBhcyBGaWx0ZXJPcGVyYXRvciwgcmFuZ2UucmFuZ2VMb3csIHJhbmdlLnJhbmdlSGlnaCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0ZmlsdGVyczogYVJhbmdlRmlsdGVycyxcblx0XHRcdGFuZDogZmFsc2Vcblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJTdHJpbmdGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogc3RyaW5nIHtcblx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoXG5cdFx0c2FwLnVpXG5cdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHQuZ2V0Q29uZmlndXJhdGlvbigpXG5cdFx0XHQuZ2V0TGFuZ3VhZ2UoKVxuXHQpO1xuXHRjb25zdCByZXNCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRjb25zdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoeyBzdHlsZTogXCJtZWRpdW1cIiB9LCBjdXJyZW50TG9jYWxlKTtcblxuXHRmdW5jdGlvbiBmb3JtYXRSYW5nZShyYW5nZTogUmFuZ2VEZWZpbml0aW9uKTogc3RyaW5nIHtcblx0XHRjb25zdCB2YWx1ZUxvdyA9XG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5VHlwZS5pbmRleE9mKFwiRWRtLkRhdGVcIikgPT09IDAgPyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZShyYW5nZS5yYW5nZUxvdykpIDogcmFuZ2UucmFuZ2VMb3c7XG5cdFx0Y29uc3QgdmFsdWVIaWdoID1cblx0XHRcdGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlUeXBlLmluZGV4T2YoXCJFZG0uRGF0ZVwiKSA9PT0gMCA/IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKHJhbmdlLnJhbmdlSGlnaCkpIDogcmFuZ2UucmFuZ2VIaWdoO1xuXG5cdFx0c3dpdGNoIChyYW5nZS5vcGVyYXRvcikge1xuXHRcdFx0Y2FzZSBcIkJUXCI6XG5cdFx0XHRcdHJldHVybiBcIltcIiArIHZhbHVlTG93ICsgXCIgLSBcIiArIHZhbHVlSGlnaCArIFwiXVwiO1xuXG5cdFx0XHRjYXNlIFwiQ29udGFpbnNcIjpcblx0XHRcdFx0cmV0dXJuIFwiKlwiICsgdmFsdWVMb3cgKyBcIipcIjtcblxuXHRcdFx0Y2FzZSBcIkdFXCI6XG5cdFx0XHRcdHJldHVybiBcIlxcdTIyNjVcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiR1RcIjpcblx0XHRcdFx0cmV0dXJuIFwiPlwiICsgdmFsdWVMb3c7XG5cblx0XHRcdGNhc2UgXCJMRVwiOlxuXHRcdFx0XHRyZXR1cm4gXCJcXHUyMjY0XCIgKyB2YWx1ZUxvdztcblxuXHRcdFx0Y2FzZSBcIkxUXCI6XG5cdFx0XHRcdHJldHVybiBcIjxcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiTkJcIjpcblx0XHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0ZJTFRFUlNUUklOR19OT1RcIiwgW1wiW1wiICsgdmFsdWVMb3cgKyBcIiAtIFwiICsgdmFsdWVIaWdoICsgXCJdXCJdKTtcblxuXHRcdFx0Y2FzZSBcIk5FXCI6XG5cdFx0XHRcdHJldHVybiBcIlxcdTIyNjBcIiArIHZhbHVlTG93O1xuXG5cdFx0XHRjYXNlIFwiTm90Q29udGFpbnNcIjpcblx0XHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0ZJTFRFUlNUUklOR19OT1RcIiwgW1wiKlwiICsgdmFsdWVMb3cgKyBcIipcIl0pO1xuXG5cdFx0XHRjYXNlIFwiRVFcIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB2YWx1ZUxvdztcblx0XHR9XG5cdH1cblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9IGVsc2UgaWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBmb3JtYXRSYW5nZShmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiKFwiICsgZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubWFwKGZvcm1hdFJhbmdlKS5qb2luKFwiLFwiKSArIFwiKVwiO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdENoYXJ0VGl0bGUoa3BpRGVmOiBLUElEZWZpbml0aW9uKTogc3RyaW5nIHtcblx0Y29uc3QgcmVzQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBSZXNvdXJjZUJ1bmRsZTtcblxuXHRmdW5jdGlvbiBmb3JtYXRMaXN0KGl0ZW1zOiB7IG5hbWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pIHtcblx0XHRpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9IGVsc2UgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIGl0ZW1zWzBdLmxhYmVsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgcmVzID0gaXRlbXNbMF0ubGFiZWw7XG5cdFx0XHRmb3IgKGxldCBJID0gMTsgSSA8IGl0ZW1zLmxlbmd0aCAtIDE7IEkrKykge1xuXHRcdFx0XHRyZXMgKz0gXCIsIFwiICsgaXRlbXNbSV0ubGFiZWw7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9JVEVNU0xJU1RcIiwgW3JlcywgaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0ubGFiZWxdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfQ0hBUlRUSVRMRVwiLCBbZm9ybWF0TGlzdChrcGlEZWYuY2hhcnQubWVhc3VyZXMpLCBmb3JtYXRMaXN0KGtwaURlZi5jaGFydC5kaW1lbnNpb25zKV0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGFydExhYmVsU2V0dGluZ3MoY2hhcnREZWZpbml0aW9uOiBLUElDaGFydERlZmluaXRpb24sIG9DaGFydFByb3BlcnRpZXM6IGFueSk6IHZvaWQge1xuXHRzd2l0Y2ggKGNoYXJ0RGVmaW5pdGlvbi5jaGFydFR5cGUpIHtcblx0XHRjYXNlIFwiRG9udXRcIjpcblx0XHRcdC8vIFNob3cgZGF0YSBsYWJlbHMsIGRvIG5vdCBzaG93IGF4aXMgdGl0bGVzXG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLmNhdGVnb3J5QXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHtcblx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0dHlwZTogXCJ2YWx1ZVwiLFxuXHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdF9NRkQyXCJcblx0XHRcdH07XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJidWJibGVcIjpcblx0XHRcdC8vIFNob3cgYXhpcyB0aXRsZSwgYnViYmxlIHNpemUgbGVnZW5kLCBkbyBub3Qgc2hvdyBkYXRhIGxhYmVsc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzMiA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5sZWdlbmRHcm91cCA9IHtcblx0XHRcdFx0bGF5b3V0OiB7XG5cdFx0XHRcdFx0cG9zaXRpb246IFwiYm90dG9tXCIsXG5cdFx0XHRcdFx0YWxpZ25tZW50OiBcInRvcExlZnRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5zaXplTGVnZW5kID0ge1xuXHRcdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5wbG90QXJlYS5kYXRhTGFiZWwgPSB7IHZpc2libGU6IGZhbHNlIH07XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJzY2F0dGVyXCI6XG5cdFx0XHQvLyBEbyBub3Qgc2hvdyBkYXRhIGxhYmVscyBhbmQgYXhpcyB0aXRsZXNcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMyID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5wbG90QXJlYS5kYXRhTGFiZWwgPSB7IHZpc2libGU6IGZhbHNlIH07XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBEbyBub3Qgc2hvdyBkYXRhIGxhYmVscyBhbmQgYXhpcyB0aXRsZXNcblx0XHRcdG9DaGFydFByb3BlcnRpZXMuY2F0ZWdvcnlBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMucGxvdEFyZWEuZGF0YUxhYmVsID0geyB2aXNpYmxlOiBmYWxzZSB9O1xuXHR9XG59XG5mdW5jdGlvbiBmaWx0ZXJNYXAoYU9iamVjdHM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyByb2xlPzogc3RyaW5nIH1bXSwgYVJvbGVzPzogKHN0cmluZyB8IHVuZGVmaW5lZClbXSk6IHN0cmluZ1tdIHtcblx0aWYgKGFSb2xlcyAmJiBhUm9sZXMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIGFPYmplY3RzXG5cdFx0XHQuZmlsdGVyKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRcdHJldHVybiBhUm9sZXMuaW5kZXhPZihkaW1lbnNpb24ucm9sZSkgPj0gMDtcblx0XHRcdH0pXG5cdFx0XHQubWFwKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRcdHJldHVybiBkaW1lbnNpb24ubGFiZWw7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gYU9iamVjdHMubWFwKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRyZXR1cm4gZGltZW5zaW9uLmxhYmVsO1xuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldFNjYXR0ZXJCdWJibGVDaGFydEZlZWRzKGNoYXJ0RGVmaW5pdGlvbjogS1BJQ2hhcnREZWZpbml0aW9uKTogeyB1aWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZXM6IHN0cmluZ1tdIH1bXSB7XG5cdGNvbnN0IGF4aXMxTWVhc3VyZXMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbXCJBeGlzMVwiXSk7XG5cdGNvbnN0IGF4aXMyTWVhc3VyZXMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbXCJBeGlzMlwiXSk7XG5cdGNvbnN0IGF4aXMzTWVhc3VyZXMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbXCJBeGlzM1wiXSk7XG5cdGNvbnN0IG90aGVyTWVhc3VyZXMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbdW5kZWZpbmVkXSk7XG5cdGNvbnN0IHNlcmllc0RpbWVuc2lvbnMgPSBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFtcIlNlcmllc1wiXSk7XG5cblx0Ly8gR2V0IHRoZSBmaXJzdCBkaW1lbnNpb24gd2l0aCByb2xlIFwiQ2F0ZWdvcnlcIiBmb3IgdGhlIHNoYXBlXG5cdGNvbnN0IHNoYXBlRGltZW5zaW9uID0gY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMuZmluZChkaW1lbnNpb24gPT4ge1xuXHRcdHJldHVybiBkaW1lbnNpb24ucm9sZSA9PT0gXCJDYXRlZ29yeVwiO1xuXHR9KTtcblxuXHQvLyBNZWFzdXJlIGZvciB0aGUgeC1BeGlzIDogZmlyc3QgbWVhc3VyZSBmb3IgQXhpczEsIG9yIGZvciBBeGlzMiBpZiBub3QgZm91bmQsIG9yIGZvciBBeGlzMyBpZiBub3QgZm91bmRcblx0Y29uc3QgeE1lYXN1cmUgPSBheGlzMU1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczJNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMzTWVhc3VyZXMuc2hpZnQoKSB8fCBvdGhlck1lYXN1cmVzLnNoaWZ0KCkgfHwgXCJcIjtcblx0Ly8gTWVhc3VyZSBmb3IgdGhlIHktQXhpcyA6IGZpcnN0IG1lYXN1cmUgZm9yIEF4aXMyLCBvciBzZWNvbmQgbWVhc3VyZSBmb3IgQXhpczEgaWYgbm90IGZvdW5kLCBvciBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMyBpZiBub3QgZm91bmRcblx0Y29uc3QgeU1lYXN1cmUgPSBheGlzMk1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczFNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMzTWVhc3VyZXMuc2hpZnQoKSB8fCBvdGhlck1lYXN1cmVzLnNoaWZ0KCkgfHwgXCJcIjtcblx0Y29uc3QgcmVzID0gW1xuXHRcdHtcblx0XHRcdFwidWlkXCI6IFwidmFsdWVBeGlzXCIsXG5cdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcInZhbHVlc1wiOiBbeE1lYXN1cmVdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRcInVpZFwiOiBcInZhbHVlQXhpczJcIixcblx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFwidmFsdWVzXCI6IFt5TWVhc3VyZV1cblx0XHR9XG5cdF07XG5cblx0aWYgKGNoYXJ0RGVmaW5pdGlvbi5jaGFydFR5cGUgPT09IFwiYnViYmxlXCIpIHtcblx0XHQvLyBNZWFzdXJlIGZvciB0aGUgc2l6ZSBvZiB0aGUgYnViYmxlOiBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMywgb3IgcmVtYWluaW5nIG1lYXN1cmUgZm9yIEF4aXMxL0F4aXMyIGlmIG5vdCBmb3VuZFxuXHRcdGNvbnN0IHNpemVNZWFzdXJlID0gYXhpczNNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMxTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzMk1lYXN1cmVzLnNoaWZ0KCkgfHwgb3RoZXJNZWFzdXJlcy5zaGlmdCgpIHx8IFwiXCI7XG5cdFx0cmVzLnB1c2goe1xuXHRcdFx0XCJ1aWRcIjogXCJidWJibGVXaWR0aFwiLFxuXHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogW3NpemVNZWFzdXJlXVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gQ29sb3IgKG9wdGlvbmFsKVxuXHRpZiAoc2VyaWVzRGltZW5zaW9ucy5sZW5ndGgpIHtcblx0XHRyZXMucHVzaCh7XG5cdFx0XHRcInVpZFwiOiBcImNvbG9yXCIsXG5cdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFwidmFsdWVzXCI6IHNlcmllc0RpbWVuc2lvbnNcblx0XHR9KTtcblx0fVxuXHQvLyBTaGFwZSAob3B0aW9uYWwpXG5cdGlmIChzaGFwZURpbWVuc2lvbikge1xuXHRcdHJlcy5wdXNoKHtcblx0XHRcdFwidWlkXCI6IFwic2hhcGVcIixcblx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogW3NoYXBlRGltZW5zaW9uLmxhYmVsXVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldENoYXJ0RmVlZHMoY2hhcnREZWZpbml0aW9uOiBLUElDaGFydERlZmluaXRpb24pOiB7IHVpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlczogc3RyaW5nW10gfVtdIHtcblx0bGV0IHJlczogeyB1aWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZXM6IHN0cmluZ1tdIH1bXTtcblxuXHRzd2l0Y2ggKGNoYXJ0RGVmaW5pdGlvbi5jaGFydFR5cGUpIHtcblx0XHRjYXNlIFwiRG9udXRcIjpcblx0XHRcdHJlcyA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwic2l6ZVwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJjb2xvclwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucylcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcImJ1YmJsZVwiOlxuXHRcdGNhc2UgXCJzY2F0dGVyXCI6XG5cdFx0XHRyZXMgPSBnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyhjaGFydERlZmluaXRpb24pO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwidmVydGljYWxfYnVsbGV0XCI6XG5cdFx0XHRyZXMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImFjdHVhbFZhbHVlc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbdW5kZWZpbmVkLCBcIkF4aXMxXCJdKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJ0YXJnZXRWYWx1ZXNcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcywgW1wiQXhpczJcIl0pXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW3VuZGVmaW5lZCwgXCJDYXRlZ29yeVwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY29sb3JcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFtcIlNlcmllc1wiXSlcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJlcyA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwidmFsdWVBeGlzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW3VuZGVmaW5lZCwgXCJDYXRlZ29yeVwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY29sb3JcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFtcIlNlcmllc1wiXSlcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0fVxuXG5cdHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRuYXZJbmZvOiBOYXZpZ2F0aW9uSW5mbyxcblx0b1NoZWxsU2VydmljZTogYW55XG4pOiBQcm9taXNlPHsgc2VtYW50aWNPYmplY3Q/OiBzdHJpbmc7IGFjdGlvbj86IHN0cmluZzsgb3V0Ym91bmQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuXHRpZiAobmF2SW5mby5zZW1hbnRpY09iamVjdCkge1xuXHRcdGlmIChuYXZJbmZvLmFjdGlvbikge1xuXHRcdFx0Ly8gQWN0aW9uIGlzIGFscmVhZHkgc3BlY2lmaWVkOiBjaGVjayBpZiBpdCdzIGF2YWlsYWJsZSBpbiB0aGUgc2hlbGxcblx0XHRcdHJldHVybiBvU2hlbGxTZXJ2aWNlLmdldExpbmtzKHsgc2VtYW50aWNPYmplY3Q6IG5hdkluZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogbmF2SW5mby5hY3Rpb24gfSkudGhlbigoYUxpbmtzOiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYUxpbmtzLmxlbmd0aCA/IHsgc2VtYW50aWNPYmplY3Q6IG5hdkluZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogbmF2SW5mby5hY3Rpb24gfSA6IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBnZXQgdGhlIHByaW1hcnkgaW50ZW50IGZyb20gdGhlIHNoZWxsXG5cdFx0XHRyZXR1cm4gb1NoZWxsU2VydmljZS5nZXRQcmltYXJ5SW50ZW50KG5hdkluZm8uc2VtYW50aWNPYmplY3QpLnRoZW4oKG9MaW5rOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKCFvTGluaykge1xuXHRcdFx0XHRcdC8vIE5vIHByaW1hcnkgaW50ZW50Li4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENoZWNrIHRoYXQgdGhlIHByaW1hcnkgaW50ZW50IGlzIG5vdCBwYXJ0IG9mIHRoZSB1bmF2YWlsYWJsZSBhY3Rpb25zXG5cdFx0XHRcdGNvbnN0IG9JbmZvID0gb1NoZWxsU2VydmljZS5wYXJzZVNoZWxsSGFzaChvTGluay5pbnRlbnQpO1xuXHRcdFx0XHRyZXR1cm4gbmF2SW5mby51bmF2YWlsYWJsZUFjdGlvbnMgJiYgbmF2SW5mby51bmF2YWlsYWJsZUFjdGlvbnMuaW5kZXhPZihvSW5mby5hY3Rpb24pID49IDBcblx0XHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHRcdDogeyBzZW1hbnRpY09iamVjdDogb0luZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogb0luZm8uYWN0aW9uIH07XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gT3V0Ym91bmQgbmF2aWdhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0cmV0dXJuIG5hdkluZm8ub3V0Ym91bmROYXZpZ2F0aW9uID8gUHJvbWlzZS5yZXNvbHZlKHsgb3V0Ym91bmQ6IG5hdkluZm8ub3V0Ym91bmROYXZpZ2F0aW9uIH0pIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgQSBjb250cm9sbGVyIGV4dGVuc2lvbiBmb3IgbWFuYWdpbmcgdGhlIEtQSXMgaW4gYW4gYW5hbHl0aWNhbCBsaXN0IHBhZ2VcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjkzLjBcbiAqL1xuQFVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuS1BJTWFuYWdlbWVudFwiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYUtQSURlZmluaXRpb25zPzogS1BJRGVmaW5pdGlvbltdO1xuXHRwcm90ZWN0ZWQgb0NhcmQ6IGFueTtcblx0cHJvdGVjdGVkIG9Qb3BvdmVyITogUG9wb3ZlcjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgY2FyZCBtYW5pZmVzdCBmb3IgYSBLUEkgZGVmaW5pdGlvbiBhbmQgc3RvcmVzIGl0IGluIGEgSlNPTiBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIGtwaURlZmluaXRpb24gVGhlIEtQSSBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBvS1BJTW9kZWwgVGhlIEpTT04gbW9kZWwgaW4gd2hpY2ggdGhlIG1hbmlmZXN0IHdpbGwgYmUgc3RvcmVkXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaW5pdENhcmRNYW5pZmVzdChrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvS1BJTW9kZWw6IEpTT05Nb2RlbCk6IHZvaWQge1xuXHRcdGNvbnN0IG9DYXJkTWFuaWZlc3Q6IGFueSA9IHtcblx0XHRcdFwic2FwLmFwcFwiOiB7XG5cdFx0XHRcdGlkOiBcInNhcC5mZVwiLFxuXHRcdFx0XHR0eXBlOiBcImNhcmRcIlxuXHRcdFx0fSxcblx0XHRcdFwic2FwLnVpXCI6IHtcblx0XHRcdFx0dGVjaG5vbG9neTogXCJVSTVcIlxuXHRcdFx0fSxcblx0XHRcdFwic2FwLmNhcmRcIjoge1xuXHRcdFx0XHR0eXBlOiBcIkFuYWx5dGljYWxcIixcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdGpzb246IHt9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGhlYWRlcjoge1xuXHRcdFx0XHRcdHR5cGU6IFwiTnVtZXJpY1wiLFxuXHRcdFx0XHRcdHRpdGxlOiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50aXRsZSxcblx0XHRcdFx0XHRzdWJUaXRsZToga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuZGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0dW5pdE9mTWVhc3VyZW1lbnQ6IFwie21haW5Vbml0fVwiLFxuXHRcdFx0XHRcdG1haW5JbmRpY2F0b3I6IHtcblx0XHRcdFx0XHRcdG51bWJlcjogXCJ7bWFpblZhbHVlTm9TY2FsZX1cIixcblx0XHRcdFx0XHRcdHVuaXQ6IFwie21haW5WYWx1ZVNjYWxlfVwiLFxuXHRcdFx0XHRcdFx0c3RhdGU6IFwie21haW5TdGF0ZX1cIixcblx0XHRcdFx0XHRcdHRyZW5kOiBcInt0cmVuZH1cIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0Y29udGVudDoge1xuXHRcdFx0XHRcdG1pbkhlaWdodDogXCIyNXJlbVwiLFxuXHRcdFx0XHRcdGNoYXJ0UHJvcGVydGllczoge1xuXHRcdFx0XHRcdFx0cGxvdEFyZWE6IHt9LFxuXHRcdFx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpZ25tZW50OiBcImxlZnRcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdFx0cGF0aDogXCIvY2hhcnREYXRhXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gQWRkIHNpZGUgaW5kaWNhdG9ycyBpbiB0aGUgY2FyZCBoZWFkZXIgaWYgYSB0YXJnZXQgaXMgZGVmaW5lZCBmb3IgdGhlIEtQSVxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoIHx8IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IHJlc0J1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uaGVhZGVyLnNpZGVJbmRpY2F0b3JzID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGl0bGU6IHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lORElDQVRPUl9UQVJHRVRcIiksXG5cdFx0XHRcdFx0bnVtYmVyOiBcInt0YXJnZXROdW1iZXJ9XCIsXG5cdFx0XHRcdFx0dW5pdDogXCJ7dGFyZ2V0VW5pdH1cIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGl0bGU6IHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lORElDQVRPUl9ERVZJQVRJT05cIiksXG5cdFx0XHRcdFx0bnVtYmVyOiBcIntkZXZpYXRpb25OdW1iZXJ9XCIsXG5cdFx0XHRcdFx0dW5pdDogXCIlXCJcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHR9XG5cblx0XHQvLyBEZXRhaWxzIG9mIHRoZSBjYXJkOiBmaWx0ZXIgZGVzY3JpcHRpb25zXG5cdFx0aWYgKGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFEZXNjcmlwdGlvbnM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5mb3JFYWNoKGZpbHRlckRlZmluaXRpb24gPT4ge1xuXHRcdFx0XHRjb25zdCBkZXNjID0gZ2V0RmlsdGVyU3RyaW5nRnJvbURlZmluaXRpb24oZmlsdGVyRGVmaW5pdGlvbik7XG5cdFx0XHRcdGlmIChkZXNjKSB7XG5cdFx0XHRcdFx0YURlc2NyaXB0aW9ucy5wdXNoKGRlc2MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFEZXNjcmlwdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5oZWFkZXIuZGV0YWlscyA9IGFEZXNjcmlwdGlvbnMuam9pbihcIiwgXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENoYXJ0IHNldHRpbmdzOiB0eXBlLCB0aXRsZSwgZGltZW5zaW9ucyBhbmQgbWVhc3VyZXMgaW4gdGhlIG1hbmlmZXN0XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuY2hhcnRUeXBlID0ga3BpRGVmaW5pdGlvbi5jaGFydC5jaGFydFR5cGU7XG5cdFx0dXBkYXRlQ2hhcnRMYWJlbFNldHRpbmdzKGtwaURlZmluaXRpb24uY2hhcnQsIG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5jb250ZW50LmNoYXJ0UHJvcGVydGllcyk7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuY2hhcnRQcm9wZXJ0aWVzLnRpdGxlLnRleHQgPSBmb3JtYXRDaGFydFRpdGxlKGtwaURlZmluaXRpb24pO1xuXHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5jb250ZW50LmRpbWVuc2lvbnMgPSBrcGlEZWZpbml0aW9uLmNoYXJ0LmRpbWVuc2lvbnMubWFwKGRpbWVuc2lvbiA9PiB7XG5cdFx0XHRyZXR1cm4geyBsYWJlbDogZGltZW5zaW9uLmxhYmVsLCB2YWx1ZTogXCJ7XCIgKyBkaW1lbnNpb24ubmFtZSArIFwifVwiIH07XG5cdFx0fSk7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQubWVhc3VyZXMgPSBrcGlEZWZpbml0aW9uLmNoYXJ0Lm1lYXN1cmVzLm1hcChtZWFzdXJlID0+IHtcblx0XHRcdHJldHVybiB7IGxhYmVsOiBtZWFzdXJlLmxhYmVsLCB2YWx1ZTogXCJ7XCIgKyBtZWFzdXJlLm5hbWUgKyBcIn1cIiB9O1xuXHRcdH0pO1xuXHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5jb250ZW50LmZlZWRzID0gZ2V0Q2hhcnRGZWVkcyhrcGlEZWZpbml0aW9uLmNoYXJ0KTtcblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQsIHtcblx0XHRcdG1hbmlmZXN0OiBvQ2FyZE1hbmlmZXN0XG5cdFx0fSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgaW5pdE5hdmlnYXRpb25JbmZvKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIG9LUElNb2RlbDogSlNPTk1vZGVsLCBvU2hlbGxTZXJ2aWNlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBBZGQgbmF2aWdhdGlvblxuXHRcdGlmIChrcGlEZWZpbml0aW9uLm5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBnZXROYXZpZ2F0aW9uUGFyYW1ldGVycyhrcGlEZWZpbml0aW9uLm5hdmlnYXRpb24sIG9TaGVsbFNlcnZpY2UpLnRoZW4ob05hdkluZm8gPT4ge1xuXHRcdFx0XHRpZiAob05hdkluZm8pIHtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvaGVhZGVyL2FjdGlvbnNcIiwgW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIk5hdmlnYXRpb25cIixcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVyczogb05hdkluZm9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHRAT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuYUtQSURlZmluaXRpb25zID0gdGhpcy5nZXRLUElEYXRhKCk7XG5cblx0XHRpZiAodGhpcy5hS1BJRGVmaW5pdGlvbnMgJiYgdGhpcy5hS1BJRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IChvVmlldy5nZXRDb250cm9sbGVyKCkgYXMgQmFzZUNvbnRyb2xsZXIpLmdldEFwcENvbXBvbmVudCgpIGFzIGFueTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGEgSlNPTiBtb2RlbCB0byBzdG9yZSBLUEkgZGF0YVxuXHRcdFx0Y29uc3Qgb0tQSU1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdFx0b1ZpZXcuc2V0TW9kZWwob0tQSU1vZGVsLCBcImtwaU1vZGVsXCIpO1xuXG5cdFx0XHR0aGlzLmFLUElEZWZpbml0aW9ucy5mb3JFYWNoKGtwaURlZmluaXRpb24gPT4ge1xuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIG1hbmlmZXN0IGZvciB0aGUgS1BJIGNhcmQgYW5kIHN0b3JlIGl0IGluIHRoZSBLUEkgbW9kZWxcblx0XHRcdFx0dGhpcy5pbml0Q2FyZE1hbmlmZXN0KGtwaURlZmluaXRpb24sIG9LUElNb2RlbCk7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBuYXZpZ2F0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHR0aGlzLmluaXROYXZpZ2F0aW9uSW5mbyhrcGlEZWZpbml0aW9uLCBvS1BJTW9kZWwsIG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpKS5jYXRjaChmdW5jdGlvbihlcnI6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBMb2FkIHRhZyBkYXRhIGZvciB0aGUgS1BJXG5cdFx0XHRcdHRoaXMubG9hZEtQSVRhZ0RhdGEoa3BpRGVmaW5pdGlvbiwgb0FwcENvbXBvbmVudC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwsIG9LUElNb2RlbCkuY2F0Y2goZnVuY3Rpb24oZXJyOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRAT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25FeGl0KCk6IHZvaWQge1xuXHRcdGNvbnN0IG9LUElNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwia3BpTW9kZWxcIikgYXMgSlNPTk1vZGVsO1xuXG5cdFx0aWYgKG9LUElNb2RlbCkge1xuXHRcdFx0b0tQSU1vZGVsLmRlc3Ryb3koKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEtQSURhdGEoKTogS1BJRGVmaW5pdGlvbltdIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0c0N1c3RvbURhdGEgPSBvVmlldy5nZXRDb250ZW50KClbMF0uZGF0YShcIktQSURhdGFcIik7XG5cblx0XHRpZiAoc0N1c3RvbURhdGEpIHtcblx0XHRcdGNvbnN0IHZEYXRhID0gdHlwZW9mIHNDdXN0b21EYXRhID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShzQ3VzdG9tRGF0YSkgOiBzQ3VzdG9tRGF0YTtcblx0XHRcdGlmIChcImN1c3RvbURhdGFcIiBpbiB2RGF0YSkge1xuXHRcdFx0XHRyZXR1cm4gdkRhdGFbXCJjdXN0b21EYXRhXCJdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHZEYXRhO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbCkge1xuXHRcdGNvbnN0IGN1cnJlbnRMb2NhbGUgPSBuZXcgTG9jYWxlKFxuXHRcdFx0c2FwLnVpXG5cdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0LmdldENvbmZpZ3VyYXRpb24oKVxuXHRcdFx0XHQuZ2V0TGFuZ3VhZ2UoKVxuXHRcdCk7XG5cdFx0Y29uc3QgcmF3VW5pdCA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzUGF0aFxuXHRcdFx0PyBrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUpXG5cdFx0XHQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LnZhbHVlO1xuXG5cdFx0Y29uc3QgaXNQZXJjZW50YWdlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNDdXJyZW5jeSA9PT0gZmFsc2UgJiYgcmF3VW5pdCA9PT0gXCIlXCI7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBNYWluIEtQSSB2YWx1ZVxuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblxuXHRcdC8vIFZhbHVlIGZvcm1hdHRlZCB3aXRoIGEgc2NhbGVcblx0XHRjb25zdCBrcGlWYWx1ZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdHNob3dTY2FsZTogIWlzUGVyY2VudGFnZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVcIiwga3BpVmFsdWUpO1xuXG5cdFx0Ly8gVmFsdWUgd2l0aG91dCBhIHNjYWxlXG5cdFx0Y29uc3Qga3BpVmFsdWVVbnNjYWxlZCA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMixcblx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZSxcblx0XHRcdFx0Z3JvdXBpbmdFbmFibGVkOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkXCIsIGtwaVZhbHVlVW5zY2FsZWQpO1xuXG5cdFx0Ly8gVmFsdWUgZm9ybWF0dGVkIHdpdGggdGhlIHNjYWxlIG9taXR0ZWRcblx0XHRjb25zdCBrcGlWYWx1ZU5vU2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IGlzUGVyY2VudGFnZSA/IHVuZGVmaW5lZCA6IFwic2hvcnRcIixcblx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZU5vU2NhbGVcIiwga3BpVmFsdWVOb1NjYWxlKTtcblxuXHRcdC8vIFNjYWxlIG9mIHRoZSB2YWx1ZVxuXHRcdGNvbnN0IGtwaVZhbHVlU2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IGlzUGVyY2VudGFnZSA/IHVuZGVmaW5lZCA6IFwic2hvcnRcIixcblx0XHRcdFx0ZGVjaW1hbHM6IDAsXG5cdFx0XHRcdG1heEludGVnZXJEaWdpdHM6IDAsXG5cdFx0XHRcdHNob3dTY2FsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVTY2FsZVwiLCBrcGlWYWx1ZVNjYWxlKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIFVuaXQgb3IgY3VycmVuY3lcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdCAmJiByYXdVbml0KSB7XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC5pc0N1cnJlbmN5KSB7XG5cdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRcIiwgcmF3VW5pdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIHVuaXQgb2YgbWVhc3VyZSwgd2UgaGF2ZSB0byBmb3JtYXQgaXQgcHJvcGVybHlcblx0XHRcdFx0Y29uc3Qga3BpVW5pdCA9IE51bWJlckZvcm1hdC5nZXRVbml0SW5zdGFuY2UoeyBzaG93TnVtYmVyOiBmYWxzZSB9LCBjdXJyZW50TG9jYWxlKS5mb3JtYXQocmF3VmFsdWUsIHJhd1VuaXQpO1xuXHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0XCIsIGtwaVVuaXQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCwgb0tQSU1vZGVsOiBKU09OTW9kZWwpIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cblx0XHRsZXQgY3JpdGljYWxpdHlWYWx1ZSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGEgZml4ZWQgdmFsdWVcblx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoKSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBjb21lcyBmcm9tIGFub3RoZXIgcHJvcGVydHkgKHZpYSBhIHBhdGgpXG5cdFx0XHRjcml0aWNhbGl0eVZhbHVlID1cblx0XHRcdFx0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlba3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpXSB8fCBNZXNzYWdlVHlwZS5Ob25lO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMgJiYga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGNhbGN1bGF0aW9uXG5cdFx0XHRzd2l0Y2ggKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvVGFyZ2V0XCI6XG5cdFx0XHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKHJhd1ZhbHVlLCBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NaW5pbWl6ZVwiOlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21NaW5pbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NYXhpbWl6ZVwiOlxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21NYXhpbWl6ZUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgY3JpdGljYWxpdHlWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZVwiLFxuXHRcdFx0VmFsdWVDb2xvckZyb21NZXNzYWdlVHlwZVtjcml0aWNhbGl0eVZhbHVlXSB8fCBcIk5vbmVcIlxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludFRyZW5kKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQsIG9LUElNb2RlbDogSlNPTk1vZGVsKSB7XG5cdFx0Y29uc3QgcmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXG5cdFx0bGV0IHRyZW5kVmFsdWUgPSBcIk5vbmVcIjtcblxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFZhbHVlKSB7XG5cdFx0XHQvLyBUcmVuZCBpcyBhIGZpeGVkIHZhbHVlXG5cdFx0XHR0cmVuZFZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRWYWx1ZTtcblx0XHR9IGVsc2UgaWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kUGF0aCkge1xuXHRcdFx0Ly8gVHJlbmQgY29tZXMgZnJvbSBhbm90aGVyIHByb3BlcnR5IHZpYSBhIHBhdGhcblx0XHRcdHRyZW5kVmFsdWUgPSBkZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlKGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aFxuXHRcdCkge1xuXHRcdFx0Ly8gQ2FsY3VsYXRlZCB0cmVuZFxuXHRcdFx0bGV0IHRyZW5kUmVmZXJlbmNlVmFsdWU6IG51bWJlcjtcblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHJlbmRSZWZlcmVuY2VWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KFxuXHRcdFx0XHRcdGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggfHwgXCJcIilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHRyZW5kVmFsdWUgPSBkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24oXG5cdFx0XHRcdHJhd1ZhbHVlLFxuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlLFxuXHRcdFx0XHQhIWtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlLFxuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdHJlbmRcIiwgdHJlbmRWYWx1ZSk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZVRhcmdldFZhbHVlKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQsIG9LUElNb2RlbDogSlNPTk1vZGVsKSB7XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlID09PSB1bmRlZmluZWQgJiYga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47IC8vIE5vIHRhcmdldCBzZXQgZm9yIHRoZSBLUElcblx0XHR9XG5cdFx0Y29uc3QgcmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXHRcdGNvbnN0IGN1cnJlbnRMb2NhbGUgPSBuZXcgTG9jYWxlKFxuXHRcdFx0c2FwLnVpXG5cdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0LmdldENvbmZpZ3VyYXRpb24oKVxuXHRcdFx0XHQuZ2V0TGFuZ3VhZ2UoKVxuXHRcdCk7XG5cblx0XHRsZXQgdGFyZ2V0UmF3VmFsdWU6IG51bWJlcjtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGFyZ2V0UmF3VmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFyZ2V0UmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggfHwgXCJcIikpO1xuXHRcdH1cblx0XHRjb25zdCBkZXZpYXRpb25SYXdWYWx1ZSA9IHRhcmdldFJhd1ZhbHVlICE9PSAwID8gKChyYXdWYWx1ZSAtIHRhcmdldFJhd1ZhbHVlKSAvIHRhcmdldFJhd1ZhbHVlKSAqIDEwMCA6IHVuZGVmaW5lZDtcblxuXHRcdC8vIEZvcm1hdHRpbmdcblx0XHRjb25zdCB0YXJnZXRWYWx1ZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogXCJzaG9ydFwiLFxuXHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQodGFyZ2V0UmF3VmFsdWUpO1xuXHRcdGNvbnN0IHRhcmdldFNjYWxlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBcInNob3J0XCIsXG5cdFx0XHRcdGRlY2ltYWxzOiAwLFxuXHRcdFx0XHRtYXhJbnRlZ2VyRGlnaXRzOiAwLFxuXHRcdFx0XHRzaG93U2NhbGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQodGFyZ2V0UmF3VmFsdWUpO1xuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXROdW1iZXJcIiwgdGFyZ2V0VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0VW5pdFwiLCB0YXJnZXRTY2FsZSk7XG5cblx0XHRpZiAoZGV2aWF0aW9uUmF3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgZGV2aWF0aW9uVmFsdWUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRcdHNob3dTY2FsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdFx0KS5mb3JtYXQoZGV2aWF0aW9uUmF3VmFsdWUpO1xuXHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9kZXZpYXRpb25OdW1iZXJcIiwgZGV2aWF0aW9uVmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2RldmlhdGlvbk51bWJlclwiLCBcIk4vQVwiKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZHMgdGFnIGRhdGEgZm9yIGEgS1BJLCBhbmQgc3RvcmVzIGl0IGluIHRoZSBKU09OIEtQSSBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIHtLUElEZWZpbml0aW9ufSBrcGlEZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBLUEkuXG5cdCAqIEBwYXJhbSB7T0RhdGFNb2RlbH0gb01haW5Nb2RlbCBUaGUgbW9kZWwgdXNlZCB0byBsb2FkIHRoZSBkYXRhLlxuXHQgKiBAcGFyYW0ge0pTT05Nb2RlbH0gb0tQSU1vZGVsIFRoZSBKU09OIG1vZGVsIHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkXG5cdCAqIEBwYXJhbSBsb2FkRnVsbCBJZiBub3QgdHJ1ZSwgbG9hZHMgb25seSBkYXRhIGZvciB0aGUgS1BJIHRhZ1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyB0aGUgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gZGF0YSBpcyBsb2FkZWQuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgbG9hZEtQSVRhZ0RhdGEoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwgb01haW5Nb2RlbDogT0RhdGFNb2RlbCwgb0tQSU1vZGVsOiBKU09OTW9kZWwsIGxvYWRGdWxsPzogYm9vbGVhbik6IGFueSB7XG5cdFx0Ly8gSWYgbG9hZEZ1bGw9ZmFsc2UsIHRoZW4gd2UncmUganVzdCBsb2FkaW5nIGRhdGEgZm9yIHRoZSB0YWcgYW5kIHdlIHVzZSB0aGUgXCIkYXV0by5Mb25nUnVubmVyc1wiIGdyb3VwSURcblx0XHQvLyBJZiBsb2FkRnVsbD10cnVlLCB3ZSdyZSBsb2FkaW5nIGRhdGEgZm9yIHRoZSB3aG9sZSBLUEkgKHRhZyArIGNhcmQpIGFuZCB3ZSB1c2UgdGhlIGRlZmF1bHQgKFwiJGF1dG9cIikgZ3JvdXBJRFxuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IGxvYWRGdWxsXG5cdFx0XHQ/IG9NYWluTW9kZWwuYmluZExpc3QoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmVudGl0eVNldClcblx0XHRcdDogb01haW5Nb2RlbC5iaW5kTGlzdChcIi9cIiArIGtwaURlZmluaXRpb24uZW50aXR5U2V0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7ICQkZ3JvdXBJZDogXCIkYXV0by5Mb25nUnVubmVyc1wiIH0pO1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGU6IFJlY29yZDxzdHJpbmcsIHsgdW5pdD86IHN0cmluZyB9PiA9IHt9O1xuXG5cdFx0Ly8gTWFpbiB2YWx1ZSArIGN1cnJlbmN5L3VuaXRcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoKSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aF0gPSB7IHVuaXQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQudmFsdWUgfTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGVydHkgZm9yIGNyaXRpY2FsaXR5XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCkge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGhdID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUHJvcGVydGllcyBmb3IgdHJlbmQgYW5kIHRyZW5kIGNhbGN1bGF0aW9uXG5cdFx0aWYgKGxvYWRGdWxsKSB7XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aCkge1xuXHRcdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHsgYWdncmVnYXRlOiBvQWdncmVnYXRlIH0pO1xuXG5cdFx0Ly8gTWFuYWdlIFNlbGVjdGlvblZhcmlhbnQgZmlsdGVyc1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhRmlsdGVycyA9IGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLm1hcChjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbikuZmlsdGVyKGZpbHRlciA9PiB7XG5cdFx0XHRcdHJldHVybiBmaWx0ZXIgIT09IHVuZGVmaW5lZDtcblx0XHRcdH0pIGFzIEZpbHRlcltdO1xuXHRcdFx0b0xpc3RCaW5kaW5nLmZpbHRlcihhRmlsdGVycyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMSkudGhlbigoYUNvbnRleHRzOiBDb250ZXh0W10pID0+IHtcblx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IHJhd1VuaXQgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGhcblx0XHRcdFx0XHQ/IGFDb250ZXh0c1swXS5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LnZhbHVlKVxuXHRcdFx0XHRcdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8udmFsdWU7XG5cblx0XHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQgJiYgIXJhd1VuaXQpIHtcblx0XHRcdFx0XHQvLyBBIHVuaXQvY3VycmVuY3kgaXMgZGVmaW5lZCwgYnV0IGl0cyB2YWx1ZSBpcyB1bmRlZmluZWQgLS0+IG11bHRpLXVuaXQgc2l0dWF0aW9uXG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVcIiwgXCIqXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlVW5zY2FsZWRcIiwgXCIqXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlTm9TY2FsZVwiLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVTY2FsZVwiLCBcIlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0XCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlcIiwgTWVzc2FnZVR5cGUuTm9uZSk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluU3RhdGVcIiwgXCJOb25lXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdHJlbmRcIiwgXCJOb25lXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIGtwaURlZmluaXRpb24uaWQgKyBcIi9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0TnVtYmVyXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXRVbml0XCIsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KFwiL1wiICsga3BpRGVmaW5pdGlvbi5pZCArIFwiL21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9kZXZpYXRpb25OdW1iZXJcIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3koa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXG5cdFx0XHRcdFx0aWYgKGxvYWRGdWxsKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZURhdGFwb2ludFRyZW5kKGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblx0XHRcdFx0XHRcdHRoaXMudXBkYXRlVGFyZ2V0VmFsdWUoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIGNhcmQgZGF0YSBmb3IgYSBLUEksIGFuZCBzdG9yZXMgaXQgaW4gdGhlIEpTT04gS1BJIG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0tQSURlZmluaXRpb259IGtwaURlZmluaXRpb24gVGhlIGRlZmluaXRpb24gb2YgdGhlIEtQSS5cblx0ICogQHBhcmFtIHtPRGF0YU1vZGVsfSBvTWFpbk1vZGVsIFRoZSBtb2RlbCB1c2VkIHRvIGxvYWQgdGhlIGRhdGEuXG5cdCAqIEBwYXJhbSB7SlNPTk1vZGVsfSBvS1BJTW9kZWwgVGhlIEpTT04gbW9kZWwgd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSBzdG9yZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgdGhlIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGRhdGEgaXMgbG9hZGVkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvTWFpbk1vZGVsOiBPRGF0YU1vZGVsLCBvS1BJTW9kZWw6IEpTT05Nb2RlbCk6IGFueSB7XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01haW5Nb2RlbC5iaW5kTGlzdChcIi9cIiArIGtwaURlZmluaXRpb24uZW50aXR5U2V0KTtcblx0XHRjb25zdCBvR3JvdXA6IFJlY29yZDxzdHJpbmcsIE9iamVjdD4gPSB7fTtcblx0XHRjb25zdCBvQWdncmVnYXRlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3Q+ID0ge307XG5cblx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0LmRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuXHRcdFx0b0dyb3VwW2RpbWVuc2lvbi5uYW1lXSA9IHt9O1xuXHRcdH0pO1xuXHRcdGtwaURlZmluaXRpb24uY2hhcnQubWVhc3VyZXMuZm9yRWFjaChtZWFzdXJlID0+IHtcblx0XHRcdG9BZ2dyZWdhdGVbbWVhc3VyZS5uYW1lXSA9IHt9O1xuXHRcdH0pO1xuXHRcdG9MaXN0QmluZGluZy5zZXRBZ2dyZWdhdGlvbih7XG5cdFx0XHRncm91cDogb0dyb3VwLFxuXHRcdFx0YWdncmVnYXRlOiBvQWdncmVnYXRlXG5cdFx0fSk7XG5cblx0XHQvLyBNYW5hZ2UgU2VsZWN0aW9uVmFyaWFudCBmaWx0ZXJzXG5cdFx0aWYgKGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFGaWx0ZXJzID0ga3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMubWFwKGNyZWF0ZUZpbHRlckZyb21EZWZpbml0aW9uKS5maWx0ZXIoZmlsdGVyID0+IHtcblx0XHRcdFx0cmV0dXJuIGZpbHRlciAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0fSkgYXMgRmlsdGVyW107XG5cdFx0XHRvTGlzdEJpbmRpbmcuZmlsdGVyKGFGaWx0ZXJzKTtcblx0XHR9XG5cblx0XHQvLyBTb3J0aW5nXG5cdFx0aWYgKGtwaURlZmluaXRpb24uY2hhcnQuc29ydE9yZGVyKSB7XG5cdFx0XHRvTGlzdEJpbmRpbmcuc29ydChcblx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jaGFydC5zb3J0T3JkZXIubWFwKHNvcnRJbmZvID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFNvcnRlcihzb3J0SW5mby5uYW1lLCBzb3J0SW5mby5kZXNjZW5kaW5nKTtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwga3BpRGVmaW5pdGlvbi5jaGFydC5tYXhJdGVtcykudGhlbigoYUNvbnRleHRzOiBDb250ZXh0W10pID0+IHtcblx0XHRcdGNvbnN0IGNoYXJ0RGF0YSA9IGFDb250ZXh0cy5tYXAoZnVuY3Rpb24ob0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jaGFydC5kaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcblx0XHRcdFx0XHRvRGF0YVtkaW1lbnNpb24ubmFtZV0gPSBvQ29udGV4dC5nZXRQcm9wZXJ0eShkaW1lbnNpb24ubmFtZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0Lm1lYXN1cmVzLmZvckVhY2gobWVhc3VyZSA9PiB7XG5cdFx0XHRcdFx0b0RhdGFbbWVhc3VyZS5uYW1lXSA9IG9Db250ZXh0LmdldFByb3BlcnR5KG1lYXN1cmUubmFtZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBvRGF0YTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBrcGlEZWZpbml0aW9uLmlkICsgXCIvbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2NoYXJ0RGF0YVwiLCBjaGFydERhdGEpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBvcG92ZXIgdG8gZGlzcGxheSB0aGUgS1BJIGNhcmRcblx0ICogVGhlIHBvcG92ZXIgYW5kIHRoZSBjb250YWluZWQgY2FyZCBmb3IgdGhlIEtQSXMgYXJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKiBUaGUgcG9wb3ZlciBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgS1BJcywgc28gaXQncyBjcmVhdGVkIG9ubHkgb25jZS5cblx0ICpcblx0ICogQHBhcmFtIG9LUElUYWcgVGhlIHRhZyB0aGF0IHRyaWdnZXJlZCB0aGUgcG9wb3ZlciBvcGVuaW5nLlxuXHQgKiBAcmV0dXJucyBUaGUgc2hhcmVkIHBvcG92ZXIgYXMgYSBwcm9taXNlLlxuXHQgKi9cblx0cHJvdGVjdGVkIGdldFBvcG92ZXIob0tQSVRhZzogR2VuZXJpY1RhZyk6IFByb21pc2U8UG9wb3Zlcj4ge1xuXHRcdGlmICghdGhpcy5vUG9wb3Zlcikge1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0KHNhcC51aS5nZXRDb3JlKCkubG9hZExpYnJhcnkoXCJzYXAvdWkvaW50ZWdyYXRpb25cIiwgeyBhc3luYzogdHJ1ZSB9KSBhcyBQcm9taXNlPG9iamVjdD4pXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoW1wic2FwL3VpL2ludGVncmF0aW9uL3dpZGdldHMvQ2FyZFwiLCBcInNhcC91aS9pbnRlZ3JhdGlvbi9Ib3N0XCJdLCAoQ2FyZDogYW55LCBIb3N0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0hvc3QgPSBuZXcgSG9zdCgpO1xuXG5cdFx0XHRcdFx0XHRcdG9Ib3N0LmF0dGFjaEFjdGlvbigob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzVHlwZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ0eXBlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicGFyYW1ldGVyc1wiKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChzVHlwZSA9PT0gXCJOYXZpZ2F0aW9uXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zLnNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbXMuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtcy5hY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlT3V0Ym91bmQob1BhcmFtcy5vdXRib3VuZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLm9DYXJkID0gbmV3IENhcmQoe1xuXHRcdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjI1cmVtXCIsXG5cdFx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcImF1dG9cIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0dGhpcy5vQ2FyZC5zZXRIb3N0KG9Ib3N0IGFzIGFueSk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5vUG9wb3ZlciA9IG5ldyBQb3BvdmVyKFwia3BpLVBvcG92ZXJcIiwge1xuXHRcdFx0XHRcdFx0XHRcdHNob3dIZWFkZXI6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBsYWNlbWVudDogXCJBdXRvXCIsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudDogW3RoaXMub0NhcmRdXG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdG9LUElUYWcuYWRkRGVwZW5kZW50KHRoaXMub1BvcG92ZXIpOyAvLyBUaGUgZmlyc3QgY2xpY2tlZCB0YWcgZ2V0cyB0aGUgcG9wb3ZlciBhcyBkZXBlbmRlbnRcblxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKHRoaXMub1BvcG92ZXIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMub1BvcG92ZXIpO1xuXHRcdH1cblx0fVxuXG5cdEBQdWJsaWNcblx0cHVibGljIG9uS1BJUHJlc3NlZChvS1BJVGFnOiBhbnksIGtwaUlEOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvS1BJTW9kZWwgPSBvS1BJVGFnLmdldE1vZGVsKFwia3BpTW9kZWxcIikgYXMgSlNPTk1vZGVsO1xuXG5cdFx0aWYgKHRoaXMuYUtQSURlZmluaXRpb25zICYmIHRoaXMuYUtQSURlZmluaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Y29uc3Qga3BpRGVmaW5pdGlvbiA9IHRoaXMuYUtQSURlZmluaXRpb25zLmZpbmQoZnVuY3Rpb24ob0RlZikge1xuXHRcdFx0XHRyZXR1cm4gb0RlZi5pZCA9PT0ga3BpSUQ7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGtwaURlZmluaXRpb24pIHtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0tQSVRhZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBhUHJvbWlzZXMgPSBbXG5cdFx0XHRcdFx0dGhpcy5sb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uLCBvTW9kZWwsIG9LUElNb2RlbCwgdHJ1ZSksXG5cdFx0XHRcdFx0dGhpcy5sb2FkS1BJQ2FyZERhdGEoa3BpRGVmaW5pdGlvbiwgb01vZGVsLCBvS1BJTW9kZWwpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0UG9wb3ZlcihvS1BJVGFnKVxuXHRcdFx0XHRdO1xuXG5cdFx0XHRcdFByb21pc2UuYWxsKGFQcm9taXNlcylcblx0XHRcdFx0XHQudGhlbihhUmVzdWx0cyA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnNldE1hbmlmZXN0KG9LUElNb2RlbC5nZXRQcm9wZXJ0eShcIi9cIiArIGtwaUlEICsgXCIvbWFuaWZlc3RcIikpO1xuXHRcdFx0XHRcdFx0dGhpcy5vQ2FyZC5yZWZyZXNoKCk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IG9Qb3BvdmVyID0gYVJlc3VsdHNbMl07XG5cdFx0XHRcdFx0XHRvUG9wb3Zlci5vcGVuQnkob0tQSVRhZywgZmFsc2UpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=