@sapui5/sap.fe.core 1.134.0 → 1.136.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 (395) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +6 -62
  4. package/src/sap/fe/core/ActionRuntime.ts +14 -65
  5. package/src/sap/fe/core/AppComponent.js +10 -2
  6. package/src/sap/fe/core/AppComponent.ts +6 -0
  7. package/src/sap/fe/core/AppStateHandler.js +9 -7
  8. package/src/sap/fe/core/AppStateHandler.ts +7 -5
  9. package/src/sap/fe/core/BaseController.js +1 -1
  10. package/src/sap/fe/core/CommonUtils.js +8 -4
  11. package/src/sap/fe/core/CommonUtils.ts +19 -4
  12. package/src/sap/fe/core/ExtensionAPI.js +7 -5
  13. package/src/sap/fe/core/ExtensionAPI.ts +5 -3
  14. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  15. package/src/sap/fe/core/InsightsFormattersExtension.js +1 -1
  16. package/src/sap/fe/core/PageController.js +36 -6
  17. package/src/sap/fe/core/PageController.ts +30 -0
  18. package/src/sap/fe/core/ResourceModel.js +1 -1
  19. package/src/sap/fe/core/ReuseComponent.js +1 -1
  20. package/src/sap/fe/core/TemplateComponent.js +1 -1
  21. package/src/sap/fe/core/TemplateModel.js +1 -1
  22. package/src/sap/fe/core/UIProvider.js +2 -2
  23. package/src/sap/fe/core/UIProvider.ts +3 -32
  24. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +34 -16
  25. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +39 -18
  26. package/src/sap/fe/core/buildingBlocks/IBuildingBlockOwnerComponent.js +1 -1
  27. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
  28. package/src/sap/fe/core/buildingBlocks/templating/AttributeModel.js +1 -1
  29. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockFormatter.js +1 -1
  30. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +2 -2
  31. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -0
  32. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +7 -7
  33. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +9 -9
  34. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
  35. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +5 -3
  36. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
  37. package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
  38. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +15 -15
  39. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +19 -19
  40. package/src/sap/fe/core/controllerextensions/ContextSharing.js +1 -1
  41. package/src/sap/fe/core/controllerextensions/EditFlow.js +74 -93
  42. package/src/sap/fe/core/controllerextensions/EditFlow.ts +89 -108
  43. package/src/sap/fe/core/controllerextensions/Feedback.js +1 -1
  44. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +355 -0
  45. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +387 -0
  46. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  47. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  48. package/src/sap/fe/core/controllerextensions/InternalRouting.js +36 -11
  49. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +36 -10
  50. package/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
  51. package/src/sap/fe/core/controllerextensions/MessageHandler.js +36 -6
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
  53. package/src/sap/fe/core/controllerextensions/PageReady.js +5 -2
  54. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -0
  55. package/src/sap/fe/core/controllerextensions/Paginator.js +1 -1
  56. package/src/sap/fe/core/controllerextensions/Placeholder.js +1 -1
  57. package/src/sap/fe/core/controllerextensions/Recommendations.js +1 -1
  58. package/src/sap/fe/core/controllerextensions/Routing.js +9 -9
  59. package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
  60. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  61. package/src/sap/fe/core/controllerextensions/Share.js +1 -1
  62. package/src/sap/fe/core/controllerextensions/SideEffects.js +13 -6
  63. package/src/sap/fe/core/controllerextensions/SideEffects.ts +13 -6
  64. package/src/sap/fe/core/controllerextensions/Telemetry.js +1 -1
  65. package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
  66. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +14 -11
  67. package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +20 -14
  68. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +4 -12
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
  70. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +12 -2
  71. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
  72. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +1 -1
  73. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
  74. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +111 -89
  75. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +140 -105
  76. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +137 -79
  77. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +133 -120
  78. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -3
  79. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
  80. package/src/sap/fe/core/controllerextensions/editFlow/editFlowConstants.js +1 -1
  81. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +26 -17
  82. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +32 -23
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +3 -3
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  85. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +103 -23
  86. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +144 -53
  87. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +29 -11
  88. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +39 -15
  89. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +24 -22
  90. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +28 -26
  91. package/src/sap/fe/core/controllerextensions/editFlow/operations/actionHelper.js +1 -1
  92. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -572
  93. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +25 -873
  94. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
  95. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +98 -56
  96. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -80
  97. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +5 -3
  98. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +7 -4
  99. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +1 -1
  100. package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +1 -1
  101. package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +1 -1
  102. package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +1 -1
  103. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
  104. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +1 -1
  105. package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributorMixin.js +1 -1
  106. package/src/sap/fe/core/controls/Any.js +1 -1
  107. package/src/sap/fe/core/controls/AnyElement.js +1 -1
  108. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  109. package/src/sap/fe/core/controls/ComponentLoader.js +1 -1
  110. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +3 -3
  111. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
  112. package/src/sap/fe/core/controls/DataWatcher.js +4 -3
  113. package/src/sap/fe/core/controls/DataWatcher.tsx +4 -1
  114. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
  115. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +10 -4
  116. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +13 -2
  117. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
  118. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +1 -1
  119. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
  120. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
  121. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
  122. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
  123. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
  124. package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
  125. package/src/sap/fe/core/converters/ConverterContext.js +1 -1
  126. package/src/sap/fe/core/converters/ManifestSettings.js +3 -2
  127. package/src/sap/fe/core/converters/ManifestSettings.ts +42 -20
  128. package/src/sap/fe/core/converters/ManifestWrapper.js +8 -2
  129. package/src/sap/fe/core/converters/ManifestWrapper.ts +8 -0
  130. package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  131. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  132. package/src/sap/fe/core/converters/annotations/DataField.js +2 -2
  133. package/src/sap/fe/core/converters/annotations/DataField.ts +2 -1
  134. package/src/sap/fe/core/converters/controls/Common/Action.js +55 -6
  135. package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
  136. package/src/sap/fe/core/converters/controls/Common/Chart.js +45 -6
  137. package/src/sap/fe/core/converters/controls/Common/Chart.ts +60 -9
  138. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
  139. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  140. package/src/sap/fe/core/converters/controls/Common/Form.js +21 -5
  141. package/src/sap/fe/core/converters/controls/Common/Form.ts +25 -5
  142. package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
  143. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -1686
  144. package/src/sap/fe/core/converters/controls/Common/Table.ts +254 -2513
  145. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +1701 -0
  146. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +2377 -0
  147. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +64 -15
  148. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +76 -14
  149. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -36
  150. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +8 -46
  151. package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
  152. package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
  153. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +10 -5
  154. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
  155. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
  156. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +5 -3
  157. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +11 -4
  158. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +7 -2
  159. package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  160. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
  161. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
  162. package/src/sap/fe/core/converters/helpers/ID.js +1 -1
  163. package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -1
  164. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  165. package/src/sap/fe/core/converters/helpers/Key.js +1 -1
  166. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
  167. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
  168. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +30 -8
  169. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
  170. package/src/sap/fe/core/converters/templates/ListReportConverter.js +5 -3
  171. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +5 -1
  172. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
  173. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +184 -0
  174. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +240 -0
  175. package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
  176. package/src/sap/fe/core/designtime/messagebundle.properties +11 -0
  177. package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
  178. package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
  179. package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
  180. package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
  181. package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
  182. package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
  183. package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
  184. package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
  185. package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
  186. package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
  187. package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
  188. package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
  189. package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
  190. package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
  191. package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
  192. package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
  193. package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
  194. package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
  195. package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
  196. package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
  197. package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
  198. package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
  199. package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
  200. package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
  201. package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
  202. package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
  203. package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
  204. package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
  205. package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
  206. package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
  207. package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
  208. package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
  209. package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
  210. package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
  211. package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
  212. package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
  213. package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
  214. package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
  215. package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
  216. package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
  217. package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
  218. package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
  219. package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
  220. package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
  221. package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
  222. package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
  223. package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
  224. package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
  225. package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
  226. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  227. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  228. package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
  229. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  230. package/src/sap/fe/core/formatters/StandardFormatter.js +1 -1
  231. package/src/sap/fe/core/formatters/ValueFormatter.js +27 -12
  232. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -11
  233. package/src/sap/fe/core/fpm/Component.js +1 -1
  234. package/src/sap/fe/core/fpm/manifest.json +1 -1
  235. package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +1 -1
  236. package/src/sap/fe/core/helpers/AppStartupHelper.js +25 -4
  237. package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
  238. package/src/sap/fe/core/helpers/BindingHelper.js +4 -3
  239. package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
  240. package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +1 -1
  241. package/src/sap/fe/core/helpers/DeleteHelper.js +6 -12
  242. package/src/sap/fe/core/helpers/DeleteHelper.ts +4 -9
  243. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  244. package/src/sap/fe/core/helpers/EditState.js +1 -1
  245. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
  246. package/src/sap/fe/core/helpers/FPMHelper.js +9 -3
  247. package/src/sap/fe/core/helpers/FPMHelper.ts +13 -1
  248. package/src/sap/fe/core/helpers/HTTP503Handler.js +1 -1
  249. package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  250. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
  251. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -1
  252. package/src/sap/fe/core/helpers/ManifestHelper.js +1 -1
  253. package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
  254. package/src/sap/fe/core/helpers/MetaModelFunction.js +1 -1
  255. package/src/sap/fe/core/helpers/MetaPath.js +1 -1
  256. package/src/sap/fe/core/helpers/ModelHelper.js +15 -5
  257. package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
  258. package/src/sap/fe/core/helpers/PasteHelper.js +39 -40
  259. package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
  260. package/src/sap/fe/core/helpers/PromiseKeeper.js +1 -1
  261. package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -1
  262. package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
  263. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  264. package/src/sap/fe/core/helpers/SizeHelper.js +1 -1
  265. package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  266. package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +1 -1
  267. package/src/sap/fe/core/helpers/Synchronization.js +1 -1
  268. package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
  269. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -1
  270. package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
  271. package/src/sap/fe/core/helpers/WebSocket.js +11 -2
  272. package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
  273. package/src/sap/fe/core/library.js +16 -4
  274. package/src/sap/fe/core/library.support.js +1 -1
  275. package/src/sap/fe/core/library.ts +1 -0
  276. package/src/sap/fe/core/manifestMerger/AddNewPage.js +1 -1
  277. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  278. package/src/sap/fe/core/messagebundle.properties +41 -2
  279. package/src/sap/fe/core/messagebundle_ar.properties +25 -4
  280. package/src/sap/fe/core/messagebundle_bg.properties +25 -4
  281. package/src/sap/fe/core/messagebundle_ca.properties +24 -3
  282. package/src/sap/fe/core/messagebundle_cnr.properties +25 -4
  283. package/src/sap/fe/core/messagebundle_cs.properties +23 -2
  284. package/src/sap/fe/core/messagebundle_cy.properties +24 -3
  285. package/src/sap/fe/core/messagebundle_da.properties +25 -4
  286. package/src/sap/fe/core/messagebundle_de.properties +28 -7
  287. package/src/sap/fe/core/messagebundle_el.properties +23 -2
  288. package/src/sap/fe/core/messagebundle_en.properties +25 -4
  289. package/src/sap/fe/core/messagebundle_en_GB.properties +25 -4
  290. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -5
  291. package/src/sap/fe/core/messagebundle_es.properties +23 -2
  292. package/src/sap/fe/core/messagebundle_es_MX.properties +23 -2
  293. package/src/sap/fe/core/messagebundle_et.properties +23 -2
  294. package/src/sap/fe/core/messagebundle_fi.properties +23 -2
  295. package/src/sap/fe/core/messagebundle_fr.properties +26 -5
  296. package/src/sap/fe/core/messagebundle_fr_CA.properties +23 -2
  297. package/src/sap/fe/core/messagebundle_hi.properties +24 -3
  298. package/src/sap/fe/core/messagebundle_hr.properties +27 -6
  299. package/src/sap/fe/core/messagebundle_hu.properties +23 -2
  300. package/src/sap/fe/core/messagebundle_id.properties +23 -2
  301. package/src/sap/fe/core/messagebundle_it.properties +25 -4
  302. package/src/sap/fe/core/messagebundle_iw.properties +24 -3
  303. package/src/sap/fe/core/messagebundle_ja.properties +24 -3
  304. package/src/sap/fe/core/messagebundle_kk.properties +23 -2
  305. package/src/sap/fe/core/messagebundle_ko.properties +25 -4
  306. package/src/sap/fe/core/messagebundle_lt.properties +23 -2
  307. package/src/sap/fe/core/messagebundle_lv.properties +25 -4
  308. package/src/sap/fe/core/messagebundle_mk.properties +23 -2
  309. package/src/sap/fe/core/messagebundle_ms.properties +24 -3
  310. package/src/sap/fe/core/messagebundle_nl.properties +23 -2
  311. package/src/sap/fe/core/messagebundle_no.properties +23 -2
  312. package/src/sap/fe/core/messagebundle_pl.properties +25 -4
  313. package/src/sap/fe/core/messagebundle_pt.properties +25 -4
  314. package/src/sap/fe/core/messagebundle_pt_PT.properties +24 -3
  315. package/src/sap/fe/core/messagebundle_ro.properties +25 -4
  316. package/src/sap/fe/core/messagebundle_ru.properties +24 -3
  317. package/src/sap/fe/core/messagebundle_sh.properties +25 -4
  318. package/src/sap/fe/core/messagebundle_sk.properties +24 -3
  319. package/src/sap/fe/core/messagebundle_sl.properties +28 -7
  320. package/src/sap/fe/core/messagebundle_sr.properties +25 -4
  321. package/src/sap/fe/core/messagebundle_sv.properties +23 -2
  322. package/src/sap/fe/core/messagebundle_th.properties +25 -4
  323. package/src/sap/fe/core/messagebundle_tr.properties +23 -2
  324. package/src/sap/fe/core/messagebundle_uk.properties +25 -4
  325. package/src/sap/fe/core/messagebundle_vi.properties +25 -4
  326. package/src/sap/fe/core/messagebundle_zh_CN.properties +26 -5
  327. package/src/sap/fe/core/messagebundle_zh_TW.properties +24 -3
  328. package/src/sap/fe/core/rootView/Fcl.controller.js +11 -7
  329. package/src/sap/fe/core/rootView/Fcl.controller.ts +16 -7
  330. package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -3
  331. package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
  332. package/src/sap/fe/core/rootView/RootViewBaseController.js +87 -35
  333. package/src/sap/fe/core/rootView/RootViewBaseController.ts +113 -57
  334. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  335. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  336. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +29 -13
  337. package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
  338. package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +1 -1
  339. package/src/sap/fe/core/services/ContextSharingServiceFactory.js +1 -1
  340. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +8 -2
  341. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
  342. package/src/sap/fe/core/services/InlineEditServiceFactory.js +11 -5
  343. package/src/sap/fe/core/services/InlineEditServiceFactory.ts +9 -3
  344. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  345. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  346. package/src/sap/fe/core/services/RoutingServiceFactory.js +14 -7
  347. package/src/sap/fe/core/services/RoutingServiceFactory.ts +11 -5
  348. package/src/sap/fe/core/services/ShellServicesFactory.js +5 -4
  349. package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
  350. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +28 -4
  351. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
  352. package/src/sap/fe/core/services/TelemetryServiceFactory.js +1 -1
  353. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
  354. package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +1 -1
  355. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
  356. package/src/sap/fe/core/services/valueHelpService/HistoryOptOutProvider.js +1 -1
  357. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  358. package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
  359. package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
  360. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
  361. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
  362. package/src/sap/fe/core/support/CommonHelper.js +1 -1
  363. package/src/sap/fe/core/support/Diagnostics.js +1 -1
  364. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
  365. package/src/sap/fe/core/templating/ActionHelper.js +1 -1
  366. package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
  367. package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
  368. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
  369. package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
  370. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  371. package/src/sap/fe/core/templating/EntitySetHelper.js +199 -59
  372. package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
  373. package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
  374. package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  375. package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
  376. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
  377. package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
  378. package/src/sap/fe/core/templating/SemanticObjectHelper.js +8 -10
  379. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +11 -10
  380. package/src/sap/fe/core/templating/UIFormatters.js +5 -2
  381. package/src/sap/fe/core/templating/UIFormatters.ts +3 -0
  382. package/src/sap/fe/core/type/Date.js +1 -1
  383. package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
  384. package/src/sap/fe/core/type/EDM.js +1 -1
  385. package/src/sap/fe/core/type/Email.js +1 -1
  386. package/src/sap/fe/core/type/FiscalDate.js +1 -1
  387. package/src/sap/fe/core/type/InputMask.js +1 -1
  388. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.js +0 -288
  389. package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.tsx +0 -208
  390. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.js +0 -404
  391. package/src/sap/fe/core/controllerextensions/editFlow/ODataOperation.ts +0 -502
  392. package/src/sap/fe/core/designtime/TextArrangementChangeAction.js +0 -100
  393. package/src/sap/fe/core/designtime/TextArrangementChangeAction.ts +0 -134
  394. package/src/sap/fe/core/operationsHelper.js +0 -192
  395. package/src/sap/fe/core/operationsHelper.ts +0 -277
@@ -1,71 +1,11 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2024 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvider", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/library", "sap/m/MessageBox", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "../ODataOperation"], function (ActionRuntime, CommonUtils, UIProvider, messageHandling, MetaModelConverter, DeleteHelper, ModelHelper, ResourceModelHelper, FELibrary, MessageBox, Library, Messaging, Message, MessageType, ODataOperation) {
5
+ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "./Operation"], function (MetaModelConverter, Operation) {
6
6
  "use strict";
7
7
 
8
- function __ui5_require_async(path) {
9
- return new Promise((resolve, reject) => {
10
- sap.ui.require([path], module => {
11
- if (!(module && module.__esModule)) {
12
- module = module === null || !(typeof module === "object" && path.endsWith("/library")) ? {
13
- default: module
14
- } : module;
15
- Object.defineProperty(module, "__esModule", {
16
- value: true
17
- });
18
- }
19
- resolve(module);
20
- }, err => {
21
- reject(err);
22
- });
23
- });
24
- }
25
- var getResourceModel = ResourceModelHelper.getResourceModel;
26
8
  var convertTypes = MetaModelConverter.convertTypes;
27
- var getCoreUIFactory = UIProvider.getCoreUIFactory;
28
- const Constants = FELibrary.Constants,
29
- InvocationGrouping = FELibrary.InvocationGrouping;
30
- const Action = MessageBox.Action;
31
- /**
32
- * Calls a bound action for one or multiple contexts.
33
- * @param sActionName The name of the action to be called
34
- * @param contexts Either one context or an array with contexts for which the action is to be be called
35
- * @param oModel OData Model
36
- * @param oAppComponent The AppComponent
37
- * @param [mParameters] Optional, can contain the following attributes:
38
- * @param [mParameters.parameterValues] A map of action parameter names and provided values
39
- * @param [mParameters.mBindingParameters] A map of binding parameters that would be part of $select and $expand coming from side effects for bound actions
40
- * @param [mParameters.additionalSideEffect] Array of property paths to be requested in addition to actual target properties of the side effect
41
- * @param [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
42
- * @param [mParameters.label] A human-readable label for the action
43
- * @param [mParameters.invocationGrouping] Mode how actions are to be called: Changeset to put all action calls into one changeset, Isolated to put them into separate changesets, defaults to Isolated
44
- * @param [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
45
- * @param [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
46
- * @param [mParameters.parentControl] If specified, the dialogs are added as dependent of the parent control
47
- * @param [mParameters.ignoreETag] If specified, the action is called without ETag handling
48
- * @returns Promise resolves with an array of response objects
49
- */
50
- async function callBoundAction(sActionName, contexts, oModel, oAppComponent, mParameters) {
51
- if (!contexts || contexts.length === 0) {
52
- //In Freestyle apps bound actions can have no context
53
- throw new Error("Bound actions always requires at least one context");
54
- }
55
- mParameters.aContexts = Array.isArray(contexts) ? contexts : [contexts];
56
- const oMetaModel = oModel.getMetaModel(),
57
- // Analyzing metaModelPath for action only from first context seems weird, but probably works in all existing scenarios - if several contexts are passed, they probably
58
- // belong to the same metamodelpath. TODO: Check, whether this can be improved / scenarios with different metaModelPaths might exist
59
- sActionPath = `${oMetaModel.getMetaPath(mParameters.aContexts[0].getPath())}/${sActionName}`,
60
- oBoundAction = oMetaModel.createBindingContext(`${sActionPath}/@$ui5.overload/0`);
61
- mParameters.isCriticalAction = await ActionRuntime.getIsActionCritical(oMetaModel, sActionPath, mParameters.aContexts);
62
- const convertedTypes = convertTypes(oModel.getMetaModel());
63
- const convertedAction = convertedTypes.resolvePath(oBoundAction.getPath()).target;
64
- if (!convertedAction) {
65
- throw new Error("Unknown bound action");
66
- }
67
- return callAction(convertedAction, oModel, oBoundAction, oAppComponent, mParameters);
68
- }
69
9
  /**
70
10
  * Calls an action import.
71
11
  * @param actionName The name of the action import to be called
@@ -89,11 +29,7 @@ sap.ui.define(["sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/c
89
29
  if (!convertedAction) {
90
30
  throw new Error("Unknown action import");
91
31
  }
92
- const unboundActionIndex = convertedTypes.actions.filter(action => action.name === convertedAction.name).findIndex(action => !action.isBound),
93
- actionNameFromModel = convertedActionImport.actionName,
94
- actionImport = metaModel.createBindingContext(`/${actionNameFromModel}/${unboundActionIndex}`);
95
- parameters.isCriticalAction = await ActionRuntime.getIsActionCritical(metaModel, `${actionPath}/@$ui5.overload`);
96
- return callAction(convertedActionImport.action, model, actionImport, appComponent, parameters);
32
+ return new Operation(appComponent, model, convertedActionImport.action, parameters).execute();
97
33
  }
98
34
  async function callBoundFunction(sFunctionName, context, oModel) {
99
35
  if (!context) {
@@ -123,507 +59,11 @@ sap.ui.define(["sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/c
123
59
  }
124
60
  const functionToCall = oModel.bindContext(`${context?.getPath() ?? ""}/${sFunctionName}(...)`);
125
61
  const groupId = context ? "functionGroup" : "functionImport";
126
- const executionPromise = functionToCall.execute(groupId);
62
+ const executionPromise = functionToCall.invoke(groupId);
127
63
  oModel.submitBatch(groupId);
128
64
  await executionPromise;
129
65
  return functionToCall.getBoundContext();
130
66
  }
131
- async function checkParameterTypeAndReturnConvertedValue(parameter, value) {
132
- if (value === undefined || value === null) {
133
- return value;
134
- }
135
- const BaseType = (await __ui5_require_async("sap/ui/mdc/enums/BaseType")).default;
136
- const TypeMap = (await __ui5_require_async("sap/ui/mdc/odata/v4/TypeMap")).default;
137
- const parameterType = parameter.type ? TypeMap.getBaseType(parameter.type) : BaseType.String;
138
- const typeInstance = TypeMap.getDataTypeInstance(parameterType);
139
- return typeInstance.parseValue(value, "string");
140
- }
141
- async function callAction(convertedAction, oModel, oAction, oAppComponent, mParameters) {
142
- let strictHandlingUtilities = {
143
- is412Executed: false,
144
- strictHandlingTransitionFails: [],
145
- strictHandlingPromises: [],
146
- strictHandlingWarningMessages: [],
147
- delaySuccessMessages: [],
148
- processedMessageIds: new Set()
149
- };
150
- const sActionName = convertedAction.isBound ? convertedAction.fullyQualifiedName.replace(/\(.*\)$/g, "") // remove the part related to the overlay
151
- : convertedAction.name;
152
- mParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
153
- return new Promise(async function (resolve, reject) {
154
- const sActionLabel = mParameters.label;
155
- let bSkipParameterDialog = mParameters.skipParameterDialog;
156
- const aContexts = mParameters.aContexts;
157
- const bIsCreateAction = mParameters.bIsCreateAction;
158
- const bIsCriticalAction = mParameters.isCriticalAction;
159
- let oMetaModel;
160
- let sMessagesPath;
161
- let iMessageSideEffect;
162
- let isSameEntity;
163
- let bValuesProvidedForAllMandatoryParameters;
164
- const actionDefinition = oAction.getObject();
165
-
166
- //in case of bound actions, ignore the first parameter and consider the rest
167
- const actionParameters = convertedAction.isBound ? convertedAction.parameters.slice(1) : convertedAction.parameters;
168
-
169
- // Check if the action has parameters and would need a parameter dialog
170
- // The parameter ResultIsActiveEntity is always hidden in the dialog! Hence if
171
- // this is the only parameter, this is treated as no parameter here because the
172
- // dialog would be empty!
173
- // FIXME: Should only ignore this if this is a 'create' action, otherwise it is just some normal parameter that happens to have this name
174
- const bActionNeedsParameterDialog = actionParameters.length > 0 && !(actionParameters.length === 1 && actionParameters[0].name === "ResultIsActiveEntity");
175
-
176
- // Provided values for the action parameters from invokeAction call
177
- const aParameterValues = mParameters.parameterValues;
178
-
179
- // Determine startup parameters if provided
180
- const oComponentData = oAppComponent.getComponentData();
181
- const oStartupParameters = oComponentData && oComponentData.startupParameters || {};
182
-
183
- // If all parameters are hidden and all mandatory parameters values are available, then we skip the dialog.
184
- bSkipParameterDialog = actionParameters.length && actionParameters.filter(actionParameter => actionParameter.name !== "ResultIsActiveEntity").every(parameter => parameter.annotations.UI?.Hidden?.valueOf() === true) ? true : bSkipParameterDialog;
185
- // In case an action parameter is needed, and we shall skip the dialog, check if values are provided for all parameters
186
- if (bActionNeedsParameterDialog && bSkipParameterDialog) {
187
- bValuesProvidedForAllMandatoryParameters = _valuesProvidedForAllMandatoryParameters(!!bIsCreateAction, actionParameters, aParameterValues, oStartupParameters);
188
- }
189
-
190
- // Depending on the previously determined data, either set a dialog or leave it empty which
191
- // will lead to direct execution of the action without a dialog
192
-
193
- const mActionExecutionParameters = {
194
- defaultParametersValues: {},
195
- appComponent: oAppComponent,
196
- fnOnSubmitted: mParameters.onSubmitted,
197
- fnOnResponse: mParameters.onResponse,
198
- actionName: sActionName,
199
- aContexts: [],
200
- model: oModel,
201
- aActionParameters: actionParameters,
202
- defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction,
203
- label: mParameters.label,
204
- selectedItems: mParameters.selectedItems
205
- };
206
- if (convertedAction.isBound) {
207
- oMetaModel = oModel.getMetaModel();
208
- const convertedMetaData = convertTypes(oMetaModel);
209
- const filteredEntitySet = convertedMetaData.entitySets.filter(singleEntitySet => singleEntitySet.entityType === convertedAction.returnEntityType);
210
- const currentEntitySet = filteredEntitySet.length > 0 ? filteredEntitySet[0] : undefined;
211
- isSameEntity = !convertedAction.returnCollection && convertedAction.returnEntityType && convertedAction.sourceEntityType === convertedAction.returnEntityType;
212
- if (isSameEntity && ModelHelper.isDraftRoot(currentEntitySet)) {
213
- mParameters.mBindingParameters ??= {};
214
- mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? `${mParameters.mBindingParameters.$select},HasActiveEntity` : "HasActiveEntity";
215
- }
216
- if (mParameters.additionalSideEffect?.pathExpressions) {
217
- sMessagesPath = ModelHelper.getMessagesPath(oMetaModel, aContexts[0].getPath());
218
- if (sMessagesPath) {
219
- // '*' effectively includes the messages path if there is one
220
- iMessageSideEffect = mParameters.additionalSideEffect.pathExpressions.findIndex(exp => typeof exp === "string" && (exp === sMessagesPath || exp === "*"));
221
-
222
- // Add SAP_Messages by default if not annotated by side effects, action does not return a collection and
223
- // the return type is the same as the bound type
224
- if (iMessageSideEffect > -1 || isSameEntity) {
225
- // the message path is annotated as side effect. As there's no binding for it and the model does currently not allow
226
- // to add it at a later point of time we have to take care it's part of the $select of the POST, therefore moving it.
227
- mParameters.mBindingParameters ??= {};
228
- if (convertedAction.returnEntityType?.entityProperties.find(property => property.name === sMessagesPath) && !(mParameters.mBindingParameters.$select ?? "").split(",").includes(sMessagesPath)) {
229
- if (isSameEntity) {
230
- // We request messages from the return context as it might not exist as a part of the bound action's source context's $select.
231
- // Example: Create on a List. Messages path might not be part of the list.
232
- mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? `${mParameters.mBindingParameters.$select},${sMessagesPath}` : sMessagesPath;
233
- // We need the return context to be fetched with all the existing properties of the bound action's source context.
234
- mParameters.mBindingParameters.$$inheritExpandSelect = true;
235
- }
236
- if (mParameters.additionalSideEffect.triggerActions?.length === 0 && iMessageSideEffect > -1) {
237
- // no trigger action therefore no need to request messages again
238
- mParameters.additionalSideEffect.pathExpressions.splice(iMessageSideEffect, 1);
239
- }
240
- }
241
- }
242
- }
243
- }
244
- mActionExecutionParameters.aContexts = aContexts ?? [];
245
- mActionExecutionParameters.mBindingParameters = mParameters.mBindingParameters;
246
- mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
247
- mActionExecutionParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
248
- mActionExecutionParameters.internalModelContext = mParameters.internalModelContext;
249
- mActionExecutionParameters.operationAvailableMap = mParameters.operationAvailableMap;
250
- mActionExecutionParameters.isCreateAction = bIsCreateAction;
251
- mActionExecutionParameters.bObjectPage = mParameters.bObjectPage;
252
- mActionExecutionParameters.disableStrictHandling = mParameters.disableStrictHandling;
253
- mActionExecutionParameters.groupId = mParameters.groupId;
254
- if (mParameters.controlId) {
255
- mActionExecutionParameters.control = mParameters.parentControl.byId(mParameters.controlId);
256
- mParameters.control = mActionExecutionParameters.control;
257
- } else {
258
- mActionExecutionParameters.control = mParameters.parentControl;
259
- mParameters.control = mParameters.parentControl;
260
- }
261
- }
262
- mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
263
- if (bIsCreateAction) {
264
- mActionExecutionParameters.bIsCreateAction = bIsCreateAction;
265
- }
266
- mActionExecutionParameters.isStatic = convertedAction.isBound && !!convertedAction.parameters[0]?.isCollection;
267
- let operationResult = [];
268
- let executionWitDialog = false;
269
- try {
270
- if (bActionNeedsParameterDialog) {
271
- if (!(bSkipParameterDialog && bValuesProvidedForAllMandatoryParameters)) {
272
- executionWitDialog = true;
273
- const parameterDialog = getCoreUIFactory().newParameterDialog(convertedAction, oAction, mActionExecutionParameters, aParameterValues, mParameters.entitySetName, mParameters.view, mParameters.messageHandler, strictHandlingUtilities, {
274
- beforeShowingMessage: actionParameterShowMessageCallback
275
- }, mParameters.ignoreETag);
276
- await parameterDialog.createDialog();
277
- operationResult = await parameterDialog.openDialog(mParameters.parentControl);
278
- }
279
- } else if (bIsCriticalAction) {
280
- executionWitDialog = true;
281
- operationResult = await confirmCriticalAction(convertedAction, sActionName, mActionExecutionParameters, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler, strictHandlingUtilities, mParameters.ignoreETag);
282
- }
283
- } catch (e) {
284
- reject(e);
285
- }
286
- if (executionWitDialog) {
287
- afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
288
- resolve(operationResult);
289
- return;
290
- }
291
-
292
- // Take over all provided parameter values and call the action.
293
- // This shall only happen if values are provided for all the parameters, otherwise the parameter dialog shall be shown which is ensured earlier
294
-
295
- if (aParameterValues) {
296
- for (const i in mActionExecutionParameters.aActionParameters) {
297
- mActionExecutionParameters.defaultParametersValues[mActionExecutionParameters.aActionParameters[i].name] = aParameterValues?.find(element => element.name === mActionExecutionParameters.aActionParameters[i].name)?.value;
298
- }
299
- } else {
300
- let actionParameter, parameterValueNotConverted;
301
- for (const i in mActionExecutionParameters.aActionParameters) {
302
- actionParameter = mActionExecutionParameters.aActionParameters[i];
303
- parameterValueNotConverted = oStartupParameters[actionParameter.name]?.[0] || actionParameter.annotations?.UI?.ParameterDefaultValue?.valueOf();
304
- mActionExecutionParameters.defaultParametersValues[actionParameter.name] = parameterValueNotConverted === undefined ? parameterValueNotConverted : await checkParameterTypeAndReturnConvertedValue(actionParameter, parameterValueNotConverted);
305
- }
306
- }
307
- let oOperationResult = [];
308
- try {
309
- oOperationResult = await new ODataOperation(convertedAction, mActionExecutionParameters, mParameters.messageHandler, strictHandlingUtilities, {
310
- ignoreETag: mParameters.ignoreETag
311
- }).execute();
312
- const messages = Messaging.getMessageModel().getData();
313
- if (strictHandlingUtilities && strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length) {
314
- strictHandlingUtilities.delaySuccessMessages = strictHandlingUtilities.delaySuccessMessages.concat(messages);
315
- }
316
- afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
317
- resolve(oOperationResult);
318
- } catch (e) {
319
- reject(e);
320
- } finally {
321
- if (strictHandlingUtilities && strictHandlingUtilities.is412Executed && strictHandlingUtilities.strictHandlingTransitionFails.length && mParameters.aContexts.length > 1) {
322
- try {
323
- const strictHandlingFails = strictHandlingUtilities.strictHandlingTransitionFails;
324
- const aFailedContexts = [];
325
- strictHandlingFails.forEach(function (fail) {
326
- aFailedContexts.push(fail.oAction.getContext());
327
- });
328
- mActionExecutionParameters.aContexts = aFailedContexts;
329
- const oFailedOperationResult = await new ODataOperation(convertedAction, mActionExecutionParameters, mParameters.messageHandler, strictHandlingUtilities, {
330
- ignoreETag: mParameters.ignoreETag
331
- }).execute();
332
- strictHandlingUtilities.strictHandlingTransitionFails = [];
333
- Messaging.addMessages(strictHandlingUtilities.delaySuccessMessages);
334
- afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition);
335
- resolve(oFailedOperationResult);
336
- } catch (e) {
337
- reject(e);
338
- }
339
- }
340
- let showGenericErrorMessageForChangeSet = false;
341
- if (mParameters.bGrouped && strictHandlingUtilities && strictHandlingUtilities.strictHandlingPromises.length || mParameters.bGrouped && messageHandling.hasTransitionErrorsOrWarnings()) {
342
- showGenericErrorMessageForChangeSet = true;
343
- }
344
- mParameters?.messageHandler?.showMessageDialog({
345
- control: mActionExecutionParameters?.control,
346
- onBeforeShowMessage: function (aMessages, showMessageParametersIn) {
347
- return actionParameterShowMessageCallback(mActionExecutionParameters, aContexts, undefined, aMessages, showMessageParametersIn, showGenericErrorMessageForChangeSet, oOperationResult.length > 0 && oOperationResult.every(res => res.status === "fulfilled"));
348
- },
349
- aSelectedContexts: mParameters.aContexts,
350
- sActionName: sActionLabel,
351
- entitySet: mParameters.entitySetName,
352
- boundActionName: sActionName
353
- }).then(() => {
354
- mParameters.messageHandler.clearStrictWarningMessages();
355
- return;
356
- });
357
- if (strictHandlingUtilities) {
358
- strictHandlingUtilities = {
359
- is412Executed: false,
360
- strictHandlingTransitionFails: [],
361
- strictHandlingPromises: [],
362
- strictHandlingWarningMessages: [],
363
- delaySuccessMessages: [],
364
- processedMessageIds: new Set()
365
- };
366
- }
367
- }
368
- });
369
- }
370
-
371
- /**
372
- * Reads a title from custom i18n file.
373
- * @param oParentControl The view where the action is called
374
- * @param suffixResourceKey The key of the title
375
- * @returns Title if defined
376
- */
377
- function getConfirmTitle(oParentControl, suffixResourceKey) {
378
- // A title only exists if it has been defined in the extension. Otherwise "Confirmation"
379
- // is used from the MessageBox control.
380
- const key = "C_OPERATIONS_ACTION_CONFIRM_TITLE";
381
- const resourceModel = getResourceModel(oParentControl);
382
- const titleOverrideExists = resourceModel.checkIfResourceKeyExists(`${key}|${suffixResourceKey}`);
383
- if (titleOverrideExists) {
384
- return resourceModel.getText(key, undefined, suffixResourceKey);
385
- }
386
- }
387
- async function confirmCriticalAction(convertedAction, sActionName, mParameters, oParentControl, entitySetName, messageHandler, strictHandlingUtilities, ignoreETag) {
388
- return new Promise((resolve, reject) => {
389
- let boundActionName = sActionName;
390
- boundActionName = boundActionName.includes(".") ? boundActionName.split(".")[boundActionName.split(".").length - 1] : boundActionName;
391
- const suffixResourceKey = boundActionName && entitySetName ? `${entitySetName}|${boundActionName}` : "";
392
- const resourceModel = getResourceModel(oParentControl);
393
- const sConfirmationText = resourceModel.getText("C_OPERATIONS_ACTION_CONFIRM_MESSAGE", undefined, suffixResourceKey);
394
- MessageBox.confirm(sConfirmationText, {
395
- title: getConfirmTitle(oParentControl, suffixResourceKey),
396
- onClose: async function (sAction) {
397
- if (sAction === Action.OK) {
398
- try {
399
- const oOperation = await new ODataOperation(convertedAction, mParameters, messageHandler, strictHandlingUtilities, {
400
- ignoreETag
401
- }).execute();
402
- resolve(oOperation);
403
- } catch (oError) {
404
- try {
405
- await messageHandler.showMessageDialog();
406
- reject(oError);
407
- } catch (e) {
408
- reject(oError);
409
- }
410
- }
411
- } else {
412
- reject(Constants.CancelActionDialog);
413
- }
414
- }
415
- });
416
- });
417
- }
418
- function afterActionResolution(mParameters, mActionExecutionParameters, actionDefinition) {
419
- if (mActionExecutionParameters.internalModelContext && mActionExecutionParameters.operationAvailableMap && mActionExecutionParameters.aContexts && mActionExecutionParameters.aContexts.length && actionDefinition.$IsBound) {
420
- let selectedContexts = [];
421
- //check for skipping static actions
422
- const isStatic = mActionExecutionParameters.isStatic;
423
- if (!isStatic) {
424
- selectedContexts = mActionExecutionParameters.internalModelContext.getProperty("selectedContexts") || [];
425
- ActionRuntime.setActionEnablement(mActionExecutionParameters.internalModelContext, JSON.parse(mActionExecutionParameters.operationAvailableMap), selectedContexts, "table");
426
- } else if (mActionExecutionParameters.control) {
427
- const control = mActionExecutionParameters.control;
428
- if (control.isA("sap.ui.mdc.Table")) {
429
- selectedContexts = control.getSelectedContexts();
430
- ActionRuntime.setActionEnablement(mActionExecutionParameters.internalModelContext, JSON.parse(mActionExecutionParameters.operationAvailableMap), selectedContexts, "table");
431
- }
432
- }
433
- //update delete button
434
- DeleteHelper.updateDeleteInfoForSelectedContexts(mActionExecutionParameters.internalModelContext, selectedContexts);
435
- }
436
- }
437
-
438
- /**
439
- * Filters an array of messages based on various conditions and returns an object containing the filtered messages and other properties.
440
- * @param messages The messages to filter.
441
- * @param errorTargetsInAPD Indicates whether error targets are in APD.
442
- * @param contexts An array of contexts.
443
- * @param unboundMessages An array of unbound messages.
444
- * @param control A control object.
445
- * @param isAPDOPen Indicates whether APD is open.
446
- * @param showMessageDialog Indicates whether to show the message dialog.
447
- * @returns An object containing a boolean indicating whether the result contains a bound transition, an array of messages to show, and a boolean indicating whether to show the message in a dialog.
448
- */
449
- function filterAPDandContextMessages(messages, errorTargetsInAPD, contexts, unboundMessages, control, isAPDOPen, showMessageDialog) {
450
- if (isAPDOPen && errorTargetsInAPD) {
451
- /* When APD is open, we need to remove the messages which are related to the objectpage context */
452
- messageHandling.removeContextMessagesfromModel(messages, contexts);
453
- }
454
-
455
- // Filter out messages which are not related to the action parameter dialog in the edit mode and display mode
456
- let containsBoundTransistion;
457
- if (!(control && CommonUtils.getIsEditable(control))) {
458
- if (isAPDOPen && errorTargetsInAPD) {
459
- if (unboundMessages?.length === 0) {
460
- containsBoundTransistion = false;
461
- showMessageDialog = false;
462
- }
463
- messages = messageHandling.removeMessagesForActionParameterDialog(messages);
464
- }
465
- } else {
466
- if (unboundMessages?.length === 0) {
467
- containsBoundTransistion = false;
468
- }
469
- messages = messageHandling.removeMessagesForActionParameterDialog(messages);
470
- }
471
- return {
472
- messagesToShow: messages,
473
- containsBoundTransistion: containsBoundTransistion,
474
- showMessageInDialog: showMessageDialog
475
- };
476
- }
477
- function actionParameterShowMessageCallback(mParameters, aContexts, oDialog, messages, showMessageParametersIn, showGenericErrorMessageForChangeSet, isActionSuccessful, is412WarningDialogCancelled) {
478
- let showMessageBox = showMessageParametersIn.showMessageBox,
479
- showMessageDialog = showMessageParametersIn.showMessageDialog;
480
- const oControl = mParameters.control;
481
- const oResourceBundle = Library.getResourceBundleFor("sap.fe.core");
482
- const unboundMessages = messages.filter(function (message) {
483
- return message.getTargets()?.[0] === "";
484
- });
485
- const APDmessages = messages.filter(function (message) {
486
- return message.getTargets && message.getTargets()?.[0].includes(mParameters.actionName) && mParameters?.aActionParameters?.some(function (actionParam) {
487
- return message.getTargets()?.[0].includes(actionParam.name);
488
- });
489
- });
490
- APDmessages?.forEach(function (APDMessage) {
491
- APDMessage.isAPDTarget = true;
492
- });
493
- const errorTargetsInAPD = APDmessages.length ? true : false;
494
- //If Action is successful with warnings, dont show the generic error message for changeset in dialog
495
- if (showGenericErrorMessageForChangeSet && !errorTargetsInAPD && !isActionSuccessful) {
496
- const messageModel = Messaging.getMessageModel();
497
- const messagesInModel = messageModel.getData();
498
- const aBoundMessages = messageHandling.getMessages(true);
499
- let genericMessage;
500
- const isEditable = (oControl && CommonUtils.getIsEditable(oControl)) ?? false;
501
- const nonErrorMessageExistsInDialog = messages.findIndex(function (message) {
502
- return message.getType() === "Error" || message.getType() === "Warning";
503
- });
504
- const nonErrorMessageExistsInModel = messagesInModel.findIndex(function (message) {
505
- return message.getType() === "Error" || message.getType() === "Warning";
506
- });
507
- if (nonErrorMessageExistsInDialog !== 1 && nonErrorMessageExistsInModel !== -1 && mParameters.aContexts && mParameters.aContexts.length > 1) {
508
- if (messagesInModel.length === 1) {
509
- genericMessage = getGenericMsgForSingleErrorInChangeSet(isEditable, oResourceBundle);
510
- messages.unshift(genericMessage);
511
- showMessageBox = true;
512
- showMessageDialog = false;
513
- } else {
514
- const sMessage = oResourceBundle.getText("C_COMMON_DIALOG_CANCEL_ERROR_MESSAGES_TEXT");
515
- const sDescriptionText = oResourceBundle.getText("C_COMMON_DIALOG_CANCEL_ERROR_MESSAGES_DETAIL_TEXT");
516
- genericMessage = new Message({
517
- message: sMessage,
518
- type: MessageType.Error,
519
- target: "",
520
- persistent: true,
521
- description: sDescriptionText,
522
- code: "FE_CUSTOM_MESSAGE_CHANGESET_ALL_FAILED"
523
- });
524
- messages.unshift(genericMessage);
525
- if (messages.length === 1) {
526
- showMessageBox = true;
527
- showMessageDialog = false;
528
- } else {
529
- showMessageDialog = true;
530
- showMessageBox = false;
531
- }
532
- }
533
- }
534
- }
535
- let bIsAPDOpen = oDialog && oDialog.isOpen();
536
- // NOTE: we don't use isOpen again after we close the dialog as isOpen(sync API) doesn't return false until the dialog animations and dialog events end.
537
- if (oDialog && bIsAPDOpen && aContexts.length !== 0 && !mParameters.isStatic) {
538
- if (!mParameters.bGrouped) {
539
- //isolated
540
- if (aContexts.length > 1 || !errorTargetsInAPD) {
541
- // does not matter if error is in APD or not, if there are multiple contexts selected or if the error is not the APD, we close it.
542
- // TODO: Dilaog handling should not be part of message handling. Refactor accordingly - dialog should not be needed inside this method - neither
543
- // to ask whether it's open, nor to close/destroy it!
544
- oDialog.close();
545
- bIsAPDOpen = false;
546
- }
547
- } else if (!errorTargetsInAPD && !is412WarningDialogCancelled) {
548
- //changeset
549
- oDialog.close();
550
- bIsAPDOpen = false;
551
- }
552
- }
553
- const filteredMessages = [];
554
- const {
555
- messagesToShow,
556
- containsBoundTransistion,
557
- showMessageInDialog
558
- } = filterAPDandContextMessages(messages, errorTargetsInAPD, aContexts, unboundMessages, oControl, bIsAPDOpen);
559
- messages = messagesToShow;
560
- showMessageDialog = showMessageInDialog ?? showMessageDialog;
561
- if (!bIsAPDOpen && errorTargetsInAPD && !mParameters.bGrouped) {
562
- // If APD is not open and there are messages related to APD, then show in the message dialog. since
563
- showMessageDialog = true;
564
- messages = messages.concat(APDmessages);
565
- }
566
- let fnGetMessageSubtitle;
567
- if (oControl && oControl.isA("sap.ui.mdc.Table")) {
568
- fnGetMessageSubtitle = messageHandling.setMessageSubtitle.bind({}, oControl, aContexts);
569
- }
570
- return {
571
- showMessageBox: showMessageBox,
572
- showMessageDialog: showMessageDialog,
573
- filteredMessages: filteredMessages.length ? filteredMessages : messages,
574
- fnGetMessageSubtitle: fnGetMessageSubtitle,
575
- showChangeSetErrorDialog: mParameters.bGrouped,
576
- containsBoundTransistion: containsBoundTransistion
577
- };
578
- }
579
- function _valuesProvidedForAllMandatoryParameters(isCreateAction, actionParameters, parameterValues, startupParameters) {
580
- const hiddenAnnotationSetOnAllActions = actionParameters.every(parameter => parameter?.annotations?.UI?.Hidden?.valueOf() === true);
581
- if (parameterValues?.length && !hiddenAnnotationSetOnAllActions) {
582
- // If showDialog is false but there are parameters from the invokeAction call which need to be checked on existance
583
- for (const actionParameter of actionParameters) {
584
- if (actionParameter.name !== "ResultIsActiveEntity" && !parameterValues?.find(element => element.name === actionParameter.name)) {
585
- // At least for one parameter no value has been provided, so we can't skip the dialog
586
- return false;
587
- }
588
- }
589
- }
590
- if (isCreateAction && startupParameters?.length && !hiddenAnnotationSetOnAllActions) {
591
- // If parameters have been provided during application launch, we need to check if the set is complete
592
- // If not, the parameter dialog still needs to be shown.
593
- for (const actionParameter of actionParameters) {
594
- if (startupParameters && !startupParameters[actionParameter.name]) {
595
- // At least for one parameter no value has been provided, so we can't skip the dialog
596
- return false;
597
- }
598
- }
599
- }
600
- if (actionParameters.length && hiddenAnnotationSetOnAllActions) {
601
- return actionParameters.every(function (parameter) {
602
- const fieldControl = parameter.annotations?.Common?.FieldControl;
603
- const isMandatory = fieldControl?.toString() === "Common.FieldControlType/Mandatory";
604
-
605
- // Possible sources may be startupParameters, parameterValues, defaultValues per annotation (ParameterDefaultValue)
606
- // If none is found, return false
607
- return !isMandatory || startupParameters && startupParameters[parameter.name] || parameterValues?.find(parameterValue => parameterValue.name === parameter.name) || parameter?.annotations?.UI?.ParameterDefaultValue?.valueOf();
608
- });
609
- }
610
- return true;
611
- }
612
- function getGenericMsgForSingleErrorInChangeSet(isEditable, resourceBundle) {
613
- const message = isEditable ? resourceBundle.getText("C_COMMON_DIALOG_CANCEL_SINGLE_ERROR_MESSAGE_TEXT_EDIT") : resourceBundle.getText("C_COMMON_DIALOG_CANCEL_SINGLE_ERROR_MESSAGE_TEXT");
614
- return new Message({
615
- message,
616
- type: MessageType.Error,
617
- target: "",
618
- persistent: true,
619
- code: "FE_CUSTOM_MESSAGE_CHANGESET_ALL_FAILED",
620
- technicalDetails: {
621
- fe: {
622
- changeSetPreTextForSingleError: message
623
- }
624
- }
625
- });
626
- }
627
67
 
628
68
  /**
629
69
  * Static functions to call OData actions (bound/import) and functions (bound/import)
@@ -632,16 +72,10 @@ sap.ui.define(["sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/c
632
72
  * @since 1.56.0
633
73
  */
634
74
  const operations = {
635
- callBoundAction: callBoundAction,
636
75
  callActionImport: callActionImport,
637
76
  callBoundFunction: callBoundFunction,
638
- callFunctionImport: callFunctionImport,
639
- valuesProvidedForAllMandatoryParameters: _valuesProvidedForAllMandatoryParameters,
640
- actionParameterShowMessageCallback: actionParameterShowMessageCallback,
641
- afterActionResolution: afterActionResolution,
642
- checkParameterTypeAndReturnConvertedValue: checkParameterTypeAndReturnConvertedValue,
643
- getConfirmTitle: getConfirmTitle
77
+ callFunctionImport: callFunctionImport
644
78
  };
645
79
  return operations;
646
80
  }, false);
647
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25zdGFudHMiLCJGRUxpYnJhcnkiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJBY3Rpb24iLCJNZXNzYWdlQm94IiwiY2FsbEJvdW5kQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJjb250ZXh0cyIsIm9Nb2RlbCIsIm9BcHBDb21wb25lbnQiLCJtUGFyYW1ldGVycyIsImxlbmd0aCIsIkVycm9yIiwiYUNvbnRleHRzIiwiQXJyYXkiLCJpc0FycmF5Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNBY3Rpb25QYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwib0JvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJpc0NyaXRpY2FsQWN0aW9uIiwiQWN0aW9uUnVudGltZSIsImdldElzQWN0aW9uQ3JpdGljYWwiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImNvbnZlcnRlZEFjdGlvbiIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiY2FsbEFjdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJhY3Rpb25OYW1lIiwibW9kZWwiLCJhcHBDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwibWV0YU1vZGVsIiwiYWN0aW9uUGF0aCIsImNvbnZlcnRlZEFjdGlvbkltcG9ydCIsImFjdGlvbiIsInVuYm91bmRBY3Rpb25JbmRleCIsImFjdGlvbnMiLCJmaWx0ZXIiLCJuYW1lIiwiZmluZEluZGV4IiwiaXNCb3VuZCIsImFjdGlvbk5hbWVGcm9tTW9kZWwiLCJhY3Rpb25JbXBvcnQiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0IiwiUHJvbWlzZSIsInJlamVjdCIsInNGdW5jdGlvblBhdGgiLCJvQm91bmRGdW5jdGlvbiIsIl9leGVjdXRlRnVuY3Rpb24iLCJjYWxsRnVuY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9GdW5jdGlvbkltcG9ydCIsImdldE9iamVjdCIsIm9GdW5jdGlvbiIsImZ1bmN0aW9uVG9DYWxsIiwiZ3JvdXBJZCIsImV4ZWN1dGlvblByb21pc2UiLCJleGVjdXRlIiwic3VibWl0QmF0Y2giLCJnZXRCb3VuZENvbnRleHQiLCJjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZSIsInBhcmFtZXRlciIsInZhbHVlIiwidW5kZWZpbmVkIiwiQmFzZVR5cGUiLCJfX3VpNV9yZXF1aXJlX2FzeW5jIiwiZGVmYXVsdCIsIlR5cGVNYXAiLCJwYXJhbWV0ZXJUeXBlIiwidHlwZSIsImdldEJhc2VUeXBlIiwiU3RyaW5nIiwidHlwZUluc3RhbmNlIiwiZ2V0RGF0YVR5cGVJbnN0YW5jZSIsInBhcnNlVmFsdWUiLCJvQWN0aW9uIiwic3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMiLCJpczQxMkV4ZWN1dGVkIiwic3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHMiLCJzdHJpY3RIYW5kbGluZ1Byb21pc2VzIiwic3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXMiLCJkZWxheVN1Y2Nlc3NNZXNzYWdlcyIsInByb2Nlc3NlZE1lc3NhZ2VJZHMiLCJTZXQiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJyZXBsYWNlIiwiYkdyb3VwZWQiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJDaGFuZ2VTZXQiLCJyZXNvbHZlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2tpcFBhcmFtZXRlckRpYWxvZyIsInNraXBQYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJpc1NhbWVFbnRpdHkiLCJiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzIiwiYWN0aW9uRGVmaW5pdGlvbiIsImFjdGlvblBhcmFtZXRlcnMiLCJzbGljZSIsImJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZyIsImFQYXJhbWV0ZXJWYWx1ZXMiLCJwYXJhbWV0ZXJWYWx1ZXMiLCJvQ29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzdGFydHVwUGFyYW1ldGVycyIsImFjdGlvblBhcmFtZXRlciIsImV2ZXJ5IiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhpZGRlbiIsInZhbHVlT2YiLCJfdmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJkZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsImZuT25TdWJtaXR0ZWQiLCJvblN1Ym1pdHRlZCIsImZuT25SZXNwb25zZSIsIm9uUmVzcG9uc2UiLCJhQWN0aW9uUGFyYW1ldGVycyIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsInNlbGVjdGVkSXRlbXMiLCJjb252ZXJ0ZWRNZXRhRGF0YSIsImZpbHRlcmVkRW50aXR5U2V0IiwiZW50aXR5U2V0cyIsInNpbmdsZUVudGl0eVNldCIsImVudGl0eVR5cGUiLCJyZXR1cm5FbnRpdHlUeXBlIiwiY3VycmVudEVudGl0eVNldCIsInJldHVybkNvbGxlY3Rpb24iLCJzb3VyY2VFbnRpdHlUeXBlIiwiTW9kZWxIZWxwZXIiLCJpc0RyYWZ0Um9vdCIsIm1CaW5kaW5nUGFyYW1ldGVycyIsIiRzZWxlY3QiLCJhZGRpdGlvbmFsU2lkZUVmZmVjdCIsInBhdGhFeHByZXNzaW9ucyIsImdldE1lc3NhZ2VzUGF0aCIsImV4cCIsImVudGl0eVByb3BlcnRpZXMiLCJmaW5kIiwicHJvcGVydHkiLCJzcGxpdCIsImluY2x1ZGVzIiwiJCRpbmhlcml0RXhwYW5kU2VsZWN0IiwidHJpZ2dlckFjdGlvbnMiLCJzcGxpY2UiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImlzQ3JlYXRlQWN0aW9uIiwiYk9iamVjdFBhZ2UiLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJjb250cm9sSWQiLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJpc1N0YXRpYyIsImlzQ29sbGVjdGlvbiIsIm9wZXJhdGlvblJlc3VsdCIsImV4ZWN1dGlvbldpdERpYWxvZyIsInBhcmFtZXRlckRpYWxvZyIsImdldENvcmVVSUZhY3RvcnkiLCJuZXdQYXJhbWV0ZXJEaWFsb2ciLCJlbnRpdHlTZXROYW1lIiwidmlldyIsIm1lc3NhZ2VIYW5kbGVyIiwiYmVmb3JlU2hvd2luZ01lc3NhZ2UiLCJhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrIiwiaWdub3JlRVRhZyIsImNyZWF0ZURpYWxvZyIsIm9wZW5EaWFsb2ciLCJjb25maXJtQ3JpdGljYWxBY3Rpb24iLCJlIiwiYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uIiwiaSIsImVsZW1lbnQiLCJwYXJhbWV0ZXJWYWx1ZU5vdENvbnZlcnRlZCIsIlBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsIm9PcGVyYXRpb25SZXN1bHQiLCJPRGF0YU9wZXJhdGlvbiIsIm1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImNvbmNhdCIsInN0cmljdEhhbmRsaW5nRmFpbHMiLCJhRmFpbGVkQ29udGV4dHMiLCJmb3JFYWNoIiwiZmFpbCIsInB1c2giLCJnZXRDb250ZXh0Iiwib0ZhaWxlZE9wZXJhdGlvblJlc3VsdCIsImFkZE1lc3NhZ2VzIiwic2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQiLCJtZXNzYWdlSGFuZGxpbmciLCJoYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncyIsInNob3dNZXNzYWdlRGlhbG9nIiwib25CZWZvcmVTaG93TWVzc2FnZSIsImFNZXNzYWdlcyIsInNob3dNZXNzYWdlUGFyYW1ldGVyc0luIiwicmVzIiwic3RhdHVzIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJib3VuZEFjdGlvbk5hbWUiLCJ0aGVuIiwiY2xlYXJTdHJpY3RXYXJuaW5nTWVzc2FnZXMiLCJnZXRDb25maXJtVGl0bGUiLCJvUGFyZW50Q29udHJvbCIsInN1ZmZpeFJlc291cmNlS2V5Iiwia2V5IiwicmVzb3VyY2VNb2RlbCIsImdldFJlc291cmNlTW9kZWwiLCJ0aXRsZU92ZXJyaWRlRXhpc3RzIiwiY2hlY2tJZlJlc291cmNlS2V5RXhpc3RzIiwiZ2V0VGV4dCIsInNDb25maXJtYXRpb25UZXh0IiwiY29uZmlybSIsInRpdGxlIiwib25DbG9zZSIsInNBY3Rpb24iLCJPSyIsIm9PcGVyYXRpb24iLCJvRXJyb3IiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCIkSXNCb3VuZCIsInNlbGVjdGVkQ29udGV4dHMiLCJnZXRQcm9wZXJ0eSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJpc0EiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiRGVsZXRlSGVscGVyIiwidXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMiLCJmaWx0ZXJBUERhbmRDb250ZXh0TWVzc2FnZXMiLCJlcnJvclRhcmdldHNJbkFQRCIsInVuYm91bmRNZXNzYWdlcyIsImlzQVBET1BlbiIsInJlbW92ZUNvbnRleHRNZXNzYWdlc2Zyb21Nb2RlbCIsImNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiIsIkNvbW1vblV0aWxzIiwiZ2V0SXNFZGl0YWJsZSIsInJlbW92ZU1lc3NhZ2VzRm9yQWN0aW9uUGFyYW1ldGVyRGlhbG9nIiwibWVzc2FnZXNUb1Nob3ciLCJzaG93TWVzc2FnZUluRGlhbG9nIiwib0RpYWxvZyIsImlzQWN0aW9uU3VjY2Vzc2Z1bCIsImlzNDEyV2FybmluZ0RpYWxvZ0NhbmNlbGxlZCIsInNob3dNZXNzYWdlQm94Iiwib0NvbnRyb2wiLCJvUmVzb3VyY2VCdW5kbGUiLCJMaWJyYXJ5IiwiZ2V0UmVzb3VyY2VCdW5kbGVGb3IiLCJtZXNzYWdlIiwiZ2V0VGFyZ2V0cyIsIkFQRG1lc3NhZ2VzIiwic29tZSIsImFjdGlvblBhcmFtIiwiQVBETWVzc2FnZSIsImlzQVBEVGFyZ2V0IiwibWVzc2FnZU1vZGVsIiwibWVzc2FnZXNJbk1vZGVsIiwiYUJvdW5kTWVzc2FnZXMiLCJnZXRNZXNzYWdlcyIsImdlbmVyaWNNZXNzYWdlIiwiaXNFZGl0YWJsZSIsIm5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nIiwiZ2V0VHlwZSIsIm5vbkVycm9yTWVzc2FnZUV4aXN0c0luTW9kZWwiLCJnZXRHZW5lcmljTXNnRm9yU2luZ2xlRXJyb3JJbkNoYW5nZVNldCIsInVuc2hpZnQiLCJzTWVzc2FnZSIsInNEZXNjcmlwdGlvblRleHQiLCJNZXNzYWdlIiwiTWVzc2FnZVR5cGUiLCJwZXJzaXN0ZW50IiwiZGVzY3JpcHRpb24iLCJjb2RlIiwiYklzQVBET3BlbiIsImlzT3BlbiIsImNsb3NlIiwiZmlsdGVyZWRNZXNzYWdlcyIsImZuR2V0TWVzc2FnZVN1YnRpdGxlIiwic2V0TWVzc2FnZVN1YnRpdGxlIiwiYmluZCIsInNob3dDaGFuZ2VTZXRFcnJvckRpYWxvZyIsImhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMiLCJmaWVsZENvbnRyb2wiLCJDb21tb24iLCJGaWVsZENvbnRyb2wiLCJpc01hbmRhdG9yeSIsInRvU3RyaW5nIiwicGFyYW1ldGVyVmFsdWUiLCJyZXNvdXJjZUJ1bmRsZSIsInRlY2huaWNhbERldGFpbHMiLCJmZSIsImNoYW5nZVNldFByZVRleHRGb3JTaW5nbGVFcnJvciIsIm9wZXJhdGlvbnMiLCJ2YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImZhY2FkZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG5cdEFjdGlvbkltcG9ydCxcblx0QWN0aW9uUGFyYW1ldGVyLFxuXHRBY3Rpb24gYXMgRWRtQWN0aW9uLFxuXHRBY3Rpb25QYXJhbWV0ZXIgYXMgRWRtQWN0aW9uUGFyYW1ldGVyLFxuXHRQcmltaXRpdmVUeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBnZXRDb3JlVUlGYWN0b3J5IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VXaXRoSGVhZGVyLCBTaG93TWVzc2FnZVBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgdHlwZSBNZXRhTW9kZWxBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCBEZWxldGVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uU2lkZUVmZmVjdHNUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkSXRlbSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9NdWx0aVZhbHVlRmllbGRJdGVtXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwiLi4vLi4vLi4vQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgeyB0eXBlIFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzIH0gZnJvbSBcIi4uLy4uLy4uL29wZXJhdGlvbnNIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCIuLi8uLi9NZXNzYWdlSGFuZGxlclwiO1xuXG5pbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IE9EYXRhT3BlcmF0aW9uLCB7IHR5cGUgT3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL09EYXRhT3BlcmF0aW9uXCI7XG5cbmNvbnN0IENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdEludm9jYXRpb25Hcm91cGluZyA9IEZFTGlicmFyeS5JbnZvY2F0aW9uR3JvdXBpbmc7XG5jb25zdCBBY3Rpb24gPSBNZXNzYWdlQm94LkFjdGlvbjtcblxuZXhwb3J0IHR5cGUgU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMgPSB7XG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50O1xuXHRmbk9uU3VibWl0dGVkPzogRnVuY3Rpb247XG5cdGZuT25SZXNwb25zZT86IEZ1bmN0aW9uO1xuXHRhY3Rpb25OYW1lOiBzdHJpbmc7XG5cdG1vZGVsOiBPRGF0YU1vZGVsO1xuXHRhQWN0aW9uUGFyYW1ldGVyczogRWRtQWN0aW9uUGFyYW1ldGVyW107XG5cdGRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBQcmltaXRpdmVUeXBlPjtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0c2VsZWN0ZWRJdGVtczogT0RhdGFWNENvbnRleHRbXTtcblx0YUNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdO1xuXHRtQmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGFkZGl0aW9uYWxTaWRlRWZmZWN0PzogQWN0aW9uU2lkZUVmZmVjdHNUeXBlO1xuXHRiR3JvdXBlZD86IGJvb2xlYW47XG5cdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdGlzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0Yk9iamVjdFBhZ2U/OiBib29sZWFuO1xuXHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuO1xuXHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRncm91cElkPzogc3RyaW5nO1xuXHRpc1N0YXRpYz86IGJvb2xlYW47XG5cdGNvbnRyb2w/OiBDb250cm9sO1xuXHRvRGlhbG9nPzogRGlhbG9nO1xuXHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIENhbGxBY3Rpb25QYXJhbWV0ZXJzID0ge1xuXHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdO1xuXHRsYWJlbD86IHN0cmluZztcblx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdG9uU3VibWl0dGVkOiBGdW5jdGlvbjtcblx0b25SZXNwb25zZTogRnVuY3Rpb247XG5cdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdGNvbnRyb2w/OiBDb250cm9sO1xuXHRiSXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXI7XG5cdGJPYmplY3RQYWdlPzogYm9vbGVhbjtcblx0aXNDcml0aWNhbEFjdGlvbj86IGJvb2xlYW47XG5cdGNvbnRyb2xJZD86IHN0cmluZztcblx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdHZpZXc6IFZpZXcgfCBudWxsO1xufSAmIHtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xufSAmIHtcblx0Ykdyb3VwZWQ/OiBib29sZWFuO1xuXHRhQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRzZWxlY3RlZEl0ZW1zPzogT0RhdGFWNENvbnRleHRbXTtcblx0YWRkaXRpb25hbFNpZGVFZmZlY3Q/OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdG1CaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhbjtcblx0Z3JvdXBJZD86IHN0cmluZztcbn07XG5cbnR5cGUgQmFzZVR5cGVQYXJhbWV0ZXIgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vKipcbiAqIENhbGxzIGEgYm91bmQgYWN0aW9uIGZvciBvbmUgb3IgbXVsdGlwbGUgY29udGV4dHMuXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBjb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBiZSBjYWxsZWRcbiAqIEBwYXJhbSBvTW9kZWwgT0RhdGEgTW9kZWxcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVyc10gQSBtYXAgb2YgYmluZGluZyBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgcGFydCBvZiAkc2VsZWN0IGFuZCAkZXhwYW5kIGNvbWluZyBmcm9tIHNpZGUgZWZmZWN0cyBmb3IgYm91bmQgYWN0aW9uc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdF0gQXJyYXkgb2YgcHJvcGVydHkgcGF0aHMgdG8gYmUgcmVxdWVzdGVkIGluIGFkZGl0aW9uIHRvIGFjdHVhbCB0YXJnZXQgcHJvcGVydGllcyBvZiB0aGUgc2lkZSBlZmZlY3RcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogQ2hhbmdlc2V0IHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgSXNvbGF0ZWQgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzLCBkZWZhdWx0cyB0byBJc29sYXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzXSBDYW4gY29udGFpbiBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBGTFAgdXNlciBkZWZhdWx0c1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXSBJZiBzcGVjaWZpZWQsIHRoZSBkaWFsb2dzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbnQgb2YgdGhlIHBhcmVudCBjb250cm9sXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmlnbm9yZUVUYWddIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBFVGFnIGhhbmRsaW5nXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0c1xuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzXG4pOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRpZiAoIWNvbnRleHRzIHx8IGNvbnRleHRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdC8vSW4gRnJlZXN0eWxlIGFwcHMgYm91bmQgYWN0aW9ucyBjYW4gaGF2ZSBubyBjb250ZXh0XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQm91bmQgYWN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbnRleHRcIik7XG5cdH1cblx0bVBhcmFtZXRlcnMuYUNvbnRleHRzID0gQXJyYXkuaXNBcnJheShjb250ZXh0cykgPyBjb250ZXh0cyA6IFtjb250ZXh0c107XG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHQvLyBBbmFseXppbmcgbWV0YU1vZGVsUGF0aCBmb3IgYWN0aW9uIG9ubHkgZnJvbSBmaXJzdCBjb250ZXh0IHNlZW1zIHdlaXJkLCBidXQgcHJvYmFibHkgd29ya3MgaW4gYWxsIGV4aXN0aW5nIHNjZW5hcmlvcyAtIGlmIHNldmVyYWwgY29udGV4dHMgYXJlIHBhc3NlZCwgdGhleSBwcm9iYWJseVxuXHRcdC8vIGJlbG9uZyB0byB0aGUgc2FtZSBtZXRhbW9kZWxwYXRoLiBUT0RPOiBDaGVjaywgd2hldGhlciB0aGlzIGNhbiBiZSBpbXByb3ZlZCAvIHNjZW5hcmlvcyB3aXRoIGRpZmZlcmVudCBtZXRhTW9kZWxQYXRocyBtaWdodCBleGlzdFxuXHRcdHNBY3Rpb25QYXRoID0gYCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChtUGFyYW1ldGVycy5hQ29udGV4dHNbMF0uZ2V0UGF0aCgpKX0vJHtzQWN0aW9uTmFtZX1gLFxuXHRcdG9Cb3VuZEFjdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7c0FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkLzBgKSE7XG5cdG1QYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBhd2FpdCBBY3Rpb25SdW50aW1lLmdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGgsIG1QYXJhbWV0ZXJzLmFDb250ZXh0cyk7XG5cdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoPEVkbUFjdGlvbiB8IHVuZGVmaW5lZD4ob0JvdW5kQWN0aW9uLmdldFBhdGgoKSkudGFyZ2V0O1xuXHRpZiAoIWNvbnZlcnRlZEFjdGlvbikge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYm91bmQgYWN0aW9uXCIpO1xuXHR9XG5cdHJldHVybiBjYWxsQWN0aW9uKGNvbnZlcnRlZEFjdGlvbiwgb01vZGVsLCBvQm91bmRBY3Rpb24sIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKTtcbn1cbi8qKlxuICogQ2FsbHMgYW4gYWN0aW9uIGltcG9ydC5cbiAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gaW1wb3J0IHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG1vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG4gKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBbcGFyYW1ldGVyc10gT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuICogQHBhcmFtIFtwYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIFtwYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gRkxQIHVzZXIgZGVmYXVsdHNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5pZ25vcmVFVGFnXSBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgRVRhZyBoYW5kbGluZ1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsbEFjdGlvbkltcG9ydChcblx0YWN0aW9uTmFtZTogc3RyaW5nLFxuXHRtb2RlbDogT0RhdGFNb2RlbCxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdHBhcmFtZXRlcnM6IHtcblx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgTXVsdGlWYWx1ZUZpZWxkSXRlbVtdPltdO1xuXHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0YWRkaXRpb25hbFNpZGVFZmZlY3Q/OiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdFx0b25TdWJtaXR0ZWQ6IEZ1bmN0aW9uO1xuXHRcdG9uUmVzcG9uc2U6IEZ1bmN0aW9uO1xuXHRcdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjtcblx0XHRiT2JqZWN0UGFnZT86IGJvb2xlYW47XG5cdFx0c2VsZWN0ZWRJdGVtcz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0dmlldzogVmlldyB8IG51bGw7XG5cdH0gJiB7XG5cdFx0aXNDcml0aWNhbEFjdGlvbj86IGJvb2xlYW47XG5cdH1cbik6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdPiB7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRjb25zdCBhY3Rpb25QYXRoID0gYC8ke2FjdGlvbk5hbWV9YDtcblx0Y29uc3QgY29udmVydGVkVHlwZXMgPSBjb252ZXJ0VHlwZXMobWV0YU1vZGVsKTtcblx0Y29uc3QgY29udmVydGVkQWN0aW9uSW1wb3J0ID0gY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGg8QWN0aW9uSW1wb3J0IHwgdW5kZWZpbmVkPihhY3Rpb25QYXRoKS50YXJnZXQsXG5cdFx0Y29udmVydGVkQWN0aW9uID0gY29udmVydGVkQWN0aW9uSW1wb3J0Py5hY3Rpb247XG5cdGlmICghY29udmVydGVkQWN0aW9uKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBhY3Rpb24gaW1wb3J0XCIpO1xuXHR9XG5cdGNvbnN0IHVuYm91bmRBY3Rpb25JbmRleCA9IGNvbnZlcnRlZFR5cGVzLmFjdGlvbnNcblx0XHRcdC5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLm5hbWUgPT09IGNvbnZlcnRlZEFjdGlvbi5uYW1lKVxuXHRcdFx0LmZpbmRJbmRleCgoYWN0aW9uKSA9PiAhYWN0aW9uLmlzQm91bmQpLFxuXHRcdGFjdGlvbk5hbWVGcm9tTW9kZWwgPSBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQuYWN0aW9uTmFtZSxcblx0XHRhY3Rpb25JbXBvcnQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke2FjdGlvbk5hbWVGcm9tTW9kZWx9LyR7dW5ib3VuZEFjdGlvbkluZGV4fWApO1xuXHRwYXJhbWV0ZXJzLmlzQ3JpdGljYWxBY3Rpb24gPSBhd2FpdCBBY3Rpb25SdW50aW1lLmdldElzQWN0aW9uQ3JpdGljYWwobWV0YU1vZGVsLCBgJHthY3Rpb25QYXRofS9AJHVpNS5vdmVybG9hZGApO1xuXHRyZXR1cm4gY2FsbEFjdGlvbihjb252ZXJ0ZWRBY3Rpb25JbXBvcnQuYWN0aW9uLCBtb2RlbCwgYWN0aW9uSW1wb3J0LCBhcHBDb21wb25lbnQsIHBhcmFtZXRlcnMpO1xufVxuYXN5bmMgZnVuY3Rpb24gY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0LCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdGlmICghY29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGZ1bmN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYSBjb250ZXh0XCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YCxcblx0XHRvQm91bmRGdW5jdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kRnVuY3Rpb24sIGNvbnRleHQpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gaW1wb3J0LlxuICogQHBhcmFtIHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPHZvaWQgfCBPRGF0YVY0Q29udGV4dD4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkhLmdldE9iamVjdChcIiRGdW5jdGlvblwiKX0vMGApO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCk7XG59XG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKFxuXHRzRnVuY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0Z1bmN0aW9uOiBDb250ZXh0IHwgbnVsbCxcblx0Y29udGV4dD86IENvbnRleHRcbik6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0aWYgKCFvRnVuY3Rpb24/LmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfSBub3QgZm91bmRgKSk7XG5cdH1cblx0Y29uc3QgZnVuY3Rpb25Ub0NhbGw6IE9EYXRhQ29udGV4dEJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7Y29udGV4dD8uZ2V0UGF0aCgpID8/IFwiXCJ9LyR7c0Z1bmN0aW9uTmFtZX0oLi4uKWApO1xuXHRjb25zdCBncm91cElkID0gY29udGV4dCA/IFwiZnVuY3Rpb25Hcm91cFwiIDogXCJmdW5jdGlvbkltcG9ydFwiO1xuXHRjb25zdCBleGVjdXRpb25Qcm9taXNlID0gZnVuY3Rpb25Ub0NhbGwuZXhlY3V0ZShncm91cElkKTtcblx0b01vZGVsLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRhd2FpdCBleGVjdXRpb25Qcm9taXNlO1xuXHRyZXR1cm4gZnVuY3Rpb25Ub0NhbGwuZ2V0Qm91bmRDb250ZXh0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUGFyYW1ldGVyVHlwZUFuZFJldHVybkNvbnZlcnRlZFZhbHVlKFxuXHRwYXJhbWV0ZXI6IEFjdGlvblBhcmFtZXRlcixcblx0dmFsdWU/OiBCYXNlVHlwZVBhcmFtZXRlciB8IG51bGxcbik6IFByb21pc2U8QmFzZVR5cGVQYXJhbWV0ZXIgfCB1bmRlZmluZWQgfCBudWxsPiB7XG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdGNvbnN0IEJhc2VUeXBlID0gKGF3YWl0IGltcG9ydChcInNhcC91aS9tZGMvZW51bXMvQmFzZVR5cGVcIikpLmRlZmF1bHQ7XG5cdGNvbnN0IFR5cGVNYXAgPSAoYXdhaXQgaW1wb3J0KFwic2FwL3VpL21kYy9vZGF0YS92NC9UeXBlTWFwXCIpKS5kZWZhdWx0O1xuXHRjb25zdCBwYXJhbWV0ZXJUeXBlID0gKFxuXHRcdHBhcmFtZXRlciBhcyB7XG5cdFx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0XHR0eXBlPzogc3RyaW5nO1xuXHRcdH1cblx0KS50eXBlXG5cdFx0PyBUeXBlTWFwLmdldEJhc2VUeXBlKFxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0cGFyYW1ldGVyIGFzIHtcblx0XHRcdFx0XHRcdG5hbWU6IHN0cmluZztcblx0XHRcdFx0XHRcdHR5cGU6IHN0cmluZztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdCkudHlwZVxuXHRcdCAgKVxuXHRcdDogQmFzZVR5cGUuU3RyaW5nO1xuXHRjb25zdCB0eXBlSW5zdGFuY2UgPSBUeXBlTWFwLmdldERhdGFUeXBlSW5zdGFuY2UocGFyYW1ldGVyVHlwZSk7XG5cdHJldHVybiB0eXBlSW5zdGFuY2UucGFyc2VWYWx1ZSh2YWx1ZSwgXCJzdHJpbmdcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxBY3Rpb24oXG5cdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uLFxuXHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdG9BY3Rpb246IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IENhbGxBY3Rpb25QYXJhbWV0ZXJzXG4pOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRsZXQgc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzID0ge1xuXHRcdGlzNDEyRXhlY3V0ZWQ6IGZhbHNlLFxuXHRcdHN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzOiBbXSxcblx0XHRzdHJpY3RIYW5kbGluZ1Byb21pc2VzOiBbXSxcblx0XHRzdHJpY3RIYW5kbGluZ1dhcm5pbmdNZXNzYWdlczogW10sXG5cdFx0ZGVsYXlTdWNjZXNzTWVzc2FnZXM6IFtdLFxuXHRcdHByb2Nlc3NlZE1lc3NhZ2VJZHM6IG5ldyBTZXQ8c3RyaW5nPigpXG5cdH07XG5cdGNvbnN0IHNBY3Rpb25OYW1lID0gY29udmVydGVkQWN0aW9uLmlzQm91bmRcblx0XHQ/IGNvbnZlcnRlZEFjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUucmVwbGFjZSgvXFwoLipcXCkkL2csIFwiXCIpIC8vIHJlbW92ZSB0aGUgcGFydCByZWxhdGVkIHRvIHRoZSBvdmVybGF5XG5cdFx0OiBjb252ZXJ0ZWRBY3Rpb24ubmFtZTtcblx0bVBhcmFtZXRlcnMuYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgPT09IEludm9jYXRpb25Hcm91cGluZy5DaGFuZ2VTZXQ7XG5cdHJldHVybiBuZXcgUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+KGFzeW5jIGZ1bmN0aW9uIChcblx0XHRyZXNvbHZlOiAodmFsdWU6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSkgPT4gdm9pZCxcblx0XHRyZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuXHQpIHtcblx0XHRjb25zdCBzQWN0aW9uTGFiZWwgPSBtUGFyYW1ldGVycy5sYWJlbDtcblx0XHRsZXQgYlNraXBQYXJhbWV0ZXJEaWFsb2cgPSBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nO1xuXHRcdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cztcblx0XHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdFx0Y29uc3QgYklzQ3JpdGljYWxBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uO1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IGlNZXNzYWdlU2lkZUVmZmVjdDtcblx0XHRsZXQgaXNTYW1lRW50aXR5O1xuXHRcdGxldCBiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IGFjdGlvbkRlZmluaXRpb24gPSBvQWN0aW9uLmdldE9iamVjdCgpIGFzIE1ldGFNb2RlbEFjdGlvbjtcblxuXHRcdC8vaW4gY2FzZSBvZiBib3VuZCBhY3Rpb25zLCBpZ25vcmUgdGhlIGZpcnN0IHBhcmFtZXRlciBhbmQgY29uc2lkZXIgdGhlIHJlc3Rcblx0XHRjb25zdCBhY3Rpb25QYXJhbWV0ZXJzID0gY29udmVydGVkQWN0aW9uLmlzQm91bmQgPyBjb252ZXJ0ZWRBY3Rpb24ucGFyYW1ldGVycy5zbGljZSgxKSA6IGNvbnZlcnRlZEFjdGlvbi5wYXJhbWV0ZXJzO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBoYXMgcGFyYW1ldGVycyBhbmQgd291bGQgbmVlZCBhIHBhcmFtZXRlciBkaWFsb2dcblx0XHQvLyBUaGUgcGFyYW1ldGVyIFJlc3VsdElzQWN0aXZlRW50aXR5IGlzIGFsd2F5cyBoaWRkZW4gaW4gdGhlIGRpYWxvZyEgSGVuY2UgaWZcblx0XHQvLyB0aGlzIGlzIHRoZSBvbmx5IHBhcmFtZXRlciwgdGhpcyBpcyB0cmVhdGVkIGFzIG5vIHBhcmFtZXRlciBoZXJlIGJlY2F1c2UgdGhlXG5cdFx0Ly8gZGlhbG9nIHdvdWxkIGJlIGVtcHR5IVxuXHRcdC8vIEZJWE1FOiBTaG91bGQgb25seSBpZ25vcmUgdGhpcyBpZiB0aGlzIGlzIGEgJ2NyZWF0ZScgYWN0aW9uLCBvdGhlcndpc2UgaXQgaXMganVzdCBzb21lIG5vcm1hbCBwYXJhbWV0ZXIgdGhhdCBoYXBwZW5zIHRvIGhhdmUgdGhpcyBuYW1lXG5cdFx0Y29uc3QgYkFjdGlvbk5lZWRzUGFyYW1ldGVyRGlhbG9nID1cblx0XHRcdGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiAhKGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAxICYmIGFjdGlvblBhcmFtZXRlcnNbMF0ubmFtZSA9PT0gXCJSZXN1bHRJc0FjdGl2ZUVudGl0eVwiKTtcblxuXHRcdC8vIFByb3ZpZGVkIHZhbHVlcyBmb3IgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzIGZyb20gaW52b2tlQWN0aW9uIGNhbGxcblx0XHRjb25zdCBhUGFyYW1ldGVyVmFsdWVzID0gbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIHN0YXJ0dXAgcGFyYW1ldGVycyBpZiBwcm92aWRlZFxuXHRcdGNvbnN0IG9Db21wb25lbnREYXRhID0gb0FwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0Y29uc3Qgb1N0YXJ0dXBQYXJhbWV0ZXJzID0gKG9Db21wb25lbnREYXRhICYmIG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzKSB8fCB7fTtcblxuXHRcdC8vIElmIGFsbCBwYXJhbWV0ZXJzIGFyZSBoaWRkZW4gIGFuZCBhbGwgbWFuZGF0b3J5IHBhcmFtZXRlcnMgdmFsdWVzIGFyZSBhdmFpbGFibGUsIHRoZW4gd2Ugc2tpcCB0aGUgZGlhbG9nLlxuXHRcdGJTa2lwUGFyYW1ldGVyRGlhbG9nID1cblx0XHRcdGFjdGlvblBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRhY3Rpb25QYXJhbWV0ZXJzXG5cdFx0XHRcdC5maWx0ZXIoKGFjdGlvblBhcmFtZXRlcikgPT4gYWN0aW9uUGFyYW1ldGVyLm5hbWUgIT09IFwiUmVzdWx0SXNBY3RpdmVFbnRpdHlcIilcblx0XHRcdFx0LmV2ZXJ5KChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5hbm5vdGF0aW9ucy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IGJTa2lwUGFyYW1ldGVyRGlhbG9nO1xuXHRcdC8vIEluIGNhc2UgYW4gYWN0aW9uIHBhcmFtZXRlciBpcyBuZWVkZWQsIGFuZCB3ZSBzaGFsbCBza2lwIHRoZSBkaWFsb2csIGNoZWNrIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBwYXJhbWV0ZXJzXG5cdFx0aWYgKGJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZyAmJiBiU2tpcFBhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0YlZhbHVlc1Byb3ZpZGVkRm9yQWxsTWFuZGF0b3J5UGFyYW1ldGVycyA9IF92YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMoXG5cdFx0XHRcdCEhYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRhUGFyYW1ldGVyVmFsdWVzLFxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Ly8gRGVwZW5kaW5nIG9uIHRoZSBwcmV2aW91c2x5IGRldGVybWluZWQgZGF0YSwgZWl0aGVyIHNldCBhIGRpYWxvZyBvciBsZWF2ZSBpdCBlbXB0eSB3aGljaFxuXHRcdC8vIHdpbGwgbGVhZCB0byBkaXJlY3QgZXhlY3V0aW9uIG9mIHRoZSBhY3Rpb24gd2l0aG91dCBhIGRpYWxvZ1xuXG5cdFx0Y29uc3QgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzID0ge1xuXHRcdFx0ZGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXM6IHt9LFxuXHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50LFxuXHRcdFx0Zm5PblN1Ym1pdHRlZDogbVBhcmFtZXRlcnMub25TdWJtaXR0ZWQsXG5cdFx0XHRmbk9uUmVzcG9uc2U6IG1QYXJhbWV0ZXJzLm9uUmVzcG9uc2UsXG5cdFx0XHRhY3Rpb25OYW1lOiBzQWN0aW9uTmFtZSxcblx0XHRcdGFDb250ZXh0czogW10sXG5cdFx0XHRtb2RlbDogb01vZGVsLFxuXHRcdFx0YUFjdGlvblBhcmFtZXRlcnM6IGFjdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbixcblx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdHNlbGVjdGVkSXRlbXM6IG1QYXJhbWV0ZXJzLnNlbGVjdGVkSXRlbXMhXG5cdFx0fTtcblx0XHRpZiAoY29udmVydGVkQWN0aW9uLmlzQm91bmQpIHtcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFEYXRhID0gY29udmVydFR5cGVzKG9NZXRhTW9kZWwpO1xuXHRcdFx0Y29uc3QgZmlsdGVyZWRFbnRpdHlTZXQgPSBjb252ZXJ0ZWRNZXRhRGF0YS5lbnRpdHlTZXRzLmZpbHRlcihcblx0XHRcdFx0KHNpbmdsZUVudGl0eVNldCkgPT4gc2luZ2xlRW50aXR5U2V0LmVudGl0eVR5cGUgPT09IGNvbnZlcnRlZEFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGZpbHRlcmVkRW50aXR5U2V0Lmxlbmd0aCA+IDAgPyBmaWx0ZXJlZEVudGl0eVNldFswXSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0aXNTYW1lRW50aXR5ID1cblx0XHRcdFx0IWNvbnZlcnRlZEFjdGlvbi5yZXR1cm5Db2xsZWN0aW9uICYmXG5cdFx0XHRcdGNvbnZlcnRlZEFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlICYmXG5cdFx0XHRcdGNvbnZlcnRlZEFjdGlvbi5zb3VyY2VFbnRpdHlUeXBlID09PSBjb252ZXJ0ZWRBY3Rpb24ucmV0dXJuRW50aXR5VHlwZTtcblxuXHRcdFx0aWYgKGlzU2FtZUVudGl0eSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjdXJyZW50RW50aXR5U2V0KSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgPz89IHt9O1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdCA9IG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0XG5cdFx0XHRcdFx0PyBgJHttUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdH0sSGFzQWN0aXZlRW50aXR5YFxuXHRcdFx0XHRcdDogXCJIYXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0Py5wYXRoRXhwcmVzc2lvbnMpIHtcblx0XHRcdFx0c01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvTWV0YU1vZGVsLCBhQ29udGV4dHMhWzBdLmdldFBhdGgoKSkhO1xuXG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0Ly8gJyonIGVmZmVjdGl2ZWx5IGluY2x1ZGVzIHRoZSBtZXNzYWdlcyBwYXRoIGlmIHRoZXJlIGlzIG9uZVxuXHRcdFx0XHRcdGlNZXNzYWdlU2lkZUVmZmVjdCA9IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5maW5kSW5kZXgoXG5cdFx0XHRcdFx0XHQoZXhwKSA9PiB0eXBlb2YgZXhwID09PSBcInN0cmluZ1wiICYmIChleHAgPT09IHNNZXNzYWdlc1BhdGggfHwgZXhwID09PSBcIipcIilcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIFNBUF9NZXNzYWdlcyBieSBkZWZhdWx0IGlmIG5vdCBhbm5vdGF0ZWQgYnkgc2lkZSBlZmZlY3RzLCBhY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgY29sbGVjdGlvbiBhbmRcblx0XHRcdFx0XHQvLyB0aGUgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJvdW5kIHR5cGVcblx0XHRcdFx0XHRpZiAoaU1lc3NhZ2VTaWRlRWZmZWN0ID4gLTEgfHwgaXNTYW1lRW50aXR5KSB7XG5cdFx0XHRcdFx0XHQvLyB0aGUgbWVzc2FnZSBwYXRoIGlzIGFubm90YXRlZCBhcyBzaWRlIGVmZmVjdC4gQXMgdGhlcmUncyBubyBiaW5kaW5nIGZvciBpdCBhbmQgdGhlIG1vZGVsIGRvZXMgY3VycmVudGx5IG5vdCBhbGxvd1xuXHRcdFx0XHRcdFx0Ly8gdG8gYWRkIGl0IGF0IGEgbGF0ZXIgcG9pbnQgb2YgdGltZSB3ZSBoYXZlIHRvIHRha2UgY2FyZSBpdCdzIHBhcnQgb2YgdGhlICRzZWxlY3Qgb2YgdGhlIFBPU1QsIHRoZXJlZm9yZSBtb3ZpbmcgaXQuXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgPz89IHt9O1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvbi5yZXR1cm5FbnRpdHlUeXBlPy5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBzTWVzc2FnZXNQYXRoKSAmJlxuXHRcdFx0XHRcdFx0XHQhKG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID8/IFwiXCIpLnNwbGl0KFwiLFwiKS5pbmNsdWRlcyhzTWVzc2FnZXNQYXRoKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChpc1NhbWVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSByZXF1ZXN0IG1lc3NhZ2VzIGZyb20gdGhlIHJldHVybiBjb250ZXh0IGFzIGl0IG1pZ2h0IG5vdCBleGlzdCBhcyBhIHBhcnQgb2YgdGhlIGJvdW5kIGFjdGlvbidzIHNvdXJjZSBjb250ZXh0J3MgJHNlbGVjdC5cblx0XHRcdFx0XHRcdFx0XHQvLyBFeGFtcGxlOiBDcmVhdGUgb24gYSBMaXN0LiBNZXNzYWdlcyBwYXRoIG1pZ2h0IG5vdCBiZSBwYXJ0IG9mIHRoZSBsaXN0LlxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVycy4kc2VsZWN0ID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3Rcblx0XHRcdFx0XHRcdFx0XHRcdD8gYCR7bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3R9LCR7c01lc3NhZ2VzUGF0aH1gXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2UgbmVlZCB0aGUgcmV0dXJuIGNvbnRleHQgdG8gYmUgZmV0Y2hlZCB3aXRoIGFsbCB0aGUgZXhpc3RpbmcgcHJvcGVydGllcyBvZiB0aGUgYm91bmQgYWN0aW9uJ3Mgc291cmNlIGNvbnRleHQuXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiQkaW5oZXJpdEV4cGFuZFNlbGVjdCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCA9PT0gMCAmJiBpTWVzc2FnZVNpZGVFZmZlY3QgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIG5vIHRyaWdnZXIgYWN0aW9uIHRoZXJlZm9yZSBubyBuZWVkIHRvIHJlcXVlc3QgbWVzc2FnZXMgYWdhaW5cblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuc3BsaWNlKGlNZXNzYWdlU2lkZUVmZmVjdCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzID0gYUNvbnRleHRzID8/IFtdO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJHcm91cGVkID0gbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nID09PSBJbnZvY2F0aW9uR3JvdXBpbmcuQ2hhbmdlU2V0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uID0gYklzQ3JlYXRlQWN0aW9uO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZTtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZyA9IG1QYXJhbWV0ZXJzLmRpc2FibGVTdHJpY3RIYW5kbGluZztcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmdyb3VwSWQgPSBtUGFyYW1ldGVycy5ncm91cElkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbC5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udHJvbCA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2w7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5jb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ID0gbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3Q7XG5cdFx0aWYgKGJJc0NyZWF0ZUFjdGlvbikge1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uID0gYklzQ3JlYXRlQWN0aW9uO1xuXHRcdH1cblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5pc1N0YXRpYyA9IGNvbnZlcnRlZEFjdGlvbi5pc0JvdW5kICYmICEhY29udmVydGVkQWN0aW9uLnBhcmFtZXRlcnNbMF0/LmlzQ29sbGVjdGlvbjtcblxuXHRcdGxldCBvcGVyYXRpb25SZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSA9IFtdO1xuXHRcdGxldCBleGVjdXRpb25XaXREaWFsb2cgPSBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGJBY3Rpb25OZWVkc1BhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0XHRpZiAoIShiU2tpcFBhcmFtZXRlckRpYWxvZyAmJiBiVmFsdWVzUHJvdmlkZWRGb3JBbGxNYW5kYXRvcnlQYXJhbWV0ZXJzKSkge1xuXHRcdFx0XHRcdGV4ZWN1dGlvbldpdERpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0Y29uc3QgcGFyYW1ldGVyRGlhbG9nID0gZ2V0Q29yZVVJRmFjdG9yeSgpLm5ld1BhcmFtZXRlckRpYWxvZyhcblx0XHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvbixcblx0XHRcdFx0XHRcdG9BY3Rpb24gYXMgT0RhdGFWNENvbnRleHQsXG5cdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMudmlldyBhcyBGRVZpZXcgfCBudWxsLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YmVmb3JlU2hvd2luZ01lc3NhZ2U6IGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2tcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRhd2FpdCBwYXJhbWV0ZXJEaWFsb2cuY3JlYXRlRGlhbG9nKCk7XG5cdFx0XHRcdFx0b3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgcGFyYW1ldGVyRGlhbG9nLm9wZW5EaWFsb2cobVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYklzQ3JpdGljYWxBY3Rpb24pIHtcblx0XHRcdFx0ZXhlY3V0aW9uV2l0RGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0b3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgY29uZmlybUNyaXRpY2FsQWN0aW9uKFxuXHRcdFx0XHRcdGNvbnZlcnRlZEFjdGlvbixcblx0XHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMubWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJlamVjdChlKTtcblx0XHR9XG5cdFx0aWYgKGV4ZWN1dGlvbldpdERpYWxvZykge1xuXHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRyZXNvbHZlKG9wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gVGFrZSBvdmVyIGFsbCBwcm92aWRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFuZCBjYWxsIHRoZSBhY3Rpb24uXG5cdFx0Ly8gVGhpcyBzaGFsbCBvbmx5IGhhcHBlbiBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMsIG90aGVyd2lzZSB0aGUgcGFyYW1ldGVyIGRpYWxvZyBzaGFsbCBiZSBzaG93biB3aGljaCBpcyBlbnN1cmVkIGVhcmxpZXJcblxuXHRcdGlmIChhUGFyYW1ldGVyVmFsdWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXNbbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnNbaV0ubmFtZV0gPVxuXHRcdFx0XHRcdGFQYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQubmFtZSA9PT0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnNbaV0ubmFtZSk/LnZhbHVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgYWN0aW9uUGFyYW1ldGVyLCBwYXJhbWV0ZXJWYWx1ZU5vdENvbnZlcnRlZDtcblx0XHRcdGZvciAoY29uc3QgaSBpbiBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXIgPSBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5hQWN0aW9uUGFyYW1ldGVyc1tpXTtcblx0XHRcdFx0cGFyYW1ldGVyVmFsdWVOb3RDb252ZXJ0ZWQgPVxuXHRcdFx0XHRcdChvU3RhcnR1cFBhcmFtZXRlcnNbYWN0aW9uUGFyYW1ldGVyLm5hbWVdPy5bMF0gYXMgQmFzZVR5cGVQYXJhbWV0ZXIpIHx8XG5cdFx0XHRcdFx0YWN0aW9uUGFyYW1ldGVyLmFubm90YXRpb25zPy5VST8uUGFyYW1ldGVyRGVmYXVsdFZhbHVlPy52YWx1ZU9mKCk7XG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmRlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzW2FjdGlvblBhcmFtZXRlci5uYW1lXSA9XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVOb3RDb252ZXJ0ZWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0PyBwYXJhbWV0ZXJWYWx1ZU5vdENvbnZlcnRlZFxuXHRcdFx0XHRcdFx0OiBhd2FpdCBjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZShhY3Rpb25QYXJhbWV0ZXIsIHBhcmFtZXRlclZhbHVlTm90Q29udmVydGVkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGV0IG9PcGVyYXRpb25SZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSA9IFtdO1xuXHRcdHRyeSB7XG5cdFx0XHRvT3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgbmV3IE9EYXRhT3BlcmF0aW9uKFxuXHRcdFx0XHRjb252ZXJ0ZWRBY3Rpb24sXG5cdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMsXG5cdFx0XHRcdHsgaWdub3JlRVRhZzogbVBhcmFtZXRlcnMuaWdub3JlRVRhZyB9XG5cdFx0XHQpLmV4ZWN1dGUoKTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJlxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5pczQxMkV4ZWN1dGVkICYmXG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLnN0cmljdEhhbmRsaW5nVHJhbnNpdGlvbkZhaWxzLmxlbmd0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLmRlbGF5U3VjY2Vzc01lc3NhZ2VzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuZGVsYXlTdWNjZXNzTWVzc2FnZXMuY29uY2F0KG1lc3NhZ2VzKTtcblx0XHRcdH1cblx0XHRcdGFmdGVyQWN0aW9uUmVzb2x1dGlvbihtUGFyYW1ldGVycywgbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsIGFjdGlvbkRlZmluaXRpb24pO1xuXHRcdFx0cmVzb2x2ZShvT3BlcmF0aW9uUmVzdWx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZWplY3QoZSk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChcblx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMgJiZcblx0XHRcdFx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuaXM0MTJFeGVjdXRlZCAmJlxuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscy5sZW5ndGggJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzIS5sZW5ndGggPiAxXG5cdFx0XHQpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBzdHJpY3RIYW5kbGluZ0ZhaWxzID0gc3RyaWN0SGFuZGxpbmdVdGlsaXRpZXMuc3RyaWN0SGFuZGxpbmdUcmFuc2l0aW9uRmFpbHM7XG5cdFx0XHRcdFx0Y29uc3QgYUZhaWxlZENvbnRleHRzID0gW10gYXMgT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ0ZhaWxzLmZvckVhY2goZnVuY3Rpb24gKGZhaWw6IHsgb0FjdGlvbjogT0RhdGFDb250ZXh0QmluZGluZzsgZ3JvdXBJZDogc3RyaW5nIH0pOiB2b2lkIHtcblx0XHRcdFx0XHRcdGFGYWlsZWRDb250ZXh0cy5wdXNoKGZhaWwub0FjdGlvbi5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmFDb250ZXh0cyA9IGFGYWlsZWRDb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBvRmFpbGVkT3BlcmF0aW9uUmVzdWx0ID0gYXdhaXQgbmV3IE9EYXRhT3BlcmF0aW9uKFxuXHRcdFx0XHRcdFx0Y29udmVydGVkQWN0aW9uLFxuXHRcdFx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRcdFx0XHRcdFx0eyBpZ25vcmVFVGFnOiBtUGFyYW1ldGVycy5pZ25vcmVFVGFnIH1cblx0XHRcdFx0XHQpLmV4ZWN1dGUoKTtcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlscyA9IFtdO1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5kZWxheVN1Y2Nlc3NNZXNzYWdlcyk7XG5cdFx0XHRcdFx0YWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKG1QYXJhbWV0ZXJzLCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycywgYWN0aW9uRGVmaW5pdGlvbik7XG5cdFx0XHRcdFx0cmVzb2x2ZShvRmFpbGVkT3BlcmF0aW9uUmVzdWx0KTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdHJlamVjdChlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bGV0IHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gZmFsc2U7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChtUGFyYW1ldGVycy5iR3JvdXBlZCAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyAmJiBzdHJpY3RIYW5kbGluZ1V0aWxpdGllcy5zdHJpY3RIYW5kbGluZ1Byb21pc2VzLmxlbmd0aCkgfHxcblx0XHRcdFx0KG1QYXJhbWV0ZXJzLmJHcm91cGVkICYmIG1lc3NhZ2VIYW5kbGluZy5oYXNUcmFuc2l0aW9uRXJyb3JzT3JXYXJuaW5ncygpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNob3dHZW5lcmljRXJyb3JNZXNzYWdlRm9yQ2hhbmdlU2V0ID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG1QYXJhbWV0ZXJzPy5tZXNzYWdlSGFuZGxlclxuXHRcdFx0XHQ/LnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRjb250cm9sOiBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycz8uY29udHJvbCxcblx0XHRcdFx0XHRvbkJlZm9yZVNob3dNZXNzYWdlOiBmdW5jdGlvbiAoYU1lc3NhZ2VzOiBNZXNzYWdlW10sIHNob3dNZXNzYWdlUGFyYW1ldGVyc0luOiBTaG93TWVzc2FnZVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdHJldHVybiBhY3Rpb25QYXJhbWV0ZXJTaG93TWVzc2FnZUNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0YUNvbnRleHRzISxcblx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRhTWVzc2FnZXMsXG5cdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLFxuXHRcdFx0XHRcdFx0XHRzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCxcblx0XHRcdFx0XHRcdFx0b09wZXJhdGlvblJlc3VsdC5sZW5ndGggPiAwICYmIG9PcGVyYXRpb25SZXN1bHQuZXZlcnkoKHJlcykgPT4gcmVzLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIilcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0czogbVBhcmFtZXRlcnMuYUNvbnRleHRzLFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lOiBzQWN0aW9uTGFiZWwsXG5cdFx0XHRcdFx0ZW50aXR5U2V0OiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdGJvdW5kQWN0aW9uTmFtZTogc0FjdGlvbk5hbWVcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLm1lc3NhZ2VIYW5kbGVyLmNsZWFyU3RyaWN0V2FybmluZ01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9KTtcblx0XHRcdGlmIChzdHJpY3RIYW5kbGluZ1V0aWxpdGllcykge1xuXHRcdFx0XHRzdHJpY3RIYW5kbGluZ1V0aWxpdGllcyA9IHtcblx0XHRcdFx0XHRpczQxMkV4ZWN1dGVkOiBmYWxzZSxcblx0XHRcdFx0XHRzdHJpY3RIYW5kbGluZ1RyYW5zaXRpb25GYWlsczogW10sXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdQcm9taXNlczogW10sXG5cdFx0XHRcdFx0c3RyaWN0SGFuZGxpbmdXYXJuaW5nTWVzc2FnZXM6IFtdLFxuXHRcdFx0XHRcdGRlbGF5U3VjY2Vzc01lc3NhZ2VzOiBbXSxcblx0XHRcdFx0XHRwcm9jZXNzZWRNZXNzYWdlSWRzOiBuZXcgU2V0KClcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgdGl0bGUgZnJvbSBjdXN0b20gaTE4biBmaWxlLlxuICogQHBhcmFtIG9QYXJlbnRDb250cm9sIFRoZSB2aWV3IHdoZXJlIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG4gKiBAcGFyYW0gc3VmZml4UmVzb3VyY2VLZXkgVGhlIGtleSBvZiB0aGUgdGl0bGVcbiAqIEByZXR1cm5zIFRpdGxlIGlmIGRlZmluZWRcbiAqL1xuZnVuY3Rpb24gZ2V0Q29uZmlybVRpdGxlKG9QYXJlbnRDb250cm9sOiBWaWV3LCBzdWZmaXhSZXNvdXJjZUtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gQSB0aXRsZSBvbmx5IGV4aXN0cyBpZiBpdCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBleHRlbnNpb24uIE90aGVyd2lzZSBcIkNvbmZpcm1hdGlvblwiXG5cdC8vIGlzIHVzZWQgZnJvbSB0aGUgTWVzc2FnZUJveCBjb250cm9sLlxuXHRjb25zdCBrZXkgPSBcIkNfT1BFUkFUSU9OU19BQ1RJT05fQ09ORklSTV9USVRMRVwiO1xuXHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvUGFyZW50Q29udHJvbCk7XG5cdGNvbnN0IHRpdGxlT3ZlcnJpZGVFeGlzdHMgPSByZXNvdXJjZU1vZGVsLmNoZWNrSWZSZXNvdXJjZUtleUV4aXN0cyhgJHtrZXl9fCR7c3VmZml4UmVzb3VyY2VLZXl9YCk7XG5cdGlmICh0aXRsZU92ZXJyaWRlRXhpc3RzKSB7XG5cdFx0cmV0dXJuIHJlc291cmNlTW9kZWwuZ2V0VGV4dChrZXksIHVuZGVmaW5lZCwgc3VmZml4UmVzb3VyY2VLZXkpO1xuXHR9XG59XG5hc3luYyBmdW5jdGlvbiBjb25maXJtQ3JpdGljYWxBY3Rpb24oXG5cdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uLFxuXHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRtUGFyYW1ldGVyczogU2hvd0FjdGlvbkRpYWxvZ1BhcmFtZXRlcnMsXG5cdG9QYXJlbnRDb250cm9sOiBWaWV3LFxuXHRlbnRpdHlTZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0c3RyaWN0SGFuZGxpbmdVdGlsaXRpZXM6IFN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRsZXQgYm91bmRBY3Rpb25OYW1lID0gc0FjdGlvbk5hbWU7XG5cdFx0Ym91bmRBY3Rpb25OYW1lID0gYm91bmRBY3Rpb25OYW1lLmluY2x1ZGVzKFwiLlwiKVxuXHRcdFx0PyBib3VuZEFjdGlvbk5hbWUuc3BsaXQoXCIuXCIpW2JvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIikubGVuZ3RoIC0gMV1cblx0XHRcdDogYm91bmRBY3Rpb25OYW1lO1xuXHRcdGNvbnN0IHN1ZmZpeFJlc291cmNlS2V5ID0gYm91bmRBY3Rpb25OYW1lICYmIGVudGl0eVNldE5hbWUgPyBgJHtlbnRpdHlTZXROYW1lfXwke2JvdW5kQWN0aW9uTmFtZX1gIDogXCJcIjtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChvUGFyZW50Q29udHJvbCk7XG5cdFx0Y29uc3Qgc0NvbmZpcm1hdGlvblRleHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX09QRVJBVElPTlNfQUNUSU9OX0NPTkZJUk1fTUVTU0FHRVwiLCB1bmRlZmluZWQsIHN1ZmZpeFJlc291cmNlS2V5KTtcblxuXHRcdE1lc3NhZ2VCb3guY29uZmlybShzQ29uZmlybWF0aW9uVGV4dCwge1xuXHRcdFx0dGl0bGU6IGdldENvbmZpcm1UaXRsZShvUGFyZW50Q29udHJvbCwgc3VmZml4UmVzb3VyY2VLZXkpLFxuXHRcdFx0b25DbG9zZTogYXN5bmMgZnVuY3Rpb24gKHNBY3Rpb246IHN0cmluZykge1xuXHRcdFx0XHRpZiAoc0FjdGlvbiA9PT0gQWN0aW9uLk9LKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9PcGVyYXRpb24gPSBhd2FpdCBuZXcgT0RhdGFPcGVyYXRpb24oY29udmVydGVkQWN0aW9uLCBtUGFyYW1ldGVycywgbWVzc2FnZUhhbmRsZXIsIHN0cmljdEhhbmRsaW5nVXRpbGl0aWVzLCB7XG5cdFx0XHRcdFx0XHRcdGlnbm9yZUVUYWdcblx0XHRcdFx0XHRcdH0pLmV4ZWN1dGUoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUob09wZXJhdGlvbik7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlamVjdChDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uKFxuXHRtUGFyYW1ldGVyczogQ2FsbEFjdGlvblBhcmFtZXRlcnMsXG5cdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzOiBTaG93QWN0aW9uRGlhbG9nUGFyYW1ldGVycyxcblx0YWN0aW9uRGVmaW5pdGlvbjogTWV0YU1vZGVsQWN0aW9uXG4pOiB2b2lkIHtcblx0aWYgKFxuXHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzICYmXG5cdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzLmxlbmd0aCAmJlxuXHRcdGFjdGlvbkRlZmluaXRpb24uJElzQm91bmRcblx0KSB7XG5cdFx0bGV0IHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBbXTtcblx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdGNvbnN0IGlzU3RhdGljID0gbUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaXNTdGF0aWM7XG5cdFx0aWYgKCFpc1N0YXRpYykge1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSB8fCBbXTtcblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdEpTT04ucGFyc2UobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XCJ0YWJsZVwiXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuY29udHJvbCkge1xuXHRcdFx0Y29uc3QgY29udHJvbCA9IG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmNvbnRyb2w7XG5cdFx0XHRpZiAoY29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRzZWxlY3RlZENvbnRleHRzID0gY29udHJvbC5nZXRTZWxlY3RlZENvbnRleHRzKCkgYXMgT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdEpTT04ucGFyc2UobUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvL3VwZGF0ZSBkZWxldGUgYnV0dG9uXG5cdFx0RGVsZXRlSGVscGVyLnVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzKG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LCBzZWxlY3RlZENvbnRleHRzKTtcblx0fVxufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgb2YgbWVzc2FnZXMgYmFzZWQgb24gdmFyaW91cyBjb25kaXRpb25zIGFuZCByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWx0ZXJlZCBtZXNzYWdlcyBhbmQgb3RoZXIgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gZmlsdGVyLlxuICogQHBhcmFtIGVycm9yVGFyZ2V0c0luQVBEIEluZGljYXRlcyB3aGV0aGVyIGVycm9yIHRhcmdldHMgYXJlIGluIEFQRC5cbiAqIEBwYXJhbSBjb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cy5cbiAqIEBwYXJhbSB1bmJvdW5kTWVzc2FnZXMgQW4gYXJyYXkgb2YgdW5ib3VuZCBtZXNzYWdlcy5cbiAqIEBwYXJhbSBjb250cm9sIEEgY29udHJvbCBvYmplY3QuXG4gKiBAcGFyYW0gaXNBUERPUGVuIEluZGljYXRlcyB3aGV0aGVyIEFQRCBpcyBvcGVuLlxuICogQHBhcmFtIHNob3dNZXNzYWdlRGlhbG9nIEluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgdGhlIG1lc3NhZ2UgZGlhbG9nLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVzdWx0IGNvbnRhaW5zIGEgYm91bmQgdHJhbnNpdGlvbiwgYW4gYXJyYXkgb2YgbWVzc2FnZXMgdG8gc2hvdywgYW5kIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc2hvdyB0aGUgbWVzc2FnZSBpbiBhIGRpYWxvZy5cbiAqL1xuZnVuY3Rpb24gZmlsdGVyQVBEYW5kQ29udGV4dE1lc3NhZ2VzKFxuXHRtZXNzYWdlczogTWVzc2FnZVtdLFxuXHRlcnJvclRhcmdldHNJbkFQRD86IGJvb2xlYW4sXG5cdGNvbnRleHRzPzogQ29udGV4dFtdLFxuXHR1bmJvdW5kTWVzc2FnZXM/OiBNZXNzYWdlW10sXG5cdGNvbnRyb2w/OiBDb250cm9sLFxuXHRpc0FQRE9QZW4/OiBib29sZWFuLFxuXHRzaG93TWVzc2FnZURpYWxvZz86IGJvb2xlYW5cbik6IHsgY29udGFpbnNCb3VuZFRyYW5zaXN0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkOyBtZXNzYWdlc1RvU2hvdzogTWVzc2FnZVtdOyBzaG93TWVzc2FnZUluRGlhbG9nPzogYm9vbGVhbiB9IHtcblx0aWYgKGlzQVBET1BlbiAmJiBlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdC8qIFdoZW4gQVBEIGlzIG9wZW4sIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBtZXNzYWdlcyB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgb2JqZWN0cGFnZSBjb250ZXh0ICovXG5cdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUNvbnRleHRNZXNzYWdlc2Zyb21Nb2RlbChtZXNzYWdlcywgY29udGV4dHMpO1xuXHR9XG5cblx0Ly8gRmlsdGVyIG91dCBtZXNzYWdlcyB3aGljaCBhcmUgbm90IHJlbGF0ZWQgdG8gdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIGluIHRoZSBlZGl0IG1vZGUgYW5kIGRpc3BsYXkgbW9kZVxuXHRsZXQgY29udGFpbnNCb3VuZFRyYW5zaXN0aW9uO1xuXHRpZiAoIShjb250cm9sICYmIENvbW1vblV0aWxzLmdldElzRWRpdGFibGUoY29udHJvbCkpKSB7XG5cdFx0aWYgKGlzQVBET1BlbiAmJiBlcnJvclRhcmdldHNJbkFQRCkge1xuXHRcdFx0aWYgKHVuYm91bmRNZXNzYWdlcz8ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiA9IGZhbHNlO1xuXHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0bWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcucmVtb3ZlTWVzc2FnZXNGb3JBY3Rpb25QYXJhbWV0ZXJEaWFsb2cobWVzc2FnZXMpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAodW5ib3VuZE1lc3NhZ2VzPy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiA9IGZhbHNlO1xuXHRcdH1cblx0XHRtZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVNZXNzYWdlc0ZvckFjdGlvblBhcmFtZXRlckRpYWxvZyhtZXNzYWdlcyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRtZXNzYWdlc1RvU2hvdzogbWVzc2FnZXMsXG5cdFx0Y29udGFpbnNCb3VuZFRyYW5zaXN0aW9uOiBjb250YWluc0JvdW5kVHJhbnNpc3Rpb24sXG5cdFx0c2hvd01lc3NhZ2VJbkRpYWxvZzogc2hvd01lc3NhZ2VEaWFsb2dcblx0fTtcbn1cblxuZnVuY3Rpb24gYWN0aW9uUGFyYW1ldGVyU2hvd01lc3NhZ2VDYWxsYmFjayhcblx0bVBhcmFtZXRlcnM6IFNob3dBY3Rpb25EaWFsb2dQYXJhbWV0ZXJzLFxuXHRhQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10sXG5cdG9EaWFsb2c6IERpYWxvZyB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZXM6IE1lc3NhZ2VbXSxcblx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW46IFNob3dNZXNzYWdlUGFyYW1ldGVycyxcblx0c2hvd0dlbmVyaWNFcnJvck1lc3NhZ2VGb3JDaGFuZ2VTZXQ6IGJvb2xlYW4sXG5cdGlzQWN0aW9uU3VjY2Vzc2Z1bD86IGJvb2xlYW4sXG5cdGlzNDEyV2FybmluZ0RpYWxvZ0NhbmNlbGxlZD86IGJvb2xlYW5cbik6IFNob3dNZXNzYWdlUGFyYW1ldGVycyB7XG5cdGxldCBzaG93TWVzc2FnZUJveCA9IHNob3dNZXNzYWdlUGFyYW1ldGVyc0luLnNob3dNZXNzYWdlQm94LFxuXHRcdHNob3dNZXNzYWdlRGlhbG9nID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzSW4uc2hvd01lc3NhZ2VEaWFsb2c7XG5cdGNvbnN0IG9Db250cm9sID0gbVBhcmFtZXRlcnMuY29udHJvbDtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0Y29uc3QgdW5ib3VuZE1lc3NhZ2VzID0gbWVzc2FnZXMuZmlsdGVyKGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0gPT09IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBBUERtZXNzYWdlcyA9IG1lc3NhZ2VzLmZpbHRlcihmdW5jdGlvbiAobWVzc2FnZSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRtZXNzYWdlLmdldFRhcmdldHMgJiZcblx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0uaW5jbHVkZXMobVBhcmFtZXRlcnMuYWN0aW9uTmFtZSkgJiZcblx0XHRcdG1QYXJhbWV0ZXJzPy5hQWN0aW9uUGFyYW1ldGVycz8uc29tZShmdW5jdGlvbiAoYWN0aW9uUGFyYW0pIHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpPy5bMF0uaW5jbHVkZXMoYWN0aW9uUGFyYW0ubmFtZSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0pO1xuXHRBUERtZXNzYWdlcz8uZm9yRWFjaChmdW5jdGlvbiAoQVBETWVzc2FnZSkge1xuXHRcdChBUERNZXNzYWdlIGFzIHVua25vd24gYXMgeyBpc0FQRFRhcmdldDogYm9vbGVhbiB9KS5pc0FQRFRhcmdldCA9IHRydWU7XG5cdH0pO1xuXG5cdGNvbnN0IGVycm9yVGFyZ2V0c0luQVBEID0gQVBEbWVzc2FnZXMubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlO1xuXHQvL0lmIEFjdGlvbiBpcyBzdWNjZXNzZnVsIHdpdGggd2FybmluZ3MsIGRvbnQgc2hvdyB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlIGZvciBjaGFuZ2VzZXQgaW4gZGlhbG9nXG5cdGlmIChzaG93R2VuZXJpY0Vycm9yTWVzc2FnZUZvckNoYW5nZVNldCAmJiAhZXJyb3JUYXJnZXRzSW5BUEQgJiYgIWlzQWN0aW9uU3VjY2Vzc2Z1bCkge1xuXHRcdGNvbnN0IG1lc3NhZ2VNb2RlbCA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlc0luTW9kZWwgPSBtZXNzYWdlTW9kZWwuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IGFCb3VuZE1lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUpO1xuXHRcdGxldCBnZW5lcmljTWVzc2FnZTtcblx0XHRjb25zdCBpc0VkaXRhYmxlID0gKG9Db250cm9sICYmIENvbW1vblV0aWxzLmdldElzRWRpdGFibGUob0NvbnRyb2wpKSA/PyBmYWxzZTtcblxuXHRcdGNvbnN0IG5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nID0gbWVzc2FnZXMuZmluZEluZGV4KGZ1bmN0aW9uIChtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIiB8fCBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJXYXJuaW5nXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgbm9uRXJyb3JNZXNzYWdlRXhpc3RzSW5Nb2RlbCA9IG1lc3NhZ2VzSW5Nb2RlbC5maW5kSW5kZXgoZnVuY3Rpb24gKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gXCJFcnJvclwiIHx8IG1lc3NhZ2UuZ2V0VHlwZSgpID09PSBcIldhcm5pbmdcIjtcblx0XHR9KTtcblxuXHRcdGlmIChcblx0XHRcdG5vbkVycm9yTWVzc2FnZUV4aXN0c0luRGlhbG9nICE9PSAxICYmXG5cdFx0XHRub25FcnJvck1lc3NhZ2VFeGlzdHNJbk1vZGVsICE9PSAtMSAmJlxuXHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzICYmXG5cdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHMubGVuZ3RoID4gMVxuXHRcdCkge1xuXHRcdFx0aWYgKG1lc3NhZ2VzSW5Nb2RlbC5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Z2VuZXJpY01lc3NhZ2UgPSBnZXRHZW5lcmljTXNnRm9yU2luZ2xlRXJyb3JJbkNoYW5nZVNldChpc0VkaXRhYmxlLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRtZXNzYWdlcy51bnNoaWZ0KGdlbmVyaWNNZXNzYWdlKTtcblx0XHRcdFx0c2hvd01lc3NhZ2VCb3ggPSB0cnVlO1xuXHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc01lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfRVJST1JfTUVTU0FHRVNfVEVYVFwiKTtcblx0XHRcdFx0Y29uc3Qgc0Rlc2NyaXB0aW9uVGV4dCA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTF9FUlJPUl9NRVNTQUdFU19ERVRBSUxfVEVYVFwiKTtcblx0XHRcdFx0Z2VuZXJpY01lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0bWVzc2FnZTogc01lc3NhZ2UsXG5cdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNEZXNjcmlwdGlvblRleHQsXG5cdFx0XHRcdFx0Y29kZTogXCJGRV9DVVNUT01fTUVTU0FHRV9DSEFOR0VTRVRfQUxMX0ZBSUxFRFwiXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtZXNzYWdlcy51bnNoaWZ0KGdlbmVyaWNNZXNzYWdlKTtcblx0XHRcdFx0aWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlQm94ID0gdHJ1ZTtcblx0XHRcdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdFx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0bGV0IGJJc0FQRE9wZW4gPSBvRGlhbG9nICYmIG9EaWFsb2cuaXNPcGVuKCk7XG5cdC8vIE5PVEU6IHdlIGRvbid0IHVzZSBpc09wZW4gYWdhaW4gYWZ0ZXIgd2UgY2xvc2UgdGhlIGRpYWxvZyBhcyBpc09wZW4oc3luYyBBUEkpIGRvZXNuJ3QgcmV0dXJuIGZhbHNlIHVudGlsIHRoZSBkaWFsb2cgYW5pbWF0aW9ucyBhbmQgZGlhbG9nIGV2ZW50cyBlbmQuXG5cdGlmIChvRGlhbG9nICYmIGJJc0FQRE9wZW4gJiYgYUNvbnRleHRzLmxlbmd0aCAhPT0gMCAmJiAhbVBhcmFtZXRlcnMuaXNTdGF0aWMpIHtcblx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJHcm91cGVkKSB7XG5cdFx0XHQvL2lzb2xhdGVkXG5cdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDEgfHwgIWVycm9yVGFyZ2V0c0luQVBEKSB7XG5cdFx0XHRcdC8vIGRvZXMgbm90IG1hdHRlciBpZiBlcnJvciBpcyBpbiBBUEQgb3Igbm90LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29udGV4dHMgc2VsZWN0ZWQgb3IgaWYgdGhlIGVycm9yIGlzIG5vdCB0aGUgQVBELCB3ZSBjbG9zZSBpdC5cblx0XHRcdFx0Ly8gVE9ETzogRGlsYW9nIGhhbmRsaW5nIHNob3VsZCBub3QgYmUgcGFydCBvZiBtZXNzYWdlIGhhbmRsaW5nLiBSZWZhY3RvciBhY2NvcmRpbmdseSAtIGRpYWxvZyBzaG91bGQgbm90IGJlIG5lZWRlZCBpbnNpZGUgdGhpcyBtZXRob2QgLSBuZWl0aGVyXG5cdFx0XHRcdC8vIHRvIGFzayB3aGV0aGVyIGl0J3Mgb3Blbiwgbm9yIHRvIGNsb3NlL2Rlc3Ryb3kgaXQhXG5cdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0YklzQVBET3BlbiA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIWVycm9yVGFyZ2V0c0luQVBEICYmICFpczQxMldhcm5pbmdEaWFsb2dDYW5jZWxsZWQpIHtcblx0XHRcdC8vY2hhbmdlc2V0XG5cdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRiSXNBUERPcGVuID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGZpbHRlcmVkTWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuXG5cdGNvbnN0IHsgbWVzc2FnZXNUb1Nob3csIGNvbnRhaW5zQm91bmRUcmFuc2lzdGlvbiwgc2hvd01lc3NhZ2VJbkRpYWxvZyB9ID0gZmlsdGVyQVBEYW5kQ29udGV4dE1lc3NhZ2VzKFxuXHRcdG1lc3NhZ2VzLFxuXHRcdGVycm9yVGFyZ2V0c0luQVBELFxuXHRcdGFDb250ZXh0cyxcblx0XHR1bmJvdW5kTWVzc2FnZXMsXG5cdFx0b0NvbnRyb2wsXG5cdFx0YklzQVBET3BlblxuXHQpO1xuXHRtZXNzYWdlcyA9IG1lc3NhZ2VzVG9TaG93O1xuXHRzaG93TWVzc2FnZURpYWxvZyA9IHNob3dNZXNzYWdlSW5EaWFsb2cgPz8gc2hvd01lc3NhZ2VEaWFsb2c7XG5cblx0aWYgKCFiSXNBUERPcGVuICYmIGVycm9yVGFyZ2V0c0luQVBEICYmICFtUGFyYW1ldGVycy5iR3JvdXBlZCkge1xuXHRcdC8vIElmIEFQRCBpcyBub3Qgb3BlbiBhbmQgdGhlcmUgYXJlIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gQVBELCB0aGVuIHNob3cgaW4gdGhlIG1lc3NhZ2UgZGlhbG9nLiBzaW5jZVxuXHRcdHNob3dNZXNzYWdlRGlhbG9nID0gdHJ1ZTtcblx0XHRtZXNzYWdlcyA9IG1lc3NhZ2VzLmNvbmNhdChBUERtZXNzYWdlcyk7XG5cdH1cblxuXHRsZXQgZm5HZXRNZXNzYWdlU3VidGl0bGU7XG5cdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdGZuR2V0TWVzc2FnZVN1YnRpdGxlID0gbWVzc2FnZUhhbmRsaW5nLnNldE1lc3NhZ2VTdWJ0aXRsZS5iaW5kKHt9LCBvQ29udHJvbCwgYUNvbnRleHRzKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNob3dNZXNzYWdlQm94OiBzaG93TWVzc2FnZUJveCxcblx0XHRzaG93TWVzc2FnZURpYWxvZzogc2hvd01lc3NhZ2VEaWFsb2csXG5cdFx0ZmlsdGVyZWRNZXNzYWdlczogZmlsdGVyZWRNZXNzYWdlcy5sZW5ndGggPyBmaWx0ZXJlZE1lc3NhZ2VzIDogbWVzc2FnZXMsXG5cdFx0Zm5HZXRNZXNzYWdlU3VidGl0bGU6IGZuR2V0TWVzc2FnZVN1YnRpdGxlLFxuXHRcdHNob3dDaGFuZ2VTZXRFcnJvckRpYWxvZzogbVBhcmFtZXRlcnMuYkdyb3VwZWQsXG5cdFx0Y29udGFpbnNCb3VuZFRyYW5zaXN0aW9uOiBjb250YWluc0JvdW5kVHJhbnNpc3Rpb25cblx0fTtcbn1cblxuZnVuY3Rpb24gX3ZhbHVlc1Byb3ZpZGVkRm9yQWxsTWFuZGF0b3J5UGFyYW1ldGVycyhcblx0aXNDcmVhdGVBY3Rpb246IGJvb2xlYW4sXG5cdGFjdGlvblBhcmFtZXRlcnM6IEVkbUFjdGlvblBhcmFtZXRlcltdLFxuXHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuXHRzdGFydHVwUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBib29sZWFuIHtcblx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvblNldE9uQWxsQWN0aW9ucyA9IGFjdGlvblBhcmFtZXRlcnMuZXZlcnkoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyPy5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlKTtcblxuXHRpZiAocGFyYW1ldGVyVmFsdWVzPy5sZW5ndGggJiYgIWhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMpIHtcblx0XHQvLyBJZiBzaG93RGlhbG9nIGlzIGZhbHNlIGJ1dCB0aGVyZSBhcmUgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnZva2VBY3Rpb24gY2FsbCB3aGljaCBuZWVkIHRvIGJlIGNoZWNrZWQgb24gZXhpc3RhbmNlXG5cdFx0Zm9yIChjb25zdCBhY3Rpb25QYXJhbWV0ZXIgb2YgYWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRhY3Rpb25QYXJhbWV0ZXIubmFtZSAhPT0gXCJSZXN1bHRJc0FjdGl2ZUVudGl0eVwiICYmXG5cdFx0XHRcdCFwYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQubmFtZSA9PT0gYWN0aW9uUGFyYW1ldGVyLm5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gQXQgbGVhc3QgZm9yIG9uZSBwYXJhbWV0ZXIgbm8gdmFsdWUgaGFzIGJlZW4gcHJvdmlkZWQsIHNvIHdlIGNhbid0IHNraXAgdGhlIGRpYWxvZ1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGlzQ3JlYXRlQWN0aW9uICYmIHN0YXJ0dXBQYXJhbWV0ZXJzPy5sZW5ndGggJiYgIWhpZGRlbkFubm90YXRpb25TZXRPbkFsbEFjdGlvbnMpIHtcblx0XHQvLyBJZiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBwcm92aWRlZCBkdXJpbmcgYXBwbGljYXRpb24gbGF1bmNoLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzZXQgaXMgY29tcGxldGVcblx0XHQvLyBJZiBub3QsIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIHN0aWxsIG5lZWRzIHRvIGJlIHNob3duLlxuXHRcdGZvciAoY29uc3QgYWN0aW9uUGFyYW1ldGVyIG9mIGFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdGlmIChzdGFydHVwUGFyYW1ldGVycyAmJiAhc3RhcnR1cFBhcmFtZXRlcnNbYWN0aW9uUGFyYW1ldGVyLm5hbWVdKSB7XG5cdFx0XHRcdC8vIEF0IGxlYXN0IGZvciBvbmUgcGFyYW1ldGVyIG5vIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkLCBzbyB3ZSBjYW4ndCBza2lwIHRoZSBkaWFsb2dcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChhY3Rpb25QYXJhbWV0ZXJzLmxlbmd0aCAmJiBoaWRkZW5Bbm5vdGF0aW9uU2V0T25BbGxBY3Rpb25zKSB7XG5cdFx0cmV0dXJuIGFjdGlvblBhcmFtZXRlcnMuZXZlcnkoZnVuY3Rpb24gKHBhcmFtZXRlcikge1xuXHRcdFx0Y29uc3QgZmllbGRDb250cm9sID0gcGFyYW1ldGVyLmFubm90YXRpb25zPy5Db21tb24/LkZpZWxkQ29udHJvbDtcblx0XHRcdGNvbnN0IGlzTWFuZGF0b3J5ID0gZmllbGRDb250cm9sPy50b1N0cmluZygpID09PSBcIkNvbW1vbi5GaWVsZENvbnRyb2xUeXBlL01hbmRhdG9yeVwiO1xuXG5cdFx0XHQvLyBQb3NzaWJsZSBzb3VyY2VzIG1heSBiZSBzdGFydHVwUGFyYW1ldGVycywgcGFyYW1ldGVyVmFsdWVzLCBkZWZhdWx0VmFsdWVzIHBlciBhbm5vdGF0aW9uIChQYXJhbWV0ZXJEZWZhdWx0VmFsdWUpXG5cdFx0XHQvLyBJZiBub25lIGlzIGZvdW5kLCByZXR1cm4gZmFsc2Vcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdCFpc01hbmRhdG9yeSB8fFxuXHRcdFx0XHQoc3RhcnR1cFBhcmFtZXRlcnMgJiYgc3RhcnR1cFBhcmFtZXRlcnNbcGFyYW1ldGVyLm5hbWVdKSB8fFxuXHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/LmZpbmQoKHBhcmFtZXRlclZhbHVlKSA9PiBwYXJhbWV0ZXJWYWx1ZS5uYW1lID09PSBwYXJhbWV0ZXIubmFtZSkgfHxcblx0XHRcdFx0cGFyYW1ldGVyPy5hbm5vdGF0aW9ucz8uVUk/LlBhcmFtZXRlckRlZmF1bHRWYWx1ZT8udmFsdWVPZigpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyaWNNc2dGb3JTaW5nbGVFcnJvckluQ2hhbmdlU2V0KGlzRWRpdGFibGU6IGJvb2xlYW4sIHJlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSk6IE1lc3NhZ2VXaXRoSGVhZGVyIHtcblx0Y29uc3QgbWVzc2FnZSA9IGlzRWRpdGFibGVcblx0XHQ/IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfQ0FOQ0VMX1NJTkdMRV9FUlJPUl9NRVNTQUdFX1RFWFRfRURJVFwiKVxuXHRcdDogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxfU0lOR0xFX0VSUk9SX01FU1NBR0VfVEVYVFwiKTtcblx0cmV0dXJuIG5ldyBNZXNzYWdlKHtcblx0XHRtZXNzYWdlLFxuXHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yLFxuXHRcdHRhcmdldDogXCJcIixcblx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdGNvZGU6IFwiRkVfQ1VTVE9NX01FU1NBR0VfQ0hBTkdFU0VUX0FMTF9GQUlMRURcIixcblx0XHR0ZWNobmljYWxEZXRhaWxzOiB7XG5cdFx0XHRmZToge1xuXHRcdFx0XHRjaGFuZ2VTZXRQcmVUZXh0Rm9yU2luZ2xlRXJyb3I6IG1lc3NhZ2Vcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxCb3VuZEFjdGlvbjogY2FsbEJvdW5kQWN0aW9uLFxuXHRjYWxsQWN0aW9uSW1wb3J0OiBjYWxsQWN0aW9uSW1wb3J0LFxuXHRjYWxsQm91bmRGdW5jdGlvbjogY2FsbEJvdW5kRnVuY3Rpb24sXG5cdGNhbGxGdW5jdGlvbkltcG9ydDogY2FsbEZ1bmN0aW9uSW1wb3J0LFxuXHR2YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnM6IF92YWx1ZXNQcm92aWRlZEZvckFsbE1hbmRhdG9yeVBhcmFtZXRlcnMsXG5cdGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2s6IGFjdGlvblBhcmFtZXRlclNob3dNZXNzYWdlQ2FsbGJhY2ssXG5cdGFmdGVyQWN0aW9uUmVzb2x1dGlvbjogYWZ0ZXJBY3Rpb25SZXNvbHV0aW9uLFxuXHRjaGVja1BhcmFtZXRlclR5cGVBbmRSZXR1cm5Db252ZXJ0ZWRWYWx1ZTogY2hlY2tQYXJhbWV0ZXJUeXBlQW5kUmV0dXJuQ29udmVydGVkVmFsdWUsXG5cdGdldENvbmZpcm1UaXRsZTogZ2V0Q29uZmlybVRpdGxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcGVyYXRpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwQ0EsTUFBTUEsU0FBUyxHQUFHQyxTQUFTLENBQUNELFNBQVM7SUFDcENFLGtCQUFrQixHQUFHRCxTQUFTLENBQUNDLGtCQUFrQjtFQUNsRCxNQUFNQyxNQUFNLEdBQUdDLFVBQVUsQ0FBQ0QsTUFBTTtFQWdFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlRSxlQUFlQSxDQUM3QkMsV0FBbUIsRUFDbkJDLFFBQTBCLEVBQzFCQyxNQUFr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
81
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxsQWN0aW9uSW1wb3J0IiwiYWN0aW9uTmFtZSIsIm1vZGVsIiwiYXBwQ29tcG9uZW50IiwicGFyYW1ldGVycyIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImFjdGlvblBhdGgiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImNvbnZlcnRlZEFjdGlvbkltcG9ydCIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiY29udmVydGVkQWN0aW9uIiwiYWN0aW9uIiwiRXJyb3IiLCJPcGVyYXRpb24iLCJleGVjdXRlIiwiY2FsbEJvdW5kRnVuY3Rpb24iLCJzRnVuY3Rpb25OYW1lIiwiY29udGV4dCIsIm9Nb2RlbCIsIlByb21pc2UiLCJyZWplY3QiLCJvTWV0YU1vZGVsIiwic0Z1bmN0aW9uUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsIm9Cb3VuZEZ1bmN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJfZXhlY3V0ZUZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0IiwiYmluZENvbnRleHQiLCJvRnVuY3Rpb25JbXBvcnQiLCJnZXRPYmplY3QiLCJvRnVuY3Rpb24iLCJmdW5jdGlvblRvQ2FsbCIsImdyb3VwSWQiLCJleGVjdXRpb25Qcm9taXNlIiwiaW52b2tlIiwic3VibWl0QmF0Y2giLCJnZXRCb3VuZENvbnRleHQiLCJvcGVyYXRpb25zIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJmYWNhZGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb25JbXBvcnQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uLy4uLy4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uLy4uL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL09EYXRhT3BlcmF0aW9uXCI7XG5pbXBvcnQgT3BlcmF0aW9uLCB7IHR5cGUgT3BlcmF0aW9uUGFyYW1ldGVyc1R5cGUgfSBmcm9tIFwiLi9PcGVyYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgQ2FsbEFjdGlvblBhcmFtZXRlcnMgPSB7XG5cdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W107XG5cdGxhYmVsPzogc3RyaW5nO1xuXHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0b0RhdGFFdmVudHM/OiB7XG5cdFx0b25PRGF0YVJlc3BvbnNlPzogRnVuY3Rpb247XG5cdFx0b25PRGF0YVN1Ym1pdD86IEZ1bmN0aW9uO1xuXHRcdG9uUmVxdWVzdFNpZGVFZmZlY3RzPzogRnVuY3Rpb247XG5cdH07XG5cdG9wZXJhdGlvbkV2ZW50cz86IHtcblx0XHRvblJlc3BvbnNlPzogRnVuY3Rpb247XG5cdH07XG5cdGNvbnRyb2w/OiBDb250cm9sO1xuXHRpc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjtcblx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0dmlldzogRkVWaWV3O1xufSAmIHtcblx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xufSAmIHtcblx0YUNvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdGdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIENhbGxzIGFuIGFjdGlvbiBpbXBvcnQuXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIGltcG9ydCB0byBiZSBjYWxsZWRcbiAqIEBwYXJhbSBtb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gW3BhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzXSBBIG1hcCBvZiBhY3Rpb24gcGFyYW1ldGVyIG5hbWVzIGFuZCBwcm92aWRlZCB2YWx1ZXNcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIFtwYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ddIElmIHNldCBhbmQgaWYgcGFyYW1ldGVycyBleGlzdCB0aGUgdXNlciByZXRyaWV2ZXMgYSBkaWFsb2cgdG8gZmlsbCBpbiBwYXJhbWV0ZXJzLCBpZiBhY3Rpb25QYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdGhleSBhcmUgc2hvd24gdG8gdGhlIHVzZXJcbiAqIEBwYXJhbSBbcGFyYW1ldGVycy5vblN1Ym1pdHRlZF0gRnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIG9uY2UgdGhlIGFjdGlvbnMgYXJlIHN1Ym1pdHRlZCB3aXRoIGFuIGFycmF5IG9mIHByb21pc2VzXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcGFyYW0gW3BhcmFtZXRlcnMuaWdub3JlRVRhZ10gSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IEVUYWcgaGFuZGxpbmdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhbGxBY3Rpb25JbXBvcnQoXG5cdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0bW9kZWw6IE9EYXRhTW9kZWwsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRwYXJhbWV0ZXJzOiBPcGVyYXRpb25QYXJhbWV0ZXJzVHlwZVxuKTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+IHtcblx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdGNvbnN0IGFjdGlvblBhdGggPSBgLyR7YWN0aW9uTmFtZX1gO1xuXHRjb25zdCBjb252ZXJ0ZWRUeXBlcyA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRjb25zdCBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQgPSBjb252ZXJ0ZWRUeXBlcy5yZXNvbHZlUGF0aDxBY3Rpb25JbXBvcnQgfCB1bmRlZmluZWQ+KGFjdGlvblBhdGgpLnRhcmdldCxcblx0XHRjb252ZXJ0ZWRBY3Rpb24gPSBjb252ZXJ0ZWRBY3Rpb25JbXBvcnQ/LmFjdGlvbjtcblx0aWYgKCFjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGFjdGlvbiBpbXBvcnRcIik7XG5cdH1cblx0cmV0dXJuIG5ldyBPcGVyYXRpb24oYXBwQ29tcG9uZW50LCBtb2RlbCwgY29udmVydGVkQWN0aW9uSW1wb3J0LmFjdGlvbiwgcGFyYW1ldGVycykuZXhlY3V0ZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjYWxsQm91bmRGdW5jdGlvbihzRnVuY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdGlmICghY29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGZ1bmN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYSBjb250ZXh0XCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YCxcblx0XHRvQm91bmRGdW5jdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0JvdW5kRnVuY3Rpb24gYXMgT0RhdGFWNENvbnRleHQsIGNvbnRleHQpO1xufVxuXG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gaW1wb3J0LlxuICogQHBhcmFtIHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIG9Nb2RlbCBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSB2NCBtb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBjYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpOiBQcm9taXNlPHZvaWQgfCBPRGF0YVY0Q29udGV4dD4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNGdW5jdGlvblBhdGggPSBvTW9kZWwuYmluZENvbnRleHQoYC8ke3NGdW5jdGlvbk5hbWV9YCkuZ2V0UGF0aCgpLFxuXHRcdG9GdW5jdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke29NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkhLmdldE9iamVjdChcIiRGdW5jdGlvblwiKX0vMGApO1xuXHRyZXR1cm4gX2V4ZWN1dGVGdW5jdGlvbihzRnVuY3Rpb25OYW1lLCBvTW9kZWwsIG9GdW5jdGlvbkltcG9ydCBhcyBPRGF0YVY0Q29udGV4dCk7XG59XG5hc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUZ1bmN0aW9uKFxuXHRzRnVuY3Rpb25OYW1lOiBzdHJpbmcsXG5cdG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0b0Z1bmN0aW9uOiBPRGF0YVY0Q29udGV4dCB8IG51bGwsXG5cdGNvbnRleHQ/OiBPRGF0YVY0Q29udGV4dFxuKTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRpZiAoIW9GdW5jdGlvbj8uZ2V0T2JqZWN0KCkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGdW5jdGlvbiAke3NGdW5jdGlvbk5hbWV9IG5vdCBmb3VuZGApKTtcblx0fVxuXHRjb25zdCBmdW5jdGlvblRvQ2FsbDogT0RhdGFDb250ZXh0QmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtjb250ZXh0Py5nZXRQYXRoKCkgPz8gXCJcIn0vJHtzRnVuY3Rpb25OYW1lfSguLi4pYCk7XG5cdGNvbnN0IGdyb3VwSWQgPSBjb250ZXh0ID8gXCJmdW5jdGlvbkdyb3VwXCIgOiBcImZ1bmN0aW9uSW1wb3J0XCI7XG5cdGNvbnN0IGV4ZWN1dGlvblByb21pc2UgPSBmdW5jdGlvblRvQ2FsbC5pbnZva2UoZ3JvdXBJZCk7XG5cdG9Nb2RlbC5zdWJtaXRCYXRjaChncm91cElkKTtcblx0YXdhaXQgZXhlY3V0aW9uUHJvbWlzZTtcblx0cmV0dXJuIGZ1bmN0aW9uVG9DYWxsLmdldEJvdW5kQ29udGV4dCgpO1xufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cdGNhbGxBY3Rpb25JbXBvcnQ6IGNhbGxBY3Rpb25JbXBvcnQsXG5cdGNhbGxCb3VuZEZ1bmN0aW9uOiBjYWxsQm91bmRGdW5jdGlvbixcblx0Y2FsbEZ1bmN0aW9uSW1wb3J0OiBjYWxsRnVuY3Rpb25JbXBvcnRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wZXJhdGlvbnM7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