@sapui5/sap.fe.core 1.108.2 → 1.110.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 (359) hide show
  1. package/README.md +5 -1
  2. package/package.json +11 -9
  3. package/src/.eslintrc +7 -0
  4. package/src/sap/fe/core/.library +39 -37
  5. package/src/sap/fe/core/.supportrc +3 -3
  6. package/src/sap/fe/core/ActionRuntime.js +72 -27
  7. package/src/sap/fe/core/ActionRuntime.ts +104 -21
  8. package/src/sap/fe/core/AppComponent.js +102 -120
  9. package/src/sap/fe/core/AppComponent.ts +148 -45
  10. package/src/sap/fe/core/AppStateHandler.js +105 -91
  11. package/src/sap/fe/core/AppStateHandler.ts +85 -23
  12. package/src/sap/fe/core/BaseController.js +5 -20
  13. package/src/sap/fe/core/BaseController.ts +11 -2
  14. package/src/sap/fe/core/CommonUtils.js +770 -1079
  15. package/src/sap/fe/core/CommonUtils.ts +750 -491
  16. package/src/sap/fe/core/ExtensionAPI.js +69 -96
  17. package/src/sap/fe/core/ExtensionAPI.ts +15 -17
  18. package/src/sap/fe/core/PageController.js +21 -46
  19. package/src/sap/fe/core/PageController.ts +11 -2
  20. package/src/sap/fe/core/TemplateComponent.js +6 -51
  21. package/src/sap/fe/core/TemplateComponent.ts +27 -16
  22. package/src/sap/fe/core/TemplateModel.js +18 -24
  23. package/src/sap/fe/core/TemplateModel.ts +25 -6
  24. package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
  25. package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
  26. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
  27. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
  28. package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
  29. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
  30. package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
  31. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
  32. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
  33. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
  34. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
  35. package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
  36. package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
  37. package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
  38. package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
  39. package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
  40. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
  41. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
  42. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
  43. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
  44. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
  45. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
  46. package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
  47. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
  48. package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
  49. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
  50. package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
  51. package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
  52. package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
  53. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
  54. package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
  55. package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
  56. package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
  57. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
  58. package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
  59. package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
  60. package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
  61. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  62. package/src/sap/fe/core/controllerextensions/Share.js +53 -98
  63. package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
  64. package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
  65. package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
  66. package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
  67. package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
  68. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
  69. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
  70. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
  71. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
  72. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
  73. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
  74. package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
  75. package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
  76. package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
  77. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
  78. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
  79. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
  80. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
  81. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
  82. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
  83. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
  84. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
  85. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
  86. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
  87. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
  88. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
  89. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
  90. package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
  91. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
  92. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
  93. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
  94. package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
  95. package/src/sap/fe/core/controls/Any.js +1 -1
  96. package/src/sap/fe/core/controls/AnyElement.js +1 -1
  97. package/src/sap/fe/core/controls/CommandExecution.js +4 -26
  98. package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
  99. package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
  100. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
  101. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
  102. package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
  103. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
  104. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
  105. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
  106. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
  107. package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
  108. package/src/sap/fe/core/controls/FileWrapper.js +51 -136
  109. package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
  110. package/src/sap/fe/core/controls/FilterBar.js +19 -54
  111. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
  112. package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
  113. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
  114. package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
  115. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
  116. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
  117. package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
  118. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
  119. package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
  120. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
  121. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
  122. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
  123. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
  124. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
  125. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
  126. package/src/sap/fe/core/converters/ConverterContext.js +44 -98
  127. package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
  128. package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
  129. package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
  130. package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
  131. package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
  132. package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
  133. package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
  134. package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
  135. package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
  136. package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
  137. package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
  138. package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
  139. package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
  140. package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
  141. package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
  142. package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
  143. package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
  144. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
  145. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
  146. package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
  147. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
  148. package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
  149. package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
  150. package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
  151. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
  152. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
  153. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
  154. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
  155. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
  156. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
  157. package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
  158. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
  159. package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
  160. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
  161. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
  162. package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
  163. package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
  164. package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
  165. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
  166. package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
  167. package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
  168. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
  169. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
  170. package/src/sap/fe/core/converters/helpers/ID.js +3 -17
  171. package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
  172. package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
  173. package/src/sap/fe/core/converters/helpers/Key.js +10 -19
  174. package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
  175. package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
  176. package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
  177. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
  178. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
  179. package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
  180. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
  181. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
  182. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
  183. package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
  184. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
  185. package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
  186. package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
  187. package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
  188. package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
  189. package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
  190. package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
  191. package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
  192. package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
  193. package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
  194. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
  195. package/src/sap/fe/core/fpm/Component.js +2 -17
  196. package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
  197. package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
  198. package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
  199. package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
  200. package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
  201. package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
  202. package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
  203. package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
  204. package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
  205. package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
  206. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
  207. package/src/sap/fe/core/helpers/EditState.js +2 -5
  208. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
  209. package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
  210. package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
  211. package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
  212. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
  213. package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
  214. package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
  215. package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
  216. package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
  217. package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
  218. package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
  219. package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
  220. package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
  221. package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
  222. package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
  223. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
  224. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
  225. package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
  226. package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
  227. package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
  228. package/src/sap/fe/core/helpers/Synchronization.js +1 -8
  229. package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
  230. package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
  231. package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
  232. package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
  233. package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
  234. package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
  235. package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
  236. package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
  237. package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
  238. package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
  239. package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
  240. package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
  241. package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
  242. package/src/sap/fe/core/library.js +9 -48
  243. package/src/sap/fe/core/library.support.js +3 -2
  244. package/src/sap/fe/core/library.support.ts +3 -1
  245. package/src/sap/fe/core/library.ts +3 -8
  246. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
  247. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
  248. package/src/sap/fe/core/messagebundle.properties +113 -67
  249. package/src/sap/fe/core/messagebundle_ar.properties +20 -3
  250. package/src/sap/fe/core/messagebundle_bg.properties +22 -5
  251. package/src/sap/fe/core/messagebundle_ca.properties +21 -4
  252. package/src/sap/fe/core/messagebundle_cs.properties +21 -4
  253. package/src/sap/fe/core/messagebundle_cy.properties +22 -5
  254. package/src/sap/fe/core/messagebundle_da.properties +20 -3
  255. package/src/sap/fe/core/messagebundle_de.properties +38 -21
  256. package/src/sap/fe/core/messagebundle_el.properties +20 -3
  257. package/src/sap/fe/core/messagebundle_en.properties +38 -21
  258. package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
  259. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
  260. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
  261. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
  262. package/src/sap/fe/core/messagebundle_es.properties +40 -23
  263. package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
  264. package/src/sap/fe/core/messagebundle_et.properties +20 -3
  265. package/src/sap/fe/core/messagebundle_fi.properties +20 -3
  266. package/src/sap/fe/core/messagebundle_fr.properties +21 -4
  267. package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
  268. package/src/sap/fe/core/messagebundle_hi.properties +20 -3
  269. package/src/sap/fe/core/messagebundle_hr.properties +22 -5
  270. package/src/sap/fe/core/messagebundle_hu.properties +20 -3
  271. package/src/sap/fe/core/messagebundle_id.properties +20 -3
  272. package/src/sap/fe/core/messagebundle_it.properties +23 -6
  273. package/src/sap/fe/core/messagebundle_iw.properties +20 -3
  274. package/src/sap/fe/core/messagebundle_ja.properties +22 -5
  275. package/src/sap/fe/core/messagebundle_kk.properties +21 -4
  276. package/src/sap/fe/core/messagebundle_ko.properties +20 -3
  277. package/src/sap/fe/core/messagebundle_lt.properties +20 -3
  278. package/src/sap/fe/core/messagebundle_lv.properties +20 -3
  279. package/src/sap/fe/core/messagebundle_ms.properties +20 -3
  280. package/src/sap/fe/core/messagebundle_nl.properties +20 -3
  281. package/src/sap/fe/core/messagebundle_no.properties +20 -3
  282. package/src/sap/fe/core/messagebundle_pl.properties +21 -4
  283. package/src/sap/fe/core/messagebundle_pt.properties +20 -3
  284. package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
  285. package/src/sap/fe/core/messagebundle_ro.properties +20 -3
  286. package/src/sap/fe/core/messagebundle_ru.properties +20 -3
  287. package/src/sap/fe/core/messagebundle_sh.properties +20 -3
  288. package/src/sap/fe/core/messagebundle_sk.properties +20 -3
  289. package/src/sap/fe/core/messagebundle_sl.properties +26 -9
  290. package/src/sap/fe/core/messagebundle_sv.properties +20 -3
  291. package/src/sap/fe/core/messagebundle_th.properties +21 -4
  292. package/src/sap/fe/core/messagebundle_tr.properties +20 -3
  293. package/src/sap/fe/core/messagebundle_uk.properties +23 -6
  294. package/src/sap/fe/core/messagebundle_vi.properties +20 -3
  295. package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
  296. package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
  297. package/src/sap/fe/core/operationsHelper.js +74 -101
  298. package/src/sap/fe/core/operationsHelper.ts +113 -44
  299. package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
  300. package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
  301. package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
  302. package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
  303. package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
  304. package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
  305. package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
  306. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
  307. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
  308. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
  309. package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
  310. package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
  311. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
  312. package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
  313. package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
  314. package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
  315. package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
  316. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
  317. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
  318. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
  319. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
  320. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
  321. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
  322. package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
  323. package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
  324. package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
  325. package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
  326. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
  327. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
  328. package/src/sap/fe/core/support/CommonHelper.js +7 -16
  329. package/src/sap/fe/core/support/Diagnostics.js +1 -10
  330. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
  331. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
  332. package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
  333. package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
  334. package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
  335. package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
  336. package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
  337. package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
  338. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
  339. package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
  340. package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
  341. package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
  342. package/src/sap/fe/core/templating/FilterHelper.js +40 -111
  343. package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
  344. package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
  345. package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
  346. package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
  347. package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
  348. package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
  349. package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
  350. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
  351. package/src/sap/fe/core/templating/UIFormatters.js +40 -180
  352. package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
  353. package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
  354. package/src/sap/fe/core/type/Email.js +1 -10
  355. package/src/sap/fe/core/type/TypeUtil.js +1 -11
  356. package/ui5.yaml +0 -1
  357. package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
  358. package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
  359. package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
@@ -2,102 +2,85 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/ObjectPath", "sap/fe/core/buildingBlocks/BuildingBlockRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/StableIdHelper", "sap/ui/base/ManagedObject", "sap/ui/core/Component", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "../converters/ConverterContext"], function (deepClone, merge, ObjectPath, BuildingBlockRuntime, CommonUtils, BindingToolkit, StableIdHelper, ManagedObject, Component, Fragment, XMLPreprocessor, ConverterContext) {
5
+ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/ObjectPath", "sap/fe/core/buildingBlocks/BuildingBlockFragment", "sap/fe/core/buildingBlocks/BuildingBlockRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/helpers/TypeGuards", "sap/ui/base/ManagedObject", "sap/ui/core/Component", "sap/ui/core/util/XMLPreprocessor", "../converters/ConverterContext"], function (deepClone, merge, ObjectPath, BuildingBlockFragment, BuildingBlockRuntime, CommonUtils, BindingToolkit, StableIdHelper, TypeGuards, ManagedObject, Component, XMLPreprocessor, ConverterContext) {
6
6
  "use strict";
7
7
 
8
- var _templateObject, _templateObject2, _templateObject3;
9
-
8
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8;
10
9
  var _exports = {};
10
+ var isContext = TypeGuards.isContext;
11
11
  var generate = StableIdHelper.generate;
12
12
  var resolveBindingString = BindingToolkit.resolveBindingString;
13
+ var isUndefinedExpression = BindingToolkit.isUndefinedExpression;
13
14
  var xml = BuildingBlockRuntime.xml;
14
15
  var registerBuildingBlock = BuildingBlockRuntime.registerBuildingBlock;
15
- var escapeXMLAttributeValue = BuildingBlockRuntime.escapeXMLAttributeValue;
16
-
17
16
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
18
-
19
17
  /**
20
18
  * Base class for Building Block
21
19
  */
22
20
  var BuildingBlockBase = /*#__PURE__*/function () {
23
21
  function BuildingBlockBase(oProps, _oControlConfig, _oSettings) {
24
22
  var _this = this;
25
-
26
23
  this.isPublic = false;
27
-
28
- this.getConverterContext = function (oVisualizationObjectPath, contextPath, mSettings, mExtraParams) {
24
+ this.getConverterContext = function (dataModelObjectPath, contextPath, mSettings, mExtraParams) {
29
25
  var oAppComponent = mSettings.appComponent;
30
26
  var originalViewData = mSettings.models.viewData && mSettings.models.viewData.getData();
31
27
  var viewData = Object.assign({}, originalViewData);
32
28
  delete viewData.resourceBundle;
33
29
  viewData = deepClone(viewData);
34
- viewData.controlConfiguration = merge(viewData.controlConfiguration, mExtraParams);
35
- return ConverterContext.createConverterContextForMacro(oVisualizationObjectPath.startingEntitySet.name, mSettings.models.metaModel, oAppComponent && oAppComponent.getDiagnostics(), merge, oVisualizationObjectPath.contextLocation, viewData);
30
+ viewData.controlConfiguration = merge(viewData.controlConfiguration, mExtraParams || {});
31
+ return ConverterContext.createConverterContextForMacro(dataModelObjectPath.startingEntitySet.name, mSettings.models.metaModel, oAppComponent && oAppComponent.getDiagnostics(), merge, dataModelObjectPath.contextLocation, viewData);
36
32
  };
37
-
38
33
  Object.keys(oProps).forEach(function (propName) {
39
34
  // This needs to be casted as any since we are assigning the properties to the instance without knowing their type
40
35
  _this[propName] = oProps[propName];
41
36
  });
42
37
  }
38
+ _exports.BuildingBlockBase = BuildingBlockBase;
39
+ var _proto = BuildingBlockBase.prototype;
43
40
  /**
44
41
  * Convert the given local element ID to a globally unique ID by prefixing with the Building Block ID.
45
42
  *
46
43
  * @param stringParts
47
44
  * @returns Either the global ID or undefined if the Building Block doesn't have an ID
48
45
  */
49
-
50
-
51
- _exports.BuildingBlockBase = BuildingBlockBase;
52
- var _proto = BuildingBlockBase.prototype;
53
-
54
46
  _proto.createId = function createId() {
55
47
  // If the child instance has an ID property use it otherwise return undefined
56
48
  if (this.id) {
57
49
  for (var _len = arguments.length, stringParts = new Array(_len), _key = 0; _key < _len; _key++) {
58
50
  stringParts[_key] = arguments[_key];
59
51
  }
60
-
61
52
  return generate([this.id].concat(stringParts));
62
53
  }
63
-
64
54
  return undefined;
65
- } // This block is commented out because I am not using them for now / need to change this but still want to keep them around
55
+ }
56
+ // This block is commented out because I am not using them for now / need to change this but still want to keep them around
66
57
  ;
67
-
68
58
  _proto.getProperties = function getProperties() {
69
59
  var allProperties = {};
70
-
71
60
  for (var oInstanceKey in this) {
72
61
  if (this.hasOwnProperty(oInstanceKey)) {
73
62
  allProperties[oInstanceKey] = this[oInstanceKey];
74
63
  }
75
64
  }
76
-
77
65
  return allProperties;
78
66
  };
79
-
80
- BuildingBlockBase.register = function register() {// To be overriden
67
+ BuildingBlockBase.register = function register() {
68
+ // To be overriden
81
69
  };
82
-
83
- BuildingBlockBase.unregister = function unregister() {// To be overriden
70
+ BuildingBlockBase.unregister = function unregister() {
71
+ // To be overriden
84
72
  };
85
-
86
- _proto.addConditionally = function addConditionally() {
87
- var condition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
88
- var partToAdd = arguments.length > 1 ? arguments[1] : undefined;
89
-
73
+ _proto.addConditionally = function addConditionally(condition, partToAdd) {
90
74
  if (condition) {
91
75
  return partToAdd;
92
76
  } else {
93
77
  return "";
94
78
  }
95
79
  };
96
-
97
80
  _proto.attr = function attr(attributeName, value) {
98
- if (value !== undefined) {
81
+ if (value !== undefined && !isUndefinedExpression(value)) {
99
82
  return function () {
100
- return "".concat(attributeName, "=\"").concat(escapeXMLAttributeValue(value), "\"");
83
+ return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["", "=\"", "\""])), attributeName, value);
101
84
  };
102
85
  } else {
103
86
  return function () {
@@ -105,27 +88,25 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
105
88
  };
106
89
  }
107
90
  };
108
-
109
91
  return BuildingBlockBase;
110
92
  }();
111
93
  /**
112
94
  * Base class for runtime building blocks
113
95
  */
114
-
115
-
116
96
  _exports.BuildingBlockBase = BuildingBlockBase;
117
-
118
97
  var ensureMetadata = function (target) {
119
98
  if (!target.hasOwnProperty("metadata")) {
120
99
  target.metadata = deepClone(target.metadata || {
121
100
  properties: {},
122
101
  aggregations: {},
123
- events: {}
102
+ events: {},
103
+ stereotype: "xmlmacro",
104
+ designtime: ""
124
105
  });
125
106
  }
126
-
127
107
  return target.metadata;
128
108
  };
109
+
129
110
  /**
130
111
  * Indicates that the property shall be declared as an xml attribute that can be used from the outside of the building block.
131
112
  *
@@ -136,54 +117,39 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
136
117
  * @param attributeDefinition
137
118
  * @returns The decorated property
138
119
  */
139
-
140
-
141
120
  function xmlAttribute(attributeDefinition) {
142
121
  return function (target, propertyKey, propertyDescriptor) {
143
122
  var metadata = ensureMetadata(target.constructor);
144
-
145
123
  if (attributeDefinition.defaultValue === undefined) {
146
124
  var _propertyDescriptor$i;
147
-
148
125
  // If there is no defaultValue we can take the value from the initializer (natural way of defining defaults)
149
126
  attributeDefinition.defaultValue = (_propertyDescriptor$i = propertyDescriptor.initializer) === null || _propertyDescriptor$i === void 0 ? void 0 : _propertyDescriptor$i.call(propertyDescriptor);
150
127
  }
151
-
152
128
  delete propertyDescriptor.initializer;
153
-
154
129
  if (metadata.properties[propertyKey.toString()] === undefined) {
155
130
  metadata.properties[propertyKey.toString()] = attributeDefinition;
156
131
  }
157
-
158
132
  return propertyDescriptor;
159
133
  }; // Needed to make TS happy with those decorators;
160
134
  }
161
-
162
135
  _exports.xmlAttribute = xmlAttribute;
163
-
164
136
  function blockAttribute(attributeDefinition) {
165
137
  return xmlAttribute(attributeDefinition);
166
138
  }
167
-
168
139
  _exports.blockAttribute = blockAttribute;
169
-
170
140
  function xmlEvent() {
171
141
  return function (target, propertyKey, propertyDescriptor) {
172
142
  var metadata = ensureMetadata(target.constructor);
173
143
  delete propertyDescriptor.initializer;
174
-
175
144
  if (metadata.events[propertyKey.toString()] === undefined) {
176
145
  metadata.events[propertyKey.toString()] = {
177
146
  type: "Function"
178
147
  };
179
148
  }
180
-
181
149
  return propertyDescriptor;
182
150
  }; // Needed to make TS happy with those decorators;
183
151
  }
184
-
185
152
  _exports.xmlEvent = xmlEvent;
186
-
187
153
  function blockEvent() {
188
154
  return xmlEvent();
189
155
  }
@@ -193,35 +159,27 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
193
159
  * @param aggregationDefinition
194
160
  * @returns The decorated property
195
161
  */
196
-
197
-
198
162
  _exports.blockEvent = blockEvent;
199
-
200
163
  function xmlAggregation(aggregationDefinition) {
201
164
  return function (target, propertyKey, propertyDescriptor) {
202
165
  var metadata = ensureMetadata(target.constructor);
203
166
  delete propertyDescriptor.initializer;
204
-
205
167
  if (metadata.aggregations[propertyKey] === undefined) {
206
168
  metadata.aggregations[propertyKey] = aggregationDefinition;
207
169
  }
208
-
209
170
  return propertyDescriptor;
210
171
  };
211
172
  }
212
-
213
173
  _exports.xmlAggregation = xmlAggregation;
214
-
215
174
  function blockAggregation(aggregationDefinition) {
216
175
  return xmlAggregation(aggregationDefinition);
217
176
  }
218
-
219
177
  _exports.blockAggregation = blockAggregation;
220
178
  var RUNTIME_BLOCKS = {};
221
-
222
179
  function defineBuildingBlock(oBuildingBlockDefinition) {
223
180
  return function (classDefinition) {
224
- ensureMetadata(classDefinition);
181
+ var metadata = ensureMetadata(classDefinition);
182
+ metadata.designtime = oBuildingBlockDefinition.designtime;
225
183
  classDefinition.xmlTag = oBuildingBlockDefinition.name;
226
184
  classDefinition.namespace = oBuildingBlockDefinition.namespace;
227
185
  classDefinition.publicNamespace = oBuildingBlockDefinition.publicNamespace;
@@ -229,55 +187,62 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
229
187
  classDefinition.isOpen = oBuildingBlockDefinition.isOpen;
230
188
  classDefinition.isRuntime = oBuildingBlockDefinition.isRuntime;
231
189
  classDefinition.apiVersion = 2;
232
-
233
190
  if (classDefinition.isRuntime === true) {
234
- classDefinition.prototype.getTemplate = function () {
191
+ classDefinition.prototype.getTemplate = function (oNode) {
235
192
  var className = "".concat(oBuildingBlockDefinition.namespace, ".").concat(oBuildingBlockDefinition.name);
236
193
  var extraProps = [];
237
-
238
- for (var propertiesKey in classDefinition.metadata.properties) {
194
+ // Function are defined as string but need to be resolved by UI5, as such we store them in an `event` property and will redispatch them later
195
+ var functionHolderDefinition = [];
196
+ var propertiesAssignedToFunction = [];
197
+ var functionStringInOrder = [];
198
+ for (var propertiesKey in metadata.properties) {
239
199
  var propertyValue = this[propertiesKey];
240
-
241
200
  if (propertyValue !== undefined && propertyValue !== null) {
242
- var _propertyValue, _propertyValue$isA;
243
-
244
- if (((_propertyValue = propertyValue) === null || _propertyValue === void 0 ? void 0 : (_propertyValue$isA = _propertyValue.isA) === null || _propertyValue$isA === void 0 ? void 0 : _propertyValue$isA.call(_propertyValue, "sap.ui.model.Context")) === true) {
201
+ if (isContext(propertyValue)) {
245
202
  propertyValue = propertyValue.getPath();
246
203
  }
247
-
248
- extraProps.push(xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["feBB:", "=\"", "\""])), propertiesKey, propertyValue));
204
+ if (metadata.properties[propertiesKey].type === "function") {
205
+ functionHolderDefinition.push(propertyValue);
206
+ functionStringInOrder.push(propertyValue);
207
+ propertiesAssignedToFunction.push(propertiesKey);
208
+ } else {
209
+ extraProps.push(xml(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["feBB:", "=\"", "\""])), propertiesKey, propertyValue));
210
+ }
249
211
  }
250
212
  }
251
-
252
- for (var eventsKey in classDefinition.metadata.events) {
213
+ if (functionHolderDefinition.length > 0) {
214
+ extraProps.push(xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["functionHolder=\"", "\""])), functionHolderDefinition.join(";")));
215
+ extraProps.push(xml(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["feBB:functionStringInOrder=\"", "\""])), functionStringInOrder.join(",")));
216
+ extraProps.push(xml(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["feBB:propertiesAssignedToFunction=\"", "\""])), propertiesAssignedToFunction.join(",")));
217
+ }
218
+ for (var eventsKey in metadata.events) {
253
219
  var eventsValue = this[eventsKey];
254
-
255
220
  if (eventsValue !== undefined) {
256
- extraProps.push(xml(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["feBB:", "=\"", "\""])), eventsKey, eventsValue));
221
+ extraProps.push(xml(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["feBB:", "=\"", "\""])), eventsKey, eventsValue));
257
222
  }
258
223
  }
259
-
260
- return xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["<core:Fragment\n\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\txmlns:feBB=\"sap.fe.core.buildingBlocks\"\n\t\t\t\t\tfragmentName=\"", "\"\n\t\t\t\t\tid=\"{this>id}\"\n\t\t\t\t\ttype=\"FE_COMPONENTS\"\n\t\t\t\t\t", "\n\t\t\t\t>\n\t\t\t\t</core:Fragment>"])), className, extraProps);
224
+ // core:require need to be defined on the node itself to be picked up due to the templating step
225
+ var coreRequire = oNode.getAttribute("core:require") || undefined;
226
+ if (coreRequire) {
227
+ extraProps.push(xml(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["core:require=\"", "\""])), coreRequire));
228
+ }
229
+ return xml(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["<feBB:BuildingBlockFragment\n\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\txmlns:feBB=\"sap.fe.core.buildingBlocks\"\n\t\t\t\t\tfragmentName=\"", "\"\n\n\t\t\t\t\tid=\"{this>id}\"\n\t\t\t\t\ttype=\"FE_COMPONENTS\"\n\t\t\t\t\t", "\n\t\t\t\t>\n\t\t\t\t</feBB:BuildingBlockFragment>"])), className, extraProps);
261
230
  };
262
231
  }
263
-
264
232
  classDefinition.register = function () {
265
233
  registerBuildingBlock(classDefinition);
266
-
267
234
  if (classDefinition.isRuntime === true) {
268
235
  RUNTIME_BLOCKS["".concat(oBuildingBlockDefinition.namespace, ".").concat(oBuildingBlockDefinition.name)] = classDefinition;
269
236
  }
270
237
  };
271
-
272
238
  classDefinition.unregister = function () {
273
239
  XMLPreprocessor.plugIn(null, classDefinition.namespace, classDefinition.name);
274
240
  XMLPreprocessor.plugIn(null, classDefinition.publicNamespace, classDefinition.name);
275
241
  };
276
242
  };
277
243
  }
278
-
279
244
  _exports.defineBuildingBlock = defineBuildingBlock;
280
- Fragment.registerType("FE_COMPONENTS", {
245
+ BuildingBlockFragment.registerType("FE_COMPONENTS", {
281
246
  load: function (mSettings) {
282
247
  try {
283
248
  return Promise.resolve(RUNTIME_BLOCKS[mSettings.fragmentName]);
@@ -286,108 +251,109 @@ sap.ui.define(["sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/
286
251
  }
287
252
  },
288
253
  init: function (mSettings) {
289
- try {
290
- var _mSettings$customData, _mSettings$customData2, _mSettings$customData3, _mSettings$customData4;
291
-
292
- var _this3 = this;
293
-
294
- var MyClass = mSettings.fragmentContent;
295
-
296
- if (!MyClass) {
297
- // In some case we might have been called here synchronously (unstash case for instance), which means we didn't go through the load function
298
- MyClass = RUNTIME_BLOCKS[mSettings.fragmentName];
299
- }
300
-
301
- var classSettings = {};
302
- var feCustomData = (mSettings === null || mSettings === void 0 ? void 0 : (_mSettings$customData = mSettings.customData) === null || _mSettings$customData === void 0 ? void 0 : (_mSettings$customData2 = _mSettings$customData[0]) === null || _mSettings$customData2 === void 0 ? void 0 : (_mSettings$customData3 = _mSettings$customData2.mProperties) === null || _mSettings$customData3 === void 0 ? void 0 : (_mSettings$customData4 = _mSettings$customData3.value) === null || _mSettings$customData4 === void 0 ? void 0 : _mSettings$customData4["sap.fe.core.buildingBlocks"]) || {};
303
- delete mSettings.customData;
304
- var pageComponent = Component.getOwnerComponentFor(mSettings.containingView);
305
-
306
- var _appComponent = CommonUtils.getAppComponent(mSettings.containingView);
307
-
308
- var metaModel = _appComponent.getMetaModel();
309
-
310
- var pageModel = pageComponent.getModel("_pageModel");
311
-
312
- for (var propertyName in MyClass.metadata.properties) {
313
- var propertyMetadata = MyClass.metadata.properties[propertyName];
314
- var pageModelContext = pageModel.createBindingContext(feCustomData[propertyName]);
315
-
316
- if (pageModelContext === null) {
317
- // value cannot be resolved, so it is either a runtime binding or a constant
318
- var vValue = feCustomData[propertyName];
319
-
320
- if (typeof vValue === "string") {
321
- if (propertyMetadata.bindable !== true) {
322
- // runtime bindings are not allowed, so convert strings into actual primitive types
323
- switch (propertyMetadata.type) {
324
- case "boolean":
325
- vValue = vValue === "true";
326
- break;
327
-
328
- case "number":
329
- vValue = Number(vValue);
330
- break;
331
- }
332
- } else {
333
- // runtime bindings are allowed, so resolve the values as BindingToolkit expressions
334
- vValue = resolveBindingString(vValue, propertyMetadata.type);
254
+ var _mSettings$customData,
255
+ _mSettings$customData2,
256
+ _mSettings$customData3,
257
+ _mSettings$customData4,
258
+ _mSettings$functionHo,
259
+ _feCustomData$functio,
260
+ _feCustomData$propert,
261
+ _this2 = this;
262
+ var MyClass = mSettings.fragmentContent;
263
+ if (!MyClass) {
264
+ // In some case we might have been called here synchronously (unstash case for instance), which means we didn't go through the load function
265
+ MyClass = RUNTIME_BLOCKS[mSettings.fragmentName];
266
+ }
267
+ var classSettings = {};
268
+ var feCustomData = (mSettings === null || mSettings === void 0 ? void 0 : (_mSettings$customData = mSettings.customData) === null || _mSettings$customData === void 0 ? void 0 : (_mSettings$customData2 = _mSettings$customData[0]) === null || _mSettings$customData2 === void 0 ? void 0 : (_mSettings$customData3 = _mSettings$customData2.mProperties) === null || _mSettings$customData3 === void 0 ? void 0 : (_mSettings$customData4 = _mSettings$customData3.value) === null || _mSettings$customData4 === void 0 ? void 0 : _mSettings$customData4["sap.fe.core.buildingBlocks"]) || {};
269
+ delete mSettings.customData;
270
+ var functionHolder = (_mSettings$functionHo = mSettings.functionHolder) !== null && _mSettings$functionHo !== void 0 ? _mSettings$functionHo : [];
271
+ delete mSettings.functionHolder;
272
+ var pageComponent = Component.getOwnerComponentFor(mSettings.containingView);
273
+ var appComponent = CommonUtils.getAppComponent(mSettings.containingView);
274
+ var metaModel = appComponent.getMetaModel();
275
+ var pageModel = pageComponent.getModel("_pageModel");
276
+ var functionStringInOrder = (_feCustomData$functio = feCustomData.functionStringInOrder) === null || _feCustomData$functio === void 0 ? void 0 : _feCustomData$functio.split(",");
277
+ var propertiesAssignedToFunction = (_feCustomData$propert = feCustomData.propertiesAssignedToFunction) === null || _feCustomData$propert === void 0 ? void 0 : _feCustomData$propert.split(",");
278
+ for (var propertyName in MyClass.metadata.properties) {
279
+ var propertyMetadata = MyClass.metadata.properties[propertyName];
280
+ var pageModelContext = pageModel.createBindingContext(feCustomData[propertyName]);
281
+ if (pageModelContext === null) {
282
+ // value cannot be resolved, so it is either a runtime binding or a constant
283
+ var vValue = feCustomData[propertyName];
284
+ if (typeof vValue === "string") {
285
+ if (propertyMetadata.bindable !== true) {
286
+ // runtime bindings are not allowed, so convert strings into actual primitive types
287
+ switch (propertyMetadata.type) {
288
+ case "boolean":
289
+ vValue = vValue === "true";
290
+ break;
291
+ case "number":
292
+ vValue = Number(vValue);
293
+ break;
335
294
  }
295
+ } else {
296
+ // runtime bindings are allowed, so resolve the values as BindingToolkit expressions
297
+ vValue = resolveBindingString(vValue, propertyMetadata.type);
336
298
  }
337
-
338
- classSettings[propertyName] = vValue;
339
- } else if (pageModelContext.getObject() !== undefined) {
340
- // get value from page model
341
- classSettings[propertyName] = pageModelContext.getObject();
342
- } else {
343
- // bind to metamodel
344
- classSettings[propertyName] = metaModel.createBindingContext(feCustomData[propertyName]);
299
+ } else if (propertyMetadata.type === "function") {
300
+ (function () {
301
+ var functionIndex = propertiesAssignedToFunction.indexOf(propertyName);
302
+ var functionString = functionStringInOrder[functionIndex];
303
+ var targetFunction = functionHolder === null || functionHolder === void 0 ? void 0 : functionHolder.find(function (functionDef) {
304
+ var _functionDef$;
305
+ return ((_functionDef$ = functionDef[0]) === null || _functionDef$ === void 0 ? void 0 : _functionDef$._sapui_handlerName) === functionString;
306
+ });
307
+ // We use the _sapui_handlerName to identify which function is the one we want to bind here
308
+ if (targetFunction && targetFunction.length > 1) {
309
+ vValue = targetFunction[0].bind(targetFunction[1]);
310
+ }
311
+ })();
345
312
  }
313
+ classSettings[propertyName] = vValue;
314
+ } else if (pageModelContext.getObject() !== undefined) {
315
+ // get value from page model
316
+ classSettings[propertyName] = pageModelContext.getObject();
317
+ } else {
318
+ // bind to metamodel
319
+ classSettings[propertyName] = metaModel.createBindingContext(feCustomData[propertyName]);
346
320
  }
347
-
348
- for (var eventName in MyClass.metadata.events) {
349
- if (feCustomData[eventName] !== undefined && feCustomData[eventName].startsWith(".")) {
350
- classSettings[eventName] = ObjectPath.get(feCustomData[eventName].substring(1), mSettings.containingView.getController());
351
- } else {
352
- classSettings[eventName] = ""; // For now, might need to resolve more stuff
353
- }
321
+ }
322
+ for (var eventName in MyClass.metadata.events) {
323
+ if (feCustomData[eventName] !== undefined && feCustomData[eventName].startsWith(".")) {
324
+ classSettings[eventName] = ObjectPath.get(feCustomData[eventName].substring(1), mSettings.containingView.getController());
325
+ } else {
326
+ classSettings[eventName] = ""; // For now, might need to resolve more stuff
354
327
  }
328
+ }
355
329
 
356
- return Promise.resolve(ManagedObject.runWithPreprocessors(function () {
357
- var renderedControl = new MyClass(classSettings, {}, {
358
- isRuntimeInstantiation: true,
359
- isPublic: false,
360
- appComponent: _appComponent
361
- }).render(mSettings.containingView, _appComponent);
362
-
363
- if (!_this3._bAsync) {
364
- _this3._aContent = renderedControl;
365
- }
366
-
367
- return renderedControl;
368
- }, {
369
- id: function (sId) {
370
- return mSettings.containingView.createId(sId);
371
- },
372
- settings: function (controlSettings) {
373
- var allAssociations = this.getMetadata().getAssociations();
374
-
375
- for (var _i = 0, _Object$keys = Object.keys(allAssociations); _i < _Object$keys.length; _i++) {
376
- var associationDetailName = _Object$keys[_i];
377
-
378
- if (controlSettings.hasOwnProperty(associationDetailName)) {
379
- controlSettings[associationDetailName] = mSettings.containingView.createId(controlSettings[associationDetailName]);
380
- }
330
+ return ManagedObject.runWithPreprocessors(function () {
331
+ var renderedControl = new MyClass(classSettings, {}, {
332
+ isRuntimeInstantiation: true,
333
+ isPublic: false,
334
+ appComponent: appComponent
335
+ }).render(mSettings.containingView, appComponent);
336
+ if (!_this2._bAsync) {
337
+ _this2._aContent = renderedControl;
338
+ }
339
+ return renderedControl;
340
+ }, {
341
+ id: function (sId) {
342
+ return mSettings.containingView.createId(sId);
343
+ },
344
+ settings: function (controlSettings) {
345
+ var allAssociations = this.getMetadata().getAssociations();
346
+ for (var _i = 0, _Object$keys = Object.keys(allAssociations); _i < _Object$keys.length; _i++) {
347
+ var associationDetailName = _Object$keys[_i];
348
+ if (controlSettings.hasOwnProperty(associationDetailName) && !(controlSettings[associationDetailName] instanceof ManagedObject)) {
349
+ controlSettings[associationDetailName] = mSettings.containingView.createId(controlSettings[associationDetailName]);
381
350
  }
382
-
383
- return controlSettings;
384
351
  }
385
- }));
386
- } catch (e) {
387
- return Promise.reject(e);
388
- }
352
+ return controlSettings;
353
+ }
354
+ });
389
355
  }
390
356
  });
391
357
  return _exports;
392
358
  }, false);
393
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWlsZGluZ0Jsb2NrQmFzZSIsIm9Qcm9wcyIsIl9vQ29udHJvbENvbmZpZyIsIl9vU2V0dGluZ3MiLCJpc1B1YmxpYyIsImdldENvbnZlcnRlckNvbnRleHQiLCJvVmlzdWFsaXphdGlvbk9iamVjdFBhdGgiLCJjb250ZXh0UGF0aCIsIm1TZXR0aW5ncyIsIm1FeHRyYVBhcmFtcyIsIm9BcHBDb21wb25lbnQiLCJhcHBDb21wb25lbnQiLCJvcmlnaW5hbFZpZXdEYXRhIiwibW9kZWxzIiwidmlld0RhdGEiLCJnZXREYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwicmVzb3VyY2VCdW5kbGUiLCJkZWVwQ2xvbmUiLCJjb250cm9sQ29uZmlndXJhdGlvbiIsIm1lcmdlIiwiQ29udmVydGVyQ29udGV4dCIsImNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmFtZSIsIm1ldGFNb2RlbCIsImdldERpYWdub3N0aWNzIiwiY29udGV4dExvY2F0aW9uIiwia2V5cyIsImZvckVhY2giLCJwcm9wTmFtZSIsImNyZWF0ZUlkIiwiaWQiLCJzdHJpbmdQYXJ0cyIsImdlbmVyYXRlIiwidW5kZWZpbmVkIiwiZ2V0UHJvcGVydGllcyIsImFsbFByb3BlcnRpZXMiLCJvSW5zdGFuY2VLZXkiLCJoYXNPd25Qcm9wZXJ0eSIsInJlZ2lzdGVyIiwidW5yZWdpc3RlciIsImFkZENvbmRpdGlvbmFsbHkiLCJjb25kaXRpb24iLCJwYXJ0VG9BZGQiLCJhdHRyIiwiYXR0cmlidXRlTmFtZSIsInZhbHVlIiwiZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUiLCJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwicHJvcGVydGllcyIsImFnZ3JlZ2F0aW9ucyIsImV2ZW50cyIsInhtbEF0dHJpYnV0ZSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJwcm9wZXJ0eUtleSIsInByb3BlcnR5RGVzY3JpcHRvciIsImNvbnN0cnVjdG9yIiwiZGVmYXVsdFZhbHVlIiwiaW5pdGlhbGl6ZXIiLCJ0b1N0cmluZyIsImJsb2NrQXR0cmlidXRlIiwieG1sRXZlbnQiLCJ0eXBlIiwiYmxvY2tFdmVudCIsInhtbEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwiYmxvY2tBZ2dyZWdhdGlvbiIsIlJVTlRJTUVfQkxPQ0tTIiwiZGVmaW5lQnVpbGRpbmdCbG9jayIsIm9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiIsImNsYXNzRGVmaW5pdGlvbiIsInhtbFRhZyIsIm5hbWVzcGFjZSIsInB1YmxpY05hbWVzcGFjZSIsImZyYWdtZW50IiwiaXNPcGVuIiwiaXNSdW50aW1lIiwiYXBpVmVyc2lvbiIsInByb3RvdHlwZSIsImdldFRlbXBsYXRlIiwiY2xhc3NOYW1lIiwiZXh0cmFQcm9wcyIsInByb3BlcnRpZXNLZXkiLCJwcm9wZXJ0eVZhbHVlIiwiaXNBIiwiZ2V0UGF0aCIsInB1c2giLCJ4bWwiLCJldmVudHNLZXkiLCJldmVudHNWYWx1ZSIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsIkZyYWdtZW50IiwicmVnaXN0ZXJUeXBlIiwibG9hZCIsImZyYWdtZW50TmFtZSIsImluaXQiLCJNeUNsYXNzIiwiZnJhZ21lbnRDb250ZW50IiwiY2xhc3NTZXR0aW5ncyIsImZlQ3VzdG9tRGF0YSIsImN1c3RvbURhdGEiLCJtUHJvcGVydGllcyIsInBhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsImNvbnRhaW5pbmdWaWV3IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRNZXRhTW9kZWwiLCJwYWdlTW9kZWwiLCJnZXRNb2RlbCIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5TWV0YWRhdGEiLCJwYWdlTW9kZWxDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ2VmFsdWUiLCJiaW5kYWJsZSIsIk51bWJlciIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwiZ2V0T2JqZWN0IiwiZXZlbnROYW1lIiwic3RhcnRzV2l0aCIsIk9iamVjdFBhdGgiLCJnZXQiLCJzdWJzdHJpbmciLCJnZXRDb250cm9sbGVyIiwiTWFuYWdlZE9iamVjdCIsInJ1bldpdGhQcmVwcm9jZXNzb3JzIiwicmVuZGVyZWRDb250cm9sIiwiaXNSdW50aW1lSW5zdGFudGlhdGlvbiIsInJlbmRlciIsIl9iQXN5bmMiLCJfYUNvbnRlbnQiLCJzSWQiLCJzZXR0aW5ncyIsImNvbnRyb2xTZXR0aW5ncyIsImFsbEFzc29jaWF0aW9ucyIsImdldE1ldGFkYXRhIiwiZ2V0QXNzb2NpYXRpb25zIiwiYXNzb2NpYXRpb25EZXRhaWxOYW1lIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJCdWlsZGluZ0Jsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHsgZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUsIHJlZ2lzdGVyQnVpbGRpbmdCbG9jaywgeG1sIH0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyByZXNvbHZlQmluZGluZ1N0cmluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL21kYy9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3RFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcblxuLy8gVHlwZSBmb3IgdGhlIGFjY2Vzc29yIGRlY29yYXRvciB0aGF0IHdlIGVuZCB1cCB3aXRoIGluIGJhYmVsLlxudHlwZSBBY2Nlc3NvckRlc2NyaXB0b3I8VD4gPSBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxUPiAmIHsgaW5pdGlhbGl6ZXI/OiAoKSA9PiBUIH07XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRXh0cmFTZXR0aW5ncyA9IHtcblx0aXNQdWJsaWM6IGJvb2xlYW47XG5cdGlzUnVudGltZUluc3RhbnRpYXRpb24/OiBib29sZWFuO1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcbn07XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQnVpbGRpbmcgQmxvY2tcbiAqL1xuZXhwb3J0IGNsYXNzIEJ1aWxkaW5nQmxvY2tCYXNlIHtcblx0cHJvdGVjdGVkIGlzUHVibGljID0gZmFsc2U7XG5cdHByb3RlY3RlZCBpZCE6IHN0cmluZztcblx0Y29uc3RydWN0b3Iob1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgX29Db250cm9sQ29uZmlnPzogYW55LCBfb1NldHRpbmdzPzogQnVpbGRpbmdCbG9ja0V4dHJhU2V0dGluZ3MpIHtcblx0XHRPYmplY3Qua2V5cyhvUHJvcHMpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7XG5cdFx0XHQvLyBUaGlzIG5lZWRzIHRvIGJlIGNhc3RlZCBhcyBhbnkgc2luY2Ugd2UgYXJlIGFzc2lnbmluZyB0aGUgcHJvcGVydGllcyB0byB0aGUgaW5zdGFuY2Ugd2l0aG91dCBrbm93aW5nIHRoZWlyIHR5cGVcblx0XHRcdHRoaXNbcHJvcE5hbWUgYXMga2V5b2YgdGhpc10gPSBvUHJvcHNbcHJvcE5hbWVdIGFzIGFueTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IHRoZSBnaXZlbiBsb2NhbCBlbGVtZW50IElEIHRvIGEgZ2xvYmFsbHkgdW5pcXVlIElEIGJ5IHByZWZpeGluZyB3aXRoIHRoZSBCdWlsZGluZyBCbG9jayBJRC5cblx0ICpcblx0ICogQHBhcmFtIHN0cmluZ1BhcnRzXG5cdCAqIEByZXR1cm5zIEVpdGhlciB0aGUgZ2xvYmFsIElEIG9yIHVuZGVmaW5lZCBpZiB0aGUgQnVpbGRpbmcgQmxvY2sgZG9lc24ndCBoYXZlIGFuIElEXG5cdCAqL1xuXHRwdWJsaWMgY3JlYXRlSWQoLi4uc3RyaW5nUGFydHM6IHN0cmluZ1tdKSB7XG5cdFx0Ly8gSWYgdGhlIGNoaWxkIGluc3RhbmNlIGhhcyBhbiBJRCBwcm9wZXJ0eSB1c2UgaXQgb3RoZXJ3aXNlIHJldHVybiB1bmRlZmluZWRcblx0XHRpZiAodGhpcy5pZCkge1xuXHRcdFx0cmV0dXJuIGdlbmVyYXRlKFsodGhpcyBhcyBhbnkpLmlkLCAuLi5zdHJpbmdQYXJ0c10pO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8vIFRoaXMgYmxvY2sgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIEkgYW0gbm90IHVzaW5nIHRoZW0gZm9yIG5vdyAvIG5lZWQgdG8gY2hhbmdlIHRoaXMgYnV0IHN0aWxsIHdhbnQgdG8ga2VlcCB0aGVtIGFyb3VuZFxuXHRwcm90ZWN0ZWQgZ2V0Q29udmVydGVyQ29udGV4dCA9IGZ1bmN0aW9uIChvVmlzdWFsaXphdGlvbk9iamVjdFBhdGg6IGFueSwgY29udGV4dFBhdGg6IGFueSwgbVNldHRpbmdzOiBhbnksIG1FeHRyYVBhcmFtcz86IGFueSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBtU2V0dGluZ3MuYXBwQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9yaWdpbmFsVmlld0RhdGEgPSBtU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhICYmIG1TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0RGF0YSgpO1xuXHRcdGxldCB2aWV3RGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsVmlld0RhdGEpO1xuXHRcdGRlbGV0ZSB2aWV3RGF0YS5yZXNvdXJjZUJ1bmRsZTtcblx0XHR2aWV3RGF0YSA9IGRlZXBDbG9uZSh2aWV3RGF0YSk7XG5cdFx0dmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24gPSBtZXJnZSh2aWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbiwgbUV4dHJhUGFyYW1zKTtcblx0XHRyZXR1cm4gQ29udmVydGVyQ29udGV4dC5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oXG5cdFx0XHRvVmlzdWFsaXphdGlvbk9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZSxcblx0XHRcdG1TZXR0aW5ncy5tb2RlbHMubWV0YU1vZGVsLFxuXHRcdFx0b0FwcENvbXBvbmVudCAmJiBvQXBwQ29tcG9uZW50LmdldERpYWdub3N0aWNzKCksXG5cdFx0XHRtZXJnZSxcblx0XHRcdG9WaXN1YWxpemF0aW9uT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0XHR2aWV3RGF0YVxuXHRcdCk7XG5cdH07XG5cdHB1YmxpYyBnZXRQcm9wZXJ0aWVzKCkge1xuXHRcdGNvbnN0IGFsbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0XHRmb3IgKGNvbnN0IG9JbnN0YW5jZUtleSBpbiB0aGlzKSB7XG5cdFx0XHRpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShvSW5zdGFuY2VLZXkpKSB7XG5cdFx0XHRcdGFsbFByb3BlcnRpZXNbb0luc3RhbmNlS2V5XSA9IHRoaXNbb0luc3RhbmNlS2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFsbFByb3BlcnRpZXM7XG5cdH1cblx0c3RhdGljIHJlZ2lzdGVyKCkge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlblxuXHR9XG5cdHN0YXRpYyB1bnJlZ2lzdGVyKCkge1xuXHRcdC8vIFRvIGJlIG92ZXJyaWRlblxuXHR9XG5cdHB1YmxpYyBhZGRDb25kaXRpb25hbGx5KGNvbmRpdGlvbiA9IGZhbHNlLCBwYXJ0VG9BZGQ/OiBhbnkpIHtcblx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRyZXR1cm4gcGFydFRvQWRkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cdH1cblx0cHJvdGVjdGVkIGF0dHIoYXR0cmlidXRlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogKCkgPT4gc3RyaW5nIHtcblx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuICgpID0+IGAke2F0dHJpYnV0ZU5hbWV9PVwiJHtlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSl9XCJgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gKCkgPT4gXCJcIjtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGV4dGVuZHMgQnVpbGRpbmdCbG9ja0Jhc2Uge1xuXHRyZW5kZXIoY29udGFpbmluZ1ZpZXc6IFZpZXcsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogQ29udHJvbDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbiA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRpc1B1YmxpYz86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IGFueTtcblx0Y29tcHV0ZWQ/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGJpbmRhYmxlPzogYm9vbGVhbjsgLy8gb25seSBjb25zaWRlcmVkIGZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrc1xuXHQka2luZD86IHN0cmluZ1tdO1xufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGlzUHVibGljPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRjb21wdXRlZD86IGJvb2xlYW47XG5cdCRUeXBlPzogc3RyaW5nW107XG5cdCRraW5kPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0V2ZW50ID0ge307XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uID0ge1xuXHRpc1B1YmxpYz86IGJvb2xlYW47XG5cdHR5cGU6IHN0cmluZztcblx0c2xvdD86IHN0cmluZztcblx0aXNEZWZhdWx0PzogYm9vbGVhbjtcbn07XG50eXBlIENvbW1vbkJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uID0ge1xuXHRuYW1lc3BhY2U6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHR4bWxUYWc/OiBzdHJpbmc7XG5cdGZyYWdtZW50Pzogc3RyaW5nO1xuXHRwdWJsaWNOYW1lc3BhY2U/OiBzdHJpbmc7XG5cblx0aXNSdW50aW1lPzogYm9vbGVhbjtcblx0aXNPcGVuPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYyID0gQ29tbW9uQnVpbGRpbmdCbG9ja0RlZmluaXRpb24gJlxuXHR0eXBlb2YgQnVpbGRpbmdCbG9ja0Jhc2UgJiB7XG5cdFx0YXBpVmVyc2lvbjogMjtcblx0XHRtZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xuXHR9O1xuXG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxID0gQ29tbW9uQnVpbGRpbmdCbG9ja0RlZmluaXRpb24gJiB7XG5cdG5hbWU6IHN0cmluZztcblx0YXBpVmVyc2lvbj86IDE7XG5cdGNyZWF0ZT86IEZ1bmN0aW9uO1xuXHRnZXRUZW1wbGF0ZT86IEZ1bmN0aW9uO1xuXHRtZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uID0gQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMiB8IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjE7XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSB7XG5cdGV2ZW50czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0V2ZW50Pjtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj47XG59O1xuXG5jb25zdCBlbnN1cmVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQ6IFBhcnRpYWw8QnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMj4pOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRpZiAoIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShcIm1ldGFkYXRhXCIpKSB7XG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID0gZGVlcENsb25lKFxuXHRcdFx0dGFyZ2V0Lm1ldGFkYXRhIHx8IHtcblx0XHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRcdGV2ZW50czoge31cblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cdHJldHVybiB0YXJnZXQubWV0YWRhdGEgYXMgQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xufTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgZGVjbGFyZWQgYXMgYW4geG1sIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGZyb20gdGhlIG91dHNpZGUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrLlxuICpcbiAqIElmIGRlZmluaW5nIGEgcnVudGltZSBCdWlsZGluZyBCbG9jaywgcGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgdGhlIGNvcnJlY3QgdHlwaW5nczogRGVwZW5kaW5nIG9uIGl0cyBtZXRhZGF0YSxcbiAqIGEgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBhIHtAbGluayBzYXAudWkubW9kZWwuQ29udGV4dH0gKDxjb2RlPnR5cGU6ICdzYXAudWkubW9kZWwuQ29udGV4dCc8L2NvZGU+KSxcbiAqIGEgY29uc3RhbnQgKDxjb2RlPmJpbmRhYmxlOiBmYWxzZTwvY29kZT4pLCBvciBhIHtAbGluayBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb259ICg8Y29kZT5iaW5kYWJsZTogdHJ1ZTwvY29kZT4pLlxuICpcbiAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxBdHRyaWJ1dGUoYXR0cmlidXRlRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IEJ1aWxkaW5nQmxvY2tCYXNlLCBwcm9wZXJ0eUtleTogc3RyaW5nIHwgU3ltYm9sLCBwcm9wZXJ0eURlc2NyaXB0b3I6IEFjY2Vzc29yRGVzY3JpcHRvcjxhbnk+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBubyBkZWZhdWx0VmFsdWUgd2UgY2FuIHRha2UgdGhlIHZhbHVlIGZyb20gdGhlIGluaXRpYWxpemVyIChuYXR1cmFsIHdheSBvZiBkZWZpbmluZyBkZWZhdWx0cylcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID0gcHJvcGVydHlEZXNjcmlwdG9yLmluaXRpYWxpemVyPy4oKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci5pbml0aWFsaXplcjtcblx0XHRpZiAobWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIGFueTsgLy8gTmVlZGVkIHRvIG1ha2UgVFMgaGFwcHkgd2l0aCB0aG9zZSBkZWNvcmF0b3JzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrQXR0cmlidXRlKGF0dHJpYnV0ZURlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24pOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiB4bWxBdHRyaWJ1dGUoYXR0cmlidXRlRGVmaW5pdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudCgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBCdWlsZGluZ0Jsb2NrQmFzZSwgcHJvcGVydHlLZXk6IHN0cmluZyB8IFN5bWJvbCwgcHJvcGVydHlEZXNjcmlwdG9yOiBBY2Nlc3NvckRlc2NyaXB0b3I8YW55Pikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLmluaXRpYWxpemVyO1xuXHRcdGlmIChtZXRhZGF0YS5ldmVudHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bWV0YWRhdGEuZXZlbnRzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0geyB0eXBlOiBcIkZ1bmN0aW9uXCIgfTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIGFueTsgLy8gTmVlZGVkIHRvIG1ha2UgVFMgaGFwcHkgd2l0aCB0aG9zZSBkZWNvcmF0b3JzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrRXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sRXZlbnQoKTtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIHByb3BlcnR5IHNoYWxsIGJlIGRlY2xhcmVkIGFzIGFuIHhtbCBhZ2dyZWdhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZyb20gdGhlIG91dHNpZGUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhtbEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IEJ1aWxkaW5nQmxvY2tCYXNlLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldC5jb25zdHJ1Y3Rvcik7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgYW55KS5pbml0aWFsaXplcjtcblx0XHRpZiAobWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldID0gYWdncmVnYXRpb25EZWZpbml0aW9uO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgYW55O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrQWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sQWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uKTtcbn1cbmNvbnN0IFJVTlRJTUVfQkxPQ0tTOiBSZWNvcmQ8c3RyaW5nLCBSdW50aW1lQnVpbGRpbmdCbG9jayAmIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjI+ID0ge307XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQnVpbGRpbmdCbG9jayhvQnVpbGRpbmdCbG9ja0RlZmluaXRpb246IENvbW1vbkJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNsYXNzRGVmaW5pdGlvbjogYW55KSB7XG5cdFx0ZW5zdXJlTWV0YWRhdGEoY2xhc3NEZWZpbml0aW9uKTtcblx0XHRjbGFzc0RlZmluaXRpb24ueG1sVGFnID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWU7XG5cdFx0Y2xhc3NEZWZpbml0aW9uLm5hbWVzcGFjZSA9IG9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2U7XG5cdFx0Y2xhc3NEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSA9IG9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2U7XG5cdFx0Y2xhc3NEZWZpbml0aW9uLmZyYWdtZW50ID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50O1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5pc09wZW4gPSBvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5pc1J1bnRpbWUgPSBvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNSdW50aW1lO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5hcGlWZXJzaW9uID0gMjtcblx0XHRpZiAoY2xhc3NEZWZpbml0aW9uLmlzUnVudGltZSA9PT0gdHJ1ZSkge1xuXHRcdFx0Y2xhc3NEZWZpbml0aW9uLnByb3RvdHlwZS5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3QgY2xhc3NOYW1lID0gYCR7b0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gO1xuXHRcdFx0XHRjb25zdCBleHRyYVByb3BzID0gW107XG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydGllc0tleSBpbiBjbGFzc0RlZmluaXRpb24ubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0XHRcdGxldCBwcm9wZXJ0eVZhbHVlID0gdGhpc1twcm9wZXJ0aWVzS2V5XTtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5VmFsdWUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlPy5pc0E/LihcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGV4dHJhUHJvcHMucHVzaCh4bWxgZmVCQjoke3Byb3BlcnRpZXNLZXl9PVwiJHtwcm9wZXJ0eVZhbHVlfVwiYCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgZXZlbnRzS2V5IGluIGNsYXNzRGVmaW5pdGlvbi5tZXRhZGF0YS5ldmVudHMpIHtcblx0XHRcdFx0XHRjb25zdCBldmVudHNWYWx1ZSA9IHRoaXNbZXZlbnRzS2V5XTtcblx0XHRcdFx0XHRpZiAoZXZlbnRzVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0ZXh0cmFQcm9wcy5wdXNoKHhtbGBmZUJCOiR7ZXZlbnRzS2V5fT1cIiR7ZXZlbnRzVmFsdWV9XCJgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHhtbGA8Y29yZTpGcmFnbWVudFxuXHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0eG1sbnM6ZmVCQj1cInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzXCJcblx0XHRcdFx0XHRmcmFnbWVudE5hbWU9XCIke2NsYXNzTmFtZX1cIlxuXHRcdFx0XHRcdGlkPVwie3RoaXM+aWR9XCJcblx0XHRcdFx0XHR0eXBlPVwiRkVfQ09NUE9ORU5UU1wiXG5cdFx0XHRcdFx0JHtleHRyYVByb3BzfVxuXHRcdFx0XHQ+XG5cdFx0XHRcdDwvY29yZTpGcmFnbWVudD5gO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjbGFzc0RlZmluaXRpb24ucmVnaXN0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZWdpc3RlckJ1aWxkaW5nQmxvY2soY2xhc3NEZWZpbml0aW9uKTtcblx0XHRcdGlmIChjbGFzc0RlZmluaXRpb24uaXNSdW50aW1lID09PSB0cnVlKSB7XG5cdFx0XHRcdFJVTlRJTUVfQkxPQ0tTW2Ake29CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2V9LiR7b0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YF0gPSBjbGFzc0RlZmluaXRpb247XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjbGFzc0RlZmluaXRpb24udW5yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgY2xhc3NEZWZpbml0aW9uLm5hbWVzcGFjZSwgY2xhc3NEZWZpbml0aW9uLm5hbWUpO1xuXHRcdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBjbGFzc0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlLCBjbGFzc0RlZmluaXRpb24ubmFtZSk7XG5cdFx0fTtcblx0fTtcbn1cblxuRnJhZ21lbnQucmVnaXN0ZXJUeXBlKFwiRkVfQ09NUE9ORU5UU1wiLCB7XG5cdGxvYWQ6IGFzeW5jIGZ1bmN0aW9uIChtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0XHRyZXR1cm4gUlVOVElNRV9CTE9DS1NbbVNldHRpbmdzLmZyYWdtZW50TmFtZV07XG5cdH0sXG5cdGluaXQ6IGFzeW5jIGZ1bmN0aW9uIChtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0XHRsZXQgTXlDbGFzczogUnVudGltZUJ1aWxkaW5nQmxvY2sgJiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYyID0gbVNldHRpbmdzLmZyYWdtZW50Q29udGVudDtcblx0XHRpZiAoIU15Q2xhc3MpIHtcblx0XHRcdC8vIEluIHNvbWUgY2FzZSB3ZSBtaWdodCBoYXZlIGJlZW4gY2FsbGVkIGhlcmUgc3luY2hyb25vdXNseSAodW5zdGFzaCBjYXNlIGZvciBpbnN0YW5jZSksIHdoaWNoIG1lYW5zIHdlIGRpZG4ndCBnbyB0aHJvdWdoIHRoZSBsb2FkIGZ1bmN0aW9uXG5cdFx0XHRNeUNsYXNzID0gUlVOVElNRV9CTE9DS1NbbVNldHRpbmdzLmZyYWdtZW50TmFtZV07XG5cdFx0fVxuXHRcdGNvbnN0IGNsYXNzU2V0dGluZ3M6IGFueSA9IHt9O1xuXHRcdGNvbnN0IGZlQ3VzdG9tRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IG1TZXR0aW5ncz8uY3VzdG9tRGF0YT8uWzBdPy5tUHJvcGVydGllcz8udmFsdWU/LltcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzXCJdIHx8IHt9O1xuXHRcdGRlbGV0ZSBtU2V0dGluZ3MuY3VzdG9tRGF0YTtcblx0XHRjb25zdCBwYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG1TZXR0aW5ncy5jb250YWluaW5nVmlldykgYXMgVGVtcGxhdGVDb21wb25lbnQ7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG1TZXR0aW5ncy5jb250YWluaW5nVmlldyk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gYXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHBhZ2VNb2RlbCA9IHBhZ2VDb21wb25lbnQuZ2V0TW9kZWwoXCJfcGFnZU1vZGVsXCIpO1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIE15Q2xhc3MubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlNZXRhZGF0YSA9IE15Q2xhc3MubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0Y29uc3QgcGFnZU1vZGVsQ29udGV4dCA9IHBhZ2VNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChmZUN1c3RvbURhdGFbcHJvcGVydHlOYW1lXSk7XG5cblx0XHRcdGlmIChwYWdlTW9kZWxDb250ZXh0ID09PSBudWxsKSB7XG5cdFx0XHRcdC8vIHZhbHVlIGNhbm5vdCBiZSByZXNvbHZlZCwgc28gaXQgaXMgZWl0aGVyIGEgcnVudGltZSBiaW5kaW5nIG9yIGEgY29uc3RhbnRcblx0XHRcdFx0bGV0IHZWYWx1ZSA9IGZlQ3VzdG9tRGF0YVtwcm9wZXJ0eU5hbWVdO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgdlZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5TWV0YWRhdGEuYmluZGFibGUgIT09IHRydWUpIHtcblx0XHRcdFx0XHRcdC8vIHJ1bnRpbWUgYmluZGluZ3MgYXJlIG5vdCBhbGxvd2VkLCBzbyBjb252ZXJ0IHN0cmluZ3MgaW50byBhY3R1YWwgcHJpbWl0aXZlIHR5cGVzXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHByb3BlcnR5TWV0YWRhdGEudHlwZSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdFx0XHRcdHZWYWx1ZSA9IHZWYWx1ZSA9PT0gXCJ0cnVlXCI7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRcdFx0XHR2VmFsdWUgPSBOdW1iZXIodlZhbHVlKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gcnVudGltZSBiaW5kaW5ncyBhcmUgYWxsb3dlZCwgc28gcmVzb2x2ZSB0aGUgdmFsdWVzIGFzIEJpbmRpbmdUb29sa2l0IGV4cHJlc3Npb25zXG5cdFx0XHRcdFx0XHR2VmFsdWUgPSByZXNvbHZlQmluZGluZ1N0cmluZyh2VmFsdWUsIHByb3BlcnR5TWV0YWRhdGEudHlwZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2xhc3NTZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gdlZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChwYWdlTW9kZWxDb250ZXh0LmdldE9iamVjdCgpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gZ2V0IHZhbHVlIGZyb20gcGFnZSBtb2RlbFxuXHRcdFx0XHRjbGFzc1NldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBwYWdlTW9kZWxDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gYmluZCB0byBtZXRhbW9kZWxcblx0XHRcdFx0Y2xhc3NTZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGZlQ3VzdG9tRGF0YVtwcm9wZXJ0eU5hbWVdKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Zm9yIChjb25zdCBldmVudE5hbWUgaW4gTXlDbGFzcy5tZXRhZGF0YS5ldmVudHMpIHtcblx0XHRcdGlmIChmZUN1c3RvbURhdGFbZXZlbnROYW1lXSAhPT0gdW5kZWZpbmVkICYmIChmZUN1c3RvbURhdGFbZXZlbnROYW1lXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG5cdFx0XHRcdGNsYXNzU2V0dGluZ3NbZXZlbnROYW1lXSA9IE9iamVjdFBhdGguZ2V0KGZlQ3VzdG9tRGF0YVtldmVudE5hbWVdLnN1YnN0cmluZygxKSwgbVNldHRpbmdzLmNvbnRhaW5pbmdWaWV3LmdldENvbnRyb2xsZXIoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbGFzc1NldHRpbmdzW2V2ZW50TmFtZV0gPSBcIlwiOyAvLyBGb3Igbm93LCBtaWdodCBuZWVkIHRvIHJlc29sdmUgbW9yZSBzdHVmZlxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gKE1hbmFnZWRPYmplY3QgYXMgdW5rbm93biBhcyBNYW5hZ2VkT2JqZWN0RXgpLnJ1bldpdGhQcmVwcm9jZXNzb3JzKFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRjb25zdCByZW5kZXJlZENvbnRyb2wgPSAoXG5cdFx0XHRcdFx0bmV3IE15Q2xhc3MoXG5cdFx0XHRcdFx0XHRjbGFzc1NldHRpbmdzLFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHR7IGlzUnVudGltZUluc3RhbnRpYXRpb246IHRydWUsIGlzUHVibGljOiBmYWxzZSwgYXBwQ29tcG9uZW50OiBhcHBDb21wb25lbnQgfVxuXHRcdFx0XHRcdCkgYXMgUnVudGltZUJ1aWxkaW5nQmxvY2tcblx0XHRcdFx0KS5yZW5kZXIobVNldHRpbmdzLmNvbnRhaW5pbmdWaWV3LCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRpZiAoISh0aGlzIGFzIGFueSkuX2JBc3luYykge1xuXHRcdFx0XHRcdCh0aGlzIGFzIGFueSkuX2FDb250ZW50ID0gcmVuZGVyZWRDb250cm9sO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZW5kZXJlZENvbnRyb2w7XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRpZDogZnVuY3Rpb24gKHNJZDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1TZXR0aW5ncy5jb250YWluaW5nVmlldy5jcmVhdGVJZChzSWQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZXR0aW5nczogZnVuY3Rpb24gKGNvbnRyb2xTZXR0aW5nczogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3QgYWxsQXNzb2NpYXRpb25zID0gdGhpcy5nZXRNZXRhZGF0YSgpLmdldEFzc29jaWF0aW9ucygpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgYXNzb2NpYXRpb25EZXRhaWxOYW1lIG9mIE9iamVjdC5rZXlzKGFsbEFzc29jaWF0aW9ucykpIHtcblx0XHRcdFx0XHRcdGlmIChjb250cm9sU2V0dGluZ3MuaGFzT3duUHJvcGVydHkoYXNzb2NpYXRpb25EZXRhaWxOYW1lKSkge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sU2V0dGluZ3NbYXNzb2NpYXRpb25EZXRhaWxOYW1lXSA9IG1TZXR0aW5ncy5jb250YWluaW5nVmlldy5jcmVhdGVJZChcblx0XHRcdFx0XHRcdFx0XHRjb250cm9sU2V0dGluZ3NbYXNzb2NpYXRpb25EZXRhaWxOYW1lXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gY29udHJvbFNldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7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
359
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWlsZGluZ0Jsb2NrQmFzZSIsIm9Qcm9wcyIsIl9vQ29udHJvbENvbmZpZyIsIl9vU2V0dGluZ3MiLCJpc1B1YmxpYyIsImdldENvbnZlcnRlckNvbnRleHQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiY29udGV4dFBhdGgiLCJtU2V0dGluZ3MiLCJtRXh0cmFQYXJhbXMiLCJvQXBwQ29tcG9uZW50IiwiYXBwQ29tcG9uZW50Iiwib3JpZ2luYWxWaWV3RGF0YSIsIm1vZGVscyIsInZpZXdEYXRhIiwiZ2V0RGF0YSIsIk9iamVjdCIsImFzc2lnbiIsInJlc291cmNlQnVuZGxlIiwiZGVlcENsb25lIiwiY29udHJvbENvbmZpZ3VyYXRpb24iLCJtZXJnZSIsIkNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8iLCJzdGFydGluZ0VudGl0eVNldCIsIm5hbWUiLCJtZXRhTW9kZWwiLCJnZXREaWFnbm9zdGljcyIsImNvbnRleHRMb2NhdGlvbiIsImtleXMiLCJmb3JFYWNoIiwicHJvcE5hbWUiLCJjcmVhdGVJZCIsImlkIiwic3RyaW5nUGFydHMiLCJnZW5lcmF0ZSIsInVuZGVmaW5lZCIsImdldFByb3BlcnRpZXMiLCJhbGxQcm9wZXJ0aWVzIiwib0luc3RhbmNlS2V5IiwiaGFzT3duUHJvcGVydHkiLCJyZWdpc3RlciIsInVucmVnaXN0ZXIiLCJhZGRDb25kaXRpb25hbGx5IiwiY29uZGl0aW9uIiwicGFydFRvQWRkIiwiYXR0ciIsImF0dHJpYnV0ZU5hbWUiLCJ2YWx1ZSIsImlzVW5kZWZpbmVkRXhwcmVzc2lvbiIsInhtbCIsImVuc3VyZU1ldGFkYXRhIiwidGFyZ2V0IiwibWV0YWRhdGEiLCJwcm9wZXJ0aWVzIiwiYWdncmVnYXRpb25zIiwiZXZlbnRzIiwic3RlcmVvdHlwZSIsImRlc2lnbnRpbWUiLCJ4bWxBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVEZWZpbml0aW9uIiwicHJvcGVydHlLZXkiLCJwcm9wZXJ0eURlc2NyaXB0b3IiLCJjb25zdHJ1Y3RvciIsImRlZmF1bHRWYWx1ZSIsImluaXRpYWxpemVyIiwidG9TdHJpbmciLCJibG9ja0F0dHJpYnV0ZSIsInhtbEV2ZW50IiwidHlwZSIsImJsb2NrRXZlbnQiLCJ4bWxBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiIsImJsb2NrQWdncmVnYXRpb24iLCJSVU5USU1FX0JMT0NLUyIsImRlZmluZUJ1aWxkaW5nQmxvY2siLCJvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJjbGFzc0RlZmluaXRpb24iLCJ4bWxUYWciLCJuYW1lc3BhY2UiLCJwdWJsaWNOYW1lc3BhY2UiLCJmcmFnbWVudCIsImlzT3BlbiIsImlzUnVudGltZSIsImFwaVZlcnNpb24iLCJwcm90b3R5cGUiLCJnZXRUZW1wbGF0ZSIsIm9Ob2RlIiwiY2xhc3NOYW1lIiwiZXh0cmFQcm9wcyIsImZ1bmN0aW9uSG9sZGVyRGVmaW5pdGlvbiIsInByb3BlcnRpZXNBc3NpZ25lZFRvRnVuY3Rpb24iLCJmdW5jdGlvblN0cmluZ0luT3JkZXIiLCJwcm9wZXJ0aWVzS2V5IiwicHJvcGVydHlWYWx1ZSIsImlzQ29udGV4dCIsImdldFBhdGgiLCJwdXNoIiwibGVuZ3RoIiwiam9pbiIsImV2ZW50c0tleSIsImV2ZW50c1ZhbHVlIiwiY29yZVJlcXVpcmUiLCJnZXRBdHRyaWJ1dGUiLCJyZWdpc3RlckJ1aWxkaW5nQmxvY2siLCJYTUxQcmVwcm9jZXNzb3IiLCJwbHVnSW4iLCJCdWlsZGluZ0Jsb2NrRnJhZ21lbnQiLCJyZWdpc3RlclR5cGUiLCJsb2FkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJmcmFnbWVudE5hbWUiLCJpbml0IiwiTXlDbGFzcyIsImZyYWdtZW50Q29udGVudCIsImNsYXNzU2V0dGluZ3MiLCJmZUN1c3RvbURhdGEiLCJjdXN0b21EYXRhIiwibVByb3BlcnRpZXMiLCJmdW5jdGlvbkhvbGRlciIsInBhZ2VDb21wb25lbnQiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsImNvbnRhaW5pbmdWaWV3IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRNZXRhTW9kZWwiLCJwYWdlTW9kZWwiLCJnZXRNb2RlbCIsInNwbGl0IiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlNZXRhZGF0YSIsInBhZ2VNb2RlbENvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInZWYWx1ZSIsImJpbmRhYmxlIiwiTnVtYmVyIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJmdW5jdGlvbkluZGV4IiwiaW5kZXhPZiIsImZ1bmN0aW9uU3RyaW5nIiwidGFyZ2V0RnVuY3Rpb24iLCJmaW5kIiwiZnVuY3Rpb25EZWYiLCJfc2FwdWlfaGFuZGxlck5hbWUiLCJiaW5kIiwiZ2V0T2JqZWN0IiwiZXZlbnROYW1lIiwic3RhcnRzV2l0aCIsIk9iamVjdFBhdGgiLCJnZXQiLCJzdWJzdHJpbmciLCJnZXRDb250cm9sbGVyIiwiTWFuYWdlZE9iamVjdCIsInJ1bldpdGhQcmVwcm9jZXNzb3JzIiwicmVuZGVyZWRDb250cm9sIiwiaXNSdW50aW1lSW5zdGFudGlhdGlvbiIsInJlbmRlciIsIl9iQXN5bmMiLCJfYUNvbnRlbnQiLCJzSWQiLCJzZXR0aW5ncyIsImNvbnRyb2xTZXR0aW5ncyIsImFsbEFzc29jaWF0aW9ucyIsImdldE1ldGFkYXRhIiwiZ2V0QXNzb2NpYXRpb25zIiwiYXNzb2NpYXRpb25EZXRhaWxOYW1lIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJCdWlsZGluZ0Jsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQnVpbGRpbmdCbG9ja0ZyYWdtZW50IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrRnJhZ21lbnRcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncywgWE1MUHJvY2Vzc29yVHlwZVZhbHVlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5pbXBvcnQgeyByZWdpc3RlckJ1aWxkaW5nQmxvY2ssIHhtbCB9IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrUnVudGltZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgaXNVbmRlZmluZWRFeHByZXNzaW9uLCByZXNvbHZlQmluZGluZ1N0cmluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgeyBpc0NvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL21kYy9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VkT2JqZWN0RXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIE9iamVjdFZhbHVlMiA9IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBDb250ZXh0IHwgdW5kZWZpbmVkIHwgb2JqZWN0IHwgbnVsbDtcbnR5cGUgT2JqZWN0VmFsdWUzPFQ+ID0gVCB8IFJlY29yZDxzdHJpbmcsIFQ+IHwgVFtdO1xuZXhwb3J0IHR5cGUgT2JqZWN0VmFsdWUgPSBPYmplY3RWYWx1ZTM8T2JqZWN0VmFsdWUyIHwgUmVjb3JkPHN0cmluZywgT2JqZWN0VmFsdWUyPiB8IE9iamVjdFZhbHVlMltdPjtcblxuLy8gVHlwZSBmb3IgdGhlIGFjY2Vzc29yIGRlY29yYXRvciB0aGF0IHdlIGVuZCB1cCB3aXRoIGluIGJhYmVsLlxudHlwZSBBY2Nlc3NvckRlc2NyaXB0b3I8VD4gPSBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxUPiAmIHsgaW5pdGlhbGl6ZXI/OiAoKSA9PiBUIH07XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRXh0cmFTZXR0aW5ncyA9IHtcblx0aXNQdWJsaWM6IGJvb2xlYW47XG5cdGlzUnVudGltZUluc3RhbnRpYXRpb24/OiBib29sZWFuO1xuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcbn07XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQnVpbGRpbmcgQmxvY2tcbiAqL1xuZXhwb3J0IGNsYXNzIEJ1aWxkaW5nQmxvY2tCYXNlIHtcblx0cHJvdGVjdGVkIGlzUHVibGljID0gZmFsc2U7XG5cdHByb3RlY3RlZCBpZCE6IHN0cmluZztcblx0Y29uc3RydWN0b3Iob1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgX29Db250cm9sQ29uZmlnPzogdW5rbm93biwgX29TZXR0aW5ncz86IEJ1aWxkaW5nQmxvY2tFeHRyYVNldHRpbmdzKSB7XG5cdFx0T2JqZWN0LmtleXMob1Byb3BzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0Ly8gVGhpcyBuZWVkcyB0byBiZSBjYXN0ZWQgYXMgYW55IHNpbmNlIHdlIGFyZSBhc3NpZ25pbmcgdGhlIHByb3BlcnRpZXMgdG8gdGhlIGluc3RhbmNlIHdpdGhvdXQga25vd2luZyB0aGVpciB0eXBlXG5cdFx0XHR0aGlzW3Byb3BOYW1lIGFzIGtleW9mIHRoaXNdID0gb1Byb3BzW3Byb3BOYW1lXSBhcyBuZXZlcjtcblx0XHR9KTtcblx0fVxuXHRwdWJsaWMgZ2V0VGVtcGxhdGU/KG9Ob2RlPzogRWxlbWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogQ29udmVydCB0aGUgZ2l2ZW4gbG9jYWwgZWxlbWVudCBJRCB0byBhIGdsb2JhbGx5IHVuaXF1ZSBJRCBieSBwcmVmaXhpbmcgd2l0aCB0aGUgQnVpbGRpbmcgQmxvY2sgSUQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzdHJpbmdQYXJ0c1xuXHQgKiBAcmV0dXJucyBFaXRoZXIgdGhlIGdsb2JhbCBJRCBvciB1bmRlZmluZWQgaWYgdGhlIEJ1aWxkaW5nIEJsb2NrIGRvZXNuJ3QgaGF2ZSBhbiBJRFxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUlkKC4uLnN0cmluZ1BhcnRzOiBzdHJpbmdbXSkge1xuXHRcdC8vIElmIHRoZSBjaGlsZCBpbnN0YW5jZSBoYXMgYW4gSUQgcHJvcGVydHkgdXNlIGl0IG90aGVyd2lzZSByZXR1cm4gdW5kZWZpbmVkXG5cdFx0aWYgKHRoaXMuaWQpIHtcblx0XHRcdHJldHVybiBnZW5lcmF0ZShbdGhpcy5pZCwgLi4uc3RyaW5nUGFydHNdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHQvLyBUaGlzIGJsb2NrIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBJIGFtIG5vdCB1c2luZyB0aGVtIGZvciBub3cgLyBuZWVkIHRvIGNoYW5nZSB0aGlzIGJ1dCBzdGlsbCB3YW50IHRvIGtlZXAgdGhlbSBhcm91bmRcblx0cHJvdGVjdGVkIGdldENvbnZlcnRlckNvbnRleHQgPSBmdW5jdGlvbiAoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRjb250ZXh0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdG1TZXR0aW5nczogVGVtcGxhdGVQcm9jZXNzb3JTZXR0aW5ncyxcblx0XHRtRXh0cmFQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXHQpIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gbVNldHRpbmdzLmFwcENvbXBvbmVudDtcblx0XHRjb25zdCBvcmlnaW5hbFZpZXdEYXRhID0gbVNldHRpbmdzLm1vZGVscy52aWV3RGF0YSAmJiBtU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhLmdldERhdGEoKTtcblx0XHRsZXQgdmlld0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbFZpZXdEYXRhKTtcblx0XHRkZWxldGUgdmlld0RhdGEucmVzb3VyY2VCdW5kbGU7XG5cdFx0dmlld0RhdGEgPSBkZWVwQ2xvbmUodmlld0RhdGEpO1xuXHRcdHZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uID0gbWVyZ2Uodmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24sIG1FeHRyYVBhcmFtcyB8fCB7fSk7XG5cdFx0cmV0dXJuIENvbnZlcnRlckNvbnRleHQuY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvKFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lLFxuXHRcdFx0bVNldHRpbmdzLm1vZGVscy5tZXRhTW9kZWwsXG5cdFx0XHRvQXBwQ29tcG9uZW50ICYmIG9BcHBDb21wb25lbnQuZ2V0RGlhZ25vc3RpY3MoKSxcblx0XHRcdG1lcmdlLFxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0XHR2aWV3RGF0YVxuXHRcdCk7XG5cdH07XG5cdHB1YmxpYyBnZXRQcm9wZXJ0aWVzKCkge1xuXHRcdGNvbnN0IGFsbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE9iamVjdFZhbHVlPiA9IHt9O1xuXHRcdGZvciAoY29uc3Qgb0luc3RhbmNlS2V5IGluIHRoaXMpIHtcblx0XHRcdGlmICh0aGlzLmhhc093blByb3BlcnR5KG9JbnN0YW5jZUtleSkpIHtcblx0XHRcdFx0YWxsUHJvcGVydGllc1tvSW5zdGFuY2VLZXldID0gdGhpc1tvSW5zdGFuY2VLZXldIGFzIHVua25vd24gYXMgT2JqZWN0VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBhbGxQcm9wZXJ0aWVzO1xuXHR9XG5cdHN0YXRpYyByZWdpc3RlcigpIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXHRzdGF0aWMgdW5yZWdpc3RlcigpIHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZW5cblx0fVxuXHRwdWJsaWMgYWRkQ29uZGl0aW9uYWxseShjb25kaXRpb246IGJvb2xlYW4sIHBhcnRUb0FkZDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRyZXR1cm4gcGFydFRvQWRkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cdH1cblx0cHJvdGVjdGVkIGF0dHIoYXR0cmlidXRlTmFtZTogc3RyaW5nLCB2YWx1ZT86IFhNTFByb2Nlc3NvclR5cGVWYWx1ZSk6ICgpID0+IHN0cmluZyB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWlzVW5kZWZpbmVkRXhwcmVzc2lvbih2YWx1ZSkpIHtcblx0XHRcdHJldHVybiAoKSA9PiB4bWxgJHthdHRyaWJ1dGVOYW1lfT1cIiR7dmFsdWV9XCJgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gKCkgPT4gXCJcIjtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBydW50aW1lIGJ1aWxkaW5nIGJsb2Nrc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGV4dGVuZHMgQnVpbGRpbmdCbG9ja0Jhc2Uge1xuXHRyZW5kZXIoY29udGFpbmluZ1ZpZXc6IFZpZXcsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogQ29udHJvbDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbiA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRpc1B1YmxpYz86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGNvbXB1dGVkPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRiaW5kYWJsZT86IGJvb2xlYW47IC8vIG9ubHkgY29uc2lkZXJlZCBmb3IgcnVudGltZSBidWlsZGluZyBibG9ja3Ncblx0JGtpbmQ/OiBzdHJpbmdbXTtcblx0JFR5cGU/OiBzdHJpbmdbXTtcblx0dmFsaWRhdGU/OiBGdW5jdGlvbjsgLy8gZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gdmFsaWRhdGUgb3IgdHJhbnNmb3JtIHRoZSBnaXZlbiBpbnB1dFxufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGlzUHVibGljPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRjb21wdXRlZD86IGJvb2xlYW47XG5cdCRUeXBlPzogc3RyaW5nW107XG5cdCRraW5kPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgQnVpbGRpbmdCbG9ja0V2ZW50ID0ge307XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uID0ge1xuXHRpc1B1YmxpYz86IGJvb2xlYW47XG5cdHR5cGU6IHN0cmluZztcblx0c2xvdD86IHN0cmluZztcblx0aXNEZWZhdWx0PzogYm9vbGVhbjtcblxuXHQvLyBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIGJhc2VkIG9uIGFjdHVhbCBub2RlIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBvciBvbmx5IG9uIFhNTCB0aGF0IHdpbGwgYmUgaW50ZXJwcmV0ZWRcblx0aGFzVmlydHVhbE5vZGU/OiBib29sZWFuO1xuXHRwcm9jZXNzQWdncmVnYXRpb25zPzogRnVuY3Rpb247XG59O1xudHlwZSBDb21tb25CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiA9IHtcblx0bmFtZXNwYWNlOiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0eG1sVGFnPzogc3RyaW5nO1xuXHRmcmFnbWVudD86IHN0cmluZztcblx0cHVibGljTmFtZXNwYWNlPzogc3RyaW5nO1xuXHRkZXNpZ250aW1lPzogc3RyaW5nO1xuXHRpc1J1bnRpbWU/OiBib29sZWFuO1xuXHRpc09wZW4/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjIgPSBDb21tb25CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiAmXG5cdChuZXcgKCkgPT4gQnVpbGRpbmdCbG9ja0Jhc2UpICZcblx0dHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlICYge1xuXHRcdGFwaVZlcnNpb246IDI7XG5cdFx0Z2V0VGVtcGxhdGU/OiBGdW5jdGlvbjtcblx0XHRtZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xuXHR9O1xuXG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxID0gQ29tbW9uQnVpbGRpbmdCbG9ja0RlZmluaXRpb24gJiB7XG5cdG5hbWU6IHN0cmluZztcblx0YXBpVmVyc2lvbj86IDE7XG5cdGNyZWF0ZT86IEZ1bmN0aW9uO1xuXHRnZXRUZW1wbGF0ZT86IEZ1bmN0aW9uO1xuXHRtZXRhZGF0YTogQnVpbGRpbmdCbG9ja01ldGFkYXRhO1xufTtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uID0gQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMiB8IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjE7XG5leHBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEgPSB7XG5cdGV2ZW50czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0V2ZW50Pjtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj47XG5cdHN0ZXJlb3R5cGU/OiBzdHJpbmc7XG5cdGRlc2lnbnRpbWU/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBlbnN1cmVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQ6IFBhcnRpYWw8QnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMj4pOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRpZiAoIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShcIm1ldGFkYXRhXCIpKSB7XG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID0gZGVlcENsb25lKFxuXHRcdFx0dGFyZ2V0Lm1ldGFkYXRhIHx8IHtcblx0XHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRcdGV2ZW50czoge30sXG5cdFx0XHRcdHN0ZXJlb3R5cGU6IFwieG1sbWFjcm9cIixcblx0XHRcdFx0ZGVzaWdudGltZTogXCJcIlxuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHRhcmdldC5tZXRhZGF0YSBhcyBCdWlsZGluZ0Jsb2NrTWV0YWRhdGE7XG59O1xuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0eSBzaGFsbCBiZSBkZWNsYXJlZCBhcyBhbiB4bWwgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgZnJvbSB0aGUgb3V0c2lkZSBvZiB0aGUgYnVpbGRpbmcgYmxvY2suXG4gKlxuICogSWYgZGVmaW5pbmcgYSBydW50aW1lIEJ1aWxkaW5nIEJsb2NrLCBwbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSB0aGUgY29ycmVjdCB0eXBpbmdzOiBEZXBlbmRpbmcgb24gaXRzIG1ldGFkYXRhLFxuICogYSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGEge0BsaW5rIHNhcC51aS5tb2RlbC5Db250ZXh0fSAoPGNvZGU+dHlwZTogJ3NhcC51aS5tb2RlbC5Db250ZXh0JzwvY29kZT4pLFxuICogYSBjb25zdGFudCAoPGNvZGU+YmluZGFibGU6IGZhbHNlPC9jb2RlPiksIG9yIGEge0BsaW5rIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbn0gKDxjb2RlPmJpbmRhYmxlOiB0cnVlPC9jb2RlPikuXG4gKlxuICogQHBhcmFtIGF0dHJpYnV0ZURlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhtbEF0dHJpYnV0ZShhdHRyaWJ1dGVEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogQnVpbGRpbmdCbG9ja0Jhc2UsIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBTeW1ib2wsIHByb3BlcnR5RGVzY3JpcHRvcjogQWNjZXNzb3JEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBubyBkZWZhdWx0VmFsdWUgd2UgY2FuIHRha2UgdGhlIHZhbHVlIGZyb20gdGhlIGluaXRpYWxpemVyIChuYXR1cmFsIHdheSBvZiBkZWZpbmluZyBkZWZhdWx0cylcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID0gcHJvcGVydHlEZXNjcmlwdG9yLmluaXRpYWxpemVyPy4oKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci5pbml0aWFsaXplcjtcblx0XHRpZiAobWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIE5lZWRlZCB0byBtYWtlIFRTIGhhcHB5IHdpdGggdGhvc2UgZGVjb3JhdG9ycztcbn1cbmV4cG9ydCBmdW5jdGlvbiBibG9ja0F0dHJpYnV0ZShhdHRyaWJ1dGVEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sQXR0cmlidXRlKGF0dHJpYnV0ZURlZmluaXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24geG1sRXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogQnVpbGRpbmdCbG9ja0Jhc2UsIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBTeW1ib2wsIHByb3BlcnR5RGVzY3JpcHRvcjogQWNjZXNzb3JEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3IuaW5pdGlhbGl6ZXI7XG5cdFx0aWYgKG1ldGFkYXRhLmV2ZW50c1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7IHR5cGU6IFwiRnVuY3Rpb25cIiB9O1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gTmVlZGVkIHRvIG1ha2UgVFMgaGFwcHkgd2l0aCB0aG9zZSBkZWNvcmF0b3JzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrRXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sRXZlbnQoKTtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIHByb3BlcnR5IHNoYWxsIGJlIGRlY2xhcmVkIGFzIGFuIHhtbCBhZ2dyZWdhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZyb20gdGhlIG91dHNpZGUgb2YgdGhlIGJ1aWxkaW5nIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhtbEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IEJ1aWxkaW5nQmxvY2tCYXNlLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IEFjY2Vzc29yRGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLmluaXRpYWxpemVyO1xuXHRcdGlmIChtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG1ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twcm9wZXJ0eUtleV0gPSBhZ2dyZWdhdGlvbkRlZmluaXRpb247XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrQWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4geG1sQWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uKTtcbn1cbmNvbnN0IFJVTlRJTUVfQkxPQ0tTOiBSZWNvcmQ8c3RyaW5nLCBSdW50aW1lQnVpbGRpbmdCbG9jayAmIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjI+ID0ge307XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQnVpbGRpbmdCbG9jayhvQnVpbGRpbmdCbG9ja0RlZmluaXRpb246IENvbW1vbkJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNsYXNzRGVmaW5pdGlvbjogUGFydGlhbDxCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYyPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEoY2xhc3NEZWZpbml0aW9uKTtcblx0XHRtZXRhZGF0YS5kZXNpZ250aW1lID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmRlc2lnbnRpbWU7XG5cdFx0Y2xhc3NEZWZpbml0aW9uLnhtbFRhZyA9IG9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5uYW1lc3BhY2UgPSBvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UgPSBvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlO1xuXHRcdGNsYXNzRGVmaW5pdGlvbi5mcmFnbWVudCA9IG9CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5mcmFnbWVudDtcblx0XHRjbGFzc0RlZmluaXRpb24uaXNPcGVuID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzT3Blbjtcblx0XHRjbGFzc0RlZmluaXRpb24uaXNSdW50aW1lID0gb0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzUnVudGltZTtcblx0XHRjbGFzc0RlZmluaXRpb24uYXBpVmVyc2lvbiA9IDI7XG5cdFx0aWYgKGNsYXNzRGVmaW5pdGlvbi5pc1J1bnRpbWUgPT09IHRydWUpIHtcblx0XHRcdGNsYXNzRGVmaW5pdGlvbi5wcm90b3R5cGUuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbiAob05vZGU6IEVsZW1lbnQpIHtcblx0XHRcdFx0Y29uc3QgY2xhc3NOYW1lID0gYCR7b0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtvQnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gO1xuXHRcdFx0XHRjb25zdCBleHRyYVByb3BzID0gW107XG5cdFx0XHRcdC8vIEZ1bmN0aW9uIGFyZSBkZWZpbmVkIGFzIHN0cmluZyBidXQgbmVlZCB0byBiZSByZXNvbHZlZCBieSBVSTUsIGFzIHN1Y2ggd2Ugc3RvcmUgdGhlbSBpbiBhbiBgZXZlbnRgIHByb3BlcnR5IGFuZCB3aWxsIHJlZGlzcGF0Y2ggdGhlbSBsYXRlclxuXHRcdFx0XHRjb25zdCBmdW5jdGlvbkhvbGRlckRlZmluaXRpb24gPSBbXTtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0Fzc2lnbmVkVG9GdW5jdGlvbiA9IFtdO1xuXHRcdFx0XHRjb25zdCBmdW5jdGlvblN0cmluZ0luT3JkZXIgPSBbXTtcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0aWVzS2V5IGluIG1ldGFkYXRhLnByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRsZXQgcHJvcGVydHlWYWx1ZSA9IHRoaXNbcHJvcGVydGllc0tleV07XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0eVZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXNDb250ZXh0KHByb3BlcnR5VmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnRpZXNLZXldLnR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdFx0XHRmdW5jdGlvbkhvbGRlckRlZmluaXRpb24ucHVzaChwcm9wZXJ0eVZhbHVlKTtcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb25TdHJpbmdJbk9yZGVyLnB1c2gocHJvcGVydHlWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnRpZXNBc3NpZ25lZFRvRnVuY3Rpb24ucHVzaChwcm9wZXJ0aWVzS2V5KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGV4dHJhUHJvcHMucHVzaCh4bWxgZmVCQjoke3Byb3BlcnRpZXNLZXl9PVwiJHtwcm9wZXJ0eVZhbHVlIGFzIFhNTFByb2Nlc3NvclR5cGVWYWx1ZX1cImApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZnVuY3Rpb25Ib2xkZXJEZWZpbml0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRleHRyYVByb3BzLnB1c2goeG1sYGZ1bmN0aW9uSG9sZGVyPVwiJHtmdW5jdGlvbkhvbGRlckRlZmluaXRpb24uam9pbihcIjtcIil9XCJgKTtcblx0XHRcdFx0XHRleHRyYVByb3BzLnB1c2goeG1sYGZlQkI6ZnVuY3Rpb25TdHJpbmdJbk9yZGVyPVwiJHtmdW5jdGlvblN0cmluZ0luT3JkZXIuam9pbihcIixcIil9XCJgKTtcblx0XHRcdFx0XHRleHRyYVByb3BzLnB1c2goeG1sYGZlQkI6cHJvcGVydGllc0Fzc2lnbmVkVG9GdW5jdGlvbj1cIiR7cHJvcGVydGllc0Fzc2lnbmVkVG9GdW5jdGlvbi5qb2luKFwiLFwiKX1cImApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgZXZlbnRzS2V5IGluIG1ldGFkYXRhLmV2ZW50cykge1xuXHRcdFx0XHRcdGNvbnN0IGV2ZW50c1ZhbHVlID0gdGhpc1tldmVudHNLZXldO1xuXHRcdFx0XHRcdGlmIChldmVudHNWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRleHRyYVByb3BzLnB1c2goeG1sYGZlQkI6JHtldmVudHNLZXl9PVwiJHtldmVudHNWYWx1ZSBhcyBYTUxQcm9jZXNzb3JUeXBlVmFsdWV9XCJgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gY29yZTpyZXF1aXJlIG5lZWQgdG8gYmUgZGVmaW5lZCBvbiB0aGUgbm9kZSBpdHNlbGYgdG8gYmUgcGlja2VkIHVwIGR1ZSB0byB0aGUgdGVtcGxhdGluZyBzdGVwXG5cdFx0XHRcdGNvbnN0IGNvcmVSZXF1aXJlID0gb05vZGUuZ2V0QXR0cmlidXRlKFwiY29yZTpyZXF1aXJlXCIpIHx8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKGNvcmVSZXF1aXJlKSB7XG5cdFx0XHRcdFx0ZXh0cmFQcm9wcy5wdXNoKHhtbGBjb3JlOnJlcXVpcmU9XCIke2NvcmVSZXF1aXJlfVwiYCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHhtbGA8ZmVCQjpCdWlsZGluZ0Jsb2NrRnJhZ21lbnRcblx0XHRcdFx0XHR4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIlxuXHRcdFx0XHRcdHhtbG5zOmZlQkI9XCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrc1wiXG5cdFx0XHRcdFx0ZnJhZ21lbnROYW1lPVwiJHtjbGFzc05hbWV9XCJcblxuXHRcdFx0XHRcdGlkPVwie3RoaXM+aWR9XCJcblx0XHRcdFx0XHR0eXBlPVwiRkVfQ09NUE9ORU5UU1wiXG5cdFx0XHRcdFx0JHtleHRyYVByb3BzfVxuXHRcdFx0XHQ+XG5cdFx0XHRcdDwvZmVCQjpCdWlsZGluZ0Jsb2NrRnJhZ21lbnQ+YDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y2xhc3NEZWZpbml0aW9uLnJlZ2lzdGVyID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGNsYXNzRGVmaW5pdGlvbiBhcyBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYyKTtcblx0XHRcdGlmIChjbGFzc0RlZmluaXRpb24uaXNSdW50aW1lID09PSB0cnVlKSB7XG5cdFx0XHRcdFJVTlRJTUVfQkxPQ0tTW2Ake29CdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2V9LiR7b0J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YF0gPVxuXHRcdFx0XHRcdGNsYXNzRGVmaW5pdGlvbiBhcyBSdW50aW1lQnVpbGRpbmdCbG9jayAmIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjI7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjbGFzc0RlZmluaXRpb24udW5yZWdpc3RlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgY2xhc3NEZWZpbml0aW9uLm5hbWVzcGFjZSwgY2xhc3NEZWZpbml0aW9uLm5hbWUpO1xuXHRcdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBjbGFzc0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlLCBjbGFzc0RlZmluaXRpb24ubmFtZSk7XG5cdFx0fTtcblx0fTtcbn1cbnR5cGUgRnJhZ21lbnRDdXN0b21EYXRhID0ge1xuXHRtUHJvcGVydGllczoge1xuXHRcdHZhbHVlOiB7XG5cdFx0XHRcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzXCI/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHRcdH07XG5cdH07XG59O1xudHlwZSBGRUNvbXBvbmVudEZyYWdtZW50U2V0dGluZ3MgPSB7XG5cdGZyYWdtZW50TmFtZTogc3RyaW5nO1xuXHRmcmFnbWVudENvbnRlbnQ/OiBSdW50aW1lQnVpbGRpbmdCbG9jayAmIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjI7XG5cdGNvbnRhaW5pbmdWaWV3OiBWaWV3O1xuXHRjdXN0b21EYXRhPzogRnJhZ21lbnRDdXN0b21EYXRhW107XG5cdGZ1bmN0aW9uSG9sZGVyPzogRnVuY3Rpb25XaXRoSGFuZGxlcltdW107XG59O1xuXG50eXBlIEZ1bmN0aW9uV2l0aEhhbmRsZXIgPSBGdW5jdGlvbiAmIHtcblx0X3NhcHVpX2hhbmRsZXJOYW1lPzogc3RyaW5nO1xufTtcbnR5cGUgRnJhZ21lbnRXaXRoSW50ZXJuYWxzID0ge1xuXHRfYkFzeW5jOiBib29sZWFuO1xuXHRfYUNvbnRlbnQ6IENvbnRyb2wgfCBDb250cm9sW107XG59O1xuQnVpbGRpbmdCbG9ja0ZyYWdtZW50LnJlZ2lzdGVyVHlwZShcIkZFX0NPTVBPTkVOVFNcIiwge1xuXHRsb2FkOiBhc3luYyBmdW5jdGlvbiAobVNldHRpbmdzOiBGRUNvbXBvbmVudEZyYWdtZW50U2V0dGluZ3MpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFJVTlRJTUVfQkxPQ0tTW21TZXR0aW5ncy5mcmFnbWVudE5hbWVdKTtcblx0fSxcblx0aW5pdDogZnVuY3Rpb24gKHRoaXM6IEZyYWdtZW50V2l0aEludGVybmFscywgbVNldHRpbmdzOiBGRUNvbXBvbmVudEZyYWdtZW50U2V0dGluZ3MpIHtcblx0XHRsZXQgTXlDbGFzcyA9IG1TZXR0aW5ncy5mcmFnbWVudENvbnRlbnQ7XG5cdFx0aWYgKCFNeUNsYXNzKSB7XG5cdFx0XHQvLyBJbiBzb21lIGNhc2Ugd2UgbWlnaHQgaGF2ZSBiZWVuIGNhbGxlZCBoZXJlIHN5bmNocm9ub3VzbHkgKHVuc3Rhc2ggY2FzZSBmb3IgaW5zdGFuY2UpLCB3aGljaCBtZWFucyB3ZSBkaWRuJ3QgZ28gdGhyb3VnaCB0aGUgbG9hZCBmdW5jdGlvblxuXHRcdFx0TXlDbGFzcyA9IFJVTlRJTUVfQkxPQ0tTW21TZXR0aW5ncy5mcmFnbWVudE5hbWVdO1xuXHRcdH1cblx0XHRjb25zdCBjbGFzc1NldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdGNvbnN0IGZlQ3VzdG9tRGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IG1TZXR0aW5ncz8uY3VzdG9tRGF0YT8uWzBdPy5tUHJvcGVydGllcz8udmFsdWU/LltcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzXCJdIHx8IHt9O1xuXHRcdGRlbGV0ZSBtU2V0dGluZ3MuY3VzdG9tRGF0YTtcblx0XHRjb25zdCBmdW5jdGlvbkhvbGRlcjogRnVuY3Rpb25XaXRoSGFuZGxlcltdW10gPSBtU2V0dGluZ3MuZnVuY3Rpb25Ib2xkZXIgPz8gW107XG5cdFx0ZGVsZXRlIG1TZXR0aW5ncy5mdW5jdGlvbkhvbGRlcjtcblx0XHRjb25zdCBwYWdlQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG1TZXR0aW5ncy5jb250YWluaW5nVmlldykgYXMgVGVtcGxhdGVDb21wb25lbnQ7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG1TZXR0aW5ncy5jb250YWluaW5nVmlldyk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gYXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHBhZ2VNb2RlbCA9IHBhZ2VDb21wb25lbnQuZ2V0TW9kZWwoXCJfcGFnZU1vZGVsXCIpO1xuXG5cdFx0Y29uc3QgZnVuY3Rpb25TdHJpbmdJbk9yZGVyOiBzdHJpbmdbXSA9IGZlQ3VzdG9tRGF0YS5mdW5jdGlvblN0cmluZ0luT3JkZXI/LnNwbGl0KFwiLFwiKTtcblx0XHRjb25zdCBwcm9wZXJ0aWVzQXNzaWduZWRUb0Z1bmN0aW9uOiBzdHJpbmdbXSA9IGZlQ3VzdG9tRGF0YS5wcm9wZXJ0aWVzQXNzaWduZWRUb0Z1bmN0aW9uPy5zcGxpdChcIixcIik7XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gTXlDbGFzcy5tZXRhZGF0YS5wcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU1ldGFkYXRhID0gTXlDbGFzcy5tZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRjb25zdCBwYWdlTW9kZWxDb250ZXh0ID0gcGFnZU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGZlQ3VzdG9tRGF0YVtwcm9wZXJ0eU5hbWVdKTtcblxuXHRcdFx0aWYgKHBhZ2VNb2RlbENvbnRleHQgPT09IG51bGwpIHtcblx0XHRcdFx0Ly8gdmFsdWUgY2Fubm90IGJlIHJlc29sdmVkLCBzbyBpdCBpcyBlaXRoZXIgYSBydW50aW1lIGJpbmRpbmcgb3IgYSBjb25zdGFudFxuXHRcdFx0XHRsZXQgdlZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI+ID0gZmVDdXN0b21EYXRhW3Byb3BlcnR5TmFtZV07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiB2VmFsdWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlNZXRhZGF0YS5iaW5kYWJsZSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Ly8gcnVudGltZSBiaW5kaW5ncyBhcmUgbm90IGFsbG93ZWQsIHNvIGNvbnZlcnQgc3RyaW5ncyBpbnRvIGFjdHVhbCBwcmltaXRpdmUgdHlwZXNcblx0XHRcdFx0XHRcdHN3aXRjaCAocHJvcGVydHlNZXRhZGF0YS50eXBlKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdFx0XHRcdFx0dlZhbHVlID0gdlZhbHVlID09PSBcInRydWVcIjtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0XHRcdFx0XHRcdHZWYWx1ZSA9IE51bWJlcih2VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBydW50aW1lIGJpbmRpbmdzIGFyZSBhbGxvd2VkLCBzbyByZXNvbHZlIHRoZSB2YWx1ZXMgYXMgQmluZGluZ1Rvb2xraXQgZXhwcmVzc2lvbnNcblx0XHRcdFx0XHRcdHZWYWx1ZSA9IHJlc29sdmVCaW5kaW5nU3RyaW5nKHZWYWx1ZSwgcHJvcGVydHlNZXRhZGF0YS50eXBlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHlNZXRhZGF0YS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRjb25zdCBmdW5jdGlvbkluZGV4ID0gcHJvcGVydGllc0Fzc2lnbmVkVG9GdW5jdGlvbi5pbmRleE9mKHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0Y29uc3QgZnVuY3Rpb25TdHJpbmcgPSBmdW5jdGlvblN0cmluZ0luT3JkZXJbZnVuY3Rpb25JbmRleF07XG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0RnVuY3Rpb24gPSBmdW5jdGlvbkhvbGRlcj8uZmluZCgoZnVuY3Rpb25EZWYpID0+IGZ1bmN0aW9uRGVmWzBdPy5fc2FwdWlfaGFuZGxlck5hbWUgPT09IGZ1bmN0aW9uU3RyaW5nKTtcblx0XHRcdFx0XHQvLyBXZSB1c2UgdGhlIF9zYXB1aV9oYW5kbGVyTmFtZSB0byBpZGVudGlmeSB3aGljaCBmdW5jdGlvbiBpcyB0aGUgb25lIHdlIHdhbnQgdG8gYmluZCBoZXJlXG5cdFx0XHRcdFx0aWYgKHRhcmdldEZ1bmN0aW9uICYmIHRhcmdldEZ1bmN0aW9uLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdHZWYWx1ZSA9IHRhcmdldEZ1bmN0aW9uWzBdLmJpbmQodGFyZ2V0RnVuY3Rpb25bMV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNsYXNzU2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IHZWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAocGFnZU1vZGVsQ29udGV4dC5nZXRPYmplY3QoKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIGdldCB2YWx1ZSBmcm9tIHBhZ2UgbW9kZWxcblx0XHRcdFx0Y2xhc3NTZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gcGFnZU1vZGVsQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGJpbmQgdG8gbWV0YW1vZGVsXG5cdFx0XHRcdGNsYXNzU2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChmZUN1c3RvbURhdGFbcHJvcGVydHlOYW1lXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZXZlbnROYW1lIGluIE15Q2xhc3MubWV0YWRhdGEuZXZlbnRzKSB7XG5cdFx0XHRpZiAoZmVDdXN0b21EYXRhW2V2ZW50TmFtZV0gIT09IHVuZGVmaW5lZCAmJiBmZUN1c3RvbURhdGFbZXZlbnROYW1lXS5zdGFydHNXaXRoKFwiLlwiKSkge1xuXHRcdFx0XHRjbGFzc1NldHRpbmdzW2V2ZW50TmFtZV0gPSBPYmplY3RQYXRoLmdldChmZUN1c3RvbURhdGFbZXZlbnROYW1lXS5zdWJzdHJpbmcoMSksIG1TZXR0aW5ncy5jb250YWluaW5nVmlldy5nZXRDb250cm9sbGVyKCkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xhc3NTZXR0aW5nc1tldmVudE5hbWVdID0gXCJcIjsgLy8gRm9yIG5vdywgbWlnaHQgbmVlZCB0byByZXNvbHZlIG1vcmUgc3R1ZmZcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIChNYW5hZ2VkT2JqZWN0IGFzIHVua25vd24gYXMgTWFuYWdlZE9iamVjdEV4KS5ydW5XaXRoUHJlcHJvY2Vzc29ycyhcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0Y29uc3QgcmVuZGVyZWRDb250cm9sID0gKFxuXHRcdFx0XHRcdG5ldyBNeUNsYXNzIShcblx0XHRcdFx0XHRcdGNsYXNzU2V0dGluZ3MsXG5cdFx0XHRcdFx0XHR7fSxcblx0XHRcdFx0XHRcdHsgaXNSdW50aW1lSW5zdGFudGlhdGlvbjogdHJ1ZSwgaXNQdWJsaWM6IGZhbHNlLCBhcHBDb21wb25lbnQ6IGFwcENvbXBvbmVudCB9XG5cdFx0XHRcdFx0KSBhcyBSdW50aW1lQnVpbGRpbmdCbG9ja1xuXHRcdFx0XHQpLnJlbmRlcihtU2V0dGluZ3MuY29udGFpbmluZ1ZpZXcsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdGlmICghdGhpcy5fYkFzeW5jKSB7XG5cdFx0XHRcdFx0dGhpcy5fYUNvbnRlbnQgPSByZW5kZXJlZENvbnRyb2w7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlbmRlcmVkQ29udHJvbDtcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGlkOiBmdW5jdGlvbiAoc0lkOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm4gbVNldHRpbmdzLmNvbnRhaW5pbmdWaWV3LmNyZWF0ZUlkKHNJZCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldHRpbmdzOiBmdW5jdGlvbiAoY29udHJvbFNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBNYW5hZ2VkT2JqZWN0Pikge1xuXHRcdFx0XHRcdGNvbnN0IGFsbEFzc29jaWF0aW9ucyA9IHRoaXMuZ2V0TWV0YWRhdGEoKS5nZXRBc3NvY2lhdGlvbnMoKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGFzc29jaWF0aW9uRGV0YWlsTmFtZSBvZiBPYmplY3Qua2V5cyhhbGxBc3NvY2lhdGlvbnMpKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhc3NvY2lhdGlvbkRldGFpbE5hbWUpICYmXG5cdFx0XHRcdFx0XHRcdCEoY29udHJvbFNldHRpbmdzW2Fzc29jaWF0aW9uRGV0YWlsTmFtZV0gaW5zdGFuY2VvZiBNYW5hZ2VkT2JqZWN0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xTZXR0aW5nc1thc3NvY2lhdGlvbkRldGFpbE5hbWVdID0gbVNldHRpbmdzLmNvbnRhaW5pbmdWaWV3LmNyZWF0ZUlkKFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRyb2xTZXR0aW5nc1thc3NvY2lhdGlvbkRldGFpbE5hbWVdIGFzIHN0cmluZ1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gY29udHJvbFNldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7RUFtQ0E7QUFDQTtBQUNBO0VBRkEsSUFHYUEsaUJBQWlCO0lBRzdCLDJCQUFZQyxNQUErQixFQUFFQyxlQUF5QixFQUFFQyxVQUF1QyxFQUFFO01BQUE7TUFBQSxLQUZ2R0MsUUFBUSxHQUFHLEtBQUs7TUFBQSxLQXdCaEJDLG1CQUFtQixHQUFHLFVBQy9CQyxtQkFBd0MsRUFDeENDLFdBQStCLEVBQy9CQyxTQUFvQyxFQUNwQ0MsWUFBc0MsRUFDckM7UUFDRCxJQUFNQyxhQUFhLEdBQUdGLFNBQVMsQ0FBQ0csWUFBWTtRQUM1QyxJQUFNQyxnQkFBZ0IsR0FBR0osU0FBUyxDQUFDSyxNQUFNLENBQUNDLFFBQVEsSUFBSU4sU0FBUyxDQUFDSyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsT0FBTyxFQUFFO1FB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