@sap/open.fe 1.98.0 → 1.99.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 (916) hide show
  1. package/package.json +1 -1
  2. package/packages/sap.fe.common/src/sap/fe/common/.library +1 -1
  3. package/packages/sap.fe.common/src/sap/fe/common/.theming +1 -1
  4. package/packages/sap.fe.common/src/sap/fe/common/MessageButton-dbg.js +10 -8
  5. package/packages/sap.fe.common/src/sap/fe/common/MessageButton.js +1 -1
  6. package/packages/sap.fe.common/src/sap/fe/common/library-dbg.js +1 -1
  7. package/packages/sap.fe.common/src/sap/fe/common/library-h2-preload.js +2 -2
  8. package/packages/sap.fe.common/src/sap/fe/common/library-preload.js +3 -3
  9. package/packages/sap.fe.common/src/sap/fe/common/library-preload.js.map +3 -3
  10. package/packages/sap.fe.common/src/sap/fe/common/library.js +1 -1
  11. package/packages/sap.fe.common/src/sap/fe/common/manifest.json +3 -3
  12. package/packages/sap.fe.common/src/sap/fe/common/resources.json +4 -4
  13. package/packages/sap.fe.common/test/sap/fe/common/designtime/api.json +1 -1
  14. package/packages/sap.fe.common/test/sap/fe/common/designtime/apiref/api.json +1 -1
  15. package/packages/sap.fe.common/test/sap/fe/common/designtime/codeassistance/Library.xmlmeta.json +1 -1
  16. package/packages/sap.fe.common/test/sap/fe/common/relnotes/changes-1.99.json +18 -0
  17. package/packages/sap.fe.core/src/sap/fe/core/.library +1 -1
  18. package/packages/sap.fe.core/src/sap/fe/core/.theming +1 -1
  19. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper-dbg.js +376 -405
  20. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper.js +2 -3
  21. package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper.ts +385 -0
  22. package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler-dbg.js +228 -181
  23. package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler.js +2 -3
  24. package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler.ts +171 -0
  25. package/packages/sap.fe.core/src/sap/fe/core/BusyLocker-dbg.js +104 -121
  26. package/packages/sap.fe.core/src/sap/fe/core/BusyLocker.js +2 -3
  27. package/packages/sap.fe.core/src/sap/fe/core/BusyLocker.ts +98 -0
  28. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils-dbg.js +2072 -2399
  29. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils.js +2 -3
  30. package/packages/sap.fe.core/src/sap/fe/core/CommonUtils.ts +2078 -0
  31. package/packages/sap.fe.core/src/sap/fe/core/PageController-dbg.js +83 -125
  32. package/packages/sap.fe.core/src/sap/fe/core/PageController.js +2 -3
  33. package/packages/sap.fe.core/src/sap/fe/core/PageController.ts +101 -0
  34. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy-dbg.js +985 -823
  35. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy.js +2 -3
  36. package/packages/sap.fe.core/src/sap/fe/core/RouterProxy.ts +838 -0
  37. package/packages/sap.fe.core/src/sap/fe/core/Synchronization-dbg.js +50 -35
  38. package/packages/sap.fe.core/src/sap/fe/core/Synchronization.js +2 -3
  39. package/packages/sap.fe.core/src/sap/fe/core/Synchronization.ts +29 -0
  40. package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent-dbg.js +172 -164
  41. package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent.js +2 -3
  42. package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent.ts +166 -0
  43. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel-dbg.js +96 -54
  44. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel.js +2 -3
  45. package/packages/sap.fe.core/src/sap/fe/core/TemplateModel.ts +63 -0
  46. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper-dbg.js +1575 -1664
  47. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper.js +2 -3
  48. package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper.ts +1706 -0
  49. package/packages/sap.fe.core/src/sap/fe/core/actions/draft-dbg.js +558 -608
  50. package/packages/sap.fe.core/src/sap/fe/core/actions/draft.js +2 -3
  51. package/packages/sap.fe.core/src/sap/fe/core/actions/draft.ts +593 -0
  52. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling-dbg.js +544 -514
  53. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling.js +2 -3
  54. package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling.ts +532 -0
  55. package/packages/sap.fe.core/src/sap/fe/core/actions/nonDraft-dbg.js +16 -19
  56. package/packages/sap.fe.core/src/sap/fe/core/actions/nonDraft.js +2 -3
  57. package/packages/sap.fe.core/src/sap/fe/core/actions/nonDraft.ts +12 -0
  58. package/packages/sap.fe.core/src/sap/fe/core/actions/operations-dbg.js +1073 -1215
  59. package/packages/sap.fe.core/src/sap/fe/core/actions/operations.js +2 -3
  60. package/packages/sap.fe.core/src/sap/fe/core/actions/operations.ts +1162 -0
  61. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky-dbg.js +101 -105
  62. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky.js +2 -3
  63. package/packages/sap.fe.core/src/sap/fe/core/actions/sticky.ts +102 -0
  64. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +51 -209
  65. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
  66. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +276 -9
  67. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow.js +1 -1
  68. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +5 -4
  69. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
  70. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +44 -43
  71. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
  72. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +2 -3
  73. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
  74. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
  75. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +98 -6
  76. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
  77. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +14 -6
  78. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler.js +1 -1
  79. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady-dbg.js +2 -2
  80. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
  81. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  82. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing-dbg.js +6 -2
  83. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing.js +1 -1
  84. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +3 -3
  85. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  86. package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
  87. package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper-dbg.js +8 -20
  88. package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper.js +1 -1
  89. package/packages/sap.fe.core/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  90. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +2 -2
  91. package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  92. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext-dbg.js +2 -2
  93. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext.js +1 -1
  94. package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext.ts +4 -3
  95. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -1
  96. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
  97. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper-dbg.js +39 -26
  98. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
  99. package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
  100. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter-dbg.js +11 -8
  101. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
  102. package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
  103. package/packages/sap.fe.core/src/sap/fe/core/converters/TemplateConverter-dbg.js +1 -1
  104. package/packages/sap.fe.core/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  105. package/packages/sap.fe.core/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +17 -13
  106. package/packages/sap.fe.core/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
  107. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Action-dbg.js +2 -2
  108. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
  109. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Action.ts +2 -2
  110. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +5 -3
  111. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
  112. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  113. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +3 -3
  114. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
  115. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  116. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form-dbg.js +4 -2
  117. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form.js +1 -1
  118. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
  119. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table-dbg.js +250 -146
  120. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
  121. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
  122. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +115 -56
  123. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
  124. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
  125. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +467 -32
  126. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
  127. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
  128. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +6 -6
  129. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
  130. package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
  131. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +13 -5
  132. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
  133. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
  134. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +4 -1
  135. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
  136. package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
  137. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +4 -4
  138. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
  139. package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  140. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +13 -6
  141. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
  142. package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  143. package/packages/sap.fe.core/src/sap/fe/core/formatters/CriticalityFormatter-dbg.js +1 -1
  144. package/packages/sap.fe.core/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  145. package/packages/sap.fe.core/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
  146. package/packages/sap.fe.core/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  147. package/packages/sap.fe.core/src/sap/fe/core/formatters/KPIFormatter-dbg.js +1 -1
  148. package/packages/sap.fe.core/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  149. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter-dbg.js +39 -28
  150. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter.js +1 -1
  151. package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  152. package/packages/sap.fe.core/src/sap/fe/core/formatters/ValueFormatter-dbg.js +1 -1
  153. package/packages/sap.fe.core/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
  154. package/packages/sap.fe.core/src/sap/fe/core/fpm/manifest.json +2 -2
  155. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
  156. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
  157. package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
  158. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression-dbg.js +314 -355
  159. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression.js +1 -1
  160. package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
  161. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport-dbg.js +27 -15
  162. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport.js +1 -1
  163. package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  164. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper-dbg.js +62 -59
  165. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -3
  166. package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  167. package/packages/sap.fe.core/src/sap/fe/core/helpers/EditState-dbg.js +80 -84
  168. package/packages/sap.fe.core/src/sap/fe/core/helpers/EditState.js +2 -3
  169. package/packages/sap.fe.core/src/sap/fe/core/helpers/EditState.ts +81 -0
  170. package/packages/sap.fe.core/src/sap/fe/core/helpers/ExcelFormatHelper-dbg.js +61 -48
  171. package/packages/sap.fe.core/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -3
  172. package/packages/sap.fe.core/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  173. package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper-dbg.js +51 -56
  174. package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper.js +2 -3
  175. package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  176. package/packages/sap.fe.core/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +3 -4
  177. package/packages/sap.fe.core/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
  178. package/packages/sap.fe.core/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
  179. package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper-dbg.js +24 -16
  180. package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
  181. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper-dbg.js +228 -225
  182. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper.js +2 -3
  183. package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  184. package/packages/sap.fe.core/src/sap/fe/core/helpers/PasteHelper-dbg.js +209 -132
  185. package/packages/sap.fe.core/src/sap/fe/core/helpers/PasteHelper.js +2 -3
  186. package/packages/sap.fe.core/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  187. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +331 -313
  188. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators.js +2 -3
  189. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  190. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +65 -67
  191. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticKeyHelper.js +2 -3
  192. package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  193. package/packages/sap.fe.core/src/sap/fe/core/helpers/StableIdHelper-dbg.js +1 -5
  194. package/packages/sap.fe.core/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
  195. package/packages/sap.fe.core/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  196. package/packages/sap.fe.core/src/sap/fe/core/jsx-runtime/jsx-dbg.js +1 -1
  197. package/packages/sap.fe.core/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  198. package/packages/sap.fe.core/src/sap/fe/core/library-dbg.js +1 -1
  199. package/packages/sap.fe.core/src/sap/fe/core/library-h2-preload.js +23 -26
  200. package/packages/sap.fe.core/src/sap/fe/core/library-h2-preload.js.map +1 -1
  201. package/packages/sap.fe.core/src/sap/fe/core/library-preload.js +630 -649
  202. package/packages/sap.fe.core/src/sap/fe/core/library-preload.js.map +3 -3
  203. package/packages/sap.fe.core/src/sap/fe/core/library-preload.support.js +17 -5
  204. package/packages/sap.fe.core/src/sap/fe/core/library-preload.support.js.map +2 -2
  205. package/packages/sap.fe.core/src/sap/fe/core/library.js +1 -1
  206. package/packages/sap.fe.core/src/sap/fe/core/manifest.json +10 -10
  207. package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +1 -1
  208. package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
  209. package/packages/sap.fe.core/src/sap/fe/core/messagebundle.properties +23 -10
  210. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ar.properties +9 -0
  211. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_bg.properties +9 -0
  212. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ca.properties +9 -0
  213. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_cs.properties +10 -1
  214. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_cy.properties +9 -0
  215. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_da.properties +9 -0
  216. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_de.properties +9 -0
  217. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_el.properties +9 -0
  218. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en.properties +9 -0
  219. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
  220. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
  221. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
  222. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
  223. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_es.properties +9 -0
  224. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
  225. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_et.properties +9 -0
  226. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fi.properties +9 -0
  227. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fr.properties +13 -4
  228. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
  229. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hi.properties +15 -6
  230. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hr.properties +15 -6
  231. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hu.properties +9 -0
  232. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_id.properties +10 -1
  233. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_it.properties +9 -0
  234. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_iw.properties +9 -0
  235. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ja.properties +9 -0
  236. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_kk.properties +15 -6
  237. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ko.properties +9 -0
  238. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_lt.properties +9 -0
  239. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_lv.properties +15 -6
  240. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ms.properties +14 -5
  241. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_nl.properties +9 -0
  242. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_no.properties +9 -0
  243. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pl.properties +9 -0
  244. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pt.properties +9 -0
  245. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
  246. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ro.properties +9 -0
  247. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ru.properties +9 -0
  248. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sh.properties +11 -2
  249. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sk.properties +9 -0
  250. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sl.properties +15 -6
  251. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sv.properties +9 -0
  252. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_th.properties +9 -0
  253. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_tr.properties +9 -0
  254. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_uk.properties +9 -0
  255. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_vi.properties +9 -0
  256. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
  257. package/packages/sap.fe.core/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
  258. package/packages/sap.fe.core/src/sap/fe/core/resources.json +427 -341
  259. package/packages/sap.fe.core/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
  260. package/packages/sap.fe.core/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  261. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +268 -202
  262. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -3
  263. package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  264. package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
  265. package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
  266. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +405 -300
  267. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory.js +2 -3
  268. package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  269. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +148 -81
  270. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -3
  271. package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  272. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +986 -899
  273. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory.js +2 -3
  274. package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  275. package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory-dbg.js +1 -1
  276. package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
  277. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +35 -81
  278. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
  279. package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
  280. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +460 -487
  281. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory.js +2 -3
  282. package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  283. package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage-dbg.controller.js +9 -8
  284. package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -3
  285. package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  286. package/packages/sap.fe.core/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  287. package/packages/sap.fe.core/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  288. package/packages/sap.fe.core/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  289. package/packages/sap.fe.core/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  290. package/packages/sap.fe.core/src/sap/fe/core/templating/FieldControlHelper-dbg.js +8 -8
  291. package/packages/sap.fe.core/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
  292. package/packages/sap.fe.core/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  293. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper-dbg.js +138 -72
  294. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper.js +1 -1
  295. package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper.ts +139 -71
  296. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters-dbg.js +31 -1
  297. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters.js +1 -1
  298. package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters.ts +33 -2
  299. package/packages/sap.fe.core/src/sap/fe/core/type/Email-dbg.js +1 -1
  300. package/packages/sap.fe.core/src/sap/fe/core/type/Email.ts +4 -6
  301. package/packages/sap.fe.core/test/sap/fe/core/designtime/api.json +1 -1
  302. package/packages/sap.fe.core/test/sap/fe/core/designtime/apiref/api.json +1 -1
  303. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.jsmeta.json +1 -1
  304. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.jstemplates.json +1 -1
  305. package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.xmlmeta.json +1 -1
  306. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/controls/FileEditor.js +15 -1
  307. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/model/MacroNavigationModel.js +90 -0
  308. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/buildingBlockOverview.md +2 -0
  309. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/Component.js +36 -0
  310. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/chartFilterBar.controller.js +5 -0
  311. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/chartFilterBar.view.xml +22 -0
  312. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/ChildEntity.json +686 -0
  313. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/CreditLimitDetails.json +154 -0
  314. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/RootEntity.json +252 -0
  315. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/service.cds +141 -0
  316. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/localService/status.json +11 -0
  317. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chart/chartFilterBar/manifest.json +69 -0
  318. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/chartFilterBar.html +37 -0
  319. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldFormatOptions/FieldFormatOptions.view.xml +186 -122
  320. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldFormatOptions/localService/FieldFormatOptions.cds +5 -0
  321. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldFormatOptions/localService/RootEntity.json +2 -1
  322. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/filterBar/filterBarDefault/localService/service.cds +15 -1
  323. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/filterBar/filterBarSVandAnnotationDefaults/localService/service.cds +36 -5
  324. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/Component.js +33 -0
  325. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/FormSample.view.xml +10 -0
  326. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/localService/FormSample.cds +72 -0
  327. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/localService/RootEntity.json +13 -0
  328. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/form/formSample/manifest.json +68 -0
  329. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/formSample.html +37 -0
  330. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/guidance/guidanceFreestyle/EntryPage.controller.js +72 -43
  331. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/guidance/guidanceFreestyle/EntryPage.controller.ts +90 -0
  332. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/guidance/guidanceFreestyle/EntryPage.view.xml +12 -3
  333. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/Page.controller.js +4 -0
  334. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/Page.view.xml +9 -3
  335. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/Component.js +36 -0
  336. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/TableFilterBar.controller.js +5 -0
  337. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/TableFilterBar.view.xml +11 -0
  338. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/localService/RootEntity.json +102 -0
  339. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/localService/ValueHelpEntity.js +11 -0
  340. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/localService/service.cds +94 -0
  341. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableFilterBar/manifest.json +79 -0
  342. package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/tableFilterBar.html +37 -0
  343. package/packages/sap.fe.core/test/sap/fe/core/jest/AnnotationHelper.spec.js +694 -0
  344. package/packages/sap.fe.core/test/sap/fe/core/jest/AnnotationHelper.spec.ts +819 -0
  345. package/packages/sap.fe.core/test/sap/fe/core/jest/AppStateHandler.spec.js +51 -0
  346. package/packages/sap.fe.core/test/sap/fe/core/jest/AppStateHandler.spec.ts +40 -0
  347. package/packages/sap.fe.core/test/sap/fe/core/jest/BindingExpression-AnnotationExpression.spec.js +1 -1
  348. package/packages/sap.fe.core/test/sap/fe/core/jest/BindingExpression-AnnotationExpression.spec.ts +1 -1
  349. package/packages/sap.fe.core/test/sap/fe/core/jest/BindingExpression.spec.js +26 -15
  350. package/packages/sap.fe.core/test/sap/fe/core/jest/BindingExpression.spec.ts +28 -15
  351. package/packages/sap.fe.core/test/sap/fe/core/jest/CommonUtils.spec.ts +202 -0
  352. package/packages/sap.fe.core/test/sap/fe/core/jest/RouterProxy.spec.js +54 -0
  353. package/packages/sap.fe.core/test/sap/fe/core/jest/RouterProxy.spec.ts +35 -0
  354. package/packages/sap.fe.core/test/sap/fe/core/jest/TemplateConverter.spec.js +5 -11
  355. package/packages/sap.fe.core/test/sap/fe/core/jest/TemplateConverter.spec.ts +8 -8
  356. package/packages/sap.fe.core/test/sap/fe/core/jest/TransactionHelper.spec.js +736 -619
  357. package/packages/sap.fe.core/test/sap/fe/core/jest/TransactionHelper.spec.ts +703 -0
  358. package/packages/sap.fe.core/test/sap/fe/core/jest/__snapshots__/TemplateConverter.spec.ts.snap +89 -85
  359. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/draft.spec.js +102 -0
  360. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/draft.spec.ts +97 -0
  361. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/messageHandling.spec.js +492 -0
  362. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/messageHandling.spec.ts +509 -0
  363. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/operations.spec.js +895 -0
  364. package/packages/sap.fe.core/test/sap/fe/core/jest/actions/operations.spec.ts +908 -0
  365. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/EditFlow.spec.js +209 -353
  366. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/EditFlow.spec.ts +222 -362
  367. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalEditFlow.spec.js +508 -0
  368. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalEditFlow.spec.ts +440 -0
  369. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalRouting.spec.ts +90 -0
  370. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/KPIManagement.spec.js +1 -1
  371. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/KPIManagement.spec.ts +10 -10
  372. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MassEdit.spec.js +286 -0
  373. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MassEdit.spec.ts +179 -0
  374. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandler.spec.js +200 -21
  375. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandler.spec.ts +168 -17
  376. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Routing.spec.js +40 -0
  377. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Routing.spec.ts +26 -0
  378. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/SideEffects.spec.js +1 -1
  379. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/SideEffects.spec.ts +1 -1
  380. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/FilterBar.spec.js +355 -0
  381. package/packages/sap.fe.core/test/sap/fe/core/jest/controls/FilterBar.spec.ts +287 -0
  382. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ConverterContext.spec.js +1 -1
  383. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ConverterContext.spec.ts +1 -1
  384. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Filter.spec.js +542 -0
  385. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Filter.spec.ts +588 -0
  386. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/HeaderFacet.spec.js +1 -2
  387. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/HeaderFacet.spec.ts +1 -2
  388. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ListReportConverter.spec.js +371 -7
  389. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ListReportConverter.spec.ts +469 -6
  390. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/MetaModelConverter.spec.js +2 -2
  391. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/MetaModelConverter.spec.ts +2 -2
  392. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ObjectPageAvatar.spec.js +2 -2
  393. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ObjectPageAvatar.spec.ts +1 -1
  394. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/SubSection.spec.js +12 -8
  395. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/SubSection.spec.ts +8 -7
  396. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Table.spec.js +436 -45
  397. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Table.spec.ts +565 -33
  398. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/TableStandardActions.spec.js +136 -78
  399. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/TableStandardActions.spec.ts +315 -199
  400. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/__snapshots__/Filter.spec.ts.snap +307 -0
  401. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/__snapshots__/MetaModelConverter.spec.ts.snap +49 -1
  402. package/packages/sap.fe.core/test/sap/fe/core/jest/converters/__snapshots__/Table.spec.ts.snap +1 -0
  403. package/packages/sap.fe.core/test/sap/fe/core/jest/data/AnalyticalService.cds +51 -4
  404. package/packages/sap.fe.core/test/sap/fe/core/jest/data/AnalyticalService2.cds +107 -0
  405. package/packages/sap.fe.core/test/sap/fe/core/jest/data/ComplexType.cds +39 -0
  406. package/packages/sap.fe.core/test/sap/fe/core/jest/data/Filter.cds +187 -0
  407. package/packages/sap.fe.core/test/sap/fe/core/jest/data/MassEditHelper.cds +226 -0
  408. package/packages/sap.fe.core/test/sap/fe/core/jest/data/SideEffects.cds +1 -1
  409. package/packages/sap.fe.core/test/sap/fe/core/jest/data/computedDefaultValueService.cds +99 -0
  410. package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/TableFormatters.spec.js +25 -5
  411. package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/TableFormatters.spec.ts +18 -7
  412. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/AppStartupHelper.spec.js +1 -1
  413. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/AppStartupHelper.spec.ts +4 -2
  414. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/DynamicAnnotationPathHelper.spec.js +40 -0
  415. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/DynamicAnnotationPathHelper.spec.ts +39 -0
  416. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ExcelFormatHelper.spec.js +20 -0
  417. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ExcelFormatHelper.spec.ts +13 -0
  418. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/KeepAliveHelper.spec.js +1 -1
  419. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/KeepAliveHelper.spec.ts +3 -3
  420. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/MassEditHelper.spec.js +712 -0
  421. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/MassEditHelper.spec.ts +613 -0
  422. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ModelHelper.spec.js +344 -225
  423. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ModelHelper.spec.ts +347 -0
  424. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/PasteHelper.spec.js +439 -0
  425. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/PasteHelper.spec.ts +378 -0
  426. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/SemanticDateOperators.spec.js +123 -0
  427. package/packages/sap.fe.core/test/sap/fe/core/{qunit/helpers/SemanticDateOperators.qunit.js → jest/helpers/SemanticDateOperators.spec.ts} +10 -21
  428. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/SemanticKeyHelper.spec.js +215 -0
  429. package/packages/sap.fe.core/test/sap/fe/core/{qunit/helpers/SemanticKeyHelper.qunit.js → jest/helpers/SemanticKeyHelper.spec.ts} +58 -55
  430. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/StableIdHelper.spec.js +125 -0
  431. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/StableIdHelper.spec.ts +142 -0
  432. package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/__snapshots__/MassEditHelper.spec.ts.snap +263 -0
  433. package/packages/sap.fe.core/test/sap/fe/core/jest/services/CacheHandlerTest.spec.js +871 -0
  434. package/packages/sap.fe.core/test/sap/fe/core/jest/services/CacheHandlerTest.spec.ts +899 -0
  435. package/packages/sap.fe.core/test/sap/fe/core/jest/services/NavigationServiceFactory.spec.js +46 -0
  436. package/packages/sap.fe.core/test/sap/fe/core/jest/services/NavigationServiceFactory.spec.ts +37 -0
  437. package/packages/sap.fe.core/test/sap/fe/core/jest/services/RoutingServiceFactory.spec.js +120 -3
  438. package/packages/sap.fe.core/test/sap/fe/core/jest/services/RoutingServiceFactory.spec.ts +96 -7
  439. package/packages/sap.fe.core/test/sap/fe/core/jest/services/ShellServicesFactory.spec.js +86 -0
  440. package/packages/sap.fe.core/test/sap/fe/core/jest/services/ShellServicesFactory.spec.ts +72 -0
  441. package/packages/sap.fe.core/test/sap/fe/core/jest/services/SideEffectsService.spec.js +16 -44
  442. package/packages/sap.fe.core/test/sap/fe/core/jest/services/SideEffectsService.spec.ts +22 -60
  443. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/PropertyHelper.spec.js +4 -4
  444. package/packages/sap.fe.core/test/sap/fe/core/jest/templating/PropertyHelper.spec.ts +9 -3
  445. package/packages/sap.fe.core/test/sap/fe/core/jest/type/ComplexType.spec.js +68 -0
  446. package/packages/sap.fe.core/test/sap/fe/core/jest/type/ComplexType.spec.ts +51 -0
  447. package/packages/sap.fe.core/test/sap/fe/core/qunit/TemplatingExpressions.qunit.js +2 -2
  448. package/packages/sap.fe.core/test/sap/fe/core/qunit/apps/generalTests.json +0 -105
  449. package/packages/sap.fe.core/test/sap/fe/core/relnotes/changes-1.98.json +0 -11
  450. package/packages/sap.fe.core/test/sap/fe/core/relnotes/changes-1.99.json +534 -0
  451. package/packages/sap.fe.macros/src/sap/fe/macros/.library +1 -1
  452. package/packages/sap.fe.macros/src/sap/fe/macros/.theming +1 -1
  453. package/packages/sap.fe.macros/src/sap/fe/macros/Chart.metadata-dbg.js +14 -5
  454. package/packages/sap.fe.macros/src/sap/fe/macros/Chart.metadata.js +1 -1
  455. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI-dbg.js +15 -6
  456. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI.js +1 -1
  457. package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI.ts +9 -1
  458. package/packages/sap.fe.macros/src/sap/fe/macros/ChartDelegate-dbg.js +37 -3
  459. package/packages/sap.fe.macros/src/sap/fe/macros/ChartDelegate.js +1 -1
  460. package/packages/sap.fe.macros/src/sap/fe/macros/CommonHelper-dbg.js +27 -2
  461. package/packages/sap.fe.macros/src/sap/fe/macros/CommonHelper.js +1 -1
  462. package/packages/sap.fe.macros/src/sap/fe/macros/Field.fragment.xml +4 -0
  463. package/packages/sap.fe.macros/src/sap/fe/macros/Field.metadata-dbg.js +17 -1
  464. package/packages/sap.fe.macros/src/sap/fe/macros/Field.metadata.js +1 -1
  465. package/packages/sap.fe.macros/src/sap/fe/macros/Field.metadata.ts +17 -1
  466. package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI-dbg.js +1 -1
  467. package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI.ts +35 -9
  468. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.fragment.xml +1 -1
  469. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.metadata-dbg.js +41 -10
  470. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.metadata.js +1 -1
  471. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI-dbg.js +1 -1
  472. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI.ts +1 -1
  473. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarDelegate-dbg.js +50 -4
  474. package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarDelegate.js +1 -1
  475. package/packages/sap.fe.macros/src/sap/fe/macros/Form.fragment.xml +65 -75
  476. package/packages/sap.fe.macros/src/sap/fe/macros/Form.metadata-dbg.js +55 -51
  477. package/packages/sap.fe.macros/src/sap/fe/macros/Form.metadata.js +1 -1
  478. package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI-dbg.js +83 -0
  479. package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI.js +5 -0
  480. package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI.ts +29 -0
  481. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainer.fragment.xml +11 -10
  482. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainer.metadata-dbg.js +2 -4
  483. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainer.metadata.js +1 -1
  484. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI-dbg.js +99 -0
  485. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI.js +5 -0
  486. package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI.ts +32 -0
  487. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI-dbg.js +67 -7
  488. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI.js +1 -1
  489. package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI.ts +60 -10
  490. package/packages/sap.fe.macros/src/sap/fe/macros/PhantomUtil-dbg.js +26 -34
  491. package/packages/sap.fe.macros/src/sap/fe/macros/PhantomUtil.js +1 -1
  492. package/packages/sap.fe.macros/src/sap/fe/macros/Table.fragment.xml +6 -6
  493. package/packages/sap.fe.macros/src/sap/fe/macros/Table.metadata-dbg.js +38 -4
  494. package/packages/sap.fe.macros/src/sap/fe/macros/Table.metadata.js +1 -1
  495. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI-dbg.js +78 -92
  496. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI.js +1 -1
  497. package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI.ts +55 -68
  498. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldHelper-dbg.js +41 -39
  499. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldHelper.js +1 -1
  500. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldRuntime-dbg.js +125 -31
  501. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldRuntime.js +1 -1
  502. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating-dbg.js +16 -42
  503. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating.js +1 -1
  504. package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating.ts +13 -39
  505. package/packages/sap.fe.macros/src/sap/fe/macros/field/QuickViewLinkDelegate-dbg.js +0 -7
  506. package/packages/sap.fe.macros/src/sap/fe/macros/field/QuickViewLinkDelegate.js +1 -1
  507. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterFieldHelper-dbg.js +142 -129
  508. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterFieldHelper.js +1 -1
  509. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterUtils-dbg.js +120 -61
  510. package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterUtils.js +1 -1
  511. package/packages/sap.fe.macros/src/sap/fe/macros/form/AddressSection.fragment.xml +4 -4
  512. package/packages/sap.fe.macros/src/sap/fe/macros/form/DataFieldCollection.fragment.xml +3 -3
  513. package/packages/sap.fe.macros/src/sap/fe/macros/form/FormHelper-dbg.js +1 -14
  514. package/packages/sap.fe.macros/src/sap/fe/macros/form/FormHelper.js +1 -1
  515. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.fragment.xml +1 -1
  516. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata-dbg.js +23 -8
  517. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata.js +1 -1
  518. package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata.ts +29 -17
  519. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.fragment.xml +45 -54
  520. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.metadata-dbg.js +16 -22
  521. package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.metadata.js +1 -1
  522. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.fragment.xml +1 -1
  523. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata-dbg.js +14 -5
  524. package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata.js +1 -1
  525. package/packages/sap.fe.macros/src/sap/fe/macros/internal/FilterField.fragment.xml +1 -1
  526. package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator-dbg.js +3 -2
  527. package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator.ts +4 -3
  528. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/FieldStructure.fragment.xml +1 -1
  529. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LinkWithQuickViewForm.fragment.xml +3 -1
  530. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LinkWrapper.fragment.xml +3 -1
  531. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/ObjectIdentifier.fragment.xml +4 -145
  532. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/ObjectStatus.fragment.xml +32 -8
  533. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/DatePicker.fragment.xml +1 -1
  534. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/DateTimePicker.fragment.xml +1 -1
  535. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/File.fragment.xml +3 -3
  536. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/Input.fragment.xml +1 -1
  537. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/InputWithUnit.fragment.xml +2 -2
  538. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/InputWithValueHelp.fragment.xml +2 -2
  539. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/TextArea.fragment.xml +1 -1
  540. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/TimePicker.fragment.xml +1 -1
  541. package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/fragments/ObjectIdentifierContent.fragment.xml +81 -0
  542. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating-dbg.js +64 -30
  543. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating.js +1 -1
  544. package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating.ts +58 -36
  545. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Formatter-dbg.js +4 -2
  546. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Formatter.js +1 -1
  547. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Formatter.ts +19 -20
  548. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime-dbg.js +2 -3
  549. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime.js +1 -1
  550. package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime.ts +13 -5
  551. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueHelpContent.fragment.xml +3 -1
  552. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueHelpTemplating-dbg.js +17 -7
  553. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueHelpTemplating.js +1 -1
  554. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueHelpTemplating.ts +10 -3
  555. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +1 -1
  556. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListHelper-dbg.js +53 -62
  557. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +1 -1
  558. package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListTable.fragment.xml +2 -2
  559. package/packages/sap.fe.macros/src/sap/fe/macros/library-dbg.js +1 -1
  560. package/packages/sap.fe.macros/src/sap/fe/macros/library-h2-preload.js +16 -14
  561. package/packages/sap.fe.macros/src/sap/fe/macros/library-h2-preload.js.map +1 -1
  562. package/packages/sap.fe.macros/src/sap/fe/macros/library-preload.js +157 -178
  563. package/packages/sap.fe.macros/src/sap/fe/macros/library-preload.js.map +4 -4
  564. package/packages/sap.fe.macros/src/sap/fe/macros/library.js +1 -1
  565. package/packages/sap.fe.macros/src/sap/fe/macros/manifest.json +9 -9
  566. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle.properties +1 -1
  567. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ar.properties +14 -6
  568. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_bg.properties +14 -6
  569. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ca.properties +14 -6
  570. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_cs.properties +14 -6
  571. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_cy.properties +14 -6
  572. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_da.properties +14 -6
  573. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_de.properties +14 -6
  574. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_el.properties +14 -6
  575. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en.properties +14 -6
  576. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_GB.properties +14 -6
  577. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_sappsd.properties +14 -6
  578. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +14 -6
  579. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_saptrc.properties +14 -6
  580. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_es.properties +14 -6
  581. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_es_MX.properties +14 -6
  582. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_et.properties +14 -6
  583. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fi.properties +14 -6
  584. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fr.properties +14 -6
  585. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fr_CA.properties +14 -6
  586. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hi.properties +14 -6
  587. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hr.properties +14 -6
  588. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hu.properties +14 -6
  589. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_id.properties +14 -6
  590. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_it.properties +14 -6
  591. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_iw.properties +14 -6
  592. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ja.properties +14 -6
  593. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_kk.properties +14 -6
  594. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ko.properties +14 -6
  595. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_lt.properties +14 -6
  596. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_lv.properties +14 -6
  597. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ms.properties +14 -6
  598. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_nl.properties +14 -6
  599. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_no.properties +14 -6
  600. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pl.properties +14 -6
  601. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pt.properties +14 -6
  602. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pt_PT.properties +14 -6
  603. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ro.properties +14 -6
  604. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ru.properties +14 -6
  605. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sh.properties +14 -6
  606. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sk.properties +14 -6
  607. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sl.properties +16 -8
  608. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sv.properties +14 -6
  609. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_th.properties +14 -6
  610. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_tr.properties +14 -6
  611. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_uk.properties +14 -6
  612. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_vi.properties +14 -6
  613. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_zh_CN.properties +14 -6
  614. package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_zh_TW.properties +14 -6
  615. package/packages/sap.fe.macros/src/sap/fe/macros/microchart/MicroChartHelper-dbg.js +2 -2
  616. package/packages/sap.fe.macros/src/sap/fe/macros/microchart/MicroChartHelper.js +1 -1
  617. package/packages/sap.fe.macros/src/sap/fe/macros/microchart/fragments/BulletMicroChart.fragment.xml +2 -2
  618. package/packages/sap.fe.macros/src/sap/fe/macros/microchart/fragments/ComparisonMicroChart.fragment.xml +1 -1
  619. package/packages/sap.fe.macros/src/sap/fe/macros/resources.json +277 -209
  620. package/packages/sap.fe.macros/src/sap/fe/macros/table/Actions.fragment.xml +5 -16
  621. package/packages/sap.fe.macros/src/sap/fe/macros/table/ColumnContent.fragment.xml +17 -4
  622. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableHelper-dbg.js +0 -2
  623. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableHelper.js +1 -1
  624. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableRuntime-dbg.js +27 -18
  625. package/packages/sap.fe.macros/src/sap/fe/macros/table/TableRuntime.js +1 -1
  626. package/packages/sap.fe.macros/src/sap/fe/macros/table/delegates/TableDelegate-dbg.js +196 -139
  627. package/packages/sap.fe.macros/src/sap/fe/macros/table/delegates/TableDelegate.js +1 -1
  628. package/packages/sap.fe.macros/src/sap/fe/macros/visualfilters/InteractiveChartHelper-dbg.js +12 -14
  629. package/packages/sap.fe.macros/src/sap/fe/macros/visualfilters/InteractiveChartHelper.js +1 -1
  630. package/packages/sap.fe.macros/src/sap/fe/macros/visualfilters/VisualFilterRuntime-dbg.js +13 -15
  631. package/packages/sap.fe.macros/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +1 -1
  632. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/api.json +113 -2
  633. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/apiref/api.json +1 -1
  634. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/codeassistance/Library.jsmeta.json +1 -1
  635. package/packages/sap.fe.macros/test/sap/fe/macros/designtime/codeassistance/Library.xmlmeta.json +1 -1
  636. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartDelegate.spec.js +1 -1
  637. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartDelegate.spec.ts +1 -1
  638. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartMacro.spec.js +32 -20
  639. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartMacro.spec.ts +24 -12
  640. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CollectionField.spec.js +15 -5
  641. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CollectionField.spec.ts +18 -3
  642. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CommonHelper.spec.js +69 -0
  643. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CommonHelper.spec.ts +32 -0
  644. package/packages/sap.fe.macros/test/sap/fe/macros/jest/DatapointMacro.spec.js +6 -180
  645. package/packages/sap.fe.macros/test/sap/fe/macros/jest/DatapointMacro.spec.ts +6 -177
  646. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldMacroWithSemanticKey.spec.js +1 -1
  647. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldMacroWithSemanticKey.spec.ts +1 -1
  648. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterField.spec.js +1 -1
  649. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterField.spec.ts +1 -2
  650. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterFieldHelper.spec.js +51 -0
  651. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterFieldHelper.spec.ts +48 -0
  652. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterUtils.spec.js +133 -0
  653. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FormContainerAPI.spec.js +34 -0
  654. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FormContainerAPI.spec.ts +23 -0
  655. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FormMacro.spec.js +49 -0
  656. package/packages/sap.fe.macros/test/sap/fe/macros/jest/FormMacro.spec.ts +41 -0
  657. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroAPI.spec.js +105 -0
  658. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroAPI.spec.ts +53 -0
  659. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroComponent.spec.js +1 -1
  660. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroComponent.spec.ts +1 -1
  661. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MicroChart.spec.js +15 -1
  662. package/packages/sap.fe.macros/test/sap/fe/macros/jest/MicroChart.spec.ts +13 -0
  663. package/packages/sap.fe.macros/test/sap/fe/macros/jest/PhantomUtil.spec.js +1 -1
  664. package/packages/sap.fe.macros/test/sap/fe/macros/jest/PhantomUtil.spec.ts +1 -1
  665. package/packages/sap.fe.macros/test/sap/fe/macros/jest/QuickViewForm.spec.js +2 -3
  666. package/packages/sap.fe.macros/test/sap/fe/macros/jest/QuickViewForm.spec.ts +3 -4
  667. package/packages/sap.fe.macros/test/sap/fe/macros/jest/SimpleFieldMacro.spec.js +14 -4
  668. package/packages/sap.fe.macros/test/sap/fe/macros/jest/SimpleFieldMacro.spec.ts +18 -4
  669. package/packages/sap.fe.macros/test/sap/fe/macros/jest/Table.spec.js +140 -0
  670. package/packages/sap.fe.macros/test/sap/fe/macros/jest/Table.spec.ts +144 -0
  671. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableAPI.spec.js +445 -635
  672. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableAPI.spec.ts +528 -719
  673. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableMacro.spec.js +83 -4
  674. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableMacro.spec.ts +101 -3
  675. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ValueHelpMacro.spec.js +1 -1
  676. package/packages/sap.fe.macros/test/sap/fe/macros/jest/ValueHelpMacro.spec.ts +1 -1
  677. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/ChartMacro.spec.ts.snap +75 -7
  678. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/CollectionField.spec.ts.snap +26 -11
  679. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/DatapointMacro.spec.ts.snap +42 -304
  680. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FieldMacroDataFieldTypes.spec.ts.snap +6 -6
  681. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FilterBarMacro.spec.ts.snap +12 -12
  682. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FilterField.spec.ts.snap +3 -3
  683. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FormMacro.spec.ts.snap +150 -0
  684. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/KPITag.spec.ts.snap +4 -4
  685. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/MicroChart.spec.ts.snap +39 -3
  686. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/QuickViewForm.spec.ts.snap +4 -4
  687. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/SimpleFieldMacro.spec.ts.snap +125 -51
  688. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/Table.spec.ts.snap +1455 -0
  689. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/Chart.cds +56 -1
  690. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/FieldMacroDataFieldTypes.cds +12 -59
  691. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/Form.cds +129 -0
  692. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/MicroChart.cds +14 -0
  693. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/Table.cds +55 -2
  694. package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/simpleFieldMacro.cds +10 -4
  695. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldRuntime.spec.js +2 -2
  696. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldRuntime.spec.ts +15 -8
  697. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldTemplating.spec.js +12 -34
  698. package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldTemplating.spec.ts +21 -38
  699. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/Actions.spec.js +1 -1
  700. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/Actions.spec.ts +2 -2
  701. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/__snapshots__/columnWidth.spec.ts.snap +54 -14
  702. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/columnWidth.spec.js +17 -7
  703. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/columnWidth.spec.ts +18 -11
  704. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/data/columnWidth.cds +26 -3
  705. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/TableDelegate.spec.js +145 -17
  706. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/TableDelegate.spec.ts +176 -18
  707. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/__snapshots__/TableDelegate.spec.ts.snap +813 -111
  708. package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/data/tabledelegate.cds +9 -2
  709. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FieldHelper.qunit.js +0 -56
  710. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FieldHelperTemplate.qunit.js +0 -321
  711. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormContainerTemplating.qunit.js +1 -0
  712. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormTemplating.qunit.js +10 -5
  713. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormTemplatingTs.qunit.js +1 -1
  714. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/MicroChartHelperForTemplate.qunit.js +1 -2
  715. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/TableRuntime.qunit.js +1 -1
  716. package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/ValueListHelper.qunit.js +130 -1
  717. package/packages/sap.fe.macros/test/sap/fe/macros/relnotes/changes-1.99.json +343 -0
  718. package/packages/sap.fe.navigation/src/sap/fe/navigation/.library +1 -1
  719. package/packages/sap.fe.navigation/src/sap/fe/navigation/.theming +1 -1
  720. package/packages/sap.fe.navigation/src/sap/fe/navigation/NavigationHandler-dbg.js +0 -1
  721. package/packages/sap.fe.navigation/src/sap/fe/navigation/NavigationHandler.js +1 -1
  722. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-dbg.js +1 -1
  723. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-h2-preload.js +2 -2
  724. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-preload.js +3 -3
  725. package/packages/sap.fe.navigation/src/sap/fe/navigation/library-preload.js.map +2 -2
  726. package/packages/sap.fe.navigation/src/sap/fe/navigation/library.js +1 -1
  727. package/packages/sap.fe.navigation/src/sap/fe/navigation/manifest.json +3 -3
  728. package/packages/sap.fe.navigation/src/sap/fe/navigation/resources.json +4 -4
  729. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/api.json +1 -1
  730. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/apiref/api.json +1 -1
  731. package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/codeassistance/Library.xmlmeta.json +1 -1
  732. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/.library +1 -1
  733. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/.theming +1 -1
  734. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-dbg.js +1 -1
  735. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-h2-preload.js +2 -2
  736. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-preload.js +2 -2
  737. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library.js +1 -1
  738. package/packages/sap.fe.placeholder/src/sap/fe/placeholder/manifest.json +3 -3
  739. package/packages/sap.fe.placeholder/test/sap/fe/placeholder/designtime/api.json +1 -1
  740. package/packages/sap.fe.placeholder/test/sap/fe/placeholder/designtime/apiref/api.json +1 -1
  741. package/packages/sap.fe.templates/src/sap/fe/templates/.library +1 -1
  742. package/packages/sap.fe.templates/src/sap/fe/templates/.theming +1 -1
  743. package/packages/sap.fe.templates/src/sap/fe/templates/AnalyticalListPage/manifest.json +2 -2
  744. package/packages/sap.fe.templates/src/sap/fe/templates/ListComponent-dbg.js +1 -1
  745. package/packages/sap.fe.templates/src/sap/fe/templates/ListComponent.js +1 -1
  746. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/Component-dbg.js +8 -0
  747. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/Component.js +1 -1
  748. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ExtensionAPI-dbg.js +8 -3
  749. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ExtensionAPI.js +1 -1
  750. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReport.view.xml +11 -6
  751. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReportController-dbg.controller.js +114 -29
  752. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReportController.controller.js +1 -1
  753. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/manifest.json +2 -2
  754. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation-dbg.js +10 -10
  755. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +1 -1
  756. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/Share-dbg.js +7 -6
  757. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/Share.js +1 -1
  758. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/ViewState-dbg.js +75 -53
  759. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/ViewState.js +1 -1
  760. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/resources.json +14 -23
  761. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +8 -0
  762. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/AnnotationHelper-dbg.js +3 -3
  763. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +1 -1
  764. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/Component-dbg.js +1 -1
  765. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/Component.js +1 -1
  766. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +8 -45
  767. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPageController-dbg.controller.js +17 -67
  768. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1 -1
  769. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/manifest.json +2 -2
  770. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/resources.json +24 -12
  771. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating-dbg.js +1 -1
  772. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +2 -2
  773. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +5 -1
  774. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +33 -0
  775. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +17 -0
  776. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +18 -0
  777. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +3 -3
  778. package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +3 -3
  779. package/packages/sap.fe.templates/src/sap/fe/templates/library-dbg.js +1 -1
  780. package/packages/sap.fe.templates/src/sap/fe/templates/library-h2-preload.js +7 -5
  781. package/packages/sap.fe.templates/src/sap/fe/templates/library-h2-preload.js.map +1 -1
  782. package/packages/sap.fe.templates/src/sap/fe/templates/library-preload.js +24 -22
  783. package/packages/sap.fe.templates/src/sap/fe/templates/library-preload.js.map +4 -4
  784. package/packages/sap.fe.templates/src/sap/fe/templates/library.js +1 -1
  785. package/packages/sap.fe.templates/src/sap/fe/templates/manifest.json +13 -13
  786. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle.properties +14 -30
  787. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ar.properties +24 -6
  788. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_bg.properties +24 -6
  789. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ca.properties +24 -6
  790. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_cs.properties +24 -6
  791. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_cy.properties +24 -6
  792. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_da.properties +24 -6
  793. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_de.properties +24 -6
  794. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_el.properties +25 -7
  795. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en.properties +24 -6
  796. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_GB.properties +24 -6
  797. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +24 -6
  798. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +24 -6
  799. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +24 -6
  800. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_es.properties +24 -6
  801. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_es_MX.properties +24 -6
  802. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_et.properties +24 -6
  803. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fi.properties +24 -6
  804. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fr.properties +24 -6
  805. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fr_CA.properties +24 -6
  806. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hi.properties +24 -6
  807. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hr.properties +25 -7
  808. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hu.properties +24 -6
  809. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_id.properties +26 -8
  810. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_it.properties +24 -6
  811. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_iw.properties +24 -6
  812. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ja.properties +24 -6
  813. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_kk.properties +24 -6
  814. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ko.properties +24 -6
  815. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_lt.properties +24 -6
  816. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_lv.properties +24 -6
  817. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ms.properties +24 -6
  818. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_nl.properties +24 -6
  819. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_no.properties +24 -6
  820. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pl.properties +24 -6
  821. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pt.properties +27 -9
  822. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pt_PT.properties +25 -7
  823. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ro.properties +24 -6
  824. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ru.properties +24 -6
  825. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sh.properties +24 -6
  826. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sk.properties +24 -6
  827. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sl.properties +24 -6
  828. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sv.properties +25 -7
  829. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_th.properties +24 -6
  830. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_tr.properties +24 -6
  831. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_uk.properties +25 -7
  832. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_vi.properties +24 -6
  833. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_zh_CN.properties +24 -6
  834. package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_zh_TW.properties +24 -6
  835. package/packages/sap.fe.templates/src/sap/fe/templates/resources.json +127 -113
  836. package/packages/sap.fe.templates/test/sap/fe/templates/demokit/apps/itelo/webapp/manifest.json +1 -1
  837. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/api.json +1 -1
  838. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/apiref/api.json +1 -1
  839. package/packages/sap.fe.templates/test/sap/fe/templates/designtime/codeassistance/Library.xmlmeta.json +1 -1
  840. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/IntentBasedNavigation.spec.js +59 -0
  841. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/IntentBasedNavigation.spec.ts +54 -0
  842. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/Share.spec.js +85 -0
  843. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/Share.spec.ts +89 -0
  844. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/ViewState.spec.js +482 -259
  845. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/ViewState.spec.ts +442 -0
  846. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/AnnotationHelper.spec.js +99 -0
  847. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/AnnotationHelper.spec.ts +82 -0
  848. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/Heading.spec.js +50 -0
  849. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/Heading.spec.ts +32 -0
  850. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/__snapshots__/Heading.spec.ts.snap +43 -0
  851. package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/__snapshots__/Sections.spec.ts.snap +9 -7
  852. package/packages/sap.fe.templates/test/sap/fe/templates/jest/RootContainer/RootContainerBaseController.spec.js +2 -2
  853. package/packages/sap.fe.templates/test/sap/fe/templates/jest/RootContainer/RootContainerBaseController.spec.ts +4 -3
  854. package/packages/sap.fe.templates/test/sap/fe/templates/relnotes/changes-1.99.json +335 -0
  855. package/packages/sap.fe.test/src/sap/fe/test/.library +1 -1
  856. package/packages/sap.fe.test/src/sap/fe/test/.theming +1 -1
  857. package/packages/sap.fe.test/src/sap/fe/test/FeMocks-dbg.js +66 -0
  858. package/packages/sap.fe.test/src/sap/fe/test/FeMocks.js +5 -0
  859. package/packages/sap.fe.test/src/sap/fe/test/FeMocks.ts +77 -0
  860. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper-dbg.js +78 -22
  861. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper.js +1 -1
  862. package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper.ts +66 -22
  863. package/packages/sap.fe.test/src/sap/fe/test/ObjectPage-dbg.js +6 -4
  864. package/packages/sap.fe.test/src/sap/fe/test/ObjectPage.js +1 -1
  865. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper-dbg.js +44 -21
  866. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper.js +1 -1
  867. package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper.ts +28 -8
  868. package/packages/sap.fe.test/src/sap/fe/test/api/BaseAPI-dbg.js +1 -0
  869. package/packages/sap.fe.test/src/sap/fe/test/api/DialogAPI-dbg.js +14 -2
  870. package/packages/sap.fe.test/src/sap/fe/test/api/DialogAPI.js +1 -1
  871. package/packages/sap.fe.test/src/sap/fe/test/api/DialogCreateActions-dbg.js +1 -1
  872. package/packages/sap.fe.test/src/sap/fe/test/api/DialogCreateActions.js +1 -1
  873. package/packages/sap.fe.test/src/sap/fe/test/api/DialogCreateAssertions-dbg.js +1 -1
  874. package/packages/sap.fe.test/src/sap/fe/test/api/DialogCreateAssertions.js +1 -1
  875. package/packages/sap.fe.test/src/sap/fe/test/api/DialogMessageActions-dbg.js +16 -1
  876. package/packages/sap.fe.test/src/sap/fe/test/api/DialogMessageActions.js +1 -1
  877. package/packages/sap.fe.test/src/sap/fe/test/api/DialogMessageAssertions-dbg.js +1 -1
  878. package/packages/sap.fe.test/src/sap/fe/test/api/DialogMessageAssertions.js +1 -1
  879. package/packages/sap.fe.test/src/sap/fe/test/api/DialogValueHelpActions-dbg.js +1 -1
  880. package/packages/sap.fe.test/src/sap/fe/test/api/DialogValueHelpActions.js +1 -1
  881. package/packages/sap.fe.test/src/sap/fe/test/api/DialogValueHelpAssertions-dbg.js +1 -1
  882. package/packages/sap.fe.test/src/sap/fe/test/api/DialogValueHelpAssertions.js +1 -1
  883. package/packages/sap.fe.test/src/sap/fe/test/api/TableActions-dbg.js +0 -19
  884. package/packages/sap.fe.test/src/sap/fe/test/api/TableActions.js +1 -1
  885. package/packages/sap.fe.test/src/sap/fe/test/api/TableAssertions-dbg.js +3 -4
  886. package/packages/sap.fe.test/src/sap/fe/test/api/TableAssertions.js +1 -1
  887. package/packages/sap.fe.test/src/sap/fe/test/builder/MdcTableBuilder-dbg.js +4 -0
  888. package/packages/sap.fe.test/src/sap/fe/test/builder/MdcTableBuilder.js +1 -1
  889. package/packages/sap.fe.test/src/sap/fe/test/internal/FEJourneyRunner-dbg.js +6 -3
  890. package/packages/sap.fe.test/src/sap/fe/test/internal/FEJourneyRunner.js +1 -1
  891. package/packages/sap.fe.test/src/sap/fe/test/library-dbg.js +1 -1
  892. package/packages/sap.fe.test/src/sap/fe/test/library-h2-preload.js +3 -2
  893. package/packages/sap.fe.test/src/sap/fe/test/library-h2-preload.js.map +1 -1
  894. package/packages/sap.fe.test/src/sap/fe/test/library-preload.js +39 -20
  895. package/packages/sap.fe.test/src/sap/fe/test/library-preload.js.map +4 -4
  896. package/packages/sap.fe.test/src/sap/fe/test/library.js +1 -1
  897. package/packages/sap.fe.test/src/sap/fe/test/manifest.json +3 -3
  898. package/packages/sap.fe.test/src/sap/fe/test/resources.json +65 -28
  899. package/packages/sap.fe.test/test/sap/fe/test/designtime/api.json +1 -1
  900. package/packages/sap.fe.test/test/sap/fe/test/designtime/apiref/api.json +1 -1
  901. package/packages/sap.fe.test/test/sap/fe/test/designtime/codeassistance/Library.jsmeta.json +1 -1
  902. package/packages/sap.fe.test/test/sap/fe/test/designtime/codeassistance/Library.xmlmeta.json +1 -1
  903. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandling.spec.js +0 -115
  904. package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandling.spec.ts +0 -95
  905. package/packages/sap.fe.core/test/sap/fe/core/qunit/helpers/ExcelFormatHelper.qunit.js +0 -19
  906. package/packages/sap.fe.core/test/sap/fe/core/qunit/helpers/StableIdHelper.qunit.js +0 -301
  907. package/packages/sap.fe.core/test/sap/fe/core/qunit/services/CacheHandlerTest.qunit.js +0 -924
  908. package/packages/sap.fe.macros/src/sap/fe/macros/formcontainer/FormContainerRuntime-dbg.js +0 -46
  909. package/packages/sap.fe.macros/src/sap/fe/macros/formcontainer/FormContainerRuntime.js +0 -6
  910. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CommonUtils.spec.js +0 -94
  911. package/packages/sap.fe.macros/test/sap/fe/macros/jest/CommonUtils.spec.ts +0 -70
  912. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableFieldLabel.spec.js +0 -68
  913. package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableFieldLabel.spec.ts +0 -65
  914. package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/TableFieldLabel.spec.ts.snap +0 -607
  915. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/MassEdit-dbg.js +0 -96
  916. package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/overrides/MassEdit.js +0 -6
@@ -1,1219 +1,1077 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
5
+ sap.ui.define(["sap/m/MessageBox", "sap/m/Dialog", "sap/ui/model/json/JSONModel", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/Fragment", "sap/fe/core/actions/messageHandling", "sap/fe/core/BusyLocker", "sap/fe/core/CommonUtils", "sap/base/Log", "sap/fe/core/library", "sap/fe/core/helpers/FPMHelper", "sap/m/Button", "sap/fe/core/helpers/StableIdHelper"], function (MessageBox, Dialog, JSONModel, XMLTemplateProcessor, XMLPreprocessor, Fragment, messageHandling, BusyLocker, CommonUtils, Log, FELibrary, FPMHelper, Button, StableIdHelper) {
6
+ "use strict";
6
7
 
7
- // Provides static functions to call OData actions (bound/import) and functions (bound/import)
8
- sap.ui.define(
9
- [
10
- "sap/m/MessageBox",
11
- "sap/m/Dialog",
12
- "sap/ui/model/json/JSONModel",
13
- "sap/ui/core/XMLTemplateProcessor",
14
- "sap/ui/core/util/XMLPreprocessor",
15
- "sap/ui/core/Fragment",
16
- "sap/fe/core/actions/messageHandling",
17
- "sap/fe/core/BusyLocker",
18
- "sap/fe/core/CommonUtils",
19
- "sap/base/Log",
20
- "sap/fe/core/library",
21
- "sap/fe/core/helpers/FPMHelper"
22
- ],
23
- function(
24
- MessageBox,
25
- Dialog,
26
- JSONModel,
27
- XMLTemplateProcessor,
28
- XMLPreprocessor,
29
- Fragment,
30
- messageHandling,
31
- BusyLocker,
32
- CommonUtils,
33
- Log,
34
- FELibrary,
35
- FPMHelper
36
- ) {
37
- "use strict";
38
-
39
- var Constants = FELibrary.Constants,
40
- InvocationGrouping = FELibrary.InvocationGrouping;
41
-
42
- /**
43
- * Calls a bound action for one or multiple contexts
44
- * @function
45
- * @static
46
- * @name sap.fe.core.actions.operations.callBoundAction
47
- * @memberof sap.fe.core.actions.operations
48
- * @param {string} sActionName The name of the action to be called
49
- * @param {sap.ui.model.odata.v4.Context} contexts Either one context or an array with contexts for which the action is to be be called
50
- * @param {sap.ui.model.odata.v4.Model} oModel OData Model
51
- * @param {object} oAppComponent The AppComponent
52
- * @param {map} [mParameters] Optional, can contain the following attributes:
53
- * @param {map} [mParameters.actionParameters] a map of parameters to be sent for every action call
54
- * @param {map} [mParameters.mBindingParameters] a map of binding parameters that would be part of $select and $expand coming from side effects for bound actions
55
- * @param {Array} [mParameters.additionalSideEffect] array of property paths to be requested in addition to actual target properties of the side effect
56
- * @param {boolean} [mParameters.showActionParameterDialog] [false] if set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
57
- * @param {string} [mParameters.label] a human-readable label for the action
58
- * @param {string} [mParameters.invocationGrouping] [Isolated] mode how actions are to be called: Changeset to put all action calls into one changeset, Isolated to put them into separate changesets
59
- * @param {Function} [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
60
- * @param {map} [mParameters.defaultParameters] can contain default parameters from FLP user defaults
61
- * @param {sap.ui.core.Element} [mParameters.parentControl] if specified the dialogs are added as dependent of the parent control
62
- * @param {boolean} [mParameters.bGetBoundContext] if specified the action promise returns the bound context
63
- * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
64
- * @private
65
- * @ui5-restricted
66
- */
67
-
68
- function callBoundAction(sActionName, contexts, oModel, oAppComponent, mParameters) {
69
- if (!contexts || contexts.length === 0) {
70
- //In Freestyle apps bound actions can have no context
71
- return Promise.reject("Bound actions always requires at least one context");
72
- }
73
- // we expect either one context or an array of contexts
74
- if (Array.isArray(contexts)) {
75
- mParameters.bReturnAsArray = true;
76
- } else {
77
- //action needs to be called on this context from the dependent binding so UI fields are updated with response data
78
- contexts = [contexts];
79
- }
80
- var oMetaModel = oModel.getMetaModel(),
81
- sActionPath = oMetaModel.getMetaPath(contexts[0].getPath()) + "/" + sActionName,
82
- oBoundAction = oMetaModel.createBindingContext(sActionPath + "/@$ui5.overload/0");
83
- mParameters.aContexts = contexts;
84
- mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath, contexts, oBoundAction);
85
- return callAction(sActionName, oModel, oBoundAction, oAppComponent, mParameters);
86
- }
87
-
88
- /**
89
- * Calls an action import.
90
- *
91
- * @function
92
- * @static
93
- * @name sap.fe.core.actions.operations.callActionImport
94
- * @memberof sap.fe.core.actions.operations
95
- * @param {string} sActionName The name of the action import to be called
96
- * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
97
- * @param {object} oAppComponent The AppComponent
98
- * @param {map} [mParameters] Optional, can contain the following attributes:
99
- * @param {map} [mParameters.actionParameters] A map of parameters to be sent with the action import
100
- * @param {string} [mParameters.label] A human-readable label for the action
101
- * @param {boolean} [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
102
- * @param {Function} [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
103
- * @param {map} [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
104
- * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
105
- * @private
106
- * @ui5-restricted
107
- */
108
- function callActionImport(sActionName, oModel, oAppComponent, mParameters) {
109
- if (!oModel) {
110
- return Promise.reject("Action expects a model/context for execution");
111
- }
112
- var oMetaModel = oModel.getMetaModel(),
113
- sActionPath = oModel.bindContext("/" + sActionName).getPath(),
114
- oActionImport = oMetaModel.createBindingContext(
115
- "/" + oMetaModel.createBindingContext(sActionPath).getObject("$Action") + "/0"
116
- );
117
- mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath + "/@$ui5.overload");
118
- return callAction(sActionName, oModel, oActionImport, oAppComponent, mParameters);
119
- }
120
-
121
- /**
122
- * Calls a bound function.
123
- *
124
- * @function
125
- * @static
126
- * @name sap.fe.core.actions.operations.callBoundFunction
127
- * @memberof sap.fe.core.actions.operations
128
- * @param {string} sFunctionName The name of the function to be called
129
- * @param {sap.ui.model.odata.v4.Context} context The context for which the function shall be called
130
- * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
131
- * @returns {Promise} Promise resolves
132
- * @private
133
- */
134
- function callBoundFunction(sFunctionName, context, oModel) {
135
- if (!context) {
136
- return Promise.reject("Bound functions always requires a context");
137
- }
138
- var oMetaModel = oModel.getMetaModel(),
139
- sFunctionPath = oMetaModel.getMetaPath(context.getPath()) + "/" + sFunctionName,
140
- oBoundFunction = oMetaModel.createBindingContext(sFunctionPath);
141
- return _executeFunction(sFunctionName, oModel, oBoundFunction, context);
142
- }
143
-
144
- /**
145
- * Calls a function import.
146
- *
147
- * @function
148
- * @static
149
- * @name sap.fe.core.actions.operations.callFunctionImport
150
- * @memberof sap.fe.core.actions.operations
151
- * @param {string} sFunctionName The name of the function to be called
152
- * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
153
- * @returns {Promise} Promise resolves
154
- * @private
155
- */
156
- function callFunctionImport(sFunctionName, oModel) {
157
- if (!sFunctionName) {
158
- return Promise.resolve();
159
- }
160
- var oMetaModel = oModel.getMetaModel(),
161
- sFunctionPath = oModel.bindContext("/" + sFunctionName).getPath(),
162
- oFunctionImport = oMetaModel.createBindingContext(
163
- "/" + oMetaModel.createBindingContext(sFunctionPath).getObject("$Function") + "/0"
164
- );
165
- return _executeFunction(sFunctionName, oModel, oFunctionImport);
166
- }
167
-
168
- function _executeFunction(sFunctionName, oModel, oFunction, context) {
169
- var oFunctionPromise, sGroupId;
170
- if (!oFunction || !oFunction.getObject()) {
171
- return Promise.reject(new Error("Function " + sFunctionName + " not found"));
172
- }
173
- if (context) {
174
- oFunction = oModel.bindContext(sFunctionName + "(...)", context);
175
- sGroupId = "functionGroup";
176
- } else {
177
- oFunction = oModel.bindContext("/" + sFunctionName + "(...)");
178
- sGroupId = "functionImport";
179
- }
180
- oFunctionPromise = oFunction.execute(sGroupId);
181
- oModel.submitBatch(sGroupId);
182
- return oFunctionPromise.then(function() {
183
- return oFunction.getBoundContext();
184
- });
185
- }
186
-
187
- function callAction(sActionName, oModel, oAction, oAppComponent, mParameters) {
188
- return new Promise(function(resolve, reject) {
189
- var aActionParameters = mParameters.actionParameters || [],
190
- mActionExecutionParameters = {},
191
- fnDialog,
192
- oActionPromise,
193
- sActionLabel = mParameters.label,
194
- bShowActionParameterDialog = mParameters.showActionParameterDialog,
195
- aContexts = mParameters.aContexts,
196
- bIsCreateAction = mParameters.bIsCreateAction,
197
- bIsCriticalAction = mParameters.isCriticalAction,
198
- oMetaModel,
199
- sMetaPath,
200
- sMessagesPath,
201
- iMessageSideEffect;
202
- if (!oAction || !oAction.getObject()) {
203
- return reject(new Error("Action " + sActionName + " not found"));
204
- }
205
- if (bShowActionParameterDialog || aActionParameters.length > 0) {
206
- aActionParameters = prepareActionParameters(oAction, aActionParameters);
207
- if (!aActionParameters || aActionParameters.length === 0) {
208
- bShowActionParameterDialog = false;
209
- }
210
- }
211
- if (bShowActionParameterDialog) {
212
- fnDialog = showActionParameterDialog;
213
- } else if (bIsCriticalAction) {
214
- fnDialog = confirmCriticalAction;
215
- }
216
- mActionExecutionParameters = {
217
- fnOnSubmitted: mParameters.onSubmitted,
218
- fnOnResponse: mParameters.onResponse,
219
- actionName: sActionName,
220
- model: oModel,
221
- aActionParameters: aActionParameters,
222
- bGetBoundContext: mParameters.bGetBoundContext,
223
- defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction
224
- };
225
- if (oAction.getObject("$IsBound")) {
226
- if (mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions) {
227
- oMetaModel = oModel.getMetaModel();
228
- sMetaPath = oMetaModel.getMetaPath(aContexts[0].getPath());
229
- sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
230
-
231
- if (sMessagesPath) {
232
- iMessageSideEffect = mParameters.additionalSideEffect.pathExpressions.findIndex(function(exp) {
233
- return exp.$PropertyPath === sMessagesPath;
234
- });
235
-
236
- if (iMessageSideEffect > -1) {
237
- // the message path is annotated as side effect. As there's no binding for it and the model does currently not allow
238
- // to add it at a later point of time we have to take care it's part of the $select of the POST, therefore moving it
239
- mParameters.mBindingParameters = mParameters.mBindingParameters || {};
240
-
241
- if (
242
- oAction.getObject("$ReturnType/$Type/" + sMessagesPath) &&
243
- (!mParameters.mBindingParameters.$select ||
244
- mParameters.mBindingParameters.$select.split(",").indexOf(sMessagesPath) === -1)
245
- ) {
246
- mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select
247
- ? mParameters.mBindingParameters.$select + "," + sMessagesPath
248
- : sMessagesPath;
249
-
250
- if (mParameters.additionalSideEffect.triggerActions.length === 0) {
251
- // no trigger action therefore no need to request messages again
252
- mParameters.additionalSideEffect.pathExpressions.splice(iMessageSideEffect, 1);
253
- }
254
- }
255
- }
256
- }
257
- }
258
-
259
- mActionExecutionParameters.aContexts = aContexts;
260
- mActionExecutionParameters.mBindingParameters = mParameters.mBindingParameters;
261
- mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
262
- mActionExecutionParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
263
- mActionExecutionParameters.bReturnAsArray = mParameters.bReturnAsArray;
264
- mActionExecutionParameters.internalModelContext = mParameters.internalModelContext;
265
- mActionExecutionParameters.operationAvailableMap = mParameters.operationAvailableMap;
266
- mActionExecutionParameters.bObjectPage = mParameters.bObjectPage;
267
- }
268
- if (bIsCreateAction) {
269
- mActionExecutionParameters.bIsCreateAction = bIsCreateAction;
270
- }
271
- if (fnDialog) {
272
- oActionPromise = fnDialog(
273
- sActionName,
274
- oAppComponent,
275
- sActionLabel,
276
- mActionExecutionParameters,
277
- aActionParameters,
278
- oAction,
279
- mParameters.parentControl,
280
- mParameters.entitySetName,
281
- mParameters.messageHandler
282
- );
283
- } else {
284
- oActionPromise = _executeAction(oAppComponent, mActionExecutionParameters);
285
- }
286
- return oActionPromise
287
- .then(function(oOperationResult) {
288
- resolve(oOperationResult);
289
- })
290
- .catch(function(oOperationResult) {
291
- reject(oOperationResult);
292
- });
293
- });
294
- }
295
-
296
- function confirmCriticalAction(
297
- sActionName,
298
- oAppComponent,
299
- sActionLabel,
300
- mParameters,
301
- aActionParameters,
302
- oActionContext,
303
- oParentControl,
304
- entitySetName,
305
- messageHandler
306
- ) {
307
- return new Promise(function(resolve, reject) {
308
- var boundActionName = sActionName ? sActionName : null;
309
- boundActionName =
310
- boundActionName.indexOf(".") >= 0 ? boundActionName.split(".")[boundActionName.split(".").length - 1] : boundActionName;
311
- var suffixResourceKey = boundActionName && entitySetName ? entitySetName + "|" + boundActionName : "";
312
- var oResourceBundle = oParentControl.getController().oResourceBundle;
313
- var sConfirmationText = CommonUtils.getTranslatedText(
314
- "C_OPERATIONS_ACTION_CONFIRM_MESSAGE",
315
- oResourceBundle,
316
- null,
317
- suffixResourceKey
318
- );
319
-
320
- MessageBox.confirm(sConfirmationText, {
321
- onClose: function(sAction) {
322
- if (sAction === MessageBox.Action.OK) {
323
- return _executeAction(oAppComponent, mParameters)
324
- .then(function(oOperation) {
325
- resolve(oOperation);
326
- })
327
- .catch(function(oError) {
328
- messageHandler
329
- .showMessageDialog()
330
- .then(function() {
331
- reject(oError);
332
- })
333
- .catch(function() {
334
- reject(oError);
335
- });
336
- });
337
- } else {
338
- resolve();
339
- }
340
- }
341
- });
342
- });
343
- }
344
-
345
- function showActionParameterDialog(
346
- sActionName,
347
- oAppComponent,
348
- sActionLabel,
349
- mParameters,
350
- aActionParameters,
351
- oActionContext,
352
- oParentControl,
353
- entitySetName,
354
- messageHandler
355
- ) {
356
- var sPath = _getPath(oActionContext, sActionName),
357
- metaModel = oActionContext.getModel().oModel.getMetaModel(),
358
- entitySetContext = metaModel.createBindingContext(sPath),
359
- sActionNamePath = oActionContext.getObject("$IsBound")
360
- ? oActionContext.getPath().split("/@$ui5.overload/0")[0]
361
- : oActionContext.getPath().split("/0")[0],
362
- actionNameContext = metaModel.createBindingContext(sActionNamePath),
363
- sFragmentName = "sap/fe/core/controls/ActionParameterDialog";
364
- return new Promise(function(resolve, reject) {
365
- var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment"),
366
- oParameterModel = new JSONModel({
367
- $displayMode: {}
368
- }),
369
- aFieldInvalid = [],
370
- aFormElements = [],
371
- mFieldValueMap = {},
372
- validateRequiredProperties = function() {
373
- return Promise.all(
374
- aFormElements
375
- .filter(function(oFormElement) {
376
- var oField = oFormElement.getFields()[0];
377
- return oField.getRequired() && oField.getValueState() !== "Error";
378
- })
379
- .map(function(oFormElement) {
380
- var value = oFormElement.getFields()[0].isA("sap.ui.mdc.MultiValueField")
381
- ? oFormElement.getFields()[0].getItems()
382
- : oFormElement.getFields()[0].getValue();
383
- if (value === undefined || value === null || value === "") {
384
- return oFormElement.getLabel().getText();
385
- }
386
- })
387
- ).then(function(aResults) {
388
- aResults = aResults.filter(function(result) {
389
- return result !== undefined;
390
- });
391
- return aResults;
392
- });
393
- },
394
- _validateMessages = function(aActionParameters, aFieldInvalid, bClearTarget) {
395
- var oMessageManager = sap.ui.getCore().getMessageManager();
396
- var aMessages = oMessageManager.getMessageModel().getData();
397
-
398
- aFieldInvalid = [];
399
-
400
- aActionParameters.forEach(function(oActionParameters) {
401
- var sParameter = oActionParameters.$Name;
402
- aMessages.forEach(function(oMessage) {
403
- var sParam = sParameter.replace("-inner", "");
404
- if (
405
- oMessage.controlIds.length > 0 &&
406
- (oMessage.getControlId().includes("APD_::" + sParameter) ||
407
- (oMessage.getControlId().includes("APD_::" + sParameter + "inner") &&
408
- aFieldInvalid.indexOf("APD_::" + sParam) < 0))
409
- ) {
410
- if (bClearTarget) {
411
- oMessageManager.removeMessages(oMessage);
412
- } else {
413
- aFieldInvalid.push("APD_::" + sParam);
414
- }
415
- }
416
- // Handle messages related to input with invalid token
417
- if (oMessage.target.includes("APD_::" + sParameter)) {
418
- aFieldInvalid.push("APD_::" + sParam);
419
- oMessage.target = bClearTarget ? "" : oMessage.target;
420
- if (bClearTarget) {
421
- oMessageManager.removeMessages(oMessage);
422
- }
423
- }
424
- });
425
- });
426
- return aFieldInvalid;
427
- },
428
- oController = {
429
- handleChange: function(oEvent) {
430
- messageHandler.removeTransitionMessages();
431
- var oField = oEvent.getSource();
432
- var sFieldId = oEvent.getParameter("id");
433
- var oFieldPromise = oEvent.getParameter("promise");
434
- if (oFieldPromise) {
435
- mFieldValueMap[sFieldId] = oFieldPromise.then(function() {
436
- return oField.getValue();
437
- });
438
- }
439
- _validateMessages(aActionParameters, aFieldInvalid);
440
- }
441
- };
442
-
443
- return Promise.resolve(
444
- XMLPreprocessor.process(
445
- oFragment,
446
- { name: sFragmentName },
447
- {
448
- bindingContexts: {
449
- action: oActionContext,
450
- actionName: actionNameContext,
451
- entitySet: entitySetContext
452
- },
453
- models: {
454
- action: oActionContext.getModel(),
455
- actionName: actionNameContext.getModel(),
456
- entitySet: entitySetContext.getModel(),
457
- metaModel: entitySetContext.getModel()
458
- }
459
- }
460
- )
461
- )
462
- .then(function(oFragment) {
463
- // TODO: move the dialog into the fragment and move the handlers to the oController
464
- return CommonUtils.setUserDefaults(oAppComponent, aActionParameters, oParameterModel, true).then(function() {
465
- // TODO: move the dialog into the fragment and move the handlers to the oController
466
- return Fragment.load({ definition: oFragment, controller: oController }).then(function(oDialogContent) {
467
- var oOperationBinding;
468
- var aContexts;
469
- var oResourceBundle = oParentControl.getController().oResourceBundle;
470
- var oDialog = new Dialog({
471
- title:
472
- sActionLabel ||
473
- CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_TITLE", oResourceBundle),
474
- content: [oDialogContent],
475
- escapeHandler: function(oPromise) {
476
- oDialog.close();
477
- messageHandler.removeTransitionMessages();
478
- reject();
479
- },
480
- beginButton: {
481
- text: sActionLabel || CommonUtils.getTranslatedText("C_COMMON_DIALOG_OK", oResourceBundle),
482
- type: "Emphasized",
483
- press: function(oEvent) {
484
- validateRequiredProperties()
485
- .then(function(aEmptyMandatoryFields) {
486
- if (aEmptyMandatoryFields.length) {
487
- var oMessages = [];
488
- for (var i = 0; i < aEmptyMandatoryFields.length; i++) {
489
- oMessages.push({
490
- text: CommonUtils.getTranslatedText(
491
- "C_OPERATIONS_ACTION_PARAMETER_DIALOG_MISSING_MANDATORY_MSG",
492
- oResourceBundle,
493
- aEmptyMandatoryFields[i]
494
- ),
495
- code: 200,
496
- type: "Error"
497
- });
498
- }
499
- messageHandler.showMessageDialog({
500
- customMessages: oMessages
501
- });
502
- return;
503
- }
504
-
505
- aFieldInvalid = _validateMessages(aActionParameters, aFieldInvalid);
506
-
507
- if (aFieldInvalid.length > 0) {
508
- return messageHandling.showUnboundMessages();
509
- }
510
- BusyLocker.lock(oDialog);
511
- return Promise.all(
512
- Object.keys(mFieldValueMap).map(function(sKey) {
513
- return mFieldValueMap[sKey];
514
- })
515
- )
516
- .then(function() {
517
- // TODO: due to using the search and value helps on the action dialog transient messages could appear
518
- // we need an UX design for those to show them to the user - for now remove them before continuing
519
- messageHandler.removeTransitionMessages();
520
- // move parameter values from Dialog (SimpleForm) to mParameters.actionParameters so that they are available in the operation bindings for all contexts
521
- var vParameterValue,
522
- oParameterContext =
523
- oOperationBinding && oOperationBinding.getParameterContext();
524
- for (var i in aActionParameters) {
525
- if (aActionParameters[i].$isCollection) {
526
- var aMVFContent = oDialog
527
- .getModel("mvfview")
528
- .getProperty("/" + aActionParameters[i].$Name),
529
- aKeyValues = [];
530
- for (var j in aMVFContent) {
531
- aKeyValues.push(aMVFContent[j].Key);
532
- }
533
- vParameterValue = aKeyValues;
534
- } else {
535
- vParameterValue = oParameterContext.getProperty(
536
- aActionParameters[i].$Name
537
- );
538
- }
539
- aActionParameters[i].value = vParameterValue;
540
- vParameterValue = undefined;
541
- }
542
- return _executeAction(oAppComponent, mParameters)
543
- .then(function(oOperation) {
544
- oDialog.close();
545
- resolve(oOperation);
546
- })
547
- .catch(function(oError) {
548
- throw oError;
549
- });
550
- })
551
- .catch(function() {
552
- var oMessageManager = sap.ui.getCore().getMessageManager();
553
- var bHasEtagMessage = messageHandling.modifyETagMessagesOnly(
554
- oMessageManager,
555
- oResourceBundle
556
- );
557
-
558
- messageHandler.showMessages({
559
- bHasEtagMessage: bHasEtagMessage,
560
- context: mParameters.aContexts[0],
561
- isActionParameterDialogOpen: true,
562
- messagePageNavigationCallback: function() {
563
- oDialog.close();
564
- }
565
- });
566
- if (oDialog && bHasEtagMessage) {
567
- oDialog.close(); //close the action parameter dialog after refresh of the context after etag mismatch
568
- }
569
- })
570
- .finally(function() {
571
- BusyLocker.unlock(oDialog);
572
- });
573
- })
574
- .catch(function() {
575
- return messageHandler.showMessageDialog();
576
- });
577
- }
578
- },
579
- endButton: {
580
- text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
581
- press: function() {
582
- _validateMessages(aActionParameters, aFieldInvalid, true);
583
- oDialog.close();
584
- messageHandler.removeTransitionMessages();
585
- reject(Constants.CancelActionDialog);
586
- }
587
- },
588
- beforeOpen: function(oEvent) {
589
- // clone event for actionWrapper as oEvent.oSource gets lost during processing of beforeOpen event handler
590
- var oCloneEvent = Object.assign({}, oEvent);
591
- messageHandler.removeTransitionMessages();
592
-
593
- var fnSetDefaultsAndOpenDialog = function(sBindingParameter) {
594
- var prefillParameter = function(sParamName, vParamDefaultValue) {
595
- return new Promise(function(resolve, reject) {
596
- // Case 1: There is a ParameterDefaultValue annotation
597
- if (vParamDefaultValue !== undefined) {
598
- if (aContexts.length > 0 && vParamDefaultValue.$Path) {
599
- var oPromise = CommonUtils.requestSingletonProperty(
600
- vParamDefaultValue.$Path,
601
- oOperationBinding.getModel()
602
- );
603
- oPromise
604
- .then(function(oValue) {
605
- if (oValue === null) {
606
- return oOperationBinding
607
- .getParameterContext()
608
- .requestProperty(vParamDefaultValue.$Path);
609
- }
610
- return oValue;
611
- })
612
- .then(function(vParamValue) {
613
- if (aContexts.length > 1) {
614
- // For multi select, need to loop over aContexts (as contexts cannot be retrieved via binding parameter of the operation binding)
615
- var sPathForContext = vParamDefaultValue.$Path;
616
- if (sPathForContext.indexOf(sBindingParameter + "/") === 0) {
617
- sPathForContext = sPathForContext.replace(
618
- sBindingParameter + "/",
619
- ""
620
- );
621
- }
622
- for (var i = 1; i < aContexts.length; i++) {
623
- if (aContexts[i].getProperty(sPathForContext) !== vParamValue) {
624
- // if the values from the contexts are not all the same, do not prefill
625
- resolve({
626
- paramName: sParamName,
627
- value: undefined,
628
- bNoPossibleValue: true
629
- });
630
- }
631
- }
632
- }
633
- resolve({ paramName: sParamName, value: vParamValue });
634
- })
635
- .catch(function() {
636
- // Simply clear parameter default if an error has occurred
637
- Log.error(
638
- "Error while reading default action parameter",
639
- sParamName,
640
- mParameters.actionName
641
- );
642
- resolve({
643
- paramName: sParamName,
644
- value: undefined,
645
- bLatePropertyError: true
646
- });
647
- });
648
- } else {
649
- // Case 1.2: ParameterDefaultValue defines a fixed string value (i.e. vParamDefaultValue = 'someString')
650
- resolve({ paramName: sParamName, value: vParamDefaultValue });
651
- }
652
- } else {
653
- // Case 2: There is no ParameterDefaultValue annotation (=> look into the FLP User Defaults)
654
- if (oParameterModel && oParameterModel.oData[sParamName]) {
655
- resolve({
656
- paramName: sParamName,
657
- value: oParameterModel.oData[sParamName]
658
- });
659
- } else {
660
- resolve({ paramName: sParamName, value: undefined });
661
- }
662
- }
663
- });
664
- };
665
-
666
- var getParameterDefaultValue = function(sParamName) {
667
- var oMetaModel = oDialog.getModel().getMetaModel(),
668
- sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
669
- sActionParameterAnnotationTarget = sActionPath + "/" + sParamName + "@",
670
- oParameterAnnotations = oMetaModel.getObject(sActionParameterAnnotationTarget),
671
- oParameterDefaultValue =
672
- oParameterAnnotations &&
673
- oParameterAnnotations["@com.sap.vocabularies.UI.v1.ParameterDefaultValue"]; // either { $Path: 'somePath' } or 'someString'
674
- return oParameterDefaultValue;
675
- };
676
-
677
- var getDefaultValuesFunction = function() {
678
- var oMetaModel = oDialog.getModel().getMetaModel(),
679
- sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
680
- sDefaultValuesFunction = oMetaModel.getObject(
681
- sActionPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction"
682
- );
683
- return sDefaultValuesFunction;
684
- };
685
-
686
- var aCurrentParamDefaultValue = [];
687
- var sParamName, vParameterDefaultValue;
688
- for (var i in aActionParameters) {
689
- sParamName = aActionParameters[i].$Name;
690
- vParameterDefaultValue = getParameterDefaultValue(sParamName);
691
- aCurrentParamDefaultValue.push(prefillParameter(sParamName, vParameterDefaultValue));
692
- }
693
-
694
- if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
695
- var sBoundFunctionName = getDefaultValuesFunction();
696
- if (
697
- sBoundFunctionName &&
698
- sBoundFunctionName.length > 0 &&
699
- typeof sBoundFunctionName === "string"
700
- ) {
701
- var aFunctionParams = [];
702
- for (var i in aContexts) {
703
- aFunctionParams.push(
704
- callBoundFunction(
705
- sBoundFunctionName,
706
- aContexts[i],
707
- mParameters.model,
708
- mParameters
709
- )
710
- );
711
- }
712
- }
713
- }
714
-
715
- var aPrefillParamPromises = Promise.all(aCurrentParamDefaultValue),
716
- aExecFunctionPromises = [],
717
- oExecFunctionFromManifestPromise;
718
- if (aFunctionParams) {
719
- aExecFunctionPromises = Promise.all(aFunctionParams);
720
- }
721
- if (mParameters.defaultValuesExtensionFunction) {
722
- var sModule = mParameters.defaultValuesExtensionFunction
723
- .substring(0, mParameters.defaultValuesExtensionFunction.lastIndexOf(".") || -1)
724
- .replace(/\./gi, "/"),
725
- sFunctionName = mParameters.defaultValuesExtensionFunction.substring(
726
- mParameters.defaultValuesExtensionFunction.lastIndexOf(".") + 1,
727
- mParameters.defaultValuesExtensionFunction.length
728
- );
729
- oExecFunctionFromManifestPromise = FPMHelper.actionWrapper(
730
- oCloneEvent,
731
- sModule,
732
- sFunctionName,
733
- { "contexts": aContexts }
734
- );
735
- }
736
-
737
- Promise.all([aPrefillParamPromises, aExecFunctionPromises, oExecFunctionFromManifestPromise])
738
- .then(function(aPromises) {
739
- var aCurrentParamDefaultValue = aPromises[0],
740
- aFunctionParams = aPromises[1],
741
- oFunctionParamsFromManifest = aPromises[2],
742
- sDialogParamName;
743
- for (var i in aActionParameters) {
744
- sDialogParamName = aActionParameters[i].$Name;
745
- if (
746
- oFunctionParamsFromManifest &&
747
- oFunctionParamsFromManifest.hasOwnProperty(sDialogParamName)
748
- ) {
749
- oOperationBinding.setParameter(
750
- aActionParameters[i].$Name,
751
- oFunctionParamsFromManifest[sDialogParamName]
752
- );
753
- } else if (
754
- aCurrentParamDefaultValue[i] &&
755
- aCurrentParamDefaultValue[i].value !== undefined
756
- ) {
757
- oOperationBinding.setParameter(
758
- aActionParameters[i].$Name,
759
- aCurrentParamDefaultValue[i].value
760
- );
761
- // if the default value had not been previously determined due to different contexts, we do nothing else
762
- } else if (sBoundFunctionName && !aCurrentParamDefaultValue[i].bNoPossibleValue) {
763
- if (aContexts.length > 1) {
764
- // we check if the function retrieves the same param value for all the contexts:
765
- var j = 0;
766
- while (j < aContexts.length - 1) {
767
- if (
768
- aFunctionParams[j] &&
769
- aFunctionParams[j + 1] &&
770
- aFunctionParams[j].getObject(sDialogParamName) ===
771
- aFunctionParams[j + 1].getObject(sDialogParamName)
772
- ) {
773
- j++;
774
- } else {
775
- break;
776
- }
777
- }
778
- //param values are all the same:
779
- if (j === aContexts.length - 1) {
780
- oOperationBinding.setParameter(
781
- aActionParameters[i].$Name,
782
- aFunctionParams[j].getObject(sDialogParamName)
783
- );
784
- }
785
- } else {
786
- //Only one context, then the default param values are to be verified from the function:
787
-
788
- if (aFunctionParams[0] && aFunctionParams[0].getObject(sDialogParamName)) {
789
- oOperationBinding.setParameter(
790
- aActionParameters[i].$Name,
791
- aFunctionParams[0].getObject(sDialogParamName)
792
- );
793
- }
794
- }
795
- }
796
- }
797
- var bErrorFound = aCurrentParamDefaultValue.some(function(oValue) {
798
- if (oValue.bLatePropertyError) {
799
- return oValue.bLatePropertyError;
800
- }
801
- });
802
- // If at least one Default Property is a Late Property and an eTag error was raised.
803
- if (bErrorFound) {
804
- var sText = CommonUtils.getTranslatedText(
805
- "C_APP_COMPONENT_SAPFE_ETAG_LATE_PROPERTY",
806
- oResourceBundle
807
- );
808
- MessageBox.warning(sText, { contentWidth: "25em" });
809
- }
810
- })
811
- .catch();
812
- };
813
-
814
- if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
815
- var aParameters = oActionContext.getObject("$Parameter"),
816
- sBindingParameter = aParameters[0] && aParameters[0].$Name;
817
- aContexts[0]
818
- .requestObject()
819
- .then(function(oContextObject) {
820
- if (oContextObject) {
821
- oOperationBinding.setParameter(sBindingParameter, oContextObject);
822
- }
823
- fnSetDefaultsAndOpenDialog(sBindingParameter);
824
- })
825
- .catch(function(oError) {
826
- Log.error("Error while retrieving the parameter", oError);
827
- });
828
- } else {
829
- fnSetDefaultsAndOpenDialog();
830
- }
831
- },
832
- afterClose: function() {
833
- oDialog.destroy();
834
- }
835
- });
836
- aFormElements = oDialogContent
837
- .getAggregation("form")
838
- .getAggregation("formContainers")[0]
839
- .getAggregation("formElements");
840
- oDialog.setModel(oActionContext.getModel().oModel);
841
- oDialog.setModel(oParameterModel, "paramsModel");
842
- oDialog.bindElement({
843
- path: "/",
844
- model: "paramsModel"
845
- });
846
- // empty model to add elements dynamically depending on number of MVF fields defined on the dialog
847
- var oMVFModel = new JSONModel({});
848
- oDialog.setModel(oMVFModel, "mvfview");
849
-
850
- var sActionPath = sActionName + "(...)";
851
- aContexts = mParameters.aContexts || [];
852
- if (!aContexts.length) {
853
- sActionPath = "/" + sActionPath;
854
- }
855
- oDialog.bindElement({
856
- path: sActionPath
857
- });
858
- if (oParentControl) {
859
- // if there is a parent control specified add the dialog as dependent
860
- oParentControl.addDependent(oDialog);
861
- }
862
- if (aContexts.length > 0) {
863
- oDialog.setBindingContext(aContexts[0]); // use context of first selected line item
864
- }
865
- oOperationBinding = oDialog.getObjectBinding();
866
- oDialog.open();
867
- });
868
- });
869
- })
870
- .catch(reject);
871
- });
872
- }
873
-
874
- function prepareActionParameters(oAction, aPredefinedParameters) {
875
- // check if parameters exist at all
876
- var aParameters = getActionParameters(oAction);
877
- aPredefinedParameters = aPredefinedParameters || [];
878
-
879
- if (aPredefinedParameters.length > 0) {
880
- // TODO: merge the predefined once with the real existing one
881
- }
882
-
883
- return aParameters;
884
- }
885
-
886
- function getActionParameters(oAction) {
887
- var aParameters = oAction.getObject("$Parameter") || [];
888
- if (aParameters && aParameters.length) {
889
- if (oAction.getObject("$IsBound")) {
890
- //in case of bound actions, ignore the first parameter and consider the rest
891
- return aParameters.slice(1, aParameters.length) || [];
892
- }
893
- }
894
- return aParameters;
895
- }
896
- function getIsActionCritical(oMetaModel, sPath, contexts, oBoundAction) {
897
- var vActionCritical = oMetaModel.getObject(sPath + "@com.sap.vocabularies.Common.v1.IsActionCritical"),
898
- sCriticalPath = vActionCritical && vActionCritical.$Path;
899
- if (!sCriticalPath) {
900
- // the static value scenario for isActionCritical
901
- return !!vActionCritical;
902
- }
903
- var aBindingParams = oBoundAction && oBoundAction.getObject("$Parameter"),
904
- aPaths = sCriticalPath && sCriticalPath.split("/"),
905
- bCondition =
906
- aBindingParams &&
907
- aBindingParams.length &&
908
- typeof aBindingParams === "object" &&
909
- sCriticalPath &&
910
- contexts &&
911
- contexts.length;
912
- if (bCondition) {
913
- //in case binding patameters are there in path need to remove eg: - _it/isVerified => need to remove _it and the path should be isVerified
914
- aBindingParams.filter(function(oParams) {
915
- var index = aPaths && aPaths.indexOf(oParams.$Name);
916
- if (index > -1) {
917
- aPaths.splice(index, 1);
918
- }
919
- });
920
- sCriticalPath = aPaths.join("/");
921
- return contexts[0].getObject(sCriticalPath);
922
- } else if (sCriticalPath) {
923
- //if scenario is path based return the path value
924
- return contexts[0].getObject(sCriticalPath);
925
- }
926
- }
927
-
928
- function _executeAction(oAppComponent, mParameters) {
929
- var aContexts = mParameters.aContexts || [],
930
- oModel = mParameters.model,
931
- iExistingMessages = messageHandling.getMessages().length || 0,
932
- aActionParameters = mParameters.aActionParameters || [],
933
- sActionName = mParameters.actionName,
934
- fnOnSubmitted = mParameters.fnOnSubmitted,
935
- fnOnResponse = mParameters.fnOnResponse,
936
- bIsCreateAction = mParameters.bIsCreateAction,
937
- bActionParametersExist = false,
938
- oAction;
939
-
940
- function fnDifferentiate(promise) {
941
- return promise.then(
942
- function(response) {
943
- var aMessages = messageHandling.getMessages();
944
- // Action Dialog must remain open if there are response error-messages, because in the java stack the dialog would be closed immediately.
945
- if (aMessages.length > iExistingMessages && aMessages[aMessages.length - 1].type === "Error") {
946
- return { response: response, status: "rejected" };
947
- }
948
- return { response: response, status: "resolved" };
949
- },
950
- function(response) {
951
- return { response: response, status: "rejected" };
952
- }
953
- );
954
- }
955
-
956
- function setActionParameterDefaultValue() {
957
- if (aActionParameters && aActionParameters.length) {
958
- bActionParametersExist = true;
959
- for (var j = 0; j < aActionParameters.length; j++) {
960
- if (!aActionParameters[j].value) {
961
- switch (aActionParameters[j].$Type) {
962
- case "Edm.String":
963
- aActionParameters[j].value = "";
964
- break;
965
- case "Edm.Boolean":
966
- aActionParameters[j].value = false;
967
- break;
968
- case "Edm.Byte":
969
- case "Edm.Int16":
970
- case "Edm.Int32":
971
- case "Edm.Int64":
972
- aActionParameters[j].value = 0;
973
- break;
974
- // tbc
975
- default:
976
- break;
977
- }
978
- }
979
- oAction.setParameter(aActionParameters[j].$Name, aActionParameters[j].value);
980
- }
981
- }
982
- }
983
-
984
- if (aContexts.length) {
985
- return new Promise(function(resolve, reject) {
986
- var mBindingParameters = mParameters.mBindingParameters,
987
- bGrouped = mParameters.bGrouped,
988
- bReturnAsArray = mParameters.bReturnAsArray,
989
- bGetBoundContext = mParameters.bGetBoundContext,
990
- aActionPromises = [],
991
- oActionPromise,
992
- i,
993
- sGroupId,
994
- fnExecuteAction = function(oAction, index, oSideEffect) {
995
- setActionParameterDefaultValue();
996
- // For invocation grouping "isolated" need batch group per action call
997
- sGroupId = !bGrouped ? "$auto." + index : oAction.getUpdateGroupId();
998
- oActionPromise = bGetBoundContext
999
- ? oAction.execute(sGroupId).then(function() {
1000
- return oAction.getBoundContext();
1001
- })
1002
- : oAction.execute(sGroupId);
1003
- aActionPromises.push(oActionPromise);
1004
- var oSideEffectsService = oAppComponent.getSideEffectsService();
1005
- // trigger actions from side effects
1006
- if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
1007
- oSideEffect.triggerActions.forEach(function(sTriggerAction) {
1008
- if (sTriggerAction) {
1009
- oSideEffectsService.executeAction(sTriggerAction, oSideEffect.context, sGroupId);
1010
- }
1011
- });
1012
- }
1013
- // request side effects for this action
1014
- // as we move the messages request to POST $select we need to be prepared for an empty array
1015
- if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
1016
- oSideEffectsService
1017
- .requestSideEffects(oSideEffect.pathExpressions, oSideEffect.context, sGroupId)
1018
- .then(function() {
1019
- if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
1020
- CommonUtils.setActionEnablement(
1021
- mParameters.internalModelContext,
1022
- JSON.parse(mParameters.operationAvailableMap),
1023
- mParameters.aContexts
1024
- );
1025
- }
1026
- })
1027
- .catch(function(oError) {
1028
- Log.error("Error while requesting side effects", oError);
1029
- });
1030
- }
1031
- },
1032
- fnExecuteSingleAction = function(oAction, index, oSideEffect) {
1033
- var oPromise = new Promise(function(resolve, reject) {
1034
- var oLocalPromise,
1035
- aLocalPromise = [];
1036
- setActionParameterDefaultValue();
1037
- // For invocation grouping "isolated" need batch group per action call
1038
- sGroupId = "apiMode" + index;
1039
- oActionPromise = bGetBoundContext
1040
- ? oAction.execute(sGroupId).then(function() {
1041
- return oAction.getBoundContext();
1042
- })
1043
- : oAction.execute(sGroupId);
1044
-
1045
- aActionPromises.push(oActionPromise);
1046
- aLocalPromise.push(oActionPromise);
1047
- var oSideEffectsService = oAppComponent.getSideEffectsService();
1048
- // trigger actions from side effects
1049
- if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
1050
- oSideEffect.triggerActions.forEach(function(sTriggerAction) {
1051
- if (sTriggerAction) {
1052
- oLocalPromise = oSideEffectsService.executeAction(
1053
- sTriggerAction,
1054
- oSideEffect.context,
1055
- sGroupId
1056
- );
1057
- aLocalPromise.push(oLocalPromise);
1058
- }
1059
- });
1060
- }
1061
- // request side effects for this action
1062
- // as we move the messages request to POST $select we need to be prepared for an empty array
1063
- if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
1064
- oLocalPromise = oSideEffectsService.requestSideEffects(
1065
- oSideEffect.pathExpressions,
1066
- oSideEffect.context,
1067
- sGroupId
1068
- );
1069
- aLocalPromise.push(oLocalPromise);
1070
- oLocalPromise
1071
- .then(function() {
1072
- if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
1073
- CommonUtils.setActionEnablement(
1074
- mParameters.internalModelContext,
1075
- JSON.parse(mParameters.operationAvailableMap),
1076
- mParameters.aContexts
1077
- );
1078
- }
1079
- })
1080
- .catch(function(oError) {
1081
- Log.error("Error while requesting side effects", oError);
1082
- });
1083
- }
1084
- oModel.submitBatch(sGroupId);
1085
- Promise.all(aLocalPromise)
1086
- .then(function() {
1087
- return resolve();
1088
- })
1089
- .catch(function() {
1090
- return resolve();
1091
- });
1092
- });
1093
- return oPromise;
1094
- };
1095
-
1096
- function fnExecuteSequentially(aContexts) {
1097
- // One action and its side effects are completed before the next action is executed
1098
- (fnOnSubmitted || function noop() {})(aActionPromises);
1099
- function processOneAction(context, i) {
1100
- oAction = oModel.bindContext(sActionName + "(...)", context, mBindingParameters);
1101
- return fnExecuteSingleAction(oAction, i, {
1102
- context: context,
1103
- pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1104
- triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1105
- });
1106
- }
1107
-
1108
- var oActionAndSideEffectPromise = Promise.resolve(undefined);
1109
- var j = 0;
1110
- aContexts.forEach(function(context) {
1111
- var id = ++j;
1112
- oActionAndSideEffectPromise = oActionAndSideEffectPromise.then(function() {
1113
- return processOneAction(context, id);
1114
- });
1115
- });
1116
- oActionAndSideEffectPromise
1117
- .then(function() {
1118
- fnHandleResults();
1119
- })
1120
- .catch();
1121
- }
1122
-
1123
- if (mParameters.bObjectPage && !bGrouped) {
1124
- // For invocation grouping "isolated" called from ObjectPage, ensure that each action and matching side effects
1125
- // are processed before the next set is submitted. Workaround until JSON batch is available.
1126
- fnExecuteSequentially(aContexts);
1127
- } else {
1128
- for (i = 0; i < aContexts.length; i++) {
1129
- oAction = oModel.bindContext(sActionName + "(...)", aContexts[i], mBindingParameters);
1130
- fnExecuteAction(oAction, aContexts.length <= 1 ? null : i, {
1131
- context: aContexts[i],
1132
- pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
1133
- triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
1134
- });
1135
- }
1136
- (fnOnSubmitted || function noop() {})(aActionPromises);
1137
- fnHandleResults();
1138
- }
1139
-
1140
- function fnHandleResults() {
1141
- Promise.all(aActionPromises.map(fnDifferentiate))
1142
- .then(function(results) {
1143
- var aRejectedItems = [],
1144
- aResolvedItems = [],
1145
- iResultCount;
1146
- for (iResultCount = 0; iResultCount < results.length; iResultCount++) {
1147
- if (results[iResultCount].status === "rejected") {
1148
- aRejectedItems.push(results[iResultCount].response);
1149
- }
1150
- if (results[iResultCount].status === "resolved") {
1151
- if (bIsCreateAction && bActionParametersExist) {
1152
- //only used for NewAction
1153
- results[iResultCount].bConsiderDocumentModified = true;
1154
- aResolvedItems.push(results[iResultCount]);
1155
- } else {
1156
- aResolvedItems.push(results[iResultCount].response);
1157
- }
1158
- }
1159
- }
1160
- if (!results || (results && results.length === 0)) {
1161
- reject(true);
1162
- }
1163
- if (aRejectedItems.length === 0) {
1164
- if (bReturnAsArray) {
1165
- resolve(aResolvedItems);
1166
- } else {
1167
- // context is given directly without an array so also no array is expected
1168
- resolve(aResolvedItems[0]);
1169
- }
1170
- } else {
1171
- reject({
1172
- resolvedItems: aResolvedItems,
1173
- rejectedItems: aRejectedItems
1174
- });
1175
- }
1176
- })
1177
- .catch(reject);
1178
- }
1179
- }).finally(function() {
1180
- (fnOnResponse || function noop() {})();
1181
- });
1182
- } else {
1183
- var oActionPromise;
1184
- oAction = oModel.bindContext("/" + sActionName + "(...)");
1185
- setActionParameterDefaultValue();
1186
- oActionPromise = oAction.execute("actionImport");
1187
- oModel.submitBatch("actionImport");
1188
- // trigger onSubmitted "event"
1189
- (fnOnSubmitted || function noop() {})(oActionPromise);
1190
- return oActionPromise.finally(function() {
1191
- (fnOnResponse || function noop() {})();
1192
- });
1193
- }
1194
- }
1195
-
1196
- function _getPath(oActionContext, sActionName) {
1197
- var sPath = oActionContext.getPath();
1198
- sPath = oActionContext.getObject("$IsBound") ? sPath.split("@$ui5.overload")[0] : sPath.split("/0")[0];
1199
- return sPath.split("/" + sActionName)[0];
1200
- }
1201
-
1202
- /**
1203
- * Static functions to call OData actions (bound/import) and functions (bound/import)
1204
- *
1205
- * @namespace
1206
- * @alias sap.fe.core.actions.operations
1207
- * @private
1208
- * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
1209
- * @since 1.56.0
1210
- */
1211
- var operations = {
1212
- callBoundAction: callBoundAction,
1213
- callActionImport: callActionImport,
1214
- callBoundFunction: callBoundFunction,
1215
- callFunctionImport: callFunctionImport
1216
- };
1217
- return operations;
1218
- }
1219
- );
8
+ var generate = StableIdHelper.generate;
9
+
10
+ var Constants = FELibrary.Constants,
11
+ InvocationGrouping = FELibrary.InvocationGrouping;
12
+ var Action = MessageBox.Action;
13
+ /**
14
+ * Calls a bound action for one or multiple contexts.
15
+ *
16
+ * @function
17
+ * @static
18
+ * @name sap.fe.core.actions.operations.callBoundAction
19
+ * @memberof sap.fe.core.actions.operations
20
+ * @param {string} sActionName The name of the action to be called
21
+ * @param {sap.ui.model.odata.v4.Context} contexts Either one context or an array with contexts for which the action is to be be called
22
+ * @param {sap.ui.model.odata.v4.Model} oModel OData Model
23
+ * @param {object} oAppComponent The AppComponent
24
+ * @param {map} [mParameters] Optional, can contain the following attributes:
25
+ * @param {map} [mParameters.actionParameters] A map of parameters to be sent for every action call
26
+ * @param {map} [mParameters.mBindingParameters] A map of binding parameters that would be part of $select and $expand coming from side effects for bound actions
27
+ * @param {Array} [mParameters.additionalSideEffect] Array of property paths to be requested in addition to actual target properties of the side effect
28
+ * @param {boolean} [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
29
+ * @param {string} [mParameters.label] A human-readable label for the action
30
+ * @param {string} [mParameters.invocationGrouping] Mode how actions are to be called: Changeset to put all action calls into one changeset, Isolated to put them into separate changesets, defaults to Isolated
31
+ * @param {Function} [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
32
+ * @param {map} [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
33
+ * @param {sap.ui.core.Element} [mParameters.parentControl] If specified the dialogs are added as dependent of the parent control
34
+ * @param {boolean} [mParameters.bGetBoundContext] If specified the action promise returns the bound context
35
+ * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
36
+ * @private
37
+ * @ui5-restricted
38
+ */
39
+
40
+ function callBoundAction(sActionName, contexts, oModel, oAppComponent, mParameters) {
41
+ if (!contexts || contexts.length === 0) {
42
+ //In Freestyle apps bound actions can have no context
43
+ return Promise.reject("Bound actions always requires at least one context");
44
+ } // we expect either one context or an array of contexts
45
+
46
+
47
+ if (Array.isArray(contexts)) {
48
+ mParameters.bReturnAsArray = true;
49
+ } else {
50
+ //action needs to be called on this context from the dependent binding so UI fields are updated with response data
51
+ contexts = [contexts];
52
+ }
53
+
54
+ var oMetaModel = oModel.getMetaModel(),
55
+ sActionPath = oMetaModel.getMetaPath(contexts[0].getPath()) + "/" + sActionName,
56
+ oBoundAction = oMetaModel.createBindingContext(sActionPath + "/@$ui5.overload/0");
57
+ mParameters.aContexts = contexts;
58
+ mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath, contexts, oBoundAction);
59
+ return callAction(sActionName, oModel, oBoundAction, oAppComponent, mParameters);
60
+ }
61
+ /**
62
+ * Calls an action import.
63
+ *
64
+ * @function
65
+ * @static
66
+ * @name sap.fe.core.actions.operations.callActionImport
67
+ * @memberof sap.fe.core.actions.operations
68
+ * @param {string} sActionName The name of the action import to be called
69
+ * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
70
+ * @param {object} oAppComponent The AppComponent
71
+ * @param {map} [mParameters] Optional, can contain the following attributes:
72
+ * @param {map} [mParameters.actionParameters] A map of parameters to be sent with the action import
73
+ * @param {string} [mParameters.label] A human-readable label for the action
74
+ * @param {boolean} [mParameters.showActionParameterDialog] If set and if parameters exist the user retrieves a dialog to fill in parameters, if actionParameters are passed they are shown to the user
75
+ * @param {Function} [mParameters.onSubmitted] Function which is called once the actions are submitted with an array of promises
76
+ * @param {map} [mParameters.defaultParameters] Can contain default parameters from FLP user defaults
77
+ * @returns {Promise} Promise resolves with an array of response objects (TODO: to be changed)
78
+ * @private
79
+ * @ui5-restricted
80
+ */
81
+
82
+
83
+ function callActionImport(sActionName, oModel, oAppComponent, mParameters) {
84
+ if (!oModel) {
85
+ return Promise.reject("Action expects a model/context for execution");
86
+ }
87
+
88
+ var oMetaModel = oModel.getMetaModel(),
89
+ sActionPath = oModel.bindContext("/" + sActionName).getPath(),
90
+ oActionImport = oMetaModel.createBindingContext("/" + oMetaModel.createBindingContext(sActionPath).getObject("$Action") + "/0");
91
+ mParameters.isCriticalAction = getIsActionCritical(oMetaModel, sActionPath + "/@$ui5.overload");
92
+ return callAction(sActionName, oModel, oActionImport, oAppComponent, mParameters);
93
+ }
94
+
95
+ function callBoundFunction(sFunctionName, context, oModel) {
96
+ if (!context) {
97
+ return Promise.reject("Bound functions always requires a context");
98
+ }
99
+
100
+ var oMetaModel = oModel.getMetaModel(),
101
+ sFunctionPath = oMetaModel.getMetaPath(context.getPath()) + "/" + sFunctionName,
102
+ oBoundFunction = oMetaModel.createBindingContext(sFunctionPath);
103
+ return _executeFunction(sFunctionName, oModel, oBoundFunction, context);
104
+ }
105
+ /**
106
+ * Calls a function import.
107
+ *
108
+ * @function
109
+ * @static
110
+ * @name sap.fe.core.actions.operations.callFunctionImport
111
+ * @memberof sap.fe.core.actions.operations
112
+ * @param {string} sFunctionName The name of the function to be called
113
+ * @param {sap.ui.model.odata.v4.ODataModel} oModel An instance of an OData v4 model
114
+ * @returns {Promise} Promise resolves
115
+ * @private
116
+ */
117
+
118
+
119
+ function callFunctionImport(sFunctionName, oModel) {
120
+ if (!sFunctionName) {
121
+ return Promise.resolve();
122
+ }
123
+
124
+ var oMetaModel = oModel.getMetaModel(),
125
+ sFunctionPath = oModel.bindContext("/" + sFunctionName).getPath(),
126
+ oFunctionImport = oMetaModel.createBindingContext("/" + oMetaModel.createBindingContext(sFunctionPath).getObject("$Function") + "/0");
127
+ return _executeFunction(sFunctionName, oModel, oFunctionImport);
128
+ }
129
+
130
+ function _executeFunction(sFunctionName, oModel, oFunction, context) {
131
+ var sGroupId;
132
+
133
+ if (!oFunction || !oFunction.getObject()) {
134
+ return Promise.reject(new Error("Function " + sFunctionName + " not found"));
135
+ }
136
+
137
+ if (context) {
138
+ oFunction = oModel.bindContext(sFunctionName + "(...)", context);
139
+ sGroupId = "functionGroup";
140
+ } else {
141
+ oFunction = oModel.bindContext("/" + sFunctionName + "(...)");
142
+ sGroupId = "functionImport";
143
+ }
144
+
145
+ var oFunctionPromise = oFunction.execute(sGroupId);
146
+ oModel.submitBatch(sGroupId);
147
+ return oFunctionPromise.then(function () {
148
+ return oFunction.getBoundContext();
149
+ });
150
+ }
151
+
152
+ function callAction(sActionName, oModel, oAction, oAppComponent, mParameters) {
153
+ return new Promise(function (resolve, reject) {
154
+ var aActionParameters = mParameters.actionParameters || [];
155
+ var mActionExecutionParameters = {};
156
+ var fnDialog;
157
+ var oActionPromise;
158
+ var sActionLabel = mParameters.label;
159
+ var bShowActionParameterDialog = mParameters.showActionParameterDialog;
160
+ var aContexts = mParameters.aContexts;
161
+ var bIsCreateAction = mParameters.bIsCreateAction;
162
+ var bIsCriticalAction = mParameters.isCriticalAction;
163
+ var oMetaModel;
164
+ var sMetaPath;
165
+ var sMessagesPath;
166
+ var iMessageSideEffect;
167
+
168
+ if (!oAction || !oAction.getObject()) {
169
+ return reject(new Error("Action " + sActionName + " not found"));
170
+ }
171
+
172
+ if (bShowActionParameterDialog || aActionParameters.length > 0) {
173
+ aActionParameters = prepareActionParameters(oAction, aActionParameters);
174
+
175
+ if (!aActionParameters || aActionParameters.length === 0) {
176
+ bShowActionParameterDialog = false;
177
+ }
178
+ }
179
+
180
+ if (bShowActionParameterDialog) {
181
+ fnDialog = showActionParameterDialog;
182
+ } else if (bIsCriticalAction) {
183
+ fnDialog = confirmCriticalAction;
184
+ }
185
+
186
+ mActionExecutionParameters = {
187
+ fnOnSubmitted: mParameters.onSubmitted,
188
+ fnOnResponse: mParameters.onResponse,
189
+ actionName: sActionName,
190
+ model: oModel,
191
+ aActionParameters: aActionParameters,
192
+ bGetBoundContext: mParameters.bGetBoundContext,
193
+ defaultValuesExtensionFunction: mParameters.defaultValuesExtensionFunction
194
+ };
195
+
196
+ if (oAction.getObject("$IsBound")) {
197
+ if (mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions) {
198
+ oMetaModel = oModel.getMetaModel();
199
+ sMetaPath = oMetaModel.getMetaPath(aContexts[0].getPath());
200
+ sMessagesPath = oMetaModel.getObject(sMetaPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
201
+
202
+ if (sMessagesPath) {
203
+ iMessageSideEffect = mParameters.additionalSideEffect.pathExpressions.findIndex(function (exp) {
204
+ return exp.$PropertyPath === sMessagesPath;
205
+ });
206
+
207
+ if (iMessageSideEffect > -1) {
208
+ // the message path is annotated as side effect. As there's no binding for it and the model does currently not allow
209
+ // to add it at a later point of time we have to take care it's part of the $select of the POST, therefore moving it
210
+ mParameters.mBindingParameters = mParameters.mBindingParameters || {};
211
+
212
+ if (oAction.getObject("$ReturnType/$Type/" + sMessagesPath) && (!mParameters.mBindingParameters.$select || mParameters.mBindingParameters.$select.split(",").indexOf(sMessagesPath) === -1)) {
213
+ mParameters.mBindingParameters.$select = mParameters.mBindingParameters.$select ? mParameters.mBindingParameters.$select + "," + sMessagesPath : sMessagesPath;
214
+
215
+ if (mParameters.additionalSideEffect.triggerActions.length === 0) {
216
+ // no trigger action therefore no need to request messages again
217
+ mParameters.additionalSideEffect.pathExpressions.splice(iMessageSideEffect, 1);
218
+ }
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ mActionExecutionParameters.aContexts = aContexts;
225
+ mActionExecutionParameters.mBindingParameters = mParameters.mBindingParameters;
226
+ mActionExecutionParameters.additionalSideEffect = mParameters.additionalSideEffect;
227
+ mActionExecutionParameters.bGrouped = mParameters.invocationGrouping === InvocationGrouping.ChangeSet;
228
+ mActionExecutionParameters.bReturnAsArray = mParameters.bReturnAsArray;
229
+ mActionExecutionParameters.internalModelContext = mParameters.internalModelContext;
230
+ mActionExecutionParameters.operationAvailableMap = mParameters.operationAvailableMap;
231
+ mActionExecutionParameters.bObjectPage = mParameters.bObjectPage;
232
+ }
233
+
234
+ if (bIsCreateAction) {
235
+ mActionExecutionParameters.bIsCreateAction = bIsCreateAction;
236
+ }
237
+
238
+ if (fnDialog) {
239
+ oActionPromise = fnDialog(sActionName, oAppComponent, sActionLabel, mActionExecutionParameters, aActionParameters, oAction, mParameters.parentControl, mParameters.entitySetName, mParameters.messageHandler);
240
+ } else {
241
+ oActionPromise = _executeAction(oAppComponent, mActionExecutionParameters);
242
+ }
243
+
244
+ return oActionPromise.then(function (oOperationResult) {
245
+ resolve(oOperationResult);
246
+ }).catch(function (oOperationResult) {
247
+ reject(oOperationResult);
248
+ });
249
+ });
250
+ }
251
+
252
+ function confirmCriticalAction(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, oActionContext, oParentControl, entitySetName, messageHandler) {
253
+ return new Promise(function (resolve, reject) {
254
+ var boundActionName = sActionName ? sActionName : null;
255
+ boundActionName = boundActionName.indexOf(".") >= 0 ? boundActionName.split(".")[boundActionName.split(".").length - 1] : boundActionName;
256
+ var suffixResourceKey = boundActionName && entitySetName ? entitySetName + "|" + boundActionName : "";
257
+ var oResourceBundle = oParentControl.getController().oResourceBundle;
258
+ var sConfirmationText = CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_CONFIRM_MESSAGE", oResourceBundle, null, suffixResourceKey);
259
+ MessageBox.confirm(sConfirmationText, {
260
+ onClose: function (sAction) {
261
+ if (sAction === Action.OK) {
262
+ return _executeAction(oAppComponent, mParameters).then(function (oOperation) {
263
+ resolve(oOperation);
264
+ }).catch(function (oError) {
265
+ messageHandler.showMessageDialog().then(function () {
266
+ reject(oError);
267
+ }).catch(function () {
268
+ reject(oError);
269
+ });
270
+ });
271
+ } else {
272
+ resolve();
273
+ }
274
+ }
275
+ });
276
+ });
277
+ }
278
+
279
+ function showActionParameterDialog(sActionName, oAppComponent, sActionLabel, mParameters, aActionParameters, oActionContext, oParentControl, entitySetName, messageHandler) {
280
+ var sPath = _getPath(oActionContext, sActionName),
281
+ metaModel = oActionContext.getModel().oModel.getMetaModel(),
282
+ entitySetContext = metaModel.createBindingContext(sPath),
283
+ sActionNamePath = oActionContext.getObject("$IsBound") ? oActionContext.getPath().split("/@$ui5.overload/0")[0] : oActionContext.getPath().split("/0")[0],
284
+ actionNameContext = metaModel.createBindingContext(sActionNamePath),
285
+ sFragmentName = "sap/fe/core/controls/ActionParameterDialog";
286
+
287
+ return new Promise(function (resolve, reject) {
288
+ var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
289
+ var oParameterModel = new JSONModel({
290
+ $displayMode: {}
291
+ });
292
+ var aFieldInvalid = [];
293
+ var aFormElements = [];
294
+ var mFieldValueMap = {};
295
+
296
+ var validateRequiredProperties = function () {
297
+ return Promise.all(aFormElements.filter(function (oFormElement) {
298
+ var oField = oFormElement.getFields()[0];
299
+ return oField.getRequired() && oField.getValueState() !== "Error";
300
+ }).map(function (oFormElement) {
301
+ var value = oFormElement.getFields()[0].isA("sap.ui.mdc.MultiValueField") ? oFormElement.getFields()[0].getItems() : oFormElement.getFields()[0].getValue();
302
+
303
+ if (value === undefined || value === null || value === "") {
304
+ return oFormElement.getLabel().getText();
305
+ }
306
+ })).then(function (aResults) {
307
+ aResults = aResults.filter(function (result) {
308
+ return result !== undefined;
309
+ });
310
+ return aResults;
311
+ });
312
+ };
313
+
314
+ var _validateMessages = function (aActionParameters, aFieldInvalid, bClearTarget) {
315
+ var oMessageManager = sap.ui.getCore().getMessageManager();
316
+ var aMessages = oMessageManager.getMessageModel().getData();
317
+ aFieldInvalid = aFieldInvalid || [];
318
+ aActionParameters.forEach(function (oActionParameters) {
319
+ var sParameter = oActionParameters.$Name;
320
+ aMessages.forEach(function (oMessage) {
321
+ var sParam = sParameter.replace("-inner", "");
322
+
323
+ if (oMessage.controlIds.length > 0 && (oMessage.getControlId().includes("APD_::" + sParameter) || oMessage.getControlId().includes("APD_::" + sParameter + "inner") && aFieldInvalid.indexOf("APD_::" + sParam) < 0)) {
324
+ if (bClearTarget) {
325
+ oMessageManager.removeMessages(oMessage);
326
+ } else {
327
+ aFieldInvalid.push("APD_::" + sParam);
328
+ }
329
+ } // Handle messages related to input with invalid token
330
+
331
+
332
+ if (oMessage.target.includes("APD_::" + sParameter)) {
333
+ aFieldInvalid.push("APD_::" + sParam);
334
+ oMessage.target = bClearTarget ? "" : oMessage.target;
335
+
336
+ if (bClearTarget) {
337
+ oMessageManager.removeMessages(oMessage);
338
+ }
339
+ }
340
+ });
341
+ });
342
+ return aFieldInvalid;
343
+ };
344
+
345
+ var oController = {
346
+ handleChange: function (oEvent) {
347
+ messageHandler.removeTransitionMessages();
348
+ var oField = oEvent.getSource();
349
+ var sFieldId = oEvent.getParameter("id");
350
+ var oFieldPromise = oEvent.getParameter("promise");
351
+
352
+ if (oFieldPromise) {
353
+ mFieldValueMap[sFieldId] = oFieldPromise.then(function () {
354
+ return oField.getValue();
355
+ });
356
+ }
357
+
358
+ _validateMessages(aActionParameters, aFieldInvalid);
359
+ }
360
+ };
361
+ return Promise.resolve(XMLPreprocessor.process(oFragment, {
362
+ name: sFragmentName
363
+ }, {
364
+ bindingContexts: {
365
+ action: oActionContext,
366
+ actionName: actionNameContext,
367
+ entitySet: entitySetContext
368
+ },
369
+ models: {
370
+ action: oActionContext.getModel(),
371
+ actionName: actionNameContext.getModel(),
372
+ entitySet: entitySetContext.getModel(),
373
+ metaModel: entitySetContext.getModel()
374
+ }
375
+ })).then(function (oFragment) {
376
+ // TODO: move the dialog into the fragment and move the handlers to the oController
377
+ var aContexts;
378
+ var aFunctionParams = [];
379
+ var oOperationBinding;
380
+ return CommonUtils.setUserDefaults(oAppComponent, aActionParameters, oParameterModel, true).then(function () {
381
+ // TODO: move the dialog into the fragment and move the handlers to the oController
382
+ return Fragment.load({
383
+ definition: oFragment,
384
+ controller: oController
385
+ }).then(function (oDialogContent) {
386
+ var oResourceBundle = oParentControl.getController().oResourceBundle;
387
+ var oDialog = new Dialog(undefined, {
388
+ title: sActionLabel || CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_TITLE", oResourceBundle),
389
+ content: [oDialogContent],
390
+ escapeHandler: function () {
391
+ oDialog.close();
392
+ messageHandler.removeTransitionMessages();
393
+ reject();
394
+ },
395
+ beginButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Ok"]), {
396
+ text: sActionLabel || CommonUtils.getTranslatedText("C_COMMON_DIALOG_OK", oResourceBundle),
397
+ type: "Emphasized",
398
+ press: function () {
399
+ validateRequiredProperties().then(function (aEmptyMandatoryFields) {
400
+ if (aEmptyMandatoryFields.length) {
401
+ var oMessages = [];
402
+
403
+ for (var i = 0; i < aEmptyMandatoryFields.length; i++) {
404
+ oMessages.push({
405
+ text: CommonUtils.getTranslatedText("C_OPERATIONS_ACTION_PARAMETER_DIALOG_MISSING_MANDATORY_MSG", oResourceBundle, aEmptyMandatoryFields[i]),
406
+ code: 200,
407
+ type: "Error"
408
+ });
409
+ }
410
+
411
+ messageHandler.showMessageDialog({
412
+ customMessages: oMessages
413
+ });
414
+ return;
415
+ }
416
+
417
+ aFieldInvalid = _validateMessages(aActionParameters, aFieldInvalid);
418
+
419
+ if (aFieldInvalid.length > 0) {
420
+ return messageHandling.showUnboundMessages();
421
+ }
422
+
423
+ BusyLocker.lock(oDialog);
424
+ return Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
425
+ return mFieldValueMap[sKey];
426
+ })).then(function () {
427
+ // TODO: due to using the search and value helps on the action dialog transient messages could appear
428
+ // we need an UX design for those to show them to the user - for now remove them before continuing
429
+ messageHandler.removeTransitionMessages(); // move parameter values from Dialog (SimpleForm) to mParameters.actionParameters so that they are available in the operation bindings for all contexts
430
+
431
+ var vParameterValue;
432
+ var oParameterContext = oOperationBinding && oOperationBinding.getParameterContext();
433
+
434
+ for (var _i in aActionParameters) {
435
+ if (aActionParameters[_i].$isCollection) {
436
+ var aMVFContent = oDialog.getModel("mvfview").getProperty("/" + aActionParameters[_i].$Name),
437
+ aKeyValues = [];
438
+
439
+ for (var j in aMVFContent) {
440
+ aKeyValues.push(aMVFContent[j].Key);
441
+ }
442
+
443
+ vParameterValue = aKeyValues;
444
+ } else {
445
+ vParameterValue = oParameterContext.getProperty(aActionParameters[_i].$Name);
446
+ }
447
+
448
+ aActionParameters[_i].value = vParameterValue;
449
+ vParameterValue = undefined;
450
+ }
451
+
452
+ return _executeAction(oAppComponent, mParameters).then(function (oOperation) {
453
+ oDialog.close();
454
+ resolve(oOperation);
455
+ }).catch(function (oError) {
456
+ throw oError;
457
+ });
458
+ }).catch(function () {
459
+ var oMessageManager = sap.ui.getCore().getMessageManager();
460
+ var bHasEtagMessage = messageHandling.modifyETagMessagesOnly(oMessageManager, oResourceBundle);
461
+ messageHandler.showMessages({
462
+ bHasEtagMessage: bHasEtagMessage,
463
+ context: mParameters.aContexts[0],
464
+ isActionParameterDialogOpen: true,
465
+ messagePageNavigationCallback: function () {
466
+ oDialog.close();
467
+ }
468
+ });
469
+
470
+ if (oDialog && bHasEtagMessage) {
471
+ oDialog.close(); //close the action parameter dialog after refresh of the context after etag mismatch
472
+ }
473
+ }).finally(function () {
474
+ BusyLocker.unlock(oDialog);
475
+ });
476
+ }).catch(function () {
477
+ return messageHandler.showMessageDialog();
478
+ });
479
+ }
480
+ }),
481
+ endButton: new Button(generate(["fe", "APD_", sActionName, "Action", "Cancel"]), {
482
+ text: CommonUtils.getTranslatedText("C_COMMON_ACTION_PARAMETER_DIALOG_CANCEL", oResourceBundle),
483
+ press: function () {
484
+ _validateMessages(aActionParameters, aFieldInvalid, true);
485
+
486
+ oDialog.close();
487
+ messageHandler.removeTransitionMessages();
488
+ reject(Constants.CancelActionDialog);
489
+ }
490
+ }),
491
+ beforeOpen: function (oEvent) {
492
+ // clone event for actionWrapper as oEvent.oSource gets lost during processing of beforeOpen event handler
493
+ var oCloneEvent = Object.assign({}, oEvent);
494
+ messageHandler.removeTransitionMessages();
495
+
496
+ var getDefaultValuesFunction = function () {
497
+ var oMetaModel = oDialog.getModel().getMetaModel(),
498
+ sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
499
+ sDefaultValuesFunction = oMetaModel.getObject(sActionPath + "@com.sap.vocabularies.Common.v1.DefaultValuesFunction");
500
+ return sDefaultValuesFunction;
501
+ };
502
+
503
+ var fnSetDefaultsAndOpenDialog = function (sBindingParameter) {
504
+ var sBoundFunctionName = getDefaultValuesFunction();
505
+
506
+ var prefillParameter = function (sParamName, vParamDefaultValue) {
507
+ return new Promise(function (resolve) {
508
+ // Case 1: There is a ParameterDefaultValue annotation
509
+ if (vParamDefaultValue !== undefined) {
510
+ if (aContexts.length > 0 && vParamDefaultValue.$Path) {
511
+ var oPromise = CommonUtils.requestSingletonProperty(vParamDefaultValue.$Path, oOperationBinding.getModel());
512
+ oPromise.then(function (oValue) {
513
+ if (oValue === null) {
514
+ return oOperationBinding.getParameterContext().requestProperty(vParamDefaultValue.$Path);
515
+ }
516
+
517
+ return oValue;
518
+ }).then(function (vParamValue) {
519
+ if (aContexts.length > 1) {
520
+ // For multi select, need to loop over aContexts (as contexts cannot be retrieved via binding parameter of the operation binding)
521
+ var sPathForContext = vParamDefaultValue.$Path;
522
+
523
+ if (sPathForContext.indexOf(sBindingParameter + "/") === 0) {
524
+ sPathForContext = sPathForContext.replace(sBindingParameter + "/", "");
525
+ }
526
+
527
+ for (var i = 1; i < aContexts.length; i++) {
528
+ if (aContexts[i].getProperty(sPathForContext) !== vParamValue) {
529
+ // if the values from the contexts are not all the same, do not prefill
530
+ resolve({
531
+ paramName: sParamName,
532
+ value: undefined,
533
+ bNoPossibleValue: true
534
+ });
535
+ }
536
+ }
537
+ }
538
+
539
+ resolve({
540
+ paramName: sParamName,
541
+ value: vParamValue
542
+ });
543
+ }).catch(function () {
544
+ // Simply clear parameter default if an error has occurred
545
+ Log.error("Error while reading default action parameter", sParamName, mParameters.actionName);
546
+ resolve({
547
+ paramName: sParamName,
548
+ value: undefined,
549
+ bLatePropertyError: true
550
+ });
551
+ });
552
+ } else {
553
+ // Case 1.2: ParameterDefaultValue defines a fixed string value (i.e. vParamDefaultValue = 'someString')
554
+ resolve({
555
+ paramName: sParamName,
556
+ value: vParamDefaultValue
557
+ });
558
+ }
559
+ } else {
560
+ // Case 2: There is no ParameterDefaultValue annotation (=> look into the FLP User Defaults)
561
+ if (oParameterModel && oParameterModel.oData[sParamName]) {
562
+ resolve({
563
+ paramName: sParamName,
564
+ value: oParameterModel.oData[sParamName]
565
+ });
566
+ } else {
567
+ resolve({
568
+ paramName: sParamName,
569
+ value: undefined
570
+ });
571
+ }
572
+ }
573
+ });
574
+ };
575
+
576
+ var getParameterDefaultValue = function (sParamName) {
577
+ var oMetaModel = oDialog.getModel().getMetaModel(),
578
+ sActionPath = oActionContext.sPath && oActionContext.sPath.split("/@")[0],
579
+ sActionParameterAnnotationTarget = sActionPath + "/" + sParamName + "@",
580
+ oParameterAnnotations = oMetaModel.getObject(sActionParameterAnnotationTarget),
581
+ oParameterDefaultValue = oParameterAnnotations && oParameterAnnotations["@com.sap.vocabularies.UI.v1.ParameterDefaultValue"]; // either { $Path: 'somePath' } or 'someString'
582
+
583
+ return oParameterDefaultValue;
584
+ };
585
+
586
+ var aCurrentParamDefaultValue = [];
587
+ var sParamName, vParameterDefaultValue;
588
+
589
+ for (var i in aActionParameters) {
590
+ sParamName = aActionParameters[i].$Name;
591
+ vParameterDefaultValue = getParameterDefaultValue(sParamName);
592
+ aCurrentParamDefaultValue.push(prefillParameter(sParamName, vParameterDefaultValue));
593
+ }
594
+
595
+ if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
596
+ if (sBoundFunctionName && sBoundFunctionName.length > 0 && typeof sBoundFunctionName === "string") {
597
+ for (var _i2 in aContexts) {
598
+ aFunctionParams.push(callBoundFunction(sBoundFunctionName, aContexts[_i2], mParameters.model));
599
+ }
600
+ }
601
+ }
602
+
603
+ var aPrefillParamPromises = Promise.all(aCurrentParamDefaultValue);
604
+ var aExecFunctionPromises = Promise.resolve([]);
605
+ var oExecFunctionFromManifestPromise;
606
+
607
+ if (aFunctionParams && aFunctionParams.length > 0) {
608
+ aExecFunctionPromises = Promise.all(aFunctionParams);
609
+ }
610
+
611
+ if (mParameters.defaultValuesExtensionFunction) {
612
+ var sModule = mParameters.defaultValuesExtensionFunction.substring(0, mParameters.defaultValuesExtensionFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
613
+ sFunctionName = mParameters.defaultValuesExtensionFunction.substring(mParameters.defaultValuesExtensionFunction.lastIndexOf(".") + 1, mParameters.defaultValuesExtensionFunction.length);
614
+ oExecFunctionFromManifestPromise = FPMHelper.actionWrapper(oCloneEvent, sModule, sFunctionName, {
615
+ "contexts": aContexts
616
+ });
617
+ }
618
+
619
+ Promise.all([aPrefillParamPromises, aExecFunctionPromises, oExecFunctionFromManifestPromise]).then(function (aPromises) {
620
+ var aCurrentParamDefaultValue = aPromises[0];
621
+ var aFunctionParams = aPromises[1];
622
+ var oFunctionParamsFromManifest = aPromises[2];
623
+ var sDialogParamName;
624
+
625
+ for (var _i3 in aActionParameters) {
626
+ sDialogParamName = aActionParameters[_i3].$Name;
627
+
628
+ if (oFunctionParamsFromManifest && oFunctionParamsFromManifest.hasOwnProperty(sDialogParamName)) {
629
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, oFunctionParamsFromManifest[sDialogParamName]);
630
+ } else if (aCurrentParamDefaultValue[_i3] && aCurrentParamDefaultValue[_i3].value !== undefined) {
631
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, aCurrentParamDefaultValue[_i3].value); // if the default value had not been previously determined due to different contexts, we do nothing else
632
+ } else if (sBoundFunctionName && !aCurrentParamDefaultValue[_i3].bNoPossibleValue) {
633
+ if (aContexts.length > 1) {
634
+ // we check if the function retrieves the same param value for all the contexts:
635
+ var j = 0;
636
+
637
+ while (j < aContexts.length - 1) {
638
+ if (aFunctionParams[j] && aFunctionParams[j + 1] && aFunctionParams[j].getObject(sDialogParamName) === aFunctionParams[j + 1].getObject(sDialogParamName)) {
639
+ j++;
640
+ } else {
641
+ break;
642
+ }
643
+ } //param values are all the same:
644
+
645
+
646
+ if (j === aContexts.length - 1) {
647
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, aFunctionParams[j].getObject(sDialogParamName));
648
+ }
649
+ } else {
650
+ //Only one context, then the default param values are to be verified from the function:
651
+ if (aFunctionParams[0] && aFunctionParams[0].getObject(sDialogParamName)) {
652
+ oOperationBinding.setParameter(aActionParameters[_i3].$Name, aFunctionParams[0].getObject(sDialogParamName));
653
+ }
654
+ }
655
+ }
656
+ }
657
+
658
+ var bErrorFound = aCurrentParamDefaultValue.some(function (oValue) {
659
+ if (oValue.bLatePropertyError) {
660
+ return oValue.bLatePropertyError;
661
+ }
662
+ }); // If at least one Default Property is a Late Property and an eTag error was raised.
663
+
664
+ if (bErrorFound) {
665
+ var sText = CommonUtils.getTranslatedText("C_APP_COMPONENT_SAPFE_ETAG_LATE_PROPERTY", oResourceBundle);
666
+ MessageBox.warning(sText, {
667
+ contentWidth: "25em"
668
+ });
669
+ }
670
+ }).catch();
671
+ };
672
+
673
+ if (oActionContext.getObject("$IsBound") && aContexts.length > 0) {
674
+ var aParameters = oActionContext.getObject("$Parameter"),
675
+ sBindingParameter = aParameters[0] && aParameters[0].$Name;
676
+ aContexts[0].requestObject().then(function (oContextObject) {
677
+ if (oContextObject) {
678
+ oOperationBinding.setParameter(sBindingParameter, oContextObject);
679
+ }
680
+
681
+ fnSetDefaultsAndOpenDialog(sBindingParameter);
682
+ }).catch(function (oError) {
683
+ Log.error("Error while retrieving the parameter", oError);
684
+ });
685
+ } else {
686
+ fnSetDefaultsAndOpenDialog();
687
+ }
688
+ },
689
+ afterClose: function () {
690
+ oDialog.destroy();
691
+ }
692
+ });
693
+ aFormElements = oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
694
+ oDialog.setModel(oActionContext.getModel().oModel);
695
+ oDialog.setModel(oParameterModel, "paramsModel");
696
+ oDialog.bindElement({
697
+ path: "/",
698
+ model: "paramsModel"
699
+ }); // empty model to add elements dynamically depending on number of MVF fields defined on the dialog
700
+
701
+ var oMVFModel = new JSONModel({});
702
+ oDialog.setModel(oMVFModel, "mvfview");
703
+ var sActionPath = sActionName + "(...)";
704
+ aContexts = mParameters.aContexts || [];
705
+
706
+ if (!aContexts.length) {
707
+ sActionPath = "/" + sActionPath;
708
+ }
709
+
710
+ oDialog.bindElement({
711
+ path: sActionPath
712
+ });
713
+
714
+ if (oParentControl) {
715
+ // if there is a parent control specified add the dialog as dependent
716
+ oParentControl.addDependent(oDialog);
717
+ }
718
+
719
+ if (aContexts.length > 0) {
720
+ oDialog.setBindingContext(aContexts[0]); // use context of first selected line item
721
+ }
722
+
723
+ oOperationBinding = oDialog.getObjectBinding();
724
+ oDialog.open();
725
+ });
726
+ });
727
+ }).catch(reject);
728
+ });
729
+ }
730
+
731
+ function prepareActionParameters(oAction, aPredefinedParameters) {
732
+ // check if parameters exist at all
733
+ var aParameters = getActionParameters(oAction);
734
+ aPredefinedParameters = aPredefinedParameters || [];
735
+
736
+ if (aPredefinedParameters.length > 0) {// TODO: merge the predefined once with the real existing one
737
+ }
738
+
739
+ return aParameters;
740
+ }
741
+
742
+ function getActionParameters(oAction) {
743
+ var aParameters = oAction.getObject("$Parameter") || [];
744
+
745
+ if (aParameters && aParameters.length) {
746
+ if (oAction.getObject("$IsBound")) {
747
+ //in case of bound actions, ignore the first parameter and consider the rest
748
+ return aParameters.slice(1, aParameters.length) || [];
749
+ }
750
+ }
751
+
752
+ return aParameters;
753
+ }
754
+
755
+ function getIsActionCritical(oMetaModel, sPath, contexts, oBoundAction) {
756
+ var vActionCritical = oMetaModel.getObject(sPath + "@com.sap.vocabularies.Common.v1.IsActionCritical");
757
+ var sCriticalPath = vActionCritical && vActionCritical.$Path;
758
+
759
+ if (!sCriticalPath) {
760
+ // the static value scenario for isActionCritical
761
+ return !!vActionCritical;
762
+ }
763
+
764
+ var aBindingParams = oBoundAction && oBoundAction.getObject("$Parameter"),
765
+ aPaths = sCriticalPath && sCriticalPath.split("/"),
766
+ bCondition = aBindingParams && aBindingParams.length && typeof aBindingParams === "object" && sCriticalPath && contexts && contexts.length;
767
+
768
+ if (bCondition) {
769
+ //in case binding patameters are there in path need to remove eg: - _it/isVerified => need to remove _it and the path should be isVerified
770
+ aBindingParams.filter(function (oParams) {
771
+ var index = aPaths && aPaths.indexOf(oParams.$Name);
772
+
773
+ if (index > -1) {
774
+ aPaths.splice(index, 1);
775
+ }
776
+ });
777
+ sCriticalPath = aPaths.join("/");
778
+ return contexts[0].getObject(sCriticalPath);
779
+ } else if (sCriticalPath) {
780
+ //if scenario is path based return the path value
781
+ return contexts[0].getObject(sCriticalPath);
782
+ }
783
+ }
784
+
785
+ function _executeAction(oAppComponent, mParameters) {
786
+ var aContexts = mParameters.aContexts || [];
787
+ var oModel = mParameters.model;
788
+ var iExistingMessages = messageHandling.getMessages().length || 0;
789
+ var aActionParameters = mParameters.aActionParameters || [];
790
+ var sActionName = mParameters.actionName;
791
+ var fnOnSubmitted = mParameters.fnOnSubmitted;
792
+ var fnOnResponse = mParameters.fnOnResponse;
793
+ var bIsCreateAction = mParameters.bIsCreateAction;
794
+ var bActionParametersExist = false;
795
+ var oAction;
796
+
797
+ function fnDifferentiate(promise) {
798
+ return promise.then(function (response) {
799
+ var aMessages = messageHandling.getMessages(); // Action Dialog must remain open if there are response error-messages, because in the java stack the dialog would be closed immediately.
800
+
801
+ if (aMessages.length > iExistingMessages && aMessages[aMessages.length - 1].type === "Error") {
802
+ return {
803
+ response: response,
804
+ status: "rejected"
805
+ };
806
+ }
807
+
808
+ return {
809
+ response: response,
810
+ status: "resolved"
811
+ };
812
+ }, function (response) {
813
+ return {
814
+ response: response,
815
+ status: "rejected"
816
+ };
817
+ });
818
+ }
819
+
820
+ function setActionParameterDefaultValue() {
821
+ if (aActionParameters && aActionParameters.length) {
822
+ bActionParametersExist = true;
823
+
824
+ for (var j = 0; j < aActionParameters.length; j++) {
825
+ if (!aActionParameters[j].value) {
826
+ switch (aActionParameters[j].$Type) {
827
+ case "Edm.String":
828
+ aActionParameters[j].value = "";
829
+ break;
830
+
831
+ case "Edm.Boolean":
832
+ aActionParameters[j].value = false;
833
+ break;
834
+
835
+ case "Edm.Byte":
836
+ case "Edm.Int16":
837
+ case "Edm.Int32":
838
+ case "Edm.Int64":
839
+ aActionParameters[j].value = 0;
840
+ break;
841
+ // tbc
842
+
843
+ default:
844
+ break;
845
+ }
846
+ }
847
+
848
+ oAction.setParameter(aActionParameters[j].$Name, aActionParameters[j].value);
849
+ }
850
+ }
851
+ }
852
+
853
+ if (aContexts.length) {
854
+ return new Promise(function (resolve, reject) {
855
+ var mBindingParameters = mParameters.mBindingParameters;
856
+ var bGrouped = mParameters.bGrouped;
857
+ var bReturnAsArray = mParameters.bReturnAsArray;
858
+ var bGetBoundContext = mParameters.bGetBoundContext;
859
+ var aActionPromises = [];
860
+ var oActionPromise;
861
+ var i;
862
+ var sGroupId;
863
+
864
+ var fnExecuteAction = function (oAction, index, oSideEffect) {
865
+ setActionParameterDefaultValue(); // For invocation grouping "isolated" need batch group per action call
866
+
867
+ sGroupId = !bGrouped ? "$auto." + index : oAction.getUpdateGroupId();
868
+ oActionPromise = bGetBoundContext ? oAction.execute(sGroupId).then(function () {
869
+ return oAction.getBoundContext();
870
+ }) : oAction.execute(sGroupId);
871
+ aActionPromises.push(oActionPromise);
872
+ var oSideEffectsService = oAppComponent.getSideEffectsService(); // trigger actions from side effects
873
+
874
+ if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
875
+ oSideEffect.triggerActions.forEach(function (sTriggerAction) {
876
+ if (sTriggerAction) {
877
+ oSideEffectsService.executeAction(sTriggerAction, oSideEffect.context, sGroupId);
878
+ }
879
+ });
880
+ } // request side effects for this action
881
+ // as we move the messages request to POST $select we need to be prepared for an empty array
882
+
883
+
884
+ if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
885
+ oSideEffectsService.requestSideEffects(oSideEffect.pathExpressions, oSideEffect.context, sGroupId).then(function () {
886
+ if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
887
+ CommonUtils.setActionEnablement(mParameters.internalModelContext, JSON.parse(mParameters.operationAvailableMap), mParameters.aContexts);
888
+ }
889
+ }).catch(function (oError) {
890
+ Log.error("Error while requesting side effects", oError);
891
+ });
892
+ }
893
+ };
894
+
895
+ var fnExecuteSingleAction = function (oAction, index, oSideEffect) {
896
+ var oPromise = new Promise(function (resolve) {
897
+ var oLocalPromise;
898
+ var aLocalPromise = [];
899
+ setActionParameterDefaultValue(); // For invocation grouping "isolated" need batch group per action call
900
+
901
+ sGroupId = "apiMode" + index;
902
+ oActionPromise = bGetBoundContext ? oAction.execute(sGroupId).then(function () {
903
+ return oAction.getBoundContext();
904
+ }) : oAction.execute(sGroupId);
905
+ aActionPromises.push(oActionPromise);
906
+ aLocalPromise.push(oActionPromise);
907
+ var oSideEffectsService = oAppComponent.getSideEffectsService(); // trigger actions from side effects
908
+
909
+ if (oSideEffect && oSideEffect.triggerActions && oSideEffect.triggerActions.length) {
910
+ oSideEffect.triggerActions.forEach(function (sTriggerAction) {
911
+ if (sTriggerAction) {
912
+ oLocalPromise = oSideEffectsService.executeAction(sTriggerAction, oSideEffect.context, sGroupId);
913
+ aLocalPromise.push(oLocalPromise);
914
+ }
915
+ });
916
+ } // request side effects for this action
917
+ // as we move the messages request to POST $select we need to be prepared for an empty array
918
+
919
+
920
+ if (oSideEffect && oSideEffect.pathExpressions && oSideEffect.pathExpressions.length > 0) {
921
+ oLocalPromise = oSideEffectsService.requestSideEffects(oSideEffect.pathExpressions, oSideEffect.context, sGroupId);
922
+ aLocalPromise.push(oLocalPromise);
923
+ oLocalPromise.then(function () {
924
+ if (mParameters.operationAvailableMap && mParameters.internalModelContext) {
925
+ CommonUtils.setActionEnablement(mParameters.internalModelContext, JSON.parse(mParameters.operationAvailableMap), mParameters.aContexts);
926
+ }
927
+ }).catch(function (oError) {
928
+ Log.error("Error while requesting side effects", oError);
929
+ });
930
+ }
931
+
932
+ oModel.submitBatch(sGroupId);
933
+ Promise.all(aLocalPromise).then(function () {
934
+ return resolve();
935
+ }).catch(function () {
936
+ return resolve();
937
+ });
938
+ });
939
+ return oPromise;
940
+ };
941
+
942
+ function fnExecuteSequentially(aContexts) {
943
+ // One action and its side effects are completed before the next action is executed
944
+ (fnOnSubmitted || function noop() {
945
+ /**/
946
+ })(aActionPromises);
947
+
948
+ function processOneAction(context, i) {
949
+ oAction = oModel.bindContext(sActionName + "(...)", context, mBindingParameters);
950
+ return fnExecuteSingleAction(oAction, i, {
951
+ context: context,
952
+ pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
953
+ triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
954
+ });
955
+ }
956
+
957
+ var oActionAndSideEffectPromise = Promise.resolve();
958
+ var j = 0;
959
+ aContexts.forEach(function (context) {
960
+ var id = ++j;
961
+ oActionAndSideEffectPromise = oActionAndSideEffectPromise.then(function () {
962
+ return processOneAction(context, id);
963
+ });
964
+ });
965
+ oActionAndSideEffectPromise.then(function () {
966
+ fnHandleResults();
967
+ }).catch();
968
+ }
969
+
970
+ if (mParameters.bObjectPage && !bGrouped) {
971
+ // For invocation grouping "isolated" called from ObjectPage, ensure that each action and matching side effects
972
+ // are processed before the next set is submitted. Workaround until JSON batch is available.
973
+ fnExecuteSequentially(aContexts);
974
+ } else {
975
+ for (i = 0; i < aContexts.length; i++) {
976
+ oAction = oModel.bindContext(sActionName + "(...)", aContexts[i], mBindingParameters);
977
+ fnExecuteAction(oAction, aContexts.length <= 1 ? null : i, {
978
+ context: aContexts[i],
979
+ pathExpressions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.pathExpressions,
980
+ triggerActions: mParameters.additionalSideEffect && mParameters.additionalSideEffect.triggerActions
981
+ });
982
+ }
983
+
984
+ (fnOnSubmitted || function noop() {
985
+ /**/
986
+ })(aActionPromises);
987
+ fnHandleResults();
988
+ }
989
+
990
+ function fnHandleResults() {
991
+ Promise.all(aActionPromises.map(fnDifferentiate)).then(function (results) {
992
+ var aRejectedItems = [];
993
+ var aResolvedItems = [];
994
+ var iResultCount;
995
+
996
+ for (iResultCount = 0; iResultCount < results.length; iResultCount++) {
997
+ if (results[iResultCount].status === "rejected") {
998
+ aRejectedItems.push(results[iResultCount].response);
999
+ }
1000
+
1001
+ if (results[iResultCount].status === "resolved") {
1002
+ if (bIsCreateAction && bActionParametersExist) {
1003
+ //only used for NewAction
1004
+ results[iResultCount].bConsiderDocumentModified = true;
1005
+ aResolvedItems.push(results[iResultCount]);
1006
+ } else {
1007
+ aResolvedItems.push(results[iResultCount].response);
1008
+ }
1009
+ }
1010
+ }
1011
+
1012
+ if (!results || results && results.length === 0) {
1013
+ reject(true);
1014
+ }
1015
+
1016
+ if (aRejectedItems.length === 0) {
1017
+ if (bReturnAsArray) {
1018
+ resolve(aResolvedItems);
1019
+ } else {
1020
+ // context is given directly without an array so also no array is expected
1021
+ resolve(aResolvedItems[0]);
1022
+ }
1023
+ } else {
1024
+ reject({
1025
+ resolvedItems: aResolvedItems,
1026
+ rejectedItems: aRejectedItems
1027
+ });
1028
+ }
1029
+ }).catch(reject);
1030
+ }
1031
+ }).finally(function () {
1032
+ (fnOnResponse || function noop() {
1033
+ /**/
1034
+ })();
1035
+ });
1036
+ } else {
1037
+ oAction = oModel.bindContext("/" + sActionName + "(...)");
1038
+ setActionParameterDefaultValue();
1039
+ var oActionPromise = oAction.execute("actionImport");
1040
+ oModel.submitBatch("actionImport"); // trigger onSubmitted "event"
1041
+
1042
+ (fnOnSubmitted || function noop() {
1043
+ /**/
1044
+ })(oActionPromise);
1045
+ return oActionPromise.finally(function () {
1046
+ (fnOnResponse || function noop() {
1047
+ /**/
1048
+ })();
1049
+ });
1050
+ }
1051
+ }
1052
+
1053
+ function _getPath(oActionContext, sActionName) {
1054
+ var sPath = oActionContext.getPath();
1055
+ sPath = oActionContext.getObject("$IsBound") ? sPath.split("@$ui5.overload")[0] : sPath.split("/0")[0];
1056
+ return sPath.split("/" + sActionName)[0];
1057
+ }
1058
+ /**
1059
+ * Static functions to call OData actions (bound/import) and functions (bound/import)
1060
+ *
1061
+ * @namespace
1062
+ * @alias sap.fe.core.actions.operations
1063
+ * @private
1064
+ * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
1065
+ * @since 1.56.0
1066
+ */
1067
+
1068
+
1069
+ var operations = {
1070
+ callBoundAction: callBoundAction,
1071
+ callActionImport: callActionImport,
1072
+ callBoundFunction: callBoundFunction,
1073
+ callFunctionImport: callFunctionImport
1074
+ };
1075
+ return operations;
1076
+ }, false);
1077
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm9wZXJhdGlvbnMudHMiXSwibmFtZXMiOlsiQ29uc3RhbnRzIiwiRkVMaWJyYXJ5IiwiSW52b2NhdGlvbkdyb3VwaW5nIiwiQWN0aW9uIiwiTWVzc2FnZUJveCIsImNhbGxCb3VuZEFjdGlvbiIsInNBY3Rpb25OYW1lIiwiY29udGV4dHMiLCJvTW9kZWwiLCJvQXBwQ29tcG9uZW50IiwibVBhcmFtZXRlcnMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwiYlJldHVybkFzQXJyYXkiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0FjdGlvblBhdGgiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJvQm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImFDb250ZXh0cyIsImlzQ3JpdGljYWxBY3Rpb24iLCJnZXRJc0FjdGlvbkNyaXRpY2FsIiwiY2FsbEFjdGlvbiIsImNhbGxBY3Rpb25JbXBvcnQiLCJiaW5kQ29udGV4dCIsIm9BY3Rpb25JbXBvcnQiLCJnZXRPYmplY3QiLCJjYWxsQm91bmRGdW5jdGlvbiIsInNGdW5jdGlvbk5hbWUiLCJjb250ZXh0Iiwic0Z1bmN0aW9uUGF0aCIsIm9Cb3VuZEZ1bmN0aW9uIiwiX2V4ZWN1dGVGdW5jdGlvbiIsImNhbGxGdW5jdGlvbkltcG9ydCIsInJlc29sdmUiLCJvRnVuY3Rpb25JbXBvcnQiLCJvRnVuY3Rpb24iLCJzR3JvdXBJZCIsIkVycm9yIiwib0Z1bmN0aW9uUHJvbWlzZSIsImV4ZWN1dGUiLCJzdWJtaXRCYXRjaCIsInRoZW4iLCJnZXRCb3VuZENvbnRleHQiLCJvQWN0aW9uIiwiYUFjdGlvblBhcmFtZXRlcnMiLCJhY3Rpb25QYXJhbWV0ZXJzIiwibUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMiLCJmbkRpYWxvZyIsIm9BY3Rpb25Qcm9taXNlIiwic0FjdGlvbkxhYmVsIiwibGFiZWwiLCJiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJiSXNDcmVhdGVBY3Rpb24iLCJiSXNDcml0aWNhbEFjdGlvbiIsInNNZXRhUGF0aCIsInNNZXNzYWdlc1BhdGgiLCJpTWVzc2FnZVNpZGVFZmZlY3QiLCJwcmVwYXJlQWN0aW9uUGFyYW1ldGVycyIsImNvbmZpcm1Dcml0aWNhbEFjdGlvbiIsImZuT25TdWJtaXR0ZWQiLCJvblN1Ym1pdHRlZCIsImZuT25SZXNwb25zZSIsIm9uUmVzcG9uc2UiLCJhY3Rpb25OYW1lIiwibW9kZWwiLCJiR2V0Qm91bmRDb250ZXh0IiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJwYXRoRXhwcmVzc2lvbnMiLCJmaW5kSW5kZXgiLCJleHAiLCIkUHJvcGVydHlQYXRoIiwibUJpbmRpbmdQYXJhbWV0ZXJzIiwiJHNlbGVjdCIsInNwbGl0IiwiaW5kZXhPZiIsInRyaWdnZXJBY3Rpb25zIiwic3BsaWNlIiwiYkdyb3VwZWQiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJDaGFuZ2VTZXQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImJPYmplY3RQYWdlIiwicGFyZW50Q29udHJvbCIsImVudGl0eVNldE5hbWUiLCJtZXNzYWdlSGFuZGxlciIsIl9leGVjdXRlQWN0aW9uIiwib09wZXJhdGlvblJlc3VsdCIsImNhdGNoIiwib0FjdGlvbkNvbnRleHQiLCJvUGFyZW50Q29udHJvbCIsImJvdW5kQWN0aW9uTmFtZSIsInN1ZmZpeFJlc291cmNlS2V5Iiwib1Jlc291cmNlQnVuZGxlIiwiZ2V0Q29udHJvbGxlciIsInNDb25maXJtYXRpb25UZXh0IiwiQ29tbW9uVXRpbHMiLCJnZXRUcmFuc2xhdGVkVGV4dCIsImNvbmZpcm0iLCJvbkNsb3NlIiwic0FjdGlvbiIsIk9LIiwib09wZXJhdGlvbiIsIm9FcnJvciIsInNob3dNZXNzYWdlRGlhbG9nIiwic1BhdGgiLCJfZ2V0UGF0aCIsIm1ldGFNb2RlbCIsImdldE1vZGVsIiwiZW50aXR5U2V0Q29udGV4dCIsInNBY3Rpb25OYW1lUGF0aCIsImFjdGlvbk5hbWVDb250ZXh0Iiwic0ZyYWdtZW50TmFtZSIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwib1BhcmFtZXRlck1vZGVsIiwiSlNPTk1vZGVsIiwiJGRpc3BsYXlNb2RlIiwiYUZpZWxkSW52YWxpZCIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsInZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwiYWxsIiwiZmlsdGVyIiwib0Zvcm1FbGVtZW50Iiwib0ZpZWxkIiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZVN0YXRlIiwibWFwIiwidmFsdWUiLCJpc0EiLCJnZXRJdGVtcyIsImdldFZhbHVlIiwidW5kZWZpbmVkIiwiZ2V0TGFiZWwiLCJnZXRUZXh0IiwiYVJlc3VsdHMiLCJyZXN1bHQiLCJfdmFsaWRhdGVNZXNzYWdlcyIsImJDbGVhclRhcmdldCIsIm9NZXNzYWdlTWFuYWdlciIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiYU1lc3NhZ2VzIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvQWN0aW9uUGFyYW1ldGVycyIsInNQYXJhbWV0ZXIiLCIkTmFtZSIsIm9NZXNzYWdlIiwic1BhcmFtIiwicmVwbGFjZSIsImNvbnRyb2xJZHMiLCJnZXRDb250cm9sSWQiLCJpbmNsdWRlcyIsInJlbW92ZU1lc3NhZ2VzIiwicHVzaCIsInRhcmdldCIsIm9Db250cm9sbGVyIiwiaGFuZGxlQ2hhbmdlIiwib0V2ZW50IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZ2V0U291cmNlIiwic0ZpZWxkSWQiLCJnZXRQYXJhbWV0ZXIiLCJvRmllbGRQcm9taXNlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJiaW5kaW5nQ29udGV4dHMiLCJhY3Rpb24iLCJlbnRpdHlTZXQiLCJtb2RlbHMiLCJhRnVuY3Rpb25QYXJhbXMiLCJvT3BlcmF0aW9uQmluZGluZyIsInNldFVzZXJEZWZhdWx0cyIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwib0RpYWxvZ0NvbnRlbnQiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJjb250ZW50IiwiZXNjYXBlSGFuZGxlciIsImNsb3NlIiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJnZW5lcmF0ZSIsInRleHQiLCJ0eXBlIiwicHJlc3MiLCJhRW1wdHlNYW5kYXRvcnlGaWVsZHMiLCJvTWVzc2FnZXMiLCJpIiwiY29kZSIsImN1c3RvbU1lc3NhZ2VzIiwibWVzc2FnZUhhbmRsaW5nIiwic2hvd1VuYm91bmRNZXNzYWdlcyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiT2JqZWN0Iiwia2V5cyIsInNLZXkiLCJ2UGFyYW1ldGVyVmFsdWUiLCJvUGFyYW1ldGVyQ29udGV4dCIsImdldFBhcmFtZXRlckNvbnRleHQiLCIkaXNDb2xsZWN0aW9uIiwiYU1WRkNvbnRlbnQiLCJnZXRQcm9wZXJ0eSIsImFLZXlWYWx1ZXMiLCJqIiwiS2V5IiwiYkhhc0V0YWdNZXNzYWdlIiwibW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsInNob3dNZXNzYWdlcyIsImlzQWN0aW9uUGFyYW1ldGVyRGlhbG9nT3BlbiIsIm1lc3NhZ2VQYWdlTmF2aWdhdGlvbkNhbGxiYWNrIiwiZmluYWxseSIsInVubG9jayIsImVuZEJ1dHRvbiIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImJlZm9yZU9wZW4iLCJvQ2xvbmVFdmVudCIsImFzc2lnbiIsImdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiIsInNEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZyIsInNCaW5kaW5nUGFyYW1ldGVyIiwic0JvdW5kRnVuY3Rpb25OYW1lIiwicHJlZmlsbFBhcmFtZXRlciIsInNQYXJhbU5hbWUiLCJ2UGFyYW1EZWZhdWx0VmFsdWUiLCIkUGF0aCIsIm9Qcm9taXNlIiwicmVxdWVzdFNpbmdsZXRvblByb3BlcnR5Iiwib1ZhbHVlIiwicmVxdWVzdFByb3BlcnR5IiwidlBhcmFtVmFsdWUiLCJzUGF0aEZvckNvbnRleHQiLCJwYXJhbU5hbWUiLCJiTm9Qb3NzaWJsZVZhbHVlIiwiTG9nIiwiZXJyb3IiLCJiTGF0ZVByb3BlcnR5RXJyb3IiLCJvRGF0YSIsImdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsInNBY3Rpb25QYXJhbWV0ZXJBbm5vdGF0aW9uVGFyZ2V0Iiwib1BhcmFtZXRlckFubm90YXRpb25zIiwib1BhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUiLCJ2UGFyYW1ldGVyRGVmYXVsdFZhbHVlIiwiYVByZWZpbGxQYXJhbVByb21pc2VzIiwiYUV4ZWNGdW5jdGlvblByb21pc2VzIiwib0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2UiLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJGUE1IZWxwZXIiLCJhY3Rpb25XcmFwcGVyIiwiYVByb21pc2VzIiwib0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Iiwic0RpYWxvZ1BhcmFtTmFtZSIsImhhc093blByb3BlcnR5Iiwic2V0UGFyYW1ldGVyIiwiYkVycm9yRm91bmQiLCJzb21lIiwic1RleHQiLCJ3YXJuaW5nIiwiY29udGVudFdpZHRoIiwiYVBhcmFtZXRlcnMiLCJyZXF1ZXN0T2JqZWN0Iiwib0NvbnRleHRPYmplY3QiLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImdldEFnZ3JlZ2F0aW9uIiwic2V0TW9kZWwiLCJiaW5kRWxlbWVudCIsInBhdGgiLCJvTVZGTW9kZWwiLCJhZGREZXBlbmRlbnQiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldE9iamVjdEJpbmRpbmciLCJvcGVuIiwiYVByZWRlZmluZWRQYXJhbWV0ZXJzIiwiZ2V0QWN0aW9uUGFyYW1ldGVycyIsInNsaWNlIiwidkFjdGlvbkNyaXRpY2FsIiwic0NyaXRpY2FsUGF0aCIsImFCaW5kaW5nUGFyYW1zIiwiYVBhdGhzIiwiYkNvbmRpdGlvbiIsIm9QYXJhbXMiLCJpbmRleCIsImpvaW4iLCJpRXhpc3RpbmdNZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiYkFjdGlvblBhcmFtZXRlcnNFeGlzdCIsImZuRGlmZmVyZW50aWF0ZSIsInByb21pc2UiLCJyZXNwb25zZSIsInN0YXR1cyIsInNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsIiRUeXBlIiwiYUFjdGlvblByb21pc2VzIiwiZm5FeGVjdXRlQWN0aW9uIiwib1NpZGVFZmZlY3QiLCJnZXRVcGRhdGVHcm91cElkIiwib1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInNUcmlnZ2VyQWN0aW9uIiwiZXhlY3V0ZUFjdGlvbiIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJmbkV4ZWN1dGVTaW5nbGVBY3Rpb24iLCJvTG9jYWxQcm9taXNlIiwiYUxvY2FsUHJvbWlzZSIsImZuRXhlY3V0ZVNlcXVlbnRpYWxseSIsIm5vb3AiLCJwcm9jZXNzT25lQWN0aW9uIiwib0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlIiwiaWQiLCJmbkhhbmRsZVJlc3VsdHMiLCJyZXN1bHRzIiwiYVJlamVjdGVkSXRlbXMiLCJhUmVzb2x2ZWRJdGVtcyIsImlSZXN1bHRDb3VudCIsImJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQiLCJyZXNvbHZlZEl0ZW1zIiwicmVqZWN0ZWRJdGVtcyIsIm9wZXJhdGlvbnMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7OztBQWFBLE1BQU1BLFNBQVMsR0FBR0MsU0FBUyxDQUFDRCxTQUE1QjtBQUFBLE1BQ0NFLGtCQUFrQixHQUFHRCxTQUFTLENBQUNDLGtCQURoQztBQUVBLE1BQU1DLE1BQU0sR0FBSUMsVUFBRCxDQUFvQkQsTUFB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VUFBVSxHQUFHO0FBQ2xCclYsSUFBQUEsZUFBZSxFQUFFQSxlQURDO0FBRWxCdUIsSUFBQUEsZ0JBQWdCLEVBQUVBLGdCQUZBO0FBR2xCSSxJQUFBQSxpQkFBaUIsRUFBRUEsaUJBSEQ7QUFJbEJNLElBQUFBLGtCQUFrQixFQUFFQTtBQUpGLEdBQW5CO1NBT2VvVCxVIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9hY3Rpb25zL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuXG5jb25zdCBDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHRJbnZvY2F0aW9uR3JvdXBpbmcgPSBGRUxpYnJhcnkuSW52b2NhdGlvbkdyb3VwaW5nO1xuY29uc3QgQWN0aW9uID0gKE1lc3NhZ2VCb3ggYXMgYW55KS5BY3Rpb247XG5cbi8qKlxuICogQ2FsbHMgYSBib3VuZCBhY3Rpb24gZm9yIG9uZSBvciBtdWx0aXBsZSBjb250ZXh0cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9ucy5jYWxsQm91bmRBY3Rpb25cbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gY29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgYmUgY2FsbGVkXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Nb2RlbH0gb01vZGVsIE9EYXRhIE1vZGVsXG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzXSBBIG1hcCBvZiBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgZm9yIGV2ZXJ5IGFjdGlvbiBjYWxsXG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzLm1CaW5kaW5nUGFyYW1ldGVyc10gQSBtYXAgb2YgYmluZGluZyBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgcGFydCBvZiAkc2VsZWN0IGFuZCAkZXhwYW5kIGNvbWluZyBmcm9tIHNpZGUgZWZmZWN0cyBmb3IgYm91bmQgYWN0aW9uc1xuICogQHBhcmFtIHtBcnJheX0gW21QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0XSBBcnJheSBvZiBwcm9wZXJ0eSBwYXRocyB0byBiZSByZXF1ZXN0ZWQgaW4gYWRkaXRpb24gdG8gYWN0dWFsIHRhcmdldCBwcm9wZXJ0aWVzIG9mIHRoZSBzaWRlIGVmZmVjdFxuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZ10gSWYgc2V0IGFuZCBpZiBwYXJhbWV0ZXJzIGV4aXN0IHRoZSB1c2VyIHJldHJpZXZlcyBhIGRpYWxvZyB0byBmaWxsIGluIHBhcmFtZXRlcnMsIGlmIGFjdGlvblBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aGV5IGFyZSBzaG93biB0byB0aGUgdXNlclxuICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFttUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmddIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogQ2hhbmdlc2V0IHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgSXNvbGF0ZWQgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzLCBkZWZhdWx0cyB0byBJc29sYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW21QYXJhbWV0ZXJzLm9uU3VibWl0dGVkXSBGdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb25jZSB0aGUgYWN0aW9ucyBhcmUgc3VibWl0dGVkIHdpdGggYW4gYXJyYXkgb2YgcHJvbWlzZXNcbiAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnMuZGVmYXVsdFBhcmFtZXRlcnNdIENhbiBjb250YWluIGRlZmF1bHQgcGFyYW1ldGVycyBmcm9tIEZMUCB1c2VyIGRlZmF1bHRzXG4gKiBAcGFyYW0ge3NhcC51aS5jb3JlLkVsZW1lbnR9IFttUGFyYW1ldGVycy5wYXJlbnRDb250cm9sXSBJZiBzcGVjaWZpZWQgdGhlIGRpYWxvZ3MgYXJlIGFkZGVkIGFzIGRlcGVuZGVudCBvZiB0aGUgcGFyZW50IGNvbnRyb2xcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCB0aGUgYWN0aW9uIHByb21pc2UgcmV0dXJucyB0aGUgYm91bmQgY29udGV4dFxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBjYWxsQm91bmRBY3Rpb24oc0FjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dHM6IGFueSwgb01vZGVsOiBhbnksIG9BcHBDb21wb25lbnQ6IG9iamVjdCwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAoIWNvbnRleHRzIHx8IGNvbnRleHRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdC8vSW4gRnJlZXN0eWxlIGFwcHMgYm91bmQgYWN0aW9ucyBjYW4gaGF2ZSBubyBjb250ZXh0XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQm91bmQgYWN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbnRleHRcIik7XG5cdH1cblx0Ly8gd2UgZXhwZWN0IGVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0c1xuXHRpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0cykpIHtcblx0XHRtUGFyYW1ldGVycy5iUmV0dXJuQXNBcnJheSA9IHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0Ly9hY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIG9uIHRoaXMgY29udGV4dCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZyBzbyBVSSBmaWVsZHMgYXJlIHVwZGF0ZWQgd2l0aCByZXNwb25zZSBkYXRhXG5cdFx0Y29udGV4dHMgPSBbY29udGV4dHNdO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0FjdGlvblBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHRzWzBdLmdldFBhdGgoKSkgKyBcIi9cIiArIHNBY3Rpb25OYW1lLFxuXHRcdG9Cb3VuZEFjdGlvbiA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0FjdGlvblBhdGggKyBcIi9AJHVpNS5vdmVybG9hZC8wXCIpO1xuXHRtUGFyYW1ldGVycy5hQ29udGV4dHMgPSBjb250ZXh0cztcblx0bVBhcmFtZXRlcnMuaXNDcml0aWNhbEFjdGlvbiA9IGdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGgsIGNvbnRleHRzLCBvQm91bmRBY3Rpb24pO1xuXHRyZXR1cm4gY2FsbEFjdGlvbihzQWN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRBY3Rpb24sIG9BcHBDb21wb25lbnQsIG1QYXJhbWV0ZXJzKTtcbn1cbi8qKlxuICogQ2FsbHMgYW4gYWN0aW9uIGltcG9ydC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiBpbXBvcnQgdG8gYmUgY2FsbGVkXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfSBvTW9kZWwgQW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgdjQgbW9kZWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSB7bWFwfSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBAcGFyYW0ge21hcH0gW21QYXJhbWV0ZXJzLmFjdGlvblBhcmFtZXRlcnNdIEEgbWFwIG9mIHBhcmFtZXRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZSBhY3Rpb24gaW1wb3J0XG4gKiBAcGFyYW0ge3N0cmluZ30gW21QYXJhbWV0ZXJzLmxhYmVsXSBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXSBJZiBzZXQgYW5kIGlmIHBhcmFtZXRlcnMgZXhpc3QgdGhlIHVzZXIgcmV0cmlldmVzIGEgZGlhbG9nIHRvIGZpbGwgaW4gcGFyYW1ldGVycywgaWYgYWN0aW9uUGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZXkgYXJlIHNob3duIHRvIHRoZSB1c2VyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbbVBhcmFtZXRlcnMub25TdWJtaXR0ZWRdIEZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBvbmNlIHRoZSBhY3Rpb25zIGFyZSBzdWJtaXR0ZWQgd2l0aCBhbiBhcnJheSBvZiBwcm9taXNlc1xuICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVycy5kZWZhdWx0UGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gRkxQIHVzZXIgZGVmYXVsdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZTogc3RyaW5nLCBvTW9kZWw6IGFueSwgb0FwcENvbXBvbmVudDogb2JqZWN0LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdGlmICghb01vZGVsKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQWN0aW9uIGV4cGVjdHMgYSBtb2RlbC9jb250ZXh0IGZvciBleGVjdXRpb25cIik7XG5cdH1cblx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzQWN0aW9uUGF0aCA9IG9Nb2RlbC5iaW5kQ29udGV4dChcIi9cIiArIHNBY3Rpb25OYW1lKS5nZXRQYXRoKCksXG5cdFx0b0FjdGlvbkltcG9ydCA9IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIgKyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNBY3Rpb25QYXRoKS5nZXRPYmplY3QoXCIkQWN0aW9uXCIpICsgXCIvMFwiKTtcblx0bVBhcmFtZXRlcnMuaXNDcml0aWNhbEFjdGlvbiA9IGdldElzQWN0aW9uQ3JpdGljYWwob01ldGFNb2RlbCwgc0FjdGlvblBhdGggKyBcIi9AJHVpNS5vdmVybG9hZFwiKTtcblx0cmV0dXJuIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG9Nb2RlbCwgb0FjdGlvbkltcG9ydCwgb0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpO1xufVxuZnVuY3Rpb24gY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBhbnksIG9Nb2RlbDogYW55KSB7XG5cdGlmICghY29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkJvdW5kIGZ1bmN0aW9ucyBhbHdheXMgcmVxdWlyZXMgYSBjb250ZXh0XCIpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpICsgXCIvXCIgKyBzRnVuY3Rpb25OYW1lLFxuXHRcdG9Cb3VuZEZ1bmN0aW9uID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKTtcblx0cmV0dXJuIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb01vZGVsLCBvQm91bmRGdW5jdGlvbiwgY29udGV4dCk7XG59XG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gaW1wb3J0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zLmNhbGxGdW5jdGlvbkltcG9ydFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMub3BlcmF0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHNGdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gb01vZGVsIEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIHY0IG1vZGVsXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2FsbEZ1bmN0aW9uSW1wb3J0KHNGdW5jdGlvbk5hbWU6IHN0cmluZywgb01vZGVsOiBhbnkpIHtcblx0aWYgKCFzRnVuY3Rpb25OYW1lKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0Z1bmN0aW9uUGF0aCA9IG9Nb2RlbC5iaW5kQ29udGV4dChcIi9cIiArIHNGdW5jdGlvbk5hbWUpLmdldFBhdGgoKSxcblx0XHRvRnVuY3Rpb25JbXBvcnQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFxuXHRcdFx0XCIvXCIgKyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNGdW5jdGlvblBhdGgpLmdldE9iamVjdChcIiRGdW5jdGlvblwiKSArIFwiLzBcIlxuXHRcdCk7XG5cdHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCwgb0Z1bmN0aW9uSW1wb3J0KTtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZTogYW55LCBvTW9kZWw6IGFueSwgb0Z1bmN0aW9uOiBhbnksIGNvbnRleHQ/OiBhbnkpIHtcblx0bGV0IHNHcm91cElkO1xuXHRpZiAoIW9GdW5jdGlvbiB8fCAhb0Z1bmN0aW9uLmdldE9iamVjdCgpKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZ1bmN0aW9uIFwiICsgc0Z1bmN0aW9uTmFtZSArIFwiIG5vdCBmb3VuZFwiKSk7XG5cdH1cblx0aWYgKGNvbnRleHQpIHtcblx0XHRvRnVuY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoc0Z1bmN0aW9uTmFtZSArIFwiKC4uLilcIiwgY29udGV4dCk7XG5cdFx0c0dyb3VwSWQgPSBcImZ1bmN0aW9uR3JvdXBcIjtcblx0fSBlbHNlIHtcblx0XHRvRnVuY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoXCIvXCIgKyBzRnVuY3Rpb25OYW1lICsgXCIoLi4uKVwiKTtcblx0XHRzR3JvdXBJZCA9IFwiZnVuY3Rpb25JbXBvcnRcIjtcblx0fVxuXHRjb25zdCBvRnVuY3Rpb25Qcm9taXNlID0gb0Z1bmN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpO1xuXHRvTW9kZWwuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRyZXR1cm4gb0Z1bmN0aW9uUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBvRnVuY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gY2FsbEFjdGlvbihzQWN0aW9uTmFtZTogYW55LCBvTW9kZWw6IGFueSwgb0FjdGlvbjogYW55LCBvQXBwQ29tcG9uZW50OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRsZXQgYUFjdGlvblBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5hY3Rpb25QYXJhbWV0ZXJzIHx8IFtdO1xuXHRcdGxldCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0bGV0IGZuRGlhbG9nO1xuXHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRjb25zdCBzQWN0aW9uTGFiZWwgPSBtUGFyYW1ldGVycy5sYWJlbDtcblx0XHRsZXQgYlNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2cgPSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nO1xuXHRcdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cztcblx0XHRjb25zdCBiSXNDcmVhdGVBY3Rpb24gPSBtUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb247XG5cdFx0Y29uc3QgYklzQ3JpdGljYWxBY3Rpb24gPSBtUGFyYW1ldGVycy5pc0NyaXRpY2FsQWN0aW9uO1xuXHRcdGxldCBvTWV0YU1vZGVsO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg6IGFueTtcblx0XHRsZXQgaU1lc3NhZ2VTaWRlRWZmZWN0O1xuXHRcdGlmICghb0FjdGlvbiB8fCAhb0FjdGlvbi5nZXRPYmplY3QoKSkge1xuXHRcdFx0cmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXCJBY3Rpb24gXCIgKyBzQWN0aW9uTmFtZSArIFwiIG5vdCBmb3VuZFwiKSk7XG5cdFx0fVxuXHRcdGlmIChiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyB8fCBhQWN0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhQWN0aW9uUGFyYW1ldGVycyA9IHByZXBhcmVBY3Rpb25QYXJhbWV0ZXJzKG9BY3Rpb24sIGFBY3Rpb25QYXJhbWV0ZXJzKTtcblx0XHRcdGlmICghYUFjdGlvblBhcmFtZXRlcnMgfHwgYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGJTaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChiU2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZykge1xuXHRcdFx0Zm5EaWFsb2cgPSBzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nO1xuXHRcdH0gZWxzZSBpZiAoYklzQ3JpdGljYWxBY3Rpb24pIHtcblx0XHRcdGZuRGlhbG9nID0gY29uZmlybUNyaXRpY2FsQWN0aW9uO1xuXHRcdH1cblx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdGZuT25TdWJtaXR0ZWQ6IG1QYXJhbWV0ZXJzLm9uU3VibWl0dGVkLFxuXHRcdFx0Zm5PblJlc3BvbnNlOiBtUGFyYW1ldGVycy5vblJlc3BvbnNlLFxuXHRcdFx0YWN0aW9uTmFtZTogc0FjdGlvbk5hbWUsXG5cdFx0XHRtb2RlbDogb01vZGVsLFxuXHRcdFx0YUFjdGlvblBhcmFtZXRlcnM6IGFBY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0fTtcblx0XHRpZiAob0FjdGlvbi5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSkge1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucykge1xuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGFDb250ZXh0c1swXS5nZXRQYXRoKCkpO1xuXHRcdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcblxuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdGlNZXNzYWdlU2lkZUVmZmVjdCA9IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucy5maW5kSW5kZXgoZnVuY3Rpb24oZXhwOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBleHAuJFByb3BlcnR5UGF0aCA9PT0gc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGlmIChpTWVzc2FnZVNpZGVFZmZlY3QgPiAtMSkge1xuXHRcdFx0XHRcdFx0Ly8gdGhlIG1lc3NhZ2UgcGF0aCBpcyBhbm5vdGF0ZWQgYXMgc2lkZSBlZmZlY3QuIEFzIHRoZXJlJ3Mgbm8gYmluZGluZyBmb3IgaXQgYW5kIHRoZSBtb2RlbCBkb2VzIGN1cnJlbnRseSBub3QgYWxsb3dcblx0XHRcdFx0XHRcdC8vIHRvIGFkZCBpdCBhdCBhIGxhdGVyIHBvaW50IG9mIHRpbWUgd2UgaGF2ZSB0byB0YWtlIGNhcmUgaXQncyBwYXJ0IG9mIHRoZSAkc2VsZWN0IG9mIHRoZSBQT1NULCB0aGVyZWZvcmUgbW92aW5nIGl0XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMgfHwge307XG5cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0b0FjdGlvbi5nZXRPYmplY3QoXCIkUmV0dXJuVHlwZS8kVHlwZS9cIiArIHNNZXNzYWdlc1BhdGgpICYmXG5cdFx0XHRcdFx0XHRcdCghbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgfHxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdC5zcGxpdChcIixcIikuaW5kZXhPZihzTWVzc2FnZXNQYXRoKSA9PT0gLTEpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgPSBtUGFyYW1ldGVycy5tQmluZGluZ1BhcmFtZXRlcnMuJHNlbGVjdFxuXHRcdFx0XHRcdFx0XHRcdD8gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzLiRzZWxlY3QgKyBcIixcIiArIHNNZXNzYWdlc1BhdGhcblx0XHRcdFx0XHRcdFx0XHQ6IHNNZXNzYWdlc1BhdGg7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIG5vIHRyaWdnZXIgYWN0aW9uIHRoZXJlZm9yZSBubyBuZWVkIHRvIHJlcXVlc3QgbWVzc2FnZXMgYWdhaW5cblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMuc3BsaWNlKGlNZXNzYWdlU2lkZUVmZmVjdCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYUNvbnRleHRzID0gYUNvbnRleHRzO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgPSBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdDtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmJHcm91cGVkID0gbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nID09PSBJbnZvY2F0aW9uR3JvdXBpbmcuQ2hhbmdlU2V0O1xuXHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXkgPSBtUGFyYW1ldGVycy5iUmV0dXJuQXNBcnJheTtcblx0XHRcdG1BY3Rpb25FeGVjdXRpb25QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAgPSBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXA7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlO1xuXHRcdH1cblx0XHRpZiAoYklzQ3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycy5iSXNDcmVhdGVBY3Rpb24gPSBiSXNDcmVhdGVBY3Rpb247XG5cdFx0fVxuXHRcdGlmIChmbkRpYWxvZykge1xuXHRcdFx0b0FjdGlvblByb21pc2UgPSBmbkRpYWxvZyhcblx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRcdHNBY3Rpb25MYWJlbCxcblx0XHRcdFx0bUFjdGlvbkV4ZWN1dGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvQWN0aW9uLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycy5tZXNzYWdlSGFuZGxlclxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0FjdGlvblByb21pc2UgPSBfZXhlY3V0ZUFjdGlvbihvQXBwQ29tcG9uZW50LCBtQWN0aW9uRXhlY3V0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdHJldHVybiBvQWN0aW9uUHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ob09wZXJhdGlvblJlc3VsdDogYW55KSB7XG5cdFx0XHRcdHJlc29sdmUob09wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9PcGVyYXRpb25SZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRyZWplY3Qob09wZXJhdGlvblJlc3VsdCk7XG5cdFx0XHR9KTtcblx0fSk7XG59XG5mdW5jdGlvbiBjb25maXJtQ3JpdGljYWxBY3Rpb24oXG5cdHNBY3Rpb25OYW1lOiBhbnksXG5cdG9BcHBDb21wb25lbnQ6IGFueSxcblx0c0FjdGlvbkxhYmVsOiBhbnksXG5cdG1QYXJhbWV0ZXJzOiBhbnksXG5cdGFBY3Rpb25QYXJhbWV0ZXJzOiBhbnksXG5cdG9BY3Rpb25Db250ZXh0OiBhbnksXG5cdG9QYXJlbnRDb250cm9sOiBhbnksXG5cdGVudGl0eVNldE5hbWU6IGFueSxcblx0bWVzc2FnZUhhbmRsZXI6IGFueVxuKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0bGV0IGJvdW5kQWN0aW9uTmFtZSA9IHNBY3Rpb25OYW1lID8gc0FjdGlvbk5hbWUgOiBudWxsO1xuXHRcdGJvdW5kQWN0aW9uTmFtZSA9XG5cdFx0XHRib3VuZEFjdGlvbk5hbWUuaW5kZXhPZihcIi5cIikgPj0gMCA/IGJvdW5kQWN0aW9uTmFtZS5zcGxpdChcIi5cIilbYm91bmRBY3Rpb25OYW1lLnNwbGl0KFwiLlwiKS5sZW5ndGggLSAxXSA6IGJvdW5kQWN0aW9uTmFtZTtcblx0XHRjb25zdCBzdWZmaXhSZXNvdXJjZUtleSA9IGJvdW5kQWN0aW9uTmFtZSAmJiBlbnRpdHlTZXROYW1lID8gZW50aXR5U2V0TmFtZSArIFwifFwiICsgYm91bmRBY3Rpb25OYW1lIDogXCJcIjtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBvUGFyZW50Q29udHJvbC5nZXRDb250cm9sbGVyKCkub1Jlc291cmNlQnVuZGxlO1xuXHRcdGNvbnN0IHNDb25maXJtYXRpb25UZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcIkNfT1BFUkFUSU9OU19BQ1RJT05fQ09ORklSTV9NRVNTQUdFXCIsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRudWxsLFxuXHRcdFx0c3VmZml4UmVzb3VyY2VLZXlcblx0XHQpO1xuXG5cdFx0TWVzc2FnZUJveC5jb25maXJtKHNDb25maXJtYXRpb25UZXh0LCB7XG5cdFx0XHRvbkNsb3NlOiBmdW5jdGlvbihzQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0aWYgKHNBY3Rpb24gPT09IEFjdGlvbi5PSykge1xuXHRcdFx0XHRcdHJldHVybiBfZXhlY3V0ZUFjdGlvbihvQXBwQ29tcG9uZW50LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9PcGVyYXRpb246IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKG9PcGVyYXRpb24pO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHRcdFx0XHRcdC5zaG93TWVzc2FnZURpYWxvZygpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZWplY3Qob0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuZnVuY3Rpb24gc2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyhcblx0c0FjdGlvbk5hbWU6IGFueSxcblx0b0FwcENvbXBvbmVudDogYW55LFxuXHRzQWN0aW9uTGFiZWw6IGFueSxcblx0bVBhcmFtZXRlcnM6IGFueSxcblx0YUFjdGlvblBhcmFtZXRlcnM6IGFueSxcblx0b0FjdGlvbkNvbnRleHQ6IGFueSxcblx0b1BhcmVudENvbnRyb2w6IGFueSxcblx0ZW50aXR5U2V0TmFtZTogYW55LFxuXHRtZXNzYWdlSGFuZGxlcjogYW55XG4pIHtcblx0Y29uc3Qgc1BhdGggPSBfZ2V0UGF0aChvQWN0aW9uQ29udGV4dCwgc0FjdGlvbk5hbWUpLFxuXHRcdG1ldGFNb2RlbCA9IG9BY3Rpb25Db250ZXh0LmdldE1vZGVsKCkub01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdGVudGl0eVNldENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc1BhdGgpLFxuXHRcdHNBY3Rpb25OYW1lUGF0aCA9IG9BY3Rpb25Db250ZXh0LmdldE9iamVjdChcIiRJc0JvdW5kXCIpXG5cdFx0XHQ/IG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi9AJHVpNS5vdmVybG9hZC8wXCIpWzBdXG5cdFx0XHQ6IG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKS5zcGxpdChcIi8wXCIpWzBdLFxuXHRcdGFjdGlvbk5hbWVDb250ZXh0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNBY3Rpb25OYW1lUGF0aCksXG5cdFx0c0ZyYWdtZW50TmFtZSA9IFwic2FwL2ZlL2NvcmUvY29udHJvbHMvQWN0aW9uUGFyYW1ldGVyRGlhbG9nXCI7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0Y29uc3Qgb0ZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKHNGcmFnbWVudE5hbWUsIFwiZnJhZ21lbnRcIik7XG5cdFx0Y29uc3Qgb1BhcmFtZXRlck1vZGVsID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHQkZGlzcGxheU1vZGU6IHt9XG5cdFx0fSk7XG5cdFx0bGV0IGFGaWVsZEludmFsaWQ6IGFueVtdID0gW107XG5cdFx0bGV0IGFGb3JtRWxlbWVudHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgbUZpZWxkVmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdGNvbnN0IHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdGFGb3JtRWxlbWVudHNcblx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uKG9Gb3JtRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRmllbGQgPSBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF07XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0ZpZWxkLmdldFJlcXVpcmVkKCkgJiYgb0ZpZWxkLmdldFZhbHVlU3RhdGUoKSAhPT0gXCJFcnJvclwiO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0Lm1hcChmdW5jdGlvbihvRm9ybUVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIilcblx0XHRcdFx0XHRcdFx0PyBvRm9ybUVsZW1lbnQuZ2V0RmllbGRzKClbMF0uZ2V0SXRlbXMoKVxuXHRcdFx0XHRcdFx0XHQ6IG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Gb3JtRWxlbWVudC5nZXRMYWJlbCgpLmdldFRleHQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0KS50aGVuKGZ1bmN0aW9uKGFSZXN1bHRzOiBhbnlbXSkge1xuXHRcdFx0XHRhUmVzdWx0cyA9IGFSZXN1bHRzLmZpbHRlcihmdW5jdGlvbihyZXN1bHQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBhUmVzdWx0cztcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0Y29uc3QgX3ZhbGlkYXRlTWVzc2FnZXMgPSBmdW5jdGlvbihhQWN0aW9uUGFyYW1ldGVyczogYW55LCBhRmllbGRJbnZhbGlkOiBhbnksIGJDbGVhclRhcmdldD86IGJvb2xlYW4pIHtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cblx0XHRcdGFGaWVsZEludmFsaWQgPSBhRmllbGRJbnZhbGlkIHx8IFtdO1xuXG5cdFx0XHRhQWN0aW9uUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uKG9BY3Rpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlciA9IG9BY3Rpb25QYXJhbWV0ZXJzLiROYW1lO1xuXHRcdFx0XHRhTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1BhcmFtID0gc1BhcmFtZXRlci5yZXBsYWNlKFwiLWlubmVyXCIsIFwiXCIpO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9NZXNzYWdlLmNvbnRyb2xJZHMubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0KG9NZXNzYWdlLmdldENvbnRyb2xJZCgpLmluY2x1ZGVzKFwiQVBEXzo6XCIgKyBzUGFyYW1ldGVyKSB8fFxuXHRcdFx0XHRcdFx0XHQob01lc3NhZ2UuZ2V0Q29udHJvbElkKCkuaW5jbHVkZXMoXCJBUERfOjpcIiArIHNQYXJhbWV0ZXIgKyBcImlubmVyXCIpICYmXG5cdFx0XHRcdFx0XHRcdFx0YUZpZWxkSW52YWxpZC5pbmRleE9mKFwiQVBEXzo6XCIgKyBzUGFyYW0pIDwgMCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRpZiAoYkNsZWFyVGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRhRmllbGRJbnZhbGlkLnB1c2goXCJBUERfOjpcIiArIHNQYXJhbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIEhhbmRsZSBtZXNzYWdlcyByZWxhdGVkIHRvIGlucHV0IHdpdGggaW52YWxpZCB0b2tlblxuXHRcdFx0XHRcdGlmIChvTWVzc2FnZS50YXJnZXQuaW5jbHVkZXMoXCJBUERfOjpcIiArIHNQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdFx0XHRhRmllbGRJbnZhbGlkLnB1c2goXCJBUERfOjpcIiArIHNQYXJhbSk7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZS50YXJnZXQgPSBiQ2xlYXJUYXJnZXQgPyBcIlwiIDogb01lc3NhZ2UudGFyZ2V0O1xuXHRcdFx0XHRcdFx0aWYgKGJDbGVhclRhcmdldCkge1xuXHRcdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBhRmllbGRJbnZhbGlkO1xuXHRcdH07XG5cdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB7XG5cdFx0XHRoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRjb25zdCBvRmllbGQgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRjb25zdCBvRmllbGRQcm9taXNlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIik7XG5cdFx0XHRcdGlmIChvRmllbGRQcm9taXNlKSB7XG5cdFx0XHRcdFx0bUZpZWxkVmFsdWVNYXBbc0ZpZWxkSWRdID0gb0ZpZWxkUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdF92YWxpZGF0ZU1lc3NhZ2VzKGFBY3Rpb25QYXJhbWV0ZXJzLCBhRmllbGRJbnZhbGlkKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRhY3Rpb246IG9BY3Rpb25Db250ZXh0LFxuXHRcdFx0XHRcdFx0YWN0aW9uTmFtZTogYWN0aW9uTmFtZUNvbnRleHQsXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGVudGl0eVNldENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0YWN0aW9uOiBvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0YWN0aW9uTmFtZTogYWN0aW9uTmFtZUNvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogZW50aXR5U2V0Q29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBlbnRpdHlTZXRDb250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHQpXG5cdFx0XHQudGhlbihmdW5jdGlvbihvRnJhZ21lbnQ6IGFueSkge1xuXHRcdFx0XHQvLyBUT0RPOiBtb3ZlIHRoZSBkaWFsb2cgaW50byB0aGUgZnJhZ21lbnQgYW5kIG1vdmUgdGhlIGhhbmRsZXJzIHRvIHRoZSBvQ29udHJvbGxlclxuXHRcdFx0XHRsZXQgYUNvbnRleHRzOiBhbnlbXTtcblx0XHRcdFx0Y29uc3QgYUZ1bmN0aW9uUGFyYW1zOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRsZXQgb09wZXJhdGlvbkJpbmRpbmc6IGFueTtcblx0XHRcdFx0cmV0dXJuIENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhvQXBwQ29tcG9uZW50LCBhQWN0aW9uUGFyYW1ldGVycywgb1BhcmFtZXRlck1vZGVsLCB0cnVlKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdC8vIFRPRE86IG1vdmUgdGhlIGRpYWxvZyBpbnRvIHRoZSBmcmFnbWVudCBhbmQgbW92ZSB0aGUgaGFuZGxlcnMgdG8gdGhlIG9Db250cm9sbGVyXG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQsIGNvbnRyb2xsZXI6IG9Db250cm9sbGVyIH0pLnRoZW4oZnVuY3Rpb24ob0RpYWxvZ0NvbnRlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gb1BhcmVudENvbnRyb2wuZ2V0Q29udHJvbGxlcigpLm9SZXNvdXJjZUJ1bmRsZTtcblx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTpcblx0XHRcdFx0XHRcdFx0XHRzQWN0aW9uTGFiZWwgfHxcblx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19USVRMRVwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRcdFx0XHRlc2NhcGVIYW5kbGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKGdlbmVyYXRlKFtcImZlXCIsIFwiQVBEX1wiLCBzQWN0aW9uTmFtZSwgXCJBY3Rpb25cIiwgXCJPa1wiXSksIHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBzQWN0aW9uTGFiZWwgfHwgQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfT0tcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKGFFbXB0eU1hbmRhdG9yeUZpZWxkczogYW55W10pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUVtcHR5TWFuZGF0b3J5RmllbGRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01lc3NhZ2VzID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFFbXB0eU1hbmRhdG9yeUZpZWxkcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfT1BFUkFUSU9OU19BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19NSVNTSU5HX01BTkRBVE9SWV9NU0dcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFFbXB0eU1hbmRhdG9yeUZpZWxkc1tpXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29kZTogMjAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiRXJyb3JcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IG9NZXNzYWdlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZpZWxkSW52YWxpZCA9IF92YWxpZGF0ZU1lc3NhZ2VzKGFBY3Rpb25QYXJhbWV0ZXJzLCBhRmllbGRJbnZhbGlkKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhRmllbGRJbnZhbGlkLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxpbmcuc2hvd1VuYm91bmRNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobUZpZWxkVmFsdWVNYXApLm1hcChmdW5jdGlvbihzS2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1GaWVsZFZhbHVlTWFwW3NLZXldO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogZHVlIHRvIHVzaW5nIHRoZSBzZWFyY2ggYW5kIHZhbHVlIGhlbHBzIG9uIHRoZSBhY3Rpb24gZGlhbG9nIHRyYW5zaWVudCBtZXNzYWdlcyBjb3VsZCBhcHBlYXJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gd2UgbmVlZCBhbiBVWCBkZXNpZ24gZm9yIHRob3NlIHRvIHNob3cgdGhlbSB0byB0aGUgdXNlciAtIGZvciBub3cgcmVtb3ZlIHRoZW0gYmVmb3JlIGNvbnRpbnVpbmdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIG1vdmUgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIERpYWxvZyAoU2ltcGxlRm9ybSkgdG8gbVBhcmFtZXRlcnMuYWN0aW9uUGFyYW1ldGVycyBzbyB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSBpbiB0aGUgb3BlcmF0aW9uIGJpbmRpbmdzIGZvciBhbGwgY29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHZQYXJhbWV0ZXJWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1BhcmFtZXRlckNvbnRleHQgPSBvT3BlcmF0aW9uQmluZGluZyAmJiBvT3BlcmF0aW9uQmluZGluZy5nZXRQYXJhbWV0ZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhQWN0aW9uUGFyYW1ldGVyc1tpXS4kaXNDb2xsZWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhTVZGQ29udGVudCA9IG9EaWFsb2dcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZ2V0TW9kZWwoXCJtdmZ2aWV3XCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFByb3BlcnR5KFwiL1wiICsgYUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhS2V5VmFsdWVzID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGogaW4gYU1WRkNvbnRlbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUtleVZhbHVlcy5wdXNoKGFNVkZDb250ZW50W2pdLktleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyVmFsdWUgPSBhS2V5VmFsdWVzO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyVmFsdWUgPSBvUGFyYW1ldGVyQ29udGV4dC5nZXRQcm9wZXJ0eShhQWN0aW9uUGFyYW1ldGVyc1tpXS4kTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLnZhbHVlID0gdlBhcmFtZXRlclZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbWV0ZXJWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX2V4ZWN1dGVBY3Rpb24ob0FwcENvbXBvbmVudCwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob09wZXJhdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKG9PcGVyYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJIYXNFdGFnTWVzc2FnZSA9IG1lc3NhZ2VIYW5kbGluZy5tb2RpZnlFVGFnTWVzc2FnZXNPbmx5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJIYXNFdGFnTWVzc2FnZTogYkhhc0V0YWdNZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHQ6IG1QYXJhbWV0ZXJzLmFDb250ZXh0c1swXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpc0FjdGlvblBhcmFtZXRlckRpYWxvZ09wZW46IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZVBhZ2VOYXZpZ2F0aW9uQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRGlhbG9nICYmIGJIYXNFdGFnTWVzc2FnZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTsgLy9jbG9zZSB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgYWZ0ZXIgcmVmcmVzaCBvZiB0aGUgY29udGV4dCBhZnRlciBldGFnIG1pc21hdGNoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmluYWxseShmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oZ2VuZXJhdGUoW1wiZmVcIiwgXCJBUERfXCIsIHNBY3Rpb25OYW1lLCBcIkFjdGlvblwiLCBcIkNhbmNlbFwiXSksIHtcblx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfQ09NTU9OX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX0NBTkNFTFwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdF92YWxpZGF0ZU1lc3NhZ2VzKGFBY3Rpb25QYXJhbWV0ZXJzLCBhRmllbGRJbnZhbGlkLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdGJlZm9yZU9wZW46IGZ1bmN0aW9uKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY2xvbmUgZXZlbnQgZm9yIGFjdGlvbldyYXBwZXIgYXMgb0V2ZW50Lm9Tb3VyY2UgZ2V0cyBsb3N0IGR1cmluZyBwcm9jZXNzaW5nIG9mIGJlZm9yZU9wZW4gZXZlbnQgaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DbG9uZUV2ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgb0V2ZW50KTtcblxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGdldERlZmF1bHRWYWx1ZXNGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9EaWFsb2cuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvblBhdGggPSBvQWN0aW9uQ29udGV4dC5zUGF0aCAmJiBvQWN0aW9uQ29udGV4dC5zUGF0aC5zcGxpdChcIi9AXCIpWzBdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzRGVmYXVsdFZhbHVlc0Z1bmN0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvblBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZm5TZXREZWZhdWx0c0FuZE9wZW5EaWFsb2cgPSBmdW5jdGlvbihzQmluZGluZ1BhcmFtZXRlcj86IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0JvdW5kRnVuY3Rpb25OYW1lID0gZ2V0RGVmYXVsdFZhbHVlc0Z1bmN0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBwcmVmaWxsUGFyYW1ldGVyID0gZnVuY3Rpb24oc1BhcmFtTmFtZTogYW55LCB2UGFyYW1EZWZhdWx0VmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAxOiBUaGVyZSBpcyBhIFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBhbm5vdGF0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHZQYXJhbURlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDAgJiYgdlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9taXNlID0gQ29tbW9uVXRpbHMucmVxdWVzdFNpbmdsZXRvblByb3BlcnR5KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZQYXJhbURlZmF1bHRWYWx1ZS4kUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9Qcm9taXNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob1ZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvVmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb25CaW5kaW5nXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmdldFBhcmFtZXRlckNvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0UHJvcGVydHkodlBhcmFtRGVmYXVsdFZhbHVlLiRQYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbih2UGFyYW1WYWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRm9yIG11bHRpIHNlbGVjdCwgbmVlZCB0byBsb29wIG92ZXIgYUNvbnRleHRzIChhcyBjb250ZXh0cyBjYW5ub3QgYmUgcmV0cmlldmVkIHZpYSBiaW5kaW5nIHBhcmFtZXRlciBvZiB0aGUgb3BlcmF0aW9uIGJpbmRpbmcpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzUGF0aEZvckNvbnRleHQgPSB2UGFyYW1EZWZhdWx0VmFsdWUuJFBhdGg7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzUGF0aEZvckNvbnRleHQuaW5kZXhPZihzQmluZGluZ1BhcmFtZXRlciArIFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNQYXRoRm9yQ29udGV4dCA9IHNQYXRoRm9yQ29udGV4dC5yZXBsYWNlKHNCaW5kaW5nUGFyYW1ldGVyICsgXCIvXCIsIFwiXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgYUNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFDb250ZXh0c1tpXS5nZXRQcm9wZXJ0eShzUGF0aEZvckNvbnRleHQpICE9PSB2UGFyYW1WYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgdGhlIHZhbHVlcyBmcm9tIHRoZSBjb250ZXh0cyBhcmUgbm90IGFsbCB0aGUgc2FtZSwgZG8gbm90IHByZWZpbGxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJhbU5hbWU6IHNQYXJhbU5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJOb1Bvc3NpYmxlVmFsdWU6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHZQYXJhbVZhbHVlIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU2ltcGx5IGNsZWFyIHBhcmFtZXRlciBkZWZhdWx0IGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkVycm9yIHdoaWxlIHJlYWRpbmcgZGVmYXVsdCBhY3Rpb24gcGFyYW1ldGVyXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNQYXJhbU5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmFjdGlvbk5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyYW1OYW1lOiBzUGFyYW1OYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRiTGF0ZVByb3BlcnR5RXJyb3I6IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAxLjI6IFBhcmFtZXRlckRlZmF1bHRWYWx1ZSBkZWZpbmVzIGEgZml4ZWQgc3RyaW5nIHZhbHVlIChpLmUuIHZQYXJhbURlZmF1bHRWYWx1ZSA9ICdzb21lU3RyaW5nJylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHZQYXJhbURlZmF1bHRWYWx1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FzZSAyOiBUaGVyZSBpcyBubyBQYXJhbWV0ZXJEZWZhdWx0VmFsdWUgYW5ub3RhdGlvbiAoPT4gbG9vayBpbnRvIHRoZSBGTFAgVXNlciBEZWZhdWx0cylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1ldGVyTW9kZWwgJiYgKG9QYXJhbWV0ZXJNb2RlbCBhcyBhbnkpLm9EYXRhW3NQYXJhbU5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhcmFtTmFtZTogc1BhcmFtTmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogKG9QYXJhbWV0ZXJNb2RlbCBhcyBhbnkpLm9EYXRhW3NQYXJhbU5hbWVdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh7IHBhcmFtTmFtZTogc1BhcmFtTmFtZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlID0gZnVuY3Rpb24oc1BhcmFtTmFtZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvRGlhbG9nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvblBhdGggPSBvQWN0aW9uQ29udGV4dC5zUGF0aCAmJiBvQWN0aW9uQ29udGV4dC5zUGF0aC5zcGxpdChcIi9AXCIpWzBdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNBY3Rpb25QYXJhbWV0ZXJBbm5vdGF0aW9uVGFyZ2V0ID0gc0FjdGlvblBhdGggKyBcIi9cIiArIHNQYXJhbU5hbWUgKyBcIkBcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzQWN0aW9uUGFyYW1ldGVyQW5ub3RhdGlvblRhcmdldCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtZXRlckRlZmF1bHRWYWx1ZSA9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1ldGVyQW5ub3RhdGlvbnMgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbWV0ZXJBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5QYXJhbWV0ZXJEZWZhdWx0VmFsdWVcIl07IC8vIGVpdGhlciB7ICRQYXRoOiAnc29tZVBhdGgnIH0gb3IgJ3NvbWVTdHJpbmcnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1ldGVyRGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHNQYXJhbU5hbWUsIHZQYXJhbWV0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUFjdGlvblBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c1BhcmFtTmFtZSA9IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR2UGFyYW1ldGVyRGVmYXVsdFZhbHVlID0gZ2V0UGFyYW1ldGVyRGVmYXVsdFZhbHVlKHNQYXJhbU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlLnB1c2gocHJlZmlsbFBhcmFtZXRlcihzUGFyYW1OYW1lLCB2UGFyYW1ldGVyRGVmYXVsdFZhbHVlKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc0JvdW5kRnVuY3Rpb25OYW1lICYmIHNCb3VuZEZ1bmN0aW9uTmFtZS5sZW5ndGggPiAwICYmIHR5cGVvZiBzQm91bmRGdW5jdGlvbk5hbWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGkgaW4gYUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsbEJvdW5kRnVuY3Rpb24oc0JvdW5kRnVuY3Rpb25OYW1lLCBhQ29udGV4dHNbaV0sIG1QYXJhbWV0ZXJzLm1vZGVsKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVByZWZpbGxQYXJhbVByb21pc2VzID0gUHJvbWlzZS5hbGwoYUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgYUV4ZWNGdW5jdGlvblByb21pc2VzOiBQcm9taXNlPGFueVtdPiA9IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgb0V4ZWNGdW5jdGlvbkZyb21NYW5pZmVzdFByb21pc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZ1bmN0aW9uUGFyYW1zICYmIGFGdW5jdGlvblBhcmFtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFFeGVjRnVuY3Rpb25Qcm9taXNlcyA9IFByb21pc2UuYWxsKGFGdW5jdGlvblBhcmFtcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNNb2R1bGUgPSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zdWJzdHJpbmcoMCwgbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXC4vZ2ksIFwiL1wiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9FeGVjRnVuY3Rpb25Gcm9tTWFuaWZlc3RQcm9taXNlID0gRlBNSGVscGVyLmFjdGlvbldyYXBwZXIob0Nsb25lRXZlbnQsIHNNb2R1bGUsIHNGdW5jdGlvbk5hbWUsIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbnRleHRzXCI6IGFDb250ZXh0c1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0UHJvbWlzZS5hbGwoW2FQcmVmaWxsUGFyYW1Qcm9taXNlcywgYUV4ZWNGdW5jdGlvblByb21pc2VzLCBvRXhlY0Z1bmN0aW9uRnJvbU1hbmlmZXN0UHJvbWlzZV0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKGFQcm9taXNlczogW2FueVtdLCBhbnlbXSwgYW55XSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWU6IGFueSA9IGFQcm9taXNlc1swXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRnVuY3Rpb25QYXJhbXMgPSBhUHJvbWlzZXNbMV07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0ID0gYVByb21pc2VzWzJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBzRGlhbG9nUGFyYW1OYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaSBpbiBhQWN0aW9uUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c0RpYWxvZ1BhcmFtTmFtZSA9IGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRnVuY3Rpb25QYXJhbXNGcm9tTWFuaWZlc3QgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uUGFyYW1zRnJvbU1hbmlmZXN0Lmhhc093blByb3BlcnR5KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9GdW5jdGlvblBhcmFtc0Zyb21NYW5pZmVzdFtzRGlhbG9nUGFyYW1OYW1lXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhQ3VycmVudFBhcmFtRGVmYXVsdFZhbHVlW2ldLnZhbHVlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUN1cnJlbnRQYXJhbURlZmF1bHRWYWx1ZVtpXS52YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBoYWQgbm90IGJlZW4gcHJldmlvdXNseSBkZXRlcm1pbmVkIGR1ZSB0byBkaWZmZXJlbnQgY29udGV4dHMsIHdlIGRvIG5vdGhpbmcgZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzQm91bmRGdW5jdGlvbk5hbWUgJiYgIWFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWVbaV0uYk5vUG9zc2libGVWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBjaGVjayBpZiB0aGUgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBzYW1lIHBhcmFtIHZhbHVlIGZvciBhbGwgdGhlIGNvbnRleHRzOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBqID0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoaiA8IGFDb250ZXh0cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtc1tqXSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbaiArIDFdICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSkgPT09XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUZ1bmN0aW9uUGFyYW1zW2ogKyAxXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqKys7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9wYXJhbSB2YWx1ZXMgYXJlIGFsbCB0aGUgc2FtZTpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoaiA9PT0gYUNvbnRleHRzLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nLnNldFBhcmFtZXRlcihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbaV0uJE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFGdW5jdGlvblBhcmFtc1tqXS5nZXRPYmplY3Qoc0RpYWxvZ1BhcmFtTmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vT25seSBvbmUgY29udGV4dCwgdGhlbiB0aGUgZGVmYXVsdCBwYXJhbSB2YWx1ZXMgYXJlIHRvIGJlIHZlcmlmaWVkIGZyb20gdGhlIGZ1bmN0aW9uOlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFGdW5jdGlvblBhcmFtc1swXSAmJiBhRnVuY3Rpb25QYXJhbXNbMF0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvT3BlcmF0aW9uQmluZGluZy5zZXRQYXJhbWV0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2ldLiROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRnVuY3Rpb25QYXJhbXNbMF0uZ2V0T2JqZWN0KHNEaWFsb2dQYXJhbU5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBiRXJyb3JGb3VuZCA9IGFDdXJyZW50UGFyYW1EZWZhdWx0VmFsdWUuc29tZShmdW5jdGlvbihvVmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9WYWx1ZS5iTGF0ZVByb3BlcnR5RXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9WYWx1ZS5iTGF0ZVByb3BlcnR5RXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWYgYXQgbGVhc3Qgb25lIERlZmF1bHQgUHJvcGVydHkgaXMgYSBMYXRlIFByb3BlcnR5IGFuZCBhbiBlVGFnIGVycm9yIHdhcyByYWlzZWQuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJFcnJvckZvdW5kKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfQVBQX0NPTVBPTkVOVF9TQVBGRV9FVEFHX0xBVEVfUFJPUEVSVFlcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC53YXJuaW5nKHNUZXh0LCB7IGNvbnRlbnRXaWR0aDogXCIyNWVtXCIgfSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKCk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkSXNCb3VuZFwiKSAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvQWN0aW9uQ29udGV4dC5nZXRPYmplY3QoXCIkUGFyYW1ldGVyXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzQmluZGluZ1BhcmFtZXRlciA9IGFQYXJhbWV0ZXJzWzBdICYmIGFQYXJhbWV0ZXJzWzBdLiROYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0YUNvbnRleHRzWzBdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0NvbnRleHRPYmplY3Q6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dE9iamVjdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b09wZXJhdGlvbkJpbmRpbmcuc2V0UGFyYW1ldGVyKHNCaW5kaW5nUGFyYW1ldGVyLCBvQ29udGV4dE9iamVjdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZuU2V0RGVmYXVsdHNBbmRPcGVuRGlhbG9nKHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgcGFyYW1ldGVyXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmblNldERlZmF1bHRzQW5kT3BlbkRpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0YUZvcm1FbGVtZW50cyA9IG9EaWFsb2dDb250ZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRBZ2dyZWdhdGlvbihcImZvcm1cIilcblx0XHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUNvbnRhaW5lcnNcIilbMF1cblx0XHRcdFx0XHRcdFx0LmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUVsZW1lbnRzXCIpO1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRNb2RlbChvQWN0aW9uQ29udGV4dC5nZXRNb2RlbCgpLm9Nb2RlbCk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9QYXJhbWV0ZXJNb2RlbCwgXCJwYXJhbXNNb2RlbFwiKTtcblx0XHRcdFx0XHRcdG9EaWFsb2cuYmluZEVsZW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIi9cIixcblx0XHRcdFx0XHRcdFx0bW9kZWw6IFwicGFyYW1zTW9kZWxcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyBlbXB0eSBtb2RlbCB0byBhZGQgZWxlbWVudHMgZHluYW1pY2FsbHkgZGVwZW5kaW5nIG9uIG51bWJlciBvZiBNVkYgZmllbGRzIGRlZmluZWQgb24gdGhlIGRpYWxvZ1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01WRk1vZGVsID0gbmV3IEpTT05Nb2RlbCh7fSk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLnNldE1vZGVsKG9NVkZNb2RlbCwgXCJtdmZ2aWV3XCIpO1xuXG5cdFx0XHRcdFx0XHRsZXQgc0FjdGlvblBhdGggPSBzQWN0aW9uTmFtZSArIFwiKC4uLilcIjtcblx0XHRcdFx0XHRcdGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyB8fCBbXTtcblx0XHRcdFx0XHRcdGlmICghYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRzQWN0aW9uUGF0aCA9IFwiL1wiICsgc0FjdGlvblBhdGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmJpbmRFbGVtZW50KHtcblx0XHRcdFx0XHRcdFx0cGF0aDogc0FjdGlvblBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0aWYgKG9QYXJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChhQ29udGV4dHNbMF0pOyAvLyB1c2UgY29udGV4dCBvZiBmaXJzdCBzZWxlY3RlZCBsaW5lIGl0ZW1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9PcGVyYXRpb25CaW5kaW5nID0gb0RpYWxvZy5nZXRPYmplY3RCaW5kaW5nKCk7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gcHJlcGFyZUFjdGlvblBhcmFtZXRlcnMob0FjdGlvbjogYW55LCBhUHJlZGVmaW5lZFBhcmFtZXRlcnM6IGFueSkge1xuXHQvLyBjaGVjayBpZiBwYXJhbWV0ZXJzIGV4aXN0IGF0IGFsbFxuXHRjb25zdCBhUGFyYW1ldGVycyA9IGdldEFjdGlvblBhcmFtZXRlcnMob0FjdGlvbik7XG5cdGFQcmVkZWZpbmVkUGFyYW1ldGVycyA9IGFQcmVkZWZpbmVkUGFyYW1ldGVycyB8fCBbXTtcblxuXHRpZiAoYVByZWRlZmluZWRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHQvLyBUT0RPOiBtZXJnZSB0aGUgcHJlZGVmaW5lZCBvbmNlIHdpdGggdGhlIHJlYWwgZXhpc3Rpbmcgb25lXG5cdH1cblxuXHRyZXR1cm4gYVBhcmFtZXRlcnM7XG59XG5mdW5jdGlvbiBnZXRBY3Rpb25QYXJhbWV0ZXJzKG9BY3Rpb246IGFueSkge1xuXHRjb25zdCBhUGFyYW1ldGVycyA9IG9BY3Rpb24uZ2V0T2JqZWN0KFwiJFBhcmFtZXRlclwiKSB8fCBbXTtcblx0aWYgKGFQYXJhbWV0ZXJzICYmIGFQYXJhbWV0ZXJzLmxlbmd0aCkge1xuXHRcdGlmIChvQWN0aW9uLmdldE9iamVjdChcIiRJc0JvdW5kXCIpKSB7XG5cdFx0XHQvL2luIGNhc2Ugb2YgYm91bmQgYWN0aW9ucywgaWdub3JlIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYW5kIGNvbnNpZGVyIHRoZSByZXN0XG5cdFx0XHRyZXR1cm4gYVBhcmFtZXRlcnMuc2xpY2UoMSwgYVBhcmFtZXRlcnMubGVuZ3RoKSB8fCBbXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFQYXJhbWV0ZXJzO1xufVxuZnVuY3Rpb24gZ2V0SXNBY3Rpb25Dcml0aWNhbChvTWV0YU1vZGVsOiBhbnksIHNQYXRoOiBhbnksIGNvbnRleHRzPzogYW55LCBvQm91bmRBY3Rpb24/OiBhbnkpIHtcblx0Y29uc3QgdkFjdGlvbkNyaXRpY2FsID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNBY3Rpb25Dcml0aWNhbFwiKTtcblx0bGV0IHNDcml0aWNhbFBhdGggPSB2QWN0aW9uQ3JpdGljYWwgJiYgdkFjdGlvbkNyaXRpY2FsLiRQYXRoO1xuXHRpZiAoIXNDcml0aWNhbFBhdGgpIHtcblx0XHQvLyB0aGUgc3RhdGljIHZhbHVlIHNjZW5hcmlvIGZvciBpc0FjdGlvbkNyaXRpY2FsXG5cdFx0cmV0dXJuICEhdkFjdGlvbkNyaXRpY2FsO1xuXHR9XG5cdGNvbnN0IGFCaW5kaW5nUGFyYW1zID0gb0JvdW5kQWN0aW9uICYmIG9Cb3VuZEFjdGlvbi5nZXRPYmplY3QoXCIkUGFyYW1ldGVyXCIpLFxuXHRcdGFQYXRocyA9IHNDcml0aWNhbFBhdGggJiYgc0NyaXRpY2FsUGF0aC5zcGxpdChcIi9cIiksXG5cdFx0YkNvbmRpdGlvbiA9XG5cdFx0XHRhQmluZGluZ1BhcmFtcyAmJiBhQmluZGluZ1BhcmFtcy5sZW5ndGggJiYgdHlwZW9mIGFCaW5kaW5nUGFyYW1zID09PSBcIm9iamVjdFwiICYmIHNDcml0aWNhbFBhdGggJiYgY29udGV4dHMgJiYgY29udGV4dHMubGVuZ3RoO1xuXHRpZiAoYkNvbmRpdGlvbikge1xuXHRcdC8vaW4gY2FzZSBiaW5kaW5nIHBhdGFtZXRlcnMgYXJlIHRoZXJlIGluIHBhdGggbmVlZCB0byByZW1vdmUgZWc6IC0gX2l0L2lzVmVyaWZpZWQgPT4gbmVlZCB0byByZW1vdmUgX2l0IGFuZCB0aGUgcGF0aCBzaG91bGQgYmUgaXNWZXJpZmllZFxuXHRcdGFCaW5kaW5nUGFyYW1zLmZpbHRlcihmdW5jdGlvbihvUGFyYW1zOiBhbnkpIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gYVBhdGhzICYmIGFQYXRocy5pbmRleE9mKG9QYXJhbXMuJE5hbWUpO1xuXHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0YVBhdGhzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c0NyaXRpY2FsUGF0aCA9IGFQYXRocy5qb2luKFwiL1wiKTtcblx0XHRyZXR1cm4gY29udGV4dHNbMF0uZ2V0T2JqZWN0KHNDcml0aWNhbFBhdGgpO1xuXHR9IGVsc2UgaWYgKHNDcml0aWNhbFBhdGgpIHtcblx0XHQvL2lmIHNjZW5hcmlvIGlzIHBhdGggYmFzZWQgcmV0dXJuIHRoZSBwYXRoIHZhbHVlXG5cdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldE9iamVjdChzQ3JpdGljYWxQYXRoKTtcblx0fVxufVxuZnVuY3Rpb24gX2V4ZWN1dGVBY3Rpb24ob0FwcENvbXBvbmVudDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdGNvbnN0IGFDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLmFDb250ZXh0cyB8fCBbXTtcblx0Y29uc3Qgb01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdGNvbnN0IGlFeGlzdGluZ01lc3NhZ2VzID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCkubGVuZ3RoIHx8IDA7XG5cdGNvbnN0IGFBY3Rpb25QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMuYUFjdGlvblBhcmFtZXRlcnMgfHwgW107XG5cdGNvbnN0IHNBY3Rpb25OYW1lID0gbVBhcmFtZXRlcnMuYWN0aW9uTmFtZTtcblx0Y29uc3QgZm5PblN1Ym1pdHRlZCA9IG1QYXJhbWV0ZXJzLmZuT25TdWJtaXR0ZWQ7XG5cdGNvbnN0IGZuT25SZXNwb25zZSA9IG1QYXJhbWV0ZXJzLmZuT25SZXNwb25zZTtcblx0Y29uc3QgYklzQ3JlYXRlQWN0aW9uID0gbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uO1xuXHRsZXQgYkFjdGlvblBhcmFtZXRlcnNFeGlzdCA9IGZhbHNlO1xuXHRsZXQgb0FjdGlvbjogYW55O1xuXG5cdGZ1bmN0aW9uIGZuRGlmZmVyZW50aWF0ZShwcm9taXNlOiBhbnkpIHtcblx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKFxuXHRcdFx0ZnVuY3Rpb24ocmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXMoKTtcblx0XHRcdFx0Ly8gQWN0aW9uIERpYWxvZyBtdXN0IHJlbWFpbiBvcGVuIGlmIHRoZXJlIGFyZSByZXNwb25zZSBlcnJvci1tZXNzYWdlcywgYmVjYXVzZSBpbiB0aGUgamF2YSBzdGFjayB0aGUgZGlhbG9nIHdvdWxkIGJlIGNsb3NlZCBpbW1lZGlhdGVseS5cblx0XHRcdFx0aWYgKGFNZXNzYWdlcy5sZW5ndGggPiBpRXhpc3RpbmdNZXNzYWdlcyAmJiBhTWVzc2FnZXNbYU1lc3NhZ2VzLmxlbmd0aCAtIDFdLnR5cGUgPT09IFwiRXJyb3JcIikge1xuXHRcdFx0XHRcdHJldHVybiB7IHJlc3BvbnNlOiByZXNwb25zZSwgc3RhdHVzOiBcInJlamVjdGVkXCIgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geyByZXNwb25zZTogcmVzcG9uc2UsIHN0YXR1czogXCJyZXNvbHZlZFwiIH07XG5cdFx0XHR9LFxuXHRcdFx0ZnVuY3Rpb24ocmVzcG9uc2U6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4geyByZXNwb25zZTogcmVzcG9uc2UsIHN0YXR1czogXCJyZWplY3RlZFwiIH07XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNldEFjdGlvblBhcmFtZXRlckRlZmF1bHRWYWx1ZSgpIHtcblx0XHRpZiAoYUFjdGlvblBhcmFtZXRlcnMgJiYgYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRiQWN0aW9uUGFyYW1ldGVyc0V4aXN0ID0gdHJ1ZTtcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYUFjdGlvblBhcmFtZXRlcnMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0aWYgKCFhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSkge1xuXHRcdFx0XHRcdHN3aXRjaCAoYUFjdGlvblBhcmFtZXRlcnNbal0uJFR5cGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uU3RyaW5nXCI6XG5cdFx0XHRcdFx0XHRcdGFBY3Rpb25QYXJhbWV0ZXJzW2pdLnZhbHVlID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50MTZcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRcdFx0XHRcdGNhc2UgXCJFZG0uSW50NjRcIjpcblx0XHRcdFx0XHRcdFx0YUFjdGlvblBhcmFtZXRlcnNbal0udmFsdWUgPSAwO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdC8vIHRiY1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdG9BY3Rpb24uc2V0UGFyYW1ldGVyKGFBY3Rpb25QYXJhbWV0ZXJzW2pdLiROYW1lLCBhQWN0aW9uUGFyYW1ldGVyc1tqXS52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkge1xuXHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMubUJpbmRpbmdQYXJhbWV0ZXJzO1xuXHRcdFx0Y29uc3QgYkdyb3VwZWQgPSBtUGFyYW1ldGVycy5iR3JvdXBlZDtcblx0XHRcdGNvbnN0IGJSZXR1cm5Bc0FycmF5ID0gbVBhcmFtZXRlcnMuYlJldHVybkFzQXJyYXk7XG5cdFx0XHRjb25zdCBiR2V0Qm91bmRDb250ZXh0ID0gbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dDtcblx0XHRcdGNvbnN0IGFBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvQWN0aW9uUHJvbWlzZTtcblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IHNHcm91cElkOiBzdHJpbmc7XG5cdFx0XHRjb25zdCBmbkV4ZWN1dGVBY3Rpb24gPSBmdW5jdGlvbihvQWN0aW9uOiBhbnksIGluZGV4OiBhbnksIG9TaWRlRWZmZWN0OiBhbnkpIHtcblx0XHRcdFx0c2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCk7XG5cdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiBuZWVkIGJhdGNoIGdyb3VwIHBlciBhY3Rpb24gY2FsbFxuXHRcdFx0XHRzR3JvdXBJZCA9ICFiR3JvdXBlZCA/IFwiJGF1dG8uXCIgKyBpbmRleCA6IG9BY3Rpb24uZ2V0VXBkYXRlR3JvdXBJZCgpO1xuXHRcdFx0XHRvQWN0aW9uUHJvbWlzZSA9IGJHZXRCb3VuZENvbnRleHRcblx0XHRcdFx0XHQ/IG9BY3Rpb24uZXhlY3V0ZShzR3JvdXBJZCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdDogb0FjdGlvbi5leGVjdXRlKHNHcm91cElkKTtcblx0XHRcdFx0YUFjdGlvblByb21pc2VzLnB1c2gob0FjdGlvblByb21pc2UpO1xuXHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdFx0Ly8gdHJpZ2dlciBhY3Rpb25zIGZyb20gc2lkZSBlZmZlY3RzXG5cdFx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucyAmJiBvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHNUcmlnZ2VyQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9TaWRlRWZmZWN0LmNvbnRleHQsIHNHcm91cElkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyByZXF1ZXN0IHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBhY3Rpb25cblx0XHRcdFx0Ly8gYXMgd2UgbW92ZSB0aGUgbWVzc2FnZXMgcmVxdWVzdCB0byBQT1NUICRzZWxlY3Qgd2UgbmVlZCB0byBiZSBwcmVwYXJlZCBmb3IgYW4gZW1wdHkgYXJyYXlcblx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0ICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyAmJiBvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2Vcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLCBvU2lkZUVmZmVjdC5jb250ZXh0LCBzR3JvdXBJZClcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYUNvbnRleHRzXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRjb25zdCBmbkV4ZWN1dGVTaW5nbGVBY3Rpb24gPSBmdW5jdGlvbihvQWN0aW9uOiBhbnksIGluZGV4OiBhbnksIG9TaWRlRWZmZWN0OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcblx0XHRcdFx0XHRsZXQgb0xvY2FsUHJvbWlzZTtcblx0XHRcdFx0XHRjb25zdCBhTG9jYWxQcm9taXNlID0gW107XG5cdFx0XHRcdFx0c2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCk7XG5cdFx0XHRcdFx0Ly8gRm9yIGludm9jYXRpb24gZ3JvdXBpbmcgXCJpc29sYXRlZFwiIG5lZWQgYmF0Y2ggZ3JvdXAgcGVyIGFjdGlvbiBjYWxsXG5cdFx0XHRcdFx0c0dyb3VwSWQgPSBcImFwaU1vZGVcIiArIGluZGV4O1xuXHRcdFx0XHRcdG9BY3Rpb25Qcm9taXNlID0gYkdldEJvdW5kQ29udGV4dFxuXHRcdFx0XHRcdFx0PyBvQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHQgIH0pXG5cdFx0XHRcdFx0XHQ6IG9BY3Rpb24uZXhlY3V0ZShzR3JvdXBJZCk7XG5cblx0XHRcdFx0XHRhQWN0aW9uUHJvbWlzZXMucHVzaChvQWN0aW9uUHJvbWlzZSk7XG5cdFx0XHRcdFx0YUxvY2FsUHJvbWlzZS5wdXNoKG9BY3Rpb25Qcm9taXNlKTtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdFx0XHQvLyB0cmlnZ2VyIGFjdGlvbnMgZnJvbSBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3QgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMgJiYgb1NpZGVFZmZlY3QudHJpZ2dlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHNUcmlnZ2VyQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHNUcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0xvY2FsUHJvbWlzZSA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb1NpZGVFZmZlY3QuY29udGV4dCwgc0dyb3VwSWQpO1xuXHRcdFx0XHRcdFx0XHRcdGFMb2NhbFByb21pc2UucHVzaChvTG9jYWxQcm9taXNlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIHJlcXVlc3Qgc2lkZSBlZmZlY3RzIGZvciB0aGlzIGFjdGlvblxuXHRcdFx0XHRcdC8vIGFzIHdlIG1vdmUgdGhlIG1lc3NhZ2VzIHJlcXVlc3QgdG8gUE9TVCAkc2VsZWN0IHdlIG5lZWQgdG8gYmUgcHJlcGFyZWQgZm9yIGFuIGVtcHR5IGFycmF5XG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0ICYmIG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyAmJiBvU2lkZUVmZmVjdC5wYXRoRXhwcmVzc2lvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0b0xvY2FsUHJvbWlzZSA9IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucywgb1NpZGVFZmZlY3QuY29udGV4dCwgc0dyb3VwSWQpO1xuXHRcdFx0XHRcdFx0YUxvY2FsUHJvbWlzZS5wdXNoKG9Mb2NhbFByb21pc2UpO1xuXHRcdFx0XHRcdFx0b0xvY2FsUHJvbWlzZVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5wYXJzZShtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5hQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b01vZGVsLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRcdFx0XHRQcm9taXNlLmFsbChhTG9jYWxQcm9taXNlKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdFx0XHR9O1xuXG5cdFx0XHRmdW5jdGlvbiBmbkV4ZWN1dGVTZXF1ZW50aWFsbHkoYUNvbnRleHRzOiBhbnkpIHtcblx0XHRcdFx0Ly8gT25lIGFjdGlvbiBhbmQgaXRzIHNpZGUgZWZmZWN0cyBhcmUgY29tcGxldGVkIGJlZm9yZSB0aGUgbmV4dCBhY3Rpb24gaXMgZXhlY3V0ZWRcblx0XHRcdFx0KFxuXHRcdFx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdFx0XHRmdW5jdGlvbiBub29wKCkge1xuXHRcdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KShhQWN0aW9uUHJvbWlzZXMpO1xuXHRcdFx0XHRmdW5jdGlvbiBwcm9jZXNzT25lQWN0aW9uKGNvbnRleHQ6IGFueSwgaTogYW55KSB7XG5cdFx0XHRcdFx0b0FjdGlvbiA9IG9Nb2RlbC5iaW5kQ29udGV4dChzQWN0aW9uTmFtZSArIFwiKC4uLilcIiwgY29udGV4dCwgbUJpbmRpbmdQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRyZXR1cm4gZm5FeGVjdXRlU2luZ2xlQWN0aW9uKG9BY3Rpb24sIGksIHtcblx0XHRcdFx0XHRcdGNvbnRleHQ6IGNvbnRleHQsXG5cdFx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnBhdGhFeHByZXNzaW9ucyxcblx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zOiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdCAmJiBtUGFyYW1ldGVycy5hZGRpdGlvbmFsU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uc1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRsZXQgaiA9IDA7XG5cdFx0XHRcdGFDb250ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IGlkID0gKytqO1xuXHRcdFx0XHRcdG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZSA9IG9BY3Rpb25BbmRTaWRlRWZmZWN0UHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHByb2Nlc3NPbmVBY3Rpb24oY29udGV4dCwgaWQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0b0FjdGlvbkFuZFNpZGVFZmZlY3RQcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRmbkhhbmRsZVJlc3VsdHMoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgJiYgIWJHcm91cGVkKSB7XG5cdFx0XHRcdC8vIEZvciBpbnZvY2F0aW9uIGdyb3VwaW5nIFwiaXNvbGF0ZWRcIiBjYWxsZWQgZnJvbSBPYmplY3RQYWdlLCBlbnN1cmUgdGhhdCBlYWNoIGFjdGlvbiBhbmQgbWF0Y2hpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIGFyZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBuZXh0IHNldCBpcyBzdWJtaXR0ZWQuIFdvcmthcm91bmQgdW50aWwgSlNPTiBiYXRjaCBpcyBhdmFpbGFibGUuXG5cdFx0XHRcdGZuRXhlY3V0ZVNlcXVlbnRpYWxseShhQ29udGV4dHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGFDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoc0FjdGlvbk5hbWUgKyBcIiguLi4pXCIsIGFDb250ZXh0c1tpXSwgbUJpbmRpbmdQYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRmbkV4ZWN1dGVBY3Rpb24ob0FjdGlvbiwgYUNvbnRleHRzLmxlbmd0aCA8PSAxID8gbnVsbCA6IGksIHtcblx0XHRcdFx0XHRcdGNvbnRleHQ6IGFDb250ZXh0c1tpXSxcblx0XHRcdFx0XHRcdHBhdGhFeHByZXNzaW9uczogbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QgJiYgbVBhcmFtZXRlcnMuYWRkaXRpb25hbFNpZGVFZmZlY3QucGF0aEV4cHJlc3Npb25zLFxuXHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbnM6IG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0ICYmIG1QYXJhbWV0ZXJzLmFkZGl0aW9uYWxTaWRlRWZmZWN0LnRyaWdnZXJBY3Rpb25zXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0KFxuXHRcdFx0XHRcdGZuT25TdWJtaXR0ZWQgfHxcblx0XHRcdFx0XHRmdW5jdGlvbiBub29wKCkge1xuXHRcdFx0XHRcdFx0LyoqL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KShhQWN0aW9uUHJvbWlzZXMpO1xuXHRcdFx0XHRmbkhhbmRsZVJlc3VsdHMoKTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gZm5IYW5kbGVSZXN1bHRzKCkge1xuXHRcdFx0XHRQcm9taXNlLmFsbChhQWN0aW9uUHJvbWlzZXMubWFwKGZuRGlmZmVyZW50aWF0ZSkpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ocmVzdWx0czogYW55W10pIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFSZWplY3RlZEl0ZW1zID0gW107XG5cdFx0XHRcdFx0XHRjb25zdCBhUmVzb2x2ZWRJdGVtcyA9IFtdO1xuXHRcdFx0XHRcdFx0bGV0IGlSZXN1bHRDb3VudDtcblx0XHRcdFx0XHRcdGZvciAoaVJlc3VsdENvdW50ID0gMDsgaVJlc3VsdENvdW50IDwgcmVzdWx0cy5sZW5ndGg7IGlSZXN1bHRDb3VudCsrKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChyZXN1bHRzW2lSZXN1bHRDb3VudF0uc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRhUmVqZWN0ZWRJdGVtcy5wdXNoKHJlc3VsdHNbaVJlc3VsdENvdW50XS5yZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdHNbaVJlc3VsdENvdW50XS5zdGF0dXMgPT09IFwicmVzb2x2ZWRcIikge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChiSXNDcmVhdGVBY3Rpb24gJiYgYkFjdGlvblBhcmFtZXRlcnNFeGlzdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly9vbmx5IHVzZWQgZm9yIE5ld0FjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0c1tpUmVzdWx0Q291bnRdLmJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVkSXRlbXMucHVzaChyZXN1bHRzW2lSZXN1bHRDb3VudF0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZWRJdGVtcy5wdXNoKHJlc3VsdHNbaVJlc3VsdENvdW50XS5yZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXJlc3VsdHMgfHwgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPT09IDApKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCh0cnVlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChhUmVqZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0aWYgKGJSZXR1cm5Bc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShhUmVzb2x2ZWRJdGVtcyk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gY29udGV4dCBpcyBnaXZlbiBkaXJlY3RseSB3aXRob3V0IGFuIGFycmF5IHNvIGFsc28gbm8gYXJyYXkgaXMgZXhwZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKGFSZXNvbHZlZEl0ZW1zWzBdKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlZEl0ZW1zOiBhUmVzb2x2ZWRJdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRyZWplY3RlZEl0ZW1zOiBhUmVqZWN0ZWRJdGVtc1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdFx0fVxuXHRcdH0pLmZpbmFsbHkoZnVuY3Rpb24oKSB7XG5cdFx0XHQoXG5cdFx0XHRcdGZuT25SZXNwb25zZSB8fFxuXHRcdFx0XHRmdW5jdGlvbiBub29wKCkge1xuXHRcdFx0XHRcdC8qKi9cblx0XHRcdFx0fVxuXHRcdFx0KSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9BY3Rpb24gPSBvTW9kZWwuYmluZENvbnRleHQoXCIvXCIgKyBzQWN0aW9uTmFtZSArIFwiKC4uLilcIik7XG5cdFx0c2V0QWN0aW9uUGFyYW1ldGVyRGVmYXVsdFZhbHVlKCk7XG5cdFx0Y29uc3Qgb0FjdGlvblByb21pc2UgPSBvQWN0aW9uLmV4ZWN1dGUoXCJhY3Rpb25JbXBvcnRcIik7XG5cdFx0b01vZGVsLnN1Ym1pdEJhdGNoKFwiYWN0aW9uSW1wb3J0XCIpO1xuXHRcdC8vIHRyaWdnZXIgb25TdWJtaXR0ZWQgXCJldmVudFwiXG5cdFx0KFxuXHRcdFx0Zm5PblN1Ym1pdHRlZCB8fFxuXHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0LyoqL1xuXHRcdFx0fVxuXHRcdCkob0FjdGlvblByb21pc2UpO1xuXHRcdHJldHVybiBvQWN0aW9uUHJvbWlzZS5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0KFxuXHRcdFx0XHRmbk9uUmVzcG9uc2UgfHxcblx0XHRcdFx0ZnVuY3Rpb24gbm9vcCgpIHtcblx0XHRcdFx0XHQvKiovXG5cdFx0XHRcdH1cblx0XHRcdCkoKTtcblx0XHR9KTtcblx0fVxufVxuZnVuY3Rpb24gX2dldFBhdGgob0FjdGlvbkNvbnRleHQ6IGFueSwgc0FjdGlvbk5hbWU6IGFueSkge1xuXHRsZXQgc1BhdGggPSBvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCk7XG5cdHNQYXRoID0gb0FjdGlvbkNvbnRleHQuZ2V0T2JqZWN0KFwiJElzQm91bmRcIikgPyBzUGF0aC5zcGxpdChcIkAkdWk1Lm92ZXJsb2FkXCIpWzBdIDogc1BhdGguc3BsaXQoXCIvMFwiKVswXTtcblx0cmV0dXJuIHNQYXRoLnNwbGl0KFwiL1wiICsgc0FjdGlvbk5hbWUpWzBdO1xufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgdG8gY2FsbCBPRGF0YSBhY3Rpb25zIChib3VuZC9pbXBvcnQpIGFuZCBmdW5jdGlvbnMgKGJvdW5kL2ltcG9ydClcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuYWN0aW9ucy5vcGVyYXRpb25zXG4gKiBAcHJpdmF0ZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU2LjBcbiAqL1xuY29uc3Qgb3BlcmF0aW9ucyA9IHtcblx0Y2FsbEJvdW5kQWN0aW9uOiBjYWxsQm91bmRBY3Rpb24sXG5cdGNhbGxBY3Rpb25JbXBvcnQ6IGNhbGxBY3Rpb25JbXBvcnQsXG5cdGNhbGxCb3VuZEZ1bmN0aW9uOiBjYWxsQm91bmRGdW5jdGlvbixcblx0Y2FsbEZ1bmN0aW9uSW1wb3J0OiBjYWxsRnVuY3Rpb25JbXBvcnRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wZXJhdGlvbnM7XG4iXX0=