@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
@@ -0,0 +1,871 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/core/services/CacheHandlerServiceFactory", "sap/ui/core/cache/CacheManager", "sap/ui/Device"], function (CacheHandlerServiceFactory, Cache, Device) {
6
+ "use strict";
7
+
8
+ // Override to make the CacheManager works for some tests
9
+ Device.browser.name = "cr";
10
+ Device.browser.version = 80;
11
+ describe("CacheHandlerFactory", function () {
12
+ var oFakeMetaModel = {
13
+ fetchEntityContainer: function () {
14
+ return Promise.resolve();
15
+ },
16
+ getId: function () {
17
+ return "fakeModelId";
18
+ }
19
+ };
20
+ var oFakeComponent = {
21
+ getViewData: function () {
22
+ return {
23
+ dummySetting: "dummy"
24
+ };
25
+ }
26
+ };
27
+ var oFakeAppComponent = {
28
+ getManifest: function () {
29
+ return {
30
+ "sap.app": {
31
+ dummySetting: "dummy"
32
+ }
33
+ };
34
+ }
35
+ };
36
+ test("can be initialized", function () {
37
+ expect(CacheHandlerServiceFactory).not.toEqual(null); // "Library has been loaded");
38
+
39
+ var oTestFactory = new CacheHandlerServiceFactory();
40
+ expect(oTestFactory).not.toEqual(null);
41
+ });
42
+ var oFactory;
43
+ describe("CacheHandler instance creation", function () {
44
+ beforeEach(function () {
45
+ oFactory = new CacheHandlerServiceFactory();
46
+ });
47
+ test("cannot be initialized without a metamodel", function () {
48
+ var createFn = function () {
49
+ return oFactory.createInstance({
50
+ settings: {}
51
+ });
52
+ };
53
+
54
+ expect(createFn).toThrow();
55
+ });
56
+ test("cannot be initialized with a failing metamodel", function () {
57
+ try {
58
+ var oOriginFn = oFakeMetaModel.fetchEntityContainer;
59
+
60
+ oFakeMetaModel.fetchEntityContainer = function () {
61
+ return Promise.reject("Nope");
62
+ };
63
+
64
+ var oInstance = oFactory.createInstance({
65
+ settings: {
66
+ metaModel: oFakeMetaModel,
67
+ component: oFakeComponent,
68
+ appComponent: oFakeAppComponent
69
+ }
70
+ });
71
+ expect(oInstance).toBeDefined();
72
+ return oInstance.then(function (oInstanceLoaded) {
73
+ expect(true).toBe(false);
74
+ }).catch(function () {
75
+ oFakeMetaModel.fetchEntityContainer = oOriginFn;
76
+ });
77
+ } catch (e) {
78
+ expect(true).toBe(false);
79
+ }
80
+ });
81
+ test("is initialized as a global instance", function () {
82
+ var oCurrentInstance;
83
+ var sFakeMetaModelId = oFakeMetaModel.getId();
84
+ var oFetchEntityContainerSpy = jest.spyOn(oFakeMetaModel, "fetchEntityContainer");
85
+ expect(oFactory._oInstanceRegistry[sFakeMetaModelId]).toBe(undefined); //, "No global instance exists");
86
+
87
+ var oInstance = oFactory.createInstance({
88
+ settings: {
89
+ metaModel: oFakeMetaModel,
90
+ component: oFakeComponent,
91
+ appComponent: oFakeAppComponent
92
+ }
93
+ });
94
+ expect(oInstance).toBeDefined(); // "Instance promise is created");
95
+
96
+ expect(oFetchEntityContainerSpy).toHaveBeenCalledTimes(1);
97
+ return oInstance.then(function (oInstanceLoaded) {
98
+ oCurrentInstance = oInstanceLoaded;
99
+ expect(oInstanceLoaded).toBeDefined(); //assert.ok(oInstanceLoaded != null, "Instance promise is resolved");
100
+
101
+ expect(oFactory._oInstanceRegistry[sFakeMetaModelId]).toBeDefined(); // "Global instance exists");
102
+
103
+ var oNewInstance = oFactory.createInstance({
104
+ settings: {
105
+ metaModel: oFakeMetaModel,
106
+ component: oFakeComponent,
107
+ appComponent: oFakeAppComponent
108
+ }
109
+ }); // Init should not have been called again since the instance is global to the factory
110
+
111
+ expect(oFetchEntityContainerSpy).toHaveBeenCalledTimes(1);
112
+ return oNewInstance;
113
+ }).then(function (oNewInstanceLoaded) {
114
+ expect(oNewInstanceLoaded).toEqual(oCurrentInstance); //, "Both instance are the same");
115
+
116
+ return oFactory.getInstance(oFakeMetaModel);
117
+ }).then(function (oGlobalInstance) {
118
+ expect(oCurrentInstance).toEqual(oGlobalInstance); //, "Retrieving the global instance returns the same");
119
+
120
+ oCurrentInstance.exit();
121
+ expect(oFactory._oInstanceRegistry[sFakeMetaModelId]).toEqual(null); // "Global instance is removed");
122
+
123
+ return oFactory.createInstance({
124
+ settings: {
125
+ metaModel: oFakeMetaModel,
126
+ component: oFakeComponent,
127
+ appComponent: oFakeAppComponent
128
+ }
129
+ });
130
+ }).then(function (oThirdInstanceLoaded) {
131
+ expect(oThirdInstanceLoaded).toBeDefined(); // != null, "Third instance can be created");
132
+ });
133
+ });
134
+ describe("CacheHandler checks", function () {
135
+ beforeEach(function () {
136
+ return Cache.del("myCacheKey");
137
+ });
138
+ test("Case #1a- can validate a basic cache key", function () {
139
+ var oFactory = new CacheHandlerServiceFactory();
140
+
141
+ oFakeMetaModel.getETags = function () {
142
+ return {
143
+ "myRootService": "MyETag"
144
+ };
145
+ };
146
+
147
+ return oFactory.createInstance({
148
+ settings: {
149
+ metaModel: oFakeMetaModel,
150
+ component: oFakeComponent,
151
+ appComponent: oFakeAppComponent
152
+ }
153
+ }).then(function (oCacheHandlerInstance) {
154
+ oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
155
+ expect(sValidatedKey).toBeDefined(); // "ValidatedKey exists"
156
+
157
+ expect(sValidatedKey).toEqual('{"myRootService":"MyETag","manifest":-1335850414}'); //, "ValidatedKey is correct");
158
+ });
159
+ });
160
+ });
161
+ test("Case #1a - can validate a date based cache key", function () {
162
+ var oFactory = new CacheHandlerServiceFactory();
163
+
164
+ oFakeMetaModel.getETags = function () {
165
+ return {
166
+ "myRootService": new Date("2019-08-31")
167
+ };
168
+ };
169
+
170
+ return oFactory.createInstance({
171
+ settings: {
172
+ metaModel: oFakeMetaModel,
173
+ component: oFakeComponent,
174
+ appComponent: oFakeAppComponent
175
+ }
176
+ }).then(function (oCacheHandlerInstance) {
177
+ oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
178
+ expect(sValidatedKey).toBeDefined(); // != null, "ValidatedKey exists");
179
+
180
+ expect(sValidatedKey).toEqual('{"myRootService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); // "ValidatedKey is correct"
181
+ });
182
+ });
183
+ });
184
+ test("Case #1-b cannot validate a cache key if no metadata include ETags", function () {
185
+ var oFactory = new CacheHandlerServiceFactory();
186
+
187
+ oFakeMetaModel.getETags = function () {
188
+ return {
189
+ "myRootService": null
190
+ };
191
+ };
192
+
193
+ return oFactory.createInstance({
194
+ settings: {
195
+ metaModel: oFakeMetaModel,
196
+ component: oFakeComponent,
197
+ appComponent: oFakeAppComponent
198
+ }
199
+ }).then(function (oCacheHandlerInstance) {
200
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
201
+ expect(sValidatedKey).toEqual(null); //.toBeDefined(); // == null, "Validated key is null");
202
+ });
203
+ });
204
+ });
205
+ test("Case #1-b cannot validate a cache key if one metadata does not include ETags", function () {
206
+ var oFactory = new CacheHandlerServiceFactory();
207
+
208
+ oFakeMetaModel.getETags = function () {
209
+ return {
210
+ "myRootService": "MyETag",
211
+ "myOtherService": null
212
+ };
213
+ };
214
+
215
+ return oFactory.createInstance({
216
+ settings: {
217
+ metaModel: oFakeMetaModel,
218
+ component: oFakeComponent,
219
+ appComponent: oFakeAppComponent
220
+ }
221
+ }).then(function (oCacheHandlerInstance) {
222
+ oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
223
+ expect(sValidatedKey).toEqual(null); // == null, "Validated key is null");
224
+ });
225
+ });
226
+ }); //if ((Device as any).browser.msie || (Device as any).browser.chrome) {
227
+
228
+ test("Case #2a - can validate a basic cache key and revalidate if the ETags have not changed", function () {
229
+ var oCacheManagerSpy = jest.spyOn(Cache, "set");
230
+ var oFactory = new CacheHandlerServiceFactory();
231
+
232
+ oFakeMetaModel.getETags = function () {
233
+ return {
234
+ "myRootService": "MyETag",
235
+ "myOtherService": new Date("2019-08-31")
236
+ };
237
+ };
238
+
239
+ return oFactory.createInstance({
240
+ settings: {
241
+ metaModel: oFakeMetaModel,
242
+ component: oFakeComponent,
243
+ appComponent: oFakeAppComponent
244
+ }
245
+ }).then(function (oCacheHandlerInstance) {
246
+ var sFirstCacheKey;
247
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
248
+ sFirstCacheKey = sValidatedKey;
249
+ expect(sValidatedKey).toBeDefined(); // != null, "ValidatedKey exists");
250
+
251
+ expect(sValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); //"ValidatedKey is correct "
252
+
253
+ expect(oCacheManagerSpy).not.toHaveBeenCalled();
254
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
255
+ }).then(function () {
256
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey");
257
+ }).then(function (sSecondValidatedKey) {
258
+ expect(oCacheManagerSpy).toHaveBeenCalledTimes(1);
259
+ expect(sSecondValidatedKey).toEqual(sFirstCacheKey); // "Validated Key is the same as the second validated key");
260
+
261
+ return oCacheHandlerInstance.invalidateIfNeeded(sSecondValidatedKey, "myCacheKey");
262
+ }).then(function () {
263
+ expect(oCacheManagerSpy).toHaveBeenCalledTimes(1);
264
+ oCacheManagerSpy.mockRestore();
265
+ }).catch(function () {
266
+ oCacheManagerSpy.mockRestore();
267
+ });
268
+ });
269
+ });
270
+ test("Case #2b - can deal with an ETag enhancement in a given session", function () {
271
+ var oFactory = new CacheHandlerServiceFactory();
272
+
273
+ oFakeMetaModel.getETags = function () {
274
+ return {
275
+ "myRootService": "MyETag",
276
+ "myOtherService": new Date("2019-08-31")
277
+ };
278
+ };
279
+
280
+ return oFactory.createInstance({
281
+ settings: {
282
+ metaModel: oFakeMetaModel,
283
+ component: oFakeComponent,
284
+ appComponent: oFakeAppComponent
285
+ }
286
+ }).then(function (oCacheHandlerInstance) {
287
+ var sFirstCacheKey;
288
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
289
+ sFirstCacheKey = sValidatedKey;
290
+ expect(sValidatedKey).toBeDefined(); // != null, "ValidatedKey exists");
291
+
292
+ expect(sValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); //"ValidatedKey is correct "
293
+ // Simulate model enhancement
294
+
295
+ oFakeMetaModel.getETags = function () {
296
+ return {
297
+ "myRootService": "MyETag",
298
+ "myOtherService": new Date("2019-08-31"),
299
+ "myThirdService": "Yolo"
300
+ };
301
+ };
302
+
303
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
304
+ }).then(function () {
305
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sSecondValidatedKey) {
306
+ expect(sSecondValidatedKey).toEqual(sFirstCacheKey); //"Validated Key is the same as the second validated key"
307
+ });
308
+ });
309
+ });
310
+ });
311
+ test("Case #2b + 2z - will request ETag that were added and which are now missing", function () {
312
+ var oFactory = new CacheHandlerServiceFactory();
313
+
314
+ oFakeMetaModel.getETags = function () {
315
+ return {
316
+ "myRootService": "MyETag",
317
+ "myOtherService": new Date("2019-08-31")
318
+ };
319
+ };
320
+
321
+ return oFactory.createInstance({
322
+ settings: {
323
+ metaModel: oFakeMetaModel,
324
+ component: oFakeComponent,
325
+ appComponent: oFakeAppComponent
326
+ }
327
+ }).then(function (oCacheHandlerInstance) {
328
+ var sFirstCacheKey;
329
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
330
+ sFirstCacheKey = sValidatedKey; // Simulate model enhancement
331
+
332
+ oFakeMetaModel.getETags = function () {
333
+ return {
334
+ "myRootService": "MyETag",
335
+ "myOtherService": new Date("2019-08-31"),
336
+ "myThirdService": "Yolo"
337
+ };
338
+ };
339
+
340
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
341
+ }).then(function () {
342
+ oFakeMetaModel.getETags = function () {
343
+ return {
344
+ "myRootService": "MyETag",
345
+ "myOtherService": new Date("2019-08-31")
346
+ };
347
+ };
348
+
349
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sSecondValidatedKey) {
350
+ expect(sSecondValidatedKey).not.toEqual(sFirstCacheKey); // "Validated Key is not the same as the second validated key"
351
+
352
+ expect(sSecondValidatedKey).toEqual(null); // == null, "No more cache");
353
+ });
354
+ });
355
+ });
356
+ });
357
+ test("Case #2b + 2a - will request ETag that were added and which are the same", function () {
358
+ var oFactory = new CacheHandlerServiceFactory();
359
+
360
+ var jQueryAjaxStub = function () {
361
+ var fnDoneCb;
362
+ setTimeout(function () {
363
+ fnDoneCb(null, null, {
364
+ getResponseHeader: function (param) {
365
+ if (param === "ETag") {
366
+ return "Yolo";
367
+ }
368
+ }
369
+ });
370
+ }, 100);
371
+ return {
372
+ done: function (doneCb) {
373
+ fnDoneCb = doneCb;
374
+ return {
375
+ fail: function () {}
376
+ };
377
+ }
378
+ };
379
+ };
380
+
381
+ oFakeMetaModel.getETags = function () {
382
+ return {
383
+ "myRootService": "MyETag",
384
+ "myOtherService": new Date("2019-08-31")
385
+ };
386
+ };
387
+
388
+ var origAjax = jQuery.ajax;
389
+ return oFactory.createInstance({
390
+ settings: {
391
+ metaModel: oFakeMetaModel,
392
+ component: oFakeComponent,
393
+ appComponent: oFakeAppComponent
394
+ }
395
+ }).then(function (oCacheHandlerInstance) {
396
+ var sFirstCacheKey;
397
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
398
+ sFirstCacheKey = sValidatedKey; // Simulate model enhancement
399
+
400
+ oFakeMetaModel.getETags = function () {
401
+ return {
402
+ "myRootService": "MyETag",
403
+ "myOtherService": new Date("2019-08-31"),
404
+ "myThirdService": "Yolo"
405
+ };
406
+ };
407
+
408
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
409
+ }).then(function () {
410
+ oFakeMetaModel.getETags = function () {
411
+ return {
412
+ "myRootService": "MyETag",
413
+ "myOtherService": new Date("2019-08-31")
414
+ };
415
+ }; // @ts-ignore
416
+
417
+
418
+ jQuery.ajax = jQueryAjaxStub;
419
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey");
420
+ }).then(function (sSecondValidatedKey) {
421
+ expect(sSecondValidatedKey).toEqual(sFirstCacheKey); // "Validated Key is the same as the second validated key " + sSecondValidatedKey
422
+
423
+ jQuery.ajax = origAjax;
424
+ }).catch(function () {
425
+ jQuery.ajax = origAjax;
426
+ });
427
+ });
428
+ });
429
+ test("Case #2b + 2a - will request ETag that were added and which are the same - Date version", function () {
430
+ var oFactory = new CacheHandlerServiceFactory();
431
+
432
+ var jQueryAjaxStub = function () {
433
+ var fnDoneCb;
434
+ setTimeout(function () {
435
+ fnDoneCb(null, null, {
436
+ getResponseHeader: function (param) {
437
+ if (param === "Last-Modified") {
438
+ return "2019-08-29T00:00:00.000Z";
439
+ }
440
+ }
441
+ });
442
+ }, 100);
443
+ return {
444
+ done: function (doneCb) {
445
+ fnDoneCb = doneCb;
446
+ return {
447
+ fail: function () {}
448
+ };
449
+ }
450
+ };
451
+ };
452
+
453
+ oFakeMetaModel.getETags = function () {
454
+ return {
455
+ "myRootService": "MyETag",
456
+ "myOtherService": new Date("2019-08-31")
457
+ };
458
+ };
459
+
460
+ var origAjax = jQuery.ajax;
461
+ return oFactory.createInstance({
462
+ settings: {
463
+ metaModel: oFakeMetaModel,
464
+ component: oFakeComponent,
465
+ appComponent: oFakeAppComponent
466
+ }
467
+ }).then(function (oCacheHandlerInstance) {
468
+ var sFirstCacheKey;
469
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
470
+ sFirstCacheKey = sValidatedKey; // Simulate model enhancement
471
+
472
+ oFakeMetaModel.getETags = function () {
473
+ return {
474
+ "myRootService": "MyETag",
475
+ "myOtherService": new Date("2019-08-31"),
476
+ "myThirdService": new Date("2019-08-29")
477
+ };
478
+ };
479
+
480
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
481
+ }).then(function () {
482
+ oFakeMetaModel.getETags = function () {
483
+ return {
484
+ "myRootService": "MyETag",
485
+ "myOtherService": new Date("2019-08-31")
486
+ };
487
+ }; // @ts-ignore
488
+
489
+
490
+ jQuery.ajax = jQueryAjaxStub;
491
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey");
492
+ }).then(function (sSecondValidatedKey) {
493
+ expect(sSecondValidatedKey).toEqual(sFirstCacheKey); //"Validated Key is the same as the second validated key " + sSecondValidatedKey
494
+
495
+ jQuery.ajax = origAjax;
496
+ }).catch(function () {
497
+ jQuery.ajax = origAjax;
498
+ });
499
+ });
500
+ });
501
+ test("Case #2b + 2d - will request ETag that were added and which are different", function () {
502
+ var oFactory = new CacheHandlerServiceFactory();
503
+
504
+ var jQueryAjaxStub = function () {
505
+ var fnDoneCb;
506
+ setTimeout(function () {
507
+ fnDoneCb(null, null, {
508
+ getResponseHeader: function (param) {
509
+ if (param === "ETag") {
510
+ return "NotYolo";
511
+ }
512
+ }
513
+ });
514
+ }, 100);
515
+ return {
516
+ done: function (doneCb) {
517
+ fnDoneCb = doneCb;
518
+ return {
519
+ fail: function () {}
520
+ };
521
+ }
522
+ };
523
+ };
524
+
525
+ oFakeMetaModel.getETags = function () {
526
+ return {
527
+ "myRootService": "MyETag",
528
+ "myOtherService": new Date("2019-08-31")
529
+ };
530
+ };
531
+
532
+ var origAjax = jQuery.ajax;
533
+ return oFactory.createInstance({
534
+ settings: {
535
+ metaModel: oFakeMetaModel,
536
+ component: oFakeComponent,
537
+ appComponent: oFakeAppComponent
538
+ }
539
+ }).then(function (oCacheHandlerInstance) {
540
+ var sFirstCacheKey;
541
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
542
+ sFirstCacheKey = sValidatedKey; // Simulate model enhancement
543
+
544
+ oFakeMetaModel.getETags = function () {
545
+ return {
546
+ "myRootService": "MyETag",
547
+ "myOtherService": new Date("2019-08-31"),
548
+ "myThirdService": "Yolo"
549
+ };
550
+ };
551
+
552
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
553
+ }).then(function () {
554
+ oFakeMetaModel.getETags = function () {
555
+ return {
556
+ "myRootService": "MyETag",
557
+ "myOtherService": new Date("2019-08-31")
558
+ };
559
+ }; // @ts-ignore
560
+
561
+
562
+ jQuery.ajax = jQueryAjaxStub;
563
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey");
564
+ }).then(function (sSecondValidatedKey) {
565
+ expect(sSecondValidatedKey).not.toEqual(sFirstCacheKey); //"Validated Key is the same as the second validated key " + sSecondValidatedKey
566
+
567
+ expect(sSecondValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414,"myThirdService":"NotYolo"}'); //"Validated Key is correct"
568
+
569
+ jQuery.ajax = origAjax;
570
+ }).catch(function (fDone) {
571
+ jQuery.ajax = origAjax;
572
+ });
573
+ });
574
+ });
575
+ test("Case #2b + 2d - will request ETag that were added and which are different - Date version", function () {
576
+ var oFactory = new CacheHandlerServiceFactory();
577
+
578
+ var jQueryAjaxStub = function () {
579
+ var fnDoneCb;
580
+ setTimeout(function () {
581
+ fnDoneCb(null, null, {
582
+ getResponseHeader: function (param) {
583
+ if (param === "Last-Modified") {
584
+ return "2019-08-28T00:00:00.000Z";
585
+ }
586
+ }
587
+ });
588
+ }, 100);
589
+ return {
590
+ done: function (doneCb) {
591
+ fnDoneCb = doneCb;
592
+ return {
593
+ fail: function () {}
594
+ };
595
+ }
596
+ };
597
+ };
598
+
599
+ oFakeMetaModel.getETags = function () {
600
+ return {
601
+ "myRootService": "MyETag",
602
+ "myOtherService": new Date("2019-08-31")
603
+ };
604
+ };
605
+
606
+ var origAjax = jQuery.ajax;
607
+ oFactory.createInstance({
608
+ settings: {
609
+ metaModel: oFakeMetaModel,
610
+ component: oFakeComponent,
611
+ appComponent: oFakeAppComponent
612
+ }
613
+ }).then(function (oCacheHandlerInstance) {
614
+ var sFirstCacheKey;
615
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
616
+ sFirstCacheKey = sValidatedKey; // Simulate model enhancement
617
+
618
+ oFakeMetaModel.getETags = function () {
619
+ return {
620
+ "myRootService": "MyETag",
621
+ "myOtherService": new Date("2019-08-31"),
622
+ "myThirdService": new Date("2019-08-29")
623
+ };
624
+ };
625
+
626
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
627
+ }).then(function () {
628
+ oFakeMetaModel.getETags = function () {
629
+ return {
630
+ "myRootService": "MyETag",
631
+ "myOtherService": new Date("2019-08-31")
632
+ };
633
+ }; // @ts-ignore
634
+
635
+
636
+ jQuery.ajax = jQueryAjaxStub;
637
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey");
638
+ }).then(function (sSecondValidatedKey) {
639
+ expect(sSecondValidatedKey).not.toEqual(sFirstCacheKey); //"Validated Key is the same as the second validated key " + sSecondValidatedKey
640
+
641
+ expect(sSecondValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414,"myThirdService":"2019-08-28T00:00:00.000Z"}'); //"Validated Key is correct"
642
+
643
+ jQuery.ajax = origAjax;
644
+ }).catch(function (fDone) {
645
+ jQuery.ajax = origAjax;
646
+ });
647
+ });
648
+ });
649
+ test("Case #2c - can deal with an ETag change", function () {
650
+ var oFactory = new CacheHandlerServiceFactory();
651
+
652
+ oFakeMetaModel.getETags = function () {
653
+ return {
654
+ "myRootService": "MyETag",
655
+ "myOtherService": new Date("2019-08-31")
656
+ };
657
+ };
658
+
659
+ oFactory.createInstance({
660
+ settings: {
661
+ metaModel: oFakeMetaModel,
662
+ component: oFakeComponent,
663
+ appComponent: oFakeAppComponent
664
+ }
665
+ }).then(function (oCacheHandlerInstance) {
666
+ var sFirstCacheKey;
667
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
668
+ sFirstCacheKey = sValidatedKey;
669
+ expect(sValidatedKey).toBeDefined(); // != null, "ValidatedKey exists");
670
+
671
+ expect(sValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); //"ValidatedKey is correct "
672
+
673
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
674
+ }).then(function () {
675
+ // Simulate ETag change
676
+ oFakeMetaModel.getETags = function () {
677
+ return {
678
+ "myRootService": "NotMyETag",
679
+ "myOtherService": new Date("2019-08-31")
680
+ };
681
+ };
682
+
683
+ oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sSecondValidatedKey) {
684
+ expect(sSecondValidatedKey).not.toEqual(sFirstCacheKey); // "Validated Key is the not the same as the second validated key"
685
+
686
+ expect(sSecondValidatedKey).toEqual('{"myRootService":"NotMyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); //"ValidatedKey is correct "
687
+ });
688
+ });
689
+ });
690
+ });
691
+ test("Case #2d - can deal with an ETag enhancement and a change", function () {
692
+ var oFactory = new CacheHandlerServiceFactory();
693
+
694
+ oFakeMetaModel.getETags = function () {
695
+ return {
696
+ "myRootService": "MyETag",
697
+ "myOtherService": new Date("2019-08-31")
698
+ };
699
+ };
700
+
701
+ return oFactory.createInstance({
702
+ settings: {
703
+ metaModel: oFakeMetaModel,
704
+ component: oFakeComponent,
705
+ appComponent: oFakeAppComponent
706
+ }
707
+ }).then(function (oCacheHandlerInstance) {
708
+ var sFirstCacheKey;
709
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
710
+ sFirstCacheKey = sValidatedKey;
711
+ expect(sValidatedKey).toBeDefined(); // != null, "ValidatedKey exists");
712
+
713
+ expect(sValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); //"ValidatedKey is correct "
714
+ // Simulate model enhancement
715
+
716
+ oFakeMetaModel.getETags = function () {
717
+ return {
718
+ "myRootService": "MyETag",
719
+ "myOtherService": new Date("2019-08-31"),
720
+ "myThirdService": "Yolo"
721
+ };
722
+ };
723
+
724
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
725
+ }).then(function () {
726
+ oFakeMetaModel.getETags = function () {
727
+ return {
728
+ "myRootService": "MyETag",
729
+ "myOtherService": new Date("2019-08-30"),
730
+ "myThirdService": "Yolo"
731
+ };
732
+ };
733
+
734
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sSecondValidatedKey) {
735
+ expect(sSecondValidatedKey).not.toEqual(sFirstCacheKey); //"Validated Key is not the same as the second validated key"
736
+
737
+ expect(sSecondValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-30T00:00:00.000Z","myThirdService":"Yolo","manifest":-1335850414}'); //"ValidatedKey is correct " + sSecondValidatedKe
738
+ });
739
+ });
740
+ });
741
+ });
742
+ test("Case #2z - can deal with an invalid ETag enhancement", function () {
743
+ var oFactory = new CacheHandlerServiceFactory();
744
+
745
+ oFakeMetaModel.getETags = function () {
746
+ return {
747
+ "myRootService": "MyETag",
748
+ "myOtherService": new Date("2019-08-31")
749
+ };
750
+ };
751
+
752
+ oFactory.createInstance({
753
+ settings: {
754
+ metaModel: oFakeMetaModel,
755
+ component: oFakeComponent,
756
+ appComponent: oFakeAppComponent
757
+ }
758
+ }).then(function (oCacheHandlerInstance) {
759
+ var sFirstCacheKey;
760
+ oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
761
+ sFirstCacheKey = sValidatedKey;
762
+ expect(sValidatedKey).toBeDefined(); // != null, "ValidatedKey exists");
763
+
764
+ expect(sValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); //"ValidatedKey is correct "
765
+ // Simulate model enhancement
766
+
767
+ oFakeMetaModel.getETags = function () {
768
+ return {
769
+ "myRootService": "MyETag",
770
+ "myOtherService": new Date("2019-08-31"),
771
+ "myThirdService": null
772
+ };
773
+ };
774
+
775
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
776
+ }).then(function () {
777
+ oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sSecondValidatedKey) {
778
+ expect(sSecondValidatedKey).not.toEqual(sFirstCacheKey); // "Validated Key is not the same as the second validated key"
779
+
780
+ expect(sSecondValidatedKey).toEqual(null); //, "ValidatedKey is null since it doesn't have an ETag");
781
+ });
782
+ });
783
+ });
784
+ });
785
+ test("Case #xx - can deal with an error thrown while validating the cache", function () {
786
+ var oFactory = new CacheHandlerServiceFactory();
787
+
788
+ oFakeMetaModel.getETags = function () {
789
+ return {
790
+ "myRootService": "MyETag",
791
+ "myOtherService": new Date("2019-08-31")
792
+ };
793
+ };
794
+
795
+ oFactory.createInstance({
796
+ settings: {
797
+ metaModel: oFakeMetaModel,
798
+ component: oFakeComponent,
799
+ appComponent: oFakeAppComponent
800
+ }
801
+ }).then(function (oCacheHandlerInstance) {
802
+ var sFirstCacheKey;
803
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
804
+ sFirstCacheKey = sValidatedKey;
805
+ expect(sValidatedKey).toBeDefined(); // != null, "ValidatedKey exists");
806
+
807
+ expect(sValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); //"ValidatedKey is correct "
808
+
809
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
810
+ }).then(function () {
811
+ // Simulate error
812
+ oFakeMetaModel.getETags = function () {
813
+ throw new Error("nope");
814
+ };
815
+
816
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sSecondValidatedKey) {
817
+ expect(sSecondValidatedKey).not.toEqual(sFirstCacheKey); // "Validated Key is not the same as the second validated key"
818
+
819
+ expect(sSecondValidatedKey).toEqual(null); //, "ValidatedKey is null since it doesn't have an ETag");
820
+ });
821
+ });
822
+ });
823
+ });
824
+ test("Case #3 - can deal with a Manifest change", function () {
825
+ var oFactory = new CacheHandlerServiceFactory();
826
+
827
+ oFakeMetaModel.getETags = function () {
828
+ return {
829
+ "myRootService": "MyETag",
830
+ "myOtherService": new Date("2019-08-31")
831
+ };
832
+ };
833
+
834
+ return oFactory.createInstance({
835
+ settings: {
836
+ metaModel: oFakeMetaModel,
837
+ component: oFakeComponent,
838
+ appComponent: oFakeAppComponent
839
+ }
840
+ }).then(function (oCacheHandlerInstance) {
841
+ var sFirstCacheKey;
842
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sValidatedKey) {
843
+ sFirstCacheKey = sValidatedKey;
844
+ expect(sValidatedKey).toBeDefined(); //null, "ValidatedKey exists");
845
+
846
+ expect(sValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1335850414}'); //"ValidatedKey is correct "
847
+
848
+ return oCacheHandlerInstance.invalidateIfNeeded(sValidatedKey, "myCacheKey");
849
+ }).then(function () {
850
+ // Simulate Manifest Change
851
+ oFakeAppComponent.getManifest = function () {
852
+ return {
853
+ "sap.app": {
854
+ dummySetting: "Changed"
855
+ }
856
+ };
857
+ };
858
+
859
+ return oCacheHandlerInstance.validateCacheKey("myCacheKey").then(function (sSecondValidatedKey) {
860
+ expect(sSecondValidatedKey).not.toEqual(sFirstCacheKey); //"Validated Key is the not the same as the second validated key"
861
+
862
+ expect(sSecondValidatedKey).toEqual('{"myRootService":"MyETag","myOtherService":"2019-08-31T00:00:00.000Z","manifest":-1956011802}'); //"ValidatedKey is correct "
863
+ });
864
+ });
865
+ });
866
+ }); //}
867
+ });
868
+ });
869
+ });
870
+ }, false);
871
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNhY2hlSGFuZGxlclRlc3Quc3BlYy50cyJdLCJuYW1lcyI6WyJEZXZpY2UiLCJicm93c2VyIiwibmFtZSIsInZlcnNpb24iLCJkZXNjcmliZSIsIm9GYWtlTWV0YU1vZGVsIiwiZmV0Y2hFbnRpdHlDb250YWluZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsImdldElkIiwib0Zha2VDb21wb25lbnQiLCJnZXRWaWV3RGF0YSIsImR1bW15U2V0dGluZyIsIm9GYWtlQXBwQ29tcG9uZW50IiwiZ2V0TWFuaWZlc3QiLCJ0ZXN0IiwiZXhwZWN0IiwiQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkiLCJub3QiLCJ0b0VxdWFsIiwib1Rlc3RGYWN0b3J5Iiwib0ZhY3RvcnkiLCJiZWZvcmVFYWNoIiwiY3JlYXRlRm4iLCJjcmVhdGVJbnN0YW5jZSIsInNldHRpbmdzIiwidG9UaHJvdyIsIm9PcmlnaW5GbiIsInJlamVjdCIsIm9JbnN0YW5jZSIsIm1ldGFNb2RlbCIsImNvbXBvbmVudCIsImFwcENvbXBvbmVudCIsInRvQmVEZWZpbmVkIiwidGhlbiIsIm9JbnN0YW5jZUxvYWRlZCIsInRvQmUiLCJjYXRjaCIsImUiLCJvQ3VycmVudEluc3RhbmNlIiwic0Zha2VNZXRhTW9kZWxJZCIsIm9GZXRjaEVudGl0eUNvbnRhaW5lclNweSIsImplc3QiLCJzcHlPbiIsIl9vSW5zdGFuY2VSZWdpc3RyeSIsInVuZGVmaW5lZCIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIm9OZXdJbnN0YW5jZSIsIm9OZXdJbnN0YW5jZUxvYWRlZCIsImdldEluc3RhbmNlIiwib0dsb2JhbEluc3RhbmNlIiwiZXhpdCIsIm9UaGlyZEluc3RhbmNlTG9hZGVkIiwiQ2FjaGUiLCJkZWwiLCJnZXRFVGFncyIsIm9DYWNoZUhhbmRsZXJJbnN0YW5jZSIsInZhbGlkYXRlQ2FjaGVLZXkiLCJzVmFsaWRhdGVkS2V5IiwiRGF0ZSIsIm9DYWNoZU1hbmFnZXJTcHkiLCJzRmlyc3RDYWNoZUtleSIsInRvSGF2ZUJlZW5DYWxsZWQiLCJpbnZhbGlkYXRlSWZOZWVkZWQiLCJzU2Vjb25kVmFsaWRhdGVkS2V5IiwibW9ja1Jlc3RvcmUiLCJqUXVlcnlBamF4U3R1YiIsImZuRG9uZUNiIiwic2V0VGltZW91dCIsImdldFJlc3BvbnNlSGVhZGVyIiwicGFyYW0iLCJkb25lIiwiZG9uZUNiIiwiZmFpbCIsIm9yaWdBamF4IiwialF1ZXJ5IiwiYWpheCIsImZEb25lIiwiRXJyb3IiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFDQTtBQUNDQSxFQUFBQSxNQUFELENBQWdCQyxPQUFoQixDQUF3QkMsSUFBeEIsR0FBK0IsSUFBL0I7QUFDQ0YsRUFBQUEsTUFBRCxDQUFnQkMsT0FBaEIsQ0FBd0JFLE9BQXhCLEdBQWtDLEVBQWxDO0FBRUFDLEVBQUFBLFFBQVEsQ0FBQyxxQkFBRCxFQUF3QixZQUFNO0FBQ3JDLFFBQU1DLGNBQW1CLEdBQUc7QUFDM0JDLE1BQUFBLG9CQUFvQixFQUFFLFlBQVc7QUFDaEMsZUFBT0MsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDQSxPQUgwQjtBQUkzQkMsTUFBQUEsS0FBSyxFQUFFLFlBQVc7QUFDakIsZUFBTyxhQUFQO0FBQ0E7QUFOMEIsS0FBNUI7QUFRQSxRQUFNQyxjQUFjLEdBQUc7QUFDdEJDLE1BQUFBLFdBQVcsRUFBRSxZQUFXO0FBQ3ZCLGVBQU87QUFBRUMsVUFBQUEsWUFBWSxFQUFFO0FBQWhCLFNBQVA7QUFDQTtBQUhxQixLQUF2QjtBQUtBLFFBQU1DLGlCQUFpQixHQUFHO0FBQ3pCQyxNQUFBQSxXQUFXLEVBQUUsWUFBVztBQUN2QixlQUFPO0FBQ04scUJBQVc7QUFBRUYsWUFBQUEsWUFBWSxFQUFFO0FBQWhCO0FBREwsU0FBUDtBQUdBO0FBTHdCLEtBQTFCO0FBUUFHLElBQUFBLElBQUksQ0FBQyxvQkFBRCxFQUF1QixZQUFXO0FBQ3JDQyxNQUFBQSxNQUFNLENBQUNDLDBCQUFELENBQU4sQ0FBbUNDLEdBQW5DLENBQXVDQyxPQUF2QyxDQUErQyxJQUEvQyxFQURxQyxDQUNpQjs7QUFDdEQsVUFBTUMsWUFBWSxHQUFHLElBQUlILDBCQUFKLEVBQXJCO0FBQ0FELE1BQUFBLE1BQU0sQ0FBQ0ksWUFBRCxDQUFOLENBQXFCRixHQUFyQixDQUF5QkMsT0FBekIsQ0FBaUMsSUFBakM7QUFDQSxLQUpHLENBQUo7QUFNQSxRQUFJRSxRQUFKO0FBQ0FqQixJQUFBQSxRQUFRLENBQUMsZ0NBQUQsRUFBbUMsWUFBTTtBQUNoRGtCLE1BQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2hCRCxRQUFBQSxRQUFRLEdBQUcsSUFBSUosMEJBQUosRUFBWDtBQUNBLE9BRlMsQ0FBVjtBQUlBRixNQUFBQSxJQUFJLENBQUMsMkNBQUQsRUFBOEMsWUFBVztBQUM1RCxZQUFNUSxRQUFRLEdBQUc7QUFBQSxpQkFBTUYsUUFBUSxDQUFDRyxjQUFULENBQXdCO0FBQUVDLFlBQUFBLFFBQVEsRUFBRTtBQUFaLFdBQXhCLENBQU47QUFBQSxTQUFqQjs7QUFDQVQsUUFBQUEsTUFBTSxDQUFDTyxRQUFELENBQU4sQ0FBaUJHLE9BQWpCO0FBQ0EsT0FIRyxDQUFKO0FBS0FYLE1BQUFBLElBQUksQ0FBQyxnREFBRCxFQUFtRCxZQUFXO0FBQ2pFLFlBQUk7QUFDSCxjQUFNWSxTQUFTLEdBQUd0QixjQUFjLENBQUNDLG9CQUFqQzs7QUFDQUQsVUFBQUEsY0FBYyxDQUFDQyxvQkFBZixHQUFzQyxZQUFXO0FBQ2hELG1CQUFPQyxPQUFPLENBQUNxQixNQUFSLENBQWUsTUFBZixDQUFQO0FBQ0EsV0FGRDs7QUFHQSxjQUFNQyxTQUFTLEdBQUdSLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QjtBQUN6Q0MsWUFBQUEsUUFBUSxFQUFFO0FBQUVLLGNBQUFBLFNBQVMsRUFBRXpCLGNBQWI7QUFBNkIwQixjQUFBQSxTQUFTLEVBQUVyQixjQUF4QztBQUF3RHNCLGNBQUFBLFlBQVksRUFBRW5CO0FBQXRFO0FBRCtCLFdBQXhCLENBQWxCO0FBR0FHLFVBQUFBLE1BQU0sQ0FBQ2EsU0FBRCxDQUFOLENBQWtCSSxXQUFsQjtBQUNBLGlCQUFPSixTQUFTLENBQ2RLLElBREssQ0FDQSxVQUFTQyxlQUFULEVBQTBCO0FBQy9CbkIsWUFBQUEsTUFBTSxDQUFDLElBQUQsQ0FBTixDQUFhb0IsSUFBYixDQUFrQixLQUFsQjtBQUNBLFdBSEssRUFJTEMsS0FKSyxDQUlDLFlBQVc7QUFDakJoQyxZQUFBQSxjQUFjLENBQUNDLG9CQUFmLEdBQXNDcUIsU0FBdEM7QUFDQSxXQU5LLENBQVA7QUFPQSxTQWhCRCxDQWdCRSxPQUFPVyxDQUFQLEVBQVU7QUFDWHRCLFVBQUFBLE1BQU0sQ0FBQyxJQUFELENBQU4sQ0FBYW9CLElBQWIsQ0FBa0IsS0FBbEI7QUFDQTtBQUNELE9BcEJHLENBQUo7QUFzQkFyQixNQUFBQSxJQUFJLENBQUMscUNBQUQsRUFBd0MsWUFBVztBQUN0RCxZQUFJd0IsZ0JBQUo7QUFDQSxZQUFNQyxnQkFBZ0IsR0FBR25DLGNBQWMsQ0FBQ0ksS0FBZixFQUF6QjtBQUNBLFlBQU1nQyx3QkFBd0IsR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVd0QyxjQUFYLEVBQTJCLHNCQUEzQixDQUFqQztBQUNBVyxRQUFBQSxNQUFNLENBQUNLLFFBQVEsQ0FBQ3VCLGtCQUFULENBQTRCSixnQkFBNUIsQ0FBRCxDQUFOLENBQXNESixJQUF0RCxDQUEyRFMsU0FBM0QsRUFKc0QsQ0FJaUI7O0FBRXZFLFlBQU1oQixTQUFTLEdBQUdSLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QjtBQUN6Q0MsVUFBQUEsUUFBUSxFQUFFO0FBQUVLLFlBQUFBLFNBQVMsRUFBRXpCLGNBQWI7QUFBNkIwQixZQUFBQSxTQUFTLEVBQUVyQixjQUF4QztBQUF3RHNCLFlBQUFBLFlBQVksRUFBRW5CO0FBQXRFO0FBRCtCLFNBQXhCLENBQWxCO0FBR0FHLFFBQUFBLE1BQU0sQ0FBQ2EsU0FBRCxDQUFOLENBQWtCSSxXQUFsQixHQVRzRCxDQVNyQjs7QUFDakNqQixRQUFBQSxNQUFNLENBQUN5Qix3QkFBRCxDQUFOLENBQWlDSyxxQkFBakMsQ0FBdUQsQ0FBdkQ7QUFFQSxlQUFPakIsU0FBUyxDQUNkSyxJQURLLENBQ0EsVUFBU0MsZUFBVCxFQUEwQjtBQUMvQkksVUFBQUEsZ0JBQWdCLEdBQUdKLGVBQW5CO0FBQ0FuQixVQUFBQSxNQUFNLENBQUNtQixlQUFELENBQU4sQ0FBd0JGLFdBQXhCLEdBRitCLENBRVE7O0FBQ3ZDakIsVUFBQUEsTUFBTSxDQUFDSyxRQUFRLENBQUN1QixrQkFBVCxDQUE0QkosZ0JBQTVCLENBQUQsQ0FBTixDQUFzRFAsV0FBdEQsR0FIK0IsQ0FHc0M7O0FBQ3JFLGNBQU1jLFlBQVksR0FBRzFCLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QjtBQUM1Q0MsWUFBQUEsUUFBUSxFQUFFO0FBQ1RLLGNBQUFBLFNBQVMsRUFBRXpCLGNBREY7QUFFVDBCLGNBQUFBLFNBQVMsRUFBRXJCLGNBRkY7QUFHVHNCLGNBQUFBLFlBQVksRUFBRW5CO0FBSEw7QUFEa0MsV0FBeEIsQ0FBckIsQ0FKK0IsQ0FXL0I7O0FBQ0FHLFVBQUFBLE1BQU0sQ0FBQ3lCLHdCQUFELENBQU4sQ0FBaUNLLHFCQUFqQyxDQUF1RCxDQUF2RDtBQUNBLGlCQUFPQyxZQUFQO0FBQ0EsU0FmSyxFQWdCTGIsSUFoQkssQ0FnQkEsVUFBU2Msa0JBQVQsRUFBNkI7QUFDbENoQyxVQUFBQSxNQUFNLENBQUNnQyxrQkFBRCxDQUFOLENBQTJCN0IsT0FBM0IsQ0FBbUNvQixnQkFBbkMsRUFEa0MsQ0FDb0I7O0FBQ3RELGlCQUFPbEIsUUFBUSxDQUFDNEIsV0FBVCxDQUFxQjVDLGNBQXJCLENBQVA7QUFDQSxTQW5CSyxFQW9CTDZCLElBcEJLLENBb0JBLFVBQVNnQixlQUFULEVBQTBCO0FBQy9CbEMsVUFBQUEsTUFBTSxDQUFDdUIsZ0JBQUQsQ0FBTixDQUF5QnBCLE9BQXpCLENBQWlDK0IsZUFBakMsRUFEK0IsQ0FDb0I7O0FBQ25EWCxVQUFBQSxnQkFBZ0IsQ0FBQ1ksSUFBakI7QUFDQW5DLFVBQUFBLE1BQU0sQ0FBQ0ssUUFBUSxDQUFDdUIsa0JBQVQsQ0FBNEJKLGdCQUE1QixDQUFELENBQU4sQ0FBc0RyQixPQUF0RCxDQUE4RCxJQUE5RCxFQUgrQixDQUdzQzs7QUFDckUsaUJBQU9FLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QjtBQUM5QkMsWUFBQUEsUUFBUSxFQUFFO0FBQ1RLLGNBQUFBLFNBQVMsRUFBRXpCLGNBREY7QUFFVDBCLGNBQUFBLFNBQVMsRUFBRXJCLGNBRkY7QUFHVHNCLGNBQUFBLFlBQVksRUFBRW5CO0FBSEw7QUFEb0IsV0FBeEIsQ0FBUDtBQU9BLFNBL0JLLEVBZ0NMcUIsSUFoQ0ssQ0FnQ0EsVUFBU2tCLG9CQUFULEVBQStCO0FBQ3BDcEMsVUFBQUEsTUFBTSxDQUFDb0Msb0JBQUQsQ0FBTixDQUE2Qm5CLFdBQTdCLEdBRG9DLENBQ1E7QUFDNUMsU0FsQ0ssQ0FBUDtBQW1DQSxPQS9DRyxDQUFKO0FBaURBN0IsTUFBQUEsUUFBUSxDQUFDLHFCQUFELEVBQXdCLFlBQU07QUFDckNrQixRQUFBQSxVQUFVLENBQUMsWUFBTTtBQUNoQixpQkFBTytCLEtBQUssQ0FBQ0MsR0FBTixDQUFVLFlBQVYsQ0FBUDtBQUNBLFNBRlMsQ0FBVjtBQUlBdkMsUUFBQUEsSUFBSSxDQUFDLDBDQUFELEVBQTZDLFlBQVc7QUFDM0QsY0FBTU0sUUFBUSxHQUFHLElBQUlKLDBCQUFKLEVBQWpCOztBQUNBWixVQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsbUJBQU87QUFDTiwrQkFBaUI7QUFEWCxhQUFQO0FBR0EsV0FKRDs7QUFNQSxpQkFBT2xDLFFBQVEsQ0FDYkcsY0FESyxDQUNVO0FBQ2ZDLFlBQUFBLFFBQVEsRUFBRTtBQUNUSyxjQUFBQSxTQUFTLEVBQUV6QixjQURGO0FBRVQwQixjQUFBQSxTQUFTLEVBQUVyQixjQUZGO0FBR1RzQixjQUFBQSxZQUFZLEVBQUVuQjtBQUhMO0FBREssV0FEVixFQVFMcUIsSUFSSyxDQVFBLFVBQVNzQixxQkFBVCxFQUFnQztBQUNyQ0EsWUFBQUEscUJBQXFCLENBQUNDLGdCQUF0QixDQUF1QyxZQUF2QyxFQUFxRHZCLElBQXJELENBQTBELFVBQVN3QixhQUFULEVBQXdCO0FBQ2pGMUMsY0FBQUEsTUFBTSxDQUFDMEMsYUFBRCxDQUFOLENBQXNCekIsV0FBdEIsR0FEaUYsQ0FDNUM7O0FBQ3JDakIsY0FBQUEsTUFBTSxDQUFDMEMsYUFBRCxDQUFOLENBQXNCdkMsT0FBdEIsQ0FBOEIsbURBQTlCLEVBRmlGLENBRUc7QUFDcEYsYUFIRDtBQUlBLFdBYkssQ0FBUDtBQWNBLFNBdEJHLENBQUo7QUF3QkFKLFFBQUFBLElBQUksQ0FBQyxnREFBRCxFQUFtRCxZQUFXO0FBQ2pFLGNBQU1NLFFBQVEsR0FBRyxJQUFJSiwwQkFBSixFQUFqQjs7QUFDQVosVUFBQUEsY0FBYyxDQUFDa0QsUUFBZixHQUEwQixZQUFXO0FBQ3BDLG1CQUFPO0FBQ04sK0JBQWlCLElBQUlJLElBQUosQ0FBUyxZQUFUO0FBRFgsYUFBUDtBQUdBLFdBSkQ7O0FBS0EsaUJBQU90QyxRQUFRLENBQ2JHLGNBREssQ0FDVTtBQUNmQyxZQUFBQSxRQUFRLEVBQUU7QUFDVEssY0FBQUEsU0FBUyxFQUFFekIsY0FERjtBQUVUMEIsY0FBQUEsU0FBUyxFQUFFckIsY0FGRjtBQUdUc0IsY0FBQUEsWUFBWSxFQUFFbkI7QUFITDtBQURLLFdBRFYsRUFRTHFCLElBUkssQ0FRQSxVQUFTc0IscUJBQVQsRUFBZ0M7QUFDckNBLFlBQUFBLHFCQUFxQixDQUFDQyxnQkFBdEIsQ0FBdUMsWUFBdkMsRUFBcUR2QixJQUFyRCxDQUEwRCxVQUFTd0IsYUFBVCxFQUF3QjtBQUNqRjFDLGNBQUFBLE1BQU0sQ0FBQzBDLGFBQUQsQ0FBTixDQUFzQnpCLFdBQXRCLEdBRGlGLENBQzVDOztBQUNyQ2pCLGNBQUFBLE1BQU0sQ0FBQzBDLGFBQUQsQ0FBTixDQUFzQnZDLE9BQXRCLENBQThCLHFFQUE5QixFQUZpRixDQUVxQjtBQUN0RyxhQUhEO0FBSUEsV0FiSyxDQUFQO0FBY0EsU0FyQkcsQ0FBSjtBQXVCQUosUUFBQUEsSUFBSSxDQUFDLG9FQUFELEVBQXVFLFlBQVc7QUFDckYsY0FBTU0sUUFBUSxHQUFHLElBQUlKLDBCQUFKLEVBQWpCOztBQUNBWixVQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsbUJBQU87QUFDTiwrQkFBaUI7QUFEWCxhQUFQO0FBR0EsV0FKRDs7QUFLQSxpQkFBT2xDLFFBQVEsQ0FDYkcsY0FESyxDQUNVO0FBQ2ZDLFlBQUFBLFFBQVEsRUFBRTtBQUNUSyxjQUFBQSxTQUFTLEVBQUV6QixjQURGO0FBRVQwQixjQUFBQSxTQUFTLEVBQUVyQixjQUZGO0FBR1RzQixjQUFBQSxZQUFZLEVBQUVuQjtBQUhMO0FBREssV0FEVixFQVFMcUIsSUFSSyxDQVFBLFVBQVNzQixxQkFBVCxFQUFnQztBQUNyQyxtQkFBT0EscUJBQXFCLENBQUNDLGdCQUF0QixDQUF1QyxZQUF2QyxFQUFxRHZCLElBQXJELENBQTBELFVBQVN3QixhQUFULEVBQXdCO0FBQ3hGMUMsY0FBQUEsTUFBTSxDQUFDMEMsYUFBRCxDQUFOLENBQXNCdkMsT0FBdEIsQ0FBOEIsSUFBOUIsRUFEd0YsQ0FDbkQ7QUFDckMsYUFGTSxDQUFQO0FBR0EsV0FaSyxDQUFQO0FBYUEsU0FwQkcsQ0FBSjtBQXNCQUosUUFBQUEsSUFBSSxDQUFDLDhFQUFELEVBQWlGLFlBQVc7QUFDL0YsY0FBTU0sUUFBUSxHQUFHLElBQUlKLDBCQUFKLEVBQWpCOztBQUNBWixVQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsbUJBQU87QUFDTiwrQkFBaUIsUUFEWDtBQUVOLGdDQUFrQjtBQUZaLGFBQVA7QUFJQSxXQUxEOztBQU1BLGlCQUFPbEMsUUFBUSxDQUNiRyxjQURLLENBQ1U7QUFDZkMsWUFBQUEsUUFBUSxFQUFFO0FBQ1RLLGNBQUFBLFNBQVMsRUFBRXpCLGNBREY7QUFFVDBCLGNBQUFBLFNBQVMsRUFBRXJCLGNBRkY7QUFHVHNCLGNBQUFBLFlBQVksRUFBRW5CO0FBSEw7QUFESyxXQURWLEVBUUxxQixJQVJLLENBUUEsVUFBU3NCLHFCQUFULEVBQWdDO0FBQ3JDQSxZQUFBQSxxQkFBcUIsQ0FBQ0MsZ0JBQXRCLENBQXVDLFlBQXZDLEVBQXFEdkIsSUFBckQsQ0FBMEQsVUFBU3dCLGFBQVQsRUFBd0I7QUFDakYxQyxjQUFBQSxNQUFNLENBQUMwQyxhQUFELENBQU4sQ0FBc0J2QyxPQUF0QixDQUE4QixJQUE5QixFQURpRixDQUM1QztBQUNyQyxhQUZEO0FBR0EsV0FaSyxDQUFQO0FBYUEsU0FyQkcsQ0FBSixDQTFFcUMsQ0FpR3JDOztBQUNBSixRQUFBQSxJQUFJLENBQUMsd0ZBQUQsRUFBMkYsWUFBVztBQUN6RyxjQUFNNkMsZ0JBQWdCLEdBQUdsQixJQUFJLENBQUNDLEtBQUwsQ0FBV1UsS0FBWCxFQUFrQixLQUFsQixDQUF6QjtBQUNBLGNBQU1oQyxRQUFRLEdBQUcsSUFBSUosMEJBQUosRUFBakI7O0FBQ0FaLFVBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyxtQkFBTztBQUNOLCtCQUFpQixRQURYO0FBRU4sZ0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFUO0FBRlosYUFBUDtBQUlBLFdBTEQ7O0FBTUEsaUJBQU90QyxRQUFRLENBQ2JHLGNBREssQ0FDVTtBQUNmQyxZQUFBQSxRQUFRLEVBQUU7QUFDVEssY0FBQUEsU0FBUyxFQUFFekIsY0FERjtBQUVUMEIsY0FBQUEsU0FBUyxFQUFFckIsY0FGRjtBQUdUc0IsY0FBQUEsWUFBWSxFQUFFbkI7QUFITDtBQURLLFdBRFYsRUFRTHFCLElBUkssQ0FRQSxVQUFTc0IscUJBQVQsRUFBZ0M7QUFDckMsZ0JBQUlLLGNBQUo7QUFDQSxtQkFBT0wscUJBQXFCLENBQzFCQyxnQkFESyxDQUNZLFlBRFosRUFFTHZCLElBRkssQ0FFQSxVQUFTd0IsYUFBVCxFQUF3QjtBQUM3QkcsY0FBQUEsY0FBYyxHQUFHSCxhQUFqQjtBQUNBMUMsY0FBQUEsTUFBTSxDQUFDMEMsYUFBRCxDQUFOLENBQXNCekIsV0FBdEIsR0FGNkIsQ0FFUTs7QUFDckNqQixjQUFBQSxNQUFNLENBQUMwQyxhQUFELENBQU4sQ0FBc0J2QyxPQUF0QixDQUNDLCtGQURELEVBSDZCLENBSzFCOztBQUNISCxjQUFBQSxNQUFNLENBQUM0QyxnQkFBRCxDQUFOLENBQXlCMUMsR0FBekIsQ0FBNkI0QyxnQkFBN0I7QUFDQSxxQkFBT04scUJBQXFCLENBQUNPLGtCQUF0QixDQUF5Q0wsYUFBekMsRUFBd0QsWUFBeEQsQ0FBUDtBQUNBLGFBVkssRUFXTHhCLElBWEssQ0FXQSxZQUFXO0FBQ2hCLHFCQUFPc0IscUJBQXFCLENBQUNDLGdCQUF0QixDQUF1QyxZQUF2QyxDQUFQO0FBQ0EsYUFiSyxFQWNMdkIsSUFkSyxDQWNBLFVBQVM4QixtQkFBVCxFQUE4QjtBQUNuQ2hELGNBQUFBLE1BQU0sQ0FBQzRDLGdCQUFELENBQU4sQ0FBeUJkLHFCQUF6QixDQUErQyxDQUEvQztBQUNBOUIsY0FBQUEsTUFBTSxDQUFDZ0QsbUJBQUQsQ0FBTixDQUE0QjdDLE9BQTVCLENBQW9DMEMsY0FBcEMsRUFGbUMsQ0FFa0I7O0FBQ3JELHFCQUFPTCxxQkFBcUIsQ0FBQ08sa0JBQXRCLENBQXlDQyxtQkFBekMsRUFBOEQsWUFBOUQsQ0FBUDtBQUNBLGFBbEJLLEVBbUJMOUIsSUFuQkssQ0FtQkEsWUFBVztBQUNoQmxCLGNBQUFBLE1BQU0sQ0FBQzRDLGdCQUFELENBQU4sQ0FBeUJkLHFCQUF6QixDQUErQyxDQUEvQztBQUNBYyxjQUFBQSxnQkFBZ0IsQ0FBQ0ssV0FBakI7QUFDQSxhQXRCSyxFQXVCTDVCLEtBdkJLLENBdUJDLFlBQVc7QUFDakJ1QixjQUFBQSxnQkFBZ0IsQ0FBQ0ssV0FBakI7QUFDQSxhQXpCSyxDQUFQO0FBMEJBLFdBcENLLENBQVA7QUFxQ0EsU0E5Q0csQ0FBSjtBQWdEQWxELFFBQUFBLElBQUksQ0FBQyxpRUFBRCxFQUFvRSxZQUFXO0FBQ2xGLGNBQU1NLFFBQVEsR0FBRyxJQUFJSiwwQkFBSixFQUFqQjs7QUFDQVosVUFBQUEsY0FBYyxDQUFDa0QsUUFBZixHQUEwQixZQUFXO0FBQ3BDLG1CQUFPO0FBQ04sK0JBQWlCLFFBRFg7QUFFTixnQ0FBa0IsSUFBSUksSUFBSixDQUFTLFlBQVQ7QUFGWixhQUFQO0FBSUEsV0FMRDs7QUFNQSxpQkFBT3RDLFFBQVEsQ0FDYkcsY0FESyxDQUNVO0FBQ2ZDLFlBQUFBLFFBQVEsRUFBRTtBQUNUSyxjQUFBQSxTQUFTLEVBQUV6QixjQURGO0FBRVQwQixjQUFBQSxTQUFTLEVBQUVyQixjQUZGO0FBR1RzQixjQUFBQSxZQUFZLEVBQUVuQjtBQUhMO0FBREssV0FEVixFQVFMcUIsSUFSSyxDQVFBLFVBQVNzQixxQkFBVCxFQUFnQztBQUNyQyxnQkFBSUssY0FBSjtBQUNBLG1CQUFPTCxxQkFBcUIsQ0FDMUJDLGdCQURLLENBQ1ksWUFEWixFQUVMdkIsSUFGSyxDQUVBLFVBQVN3QixhQUFULEVBQXdCO0FBQzdCRyxjQUFBQSxjQUFjLEdBQUdILGFBQWpCO0FBQ0ExQyxjQUFBQSxNQUFNLENBQUMwQyxhQUFELENBQU4sQ0FBc0J6QixXQUF0QixHQUY2QixDQUVROztBQUNyQ2pCLGNBQUFBLE1BQU0sQ0FBQzBDLGFBQUQsQ0FBTixDQUFzQnZDLE9BQXRCLENBQ0MsK0ZBREQsRUFINkIsQ0FLMUI7QUFFSDs7QUFDQWQsY0FBQUEsY0FBYyxDQUFDa0QsUUFBZixHQUEwQixZQUFXO0FBQ3BDLHVCQUFPO0FBQ04sbUNBQWlCLFFBRFg7QUFFTixvQ0FBa0IsSUFBSUksSUFBSixDQUFTLFlBQVQsQ0FGWjtBQUdOLG9DQUFrQjtBQUhaLGlCQUFQO0FBS0EsZUFORDs7QUFPQSxxQkFBT0gscUJBQXFCLENBQUNPLGtCQUF0QixDQUF5Q0wsYUFBekMsRUFBd0QsWUFBeEQsQ0FBUDtBQUNBLGFBbEJLLEVBbUJMeEIsSUFuQkssQ0FtQkEsWUFBVztBQUNoQixxQkFBT3NCLHFCQUFxQixDQUFDQyxnQkFBdEIsQ0FBdUMsWUFBdkMsRUFBcUR2QixJQUFyRCxDQUEwRCxVQUFTOEIsbUJBQVQsRUFBOEI7QUFDOUZoRCxnQkFBQUEsTUFBTSxDQUFDZ0QsbUJBQUQsQ0FBTixDQUE0QjdDLE9BQTVCLENBQW9DMEMsY0FBcEMsRUFEOEYsQ0FDekM7QUFDckQsZUFGTSxDQUFQO0FBR0EsYUF2QkssQ0FBUDtBQXdCQSxXQWxDSyxDQUFQO0FBbUNBLFNBM0NHLENBQUo7QUE2Q0E5QyxRQUFBQSxJQUFJLENBQUMsNkVBQUQsRUFBZ0YsWUFBVztBQUM5RixjQUFNTSxRQUFRLEdBQUcsSUFBSUosMEJBQUosRUFBakI7O0FBQ0FaLFVBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyxtQkFBTztBQUNOLCtCQUFpQixRQURYO0FBRU4sZ0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFUO0FBRlosYUFBUDtBQUlBLFdBTEQ7O0FBTUEsaUJBQU90QyxRQUFRLENBQ2JHLGNBREssQ0FDVTtBQUNmQyxZQUFBQSxRQUFRLEVBQUU7QUFDVEssY0FBQUEsU0FBUyxFQUFFekIsY0FERjtBQUVUMEIsY0FBQUEsU0FBUyxFQUFFckIsY0FGRjtBQUdUc0IsY0FBQUEsWUFBWSxFQUFFbkI7QUFITDtBQURLLFdBRFYsRUFRTHFCLElBUkssQ0FRQSxVQUFTc0IscUJBQVQsRUFBZ0M7QUFDckMsZ0JBQUlLLGNBQUo7QUFDQSxtQkFBT0wscUJBQXFCLENBQzFCQyxnQkFESyxDQUNZLFlBRFosRUFFTHZCLElBRkssQ0FFQSxVQUFTd0IsYUFBVCxFQUF3QjtBQUM3QkcsY0FBQUEsY0FBYyxHQUFHSCxhQUFqQixDQUQ2QixDQUU3Qjs7QUFDQXJELGNBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyx1QkFBTztBQUNOLG1DQUFpQixRQURYO0FBRU4sb0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFULENBRlo7QUFHTixvQ0FBa0I7QUFIWixpQkFBUDtBQUtBLGVBTkQ7O0FBT0EscUJBQU9ILHFCQUFxQixDQUFDTyxrQkFBdEIsQ0FBeUNMLGFBQXpDLEVBQXdELFlBQXhELENBQVA7QUFDQSxhQWJLLEVBY0x4QixJQWRLLENBY0EsWUFBVztBQUNoQjdCLGNBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyx1QkFBTztBQUNOLG1DQUFpQixRQURYO0FBRU4sb0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFUO0FBRlosaUJBQVA7QUFJQSxlQUxEOztBQU1BLHFCQUFPSCxxQkFBcUIsQ0FBQ0MsZ0JBQXRCLENBQXVDLFlBQXZDLEVBQXFEdkIsSUFBckQsQ0FBMEQsVUFBUzhCLG1CQUFULEVBQThCO0FBQzlGaEQsZ0JBQUFBLE1BQU0sQ0FBQ2dELG1CQUFELENBQU4sQ0FBNEI5QyxHQUE1QixDQUFnQ0MsT0FBaEMsQ0FBd0MwQyxjQUF4QyxFQUQ4RixDQUNyQzs7QUFDekQ3QyxnQkFBQUEsTUFBTSxDQUFDZ0QsbUJBQUQsQ0FBTixDQUE0QjdDLE9BQTVCLENBQW9DLElBQXBDLEVBRjhGLENBRW5EO0FBQzNDLGVBSE0sQ0FBUDtBQUlBLGFBekJLLENBQVA7QUEwQkEsV0FwQ0ssQ0FBUDtBQXFDQSxTQTdDRyxDQUFKO0FBK0NBSixRQUFBQSxJQUFJLENBQUMsMEVBQUQsRUFBNkUsWUFBVztBQUMzRixjQUFNTSxRQUFRLEdBQUcsSUFBSUosMEJBQUosRUFBakI7O0FBQ0EsY0FBTWlELGNBQWMsR0FBRyxZQUFXO0FBQ2pDLGdCQUFJQyxRQUFKO0FBQ0FDLFlBQUFBLFVBQVUsQ0FBQyxZQUFXO0FBQ3JCRCxjQUFBQSxRQUFRLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYTtBQUNwQkUsZ0JBQUFBLGlCQUFpQixFQUFFLFVBQVNDLEtBQVQsRUFBd0I7QUFDMUMsc0JBQUlBLEtBQUssS0FBSyxNQUFkLEVBQXNCO0FBQ3JCLDJCQUFPLE1BQVA7QUFDQTtBQUNEO0FBTG1CLGVBQWIsQ0FBUjtBQU9BLGFBUlMsRUFRUCxHQVJPLENBQVY7QUFTQSxtQkFBTztBQUNOQyxjQUFBQSxJQUFJLEVBQUUsVUFBU0MsTUFBVCxFQUEyQjtBQUNoQ0wsZ0JBQUFBLFFBQVEsR0FBR0ssTUFBWDtBQUNBLHVCQUFPO0FBQ05DLGtCQUFBQSxJQUFJLEVBQUUsWUFBVyxDQUFFO0FBRGIsaUJBQVA7QUFHQTtBQU5LLGFBQVA7QUFRQSxXQW5CRDs7QUFxQkFwRSxVQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsbUJBQU87QUFDTiwrQkFBaUIsUUFEWDtBQUVOLGdDQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVDtBQUZaLGFBQVA7QUFJQSxXQUxEOztBQU1BLGNBQU1lLFFBQVEsR0FBR0MsTUFBTSxDQUFDQyxJQUF4QjtBQUNBLGlCQUFPdkQsUUFBUSxDQUNiRyxjQURLLENBQ1U7QUFDZkMsWUFBQUEsUUFBUSxFQUFFO0FBQ1RLLGNBQUFBLFNBQVMsRUFBRXpCLGNBREY7QUFFVDBCLGNBQUFBLFNBQVMsRUFBRXJCLGNBRkY7QUFHVHNCLGNBQUFBLFlBQVksRUFBRW5CO0FBSEw7QUFESyxXQURWLEVBUUxxQixJQVJLLENBUUEsVUFBU3NCLHFCQUFULEVBQWdDO0FBQ3JDLGdCQUFJSyxjQUFKO0FBQ0EsbUJBQU9MLHFCQUFxQixDQUMxQkMsZ0JBREssQ0FDWSxZQURaLEVBRUx2QixJQUZLLENBRUEsVUFBU3dCLGFBQVQsRUFBd0I7QUFDN0JHLGNBQUFBLGNBQWMsR0FBR0gsYUFBakIsQ0FENkIsQ0FFN0I7O0FBQ0FyRCxjQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsdUJBQU87QUFDTixtQ0FBaUIsUUFEWDtBQUVOLG9DQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVCxDQUZaO0FBR04sb0NBQWtCO0FBSFosaUJBQVA7QUFLQSxlQU5EOztBQU9BLHFCQUFPSCxxQkFBcUIsQ0FBQ08sa0JBQXRCLENBQXlDTCxhQUF6QyxFQUF3RCxZQUF4RCxDQUFQO0FBQ0EsYUFiSyxFQWNMeEIsSUFkSyxDQWNBLFlBQVc7QUFDaEI3QixjQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsdUJBQU87QUFDTixtQ0FBaUIsUUFEWDtBQUVOLG9DQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVDtBQUZaLGlCQUFQO0FBSUEsZUFMRCxDQURnQixDQVFoQjs7O0FBQ0FnQixjQUFBQSxNQUFNLENBQUNDLElBQVAsR0FBY1YsY0FBZDtBQUNBLHFCQUFPVixxQkFBcUIsQ0FBQ0MsZ0JBQXRCLENBQXVDLFlBQXZDLENBQVA7QUFDQSxhQXpCSyxFQTBCTHZCLElBMUJLLENBMEJBLFVBQVM4QixtQkFBVCxFQUE4QjtBQUNuQ2hELGNBQUFBLE1BQU0sQ0FBQ2dELG1CQUFELENBQU4sQ0FBNEI3QyxPQUE1QixDQUFvQzBDLGNBQXBDLEVBRG1DLENBQ2tCOztBQUNyRGMsY0FBQUEsTUFBTSxDQUFDQyxJQUFQLEdBQWNGLFFBQWQ7QUFDQSxhQTdCSyxFQThCTHJDLEtBOUJLLENBOEJDLFlBQVc7QUFDakJzQyxjQUFBQSxNQUFNLENBQUNDLElBQVAsR0FBY0YsUUFBZDtBQUNBLGFBaENLLENBQVA7QUFpQ0EsV0EzQ0ssQ0FBUDtBQTRDQSxTQTFFRyxDQUFKO0FBNEVBM0QsUUFBQUEsSUFBSSxDQUFDLHlGQUFELEVBQTRGLFlBQVc7QUFDMUcsY0FBTU0sUUFBUSxHQUFHLElBQUlKLDBCQUFKLEVBQWpCOztBQUNBLGNBQU1pRCxjQUFjLEdBQUcsWUFBVztBQUNqQyxnQkFBSUMsUUFBSjtBQUNBQyxZQUFBQSxVQUFVLENBQUMsWUFBVztBQUNyQkQsY0FBQUEsUUFBUSxDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWE7QUFDcEJFLGdCQUFBQSxpQkFBaUIsRUFBRSxVQUFTQyxLQUFULEVBQXFCO0FBQ3ZDLHNCQUFJQSxLQUFLLEtBQUssZUFBZCxFQUErQjtBQUM5QiwyQkFBTywwQkFBUDtBQUNBO0FBQ0Q7QUFMbUIsZUFBYixDQUFSO0FBT0EsYUFSUyxFQVFQLEdBUk8sQ0FBVjtBQVNBLG1CQUFPO0FBQ05DLGNBQUFBLElBQUksRUFBRSxVQUFTQyxNQUFULEVBQTJCO0FBQ2hDTCxnQkFBQUEsUUFBUSxHQUFHSyxNQUFYO0FBQ0EsdUJBQU87QUFDTkMsa0JBQUFBLElBQUksRUFBRSxZQUFXLENBQUU7QUFEYixpQkFBUDtBQUdBO0FBTkssYUFBUDtBQVFBLFdBbkJEOztBQXFCQXBFLFVBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyxtQkFBTztBQUNOLCtCQUFpQixRQURYO0FBRU4sZ0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFUO0FBRlosYUFBUDtBQUlBLFdBTEQ7O0FBTUEsY0FBTWUsUUFBUSxHQUFHQyxNQUFNLENBQUNDLElBQXhCO0FBQ0EsaUJBQU92RCxRQUFRLENBQ2JHLGNBREssQ0FDVTtBQUNmQyxZQUFBQSxRQUFRLEVBQUU7QUFDVEssY0FBQUEsU0FBUyxFQUFFekIsY0FERjtBQUVUMEIsY0FBQUEsU0FBUyxFQUFFckIsY0FGRjtBQUdUc0IsY0FBQUEsWUFBWSxFQUFFbkI7QUFITDtBQURLLFdBRFYsRUFRTHFCLElBUkssQ0FRQSxVQUFTc0IscUJBQVQsRUFBZ0M7QUFDckMsZ0JBQUlLLGNBQUo7QUFDQSxtQkFBT0wscUJBQXFCLENBQzFCQyxnQkFESyxDQUNZLFlBRFosRUFFTHZCLElBRkssQ0FFQSxVQUFTd0IsYUFBVCxFQUF3QjtBQUM3QkcsY0FBQUEsY0FBYyxHQUFHSCxhQUFqQixDQUQ2QixDQUU3Qjs7QUFDQXJELGNBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyx1QkFBTztBQUNOLG1DQUFpQixRQURYO0FBRU4sb0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFULENBRlo7QUFHTixvQ0FBa0IsSUFBSUEsSUFBSixDQUFTLFlBQVQ7QUFIWixpQkFBUDtBQUtBLGVBTkQ7O0FBT0EscUJBQU9ILHFCQUFxQixDQUFDTyxrQkFBdEIsQ0FBeUNMLGFBQXpDLEVBQXdELFlBQXhELENBQVA7QUFDQSxhQWJLLEVBY0x4QixJQWRLLENBY0EsWUFBVztBQUNoQjdCLGNBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyx1QkFBTztBQUNOLG1DQUFpQixRQURYO0FBRU4sb0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFUO0FBRlosaUJBQVA7QUFJQSxlQUxELENBRGdCLENBUWhCOzs7QUFDQWdCLGNBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxHQUFjVixjQUFkO0FBQ0EscUJBQU9WLHFCQUFxQixDQUFDQyxnQkFBdEIsQ0FBdUMsWUFBdkMsQ0FBUDtBQUNBLGFBekJLLEVBMEJMdkIsSUExQkssQ0EwQkEsVUFBUzhCLG1CQUFULEVBQThCO0FBQ25DaEQsY0FBQUEsTUFBTSxDQUFDZ0QsbUJBQUQsQ0FBTixDQUE0QjdDLE9BQTVCLENBQW9DMEMsY0FBcEMsRUFEbUMsQ0FDa0I7O0FBQ3JEYyxjQUFBQSxNQUFNLENBQUNDLElBQVAsR0FBY0YsUUFBZDtBQUNBLGFBN0JLLEVBOEJMckMsS0E5QkssQ0E4QkMsWUFBVztBQUNqQnNDLGNBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxHQUFjRixRQUFkO0FBQ0EsYUFoQ0ssQ0FBUDtBQWlDQSxXQTNDSyxDQUFQO0FBNENBLFNBMUVHLENBQUo7QUE0RUEzRCxRQUFBQSxJQUFJLENBQUMsMkVBQUQsRUFBOEUsWUFBVztBQUM1RixjQUFNTSxRQUFRLEdBQUcsSUFBSUosMEJBQUosRUFBakI7O0FBQ0EsY0FBTWlELGNBQWMsR0FBRyxZQUFXO0FBQ2pDLGdCQUFJQyxRQUFKO0FBQ0FDLFlBQUFBLFVBQVUsQ0FBQyxZQUFXO0FBQ3JCRCxjQUFBQSxRQUFRLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYTtBQUNwQkUsZ0JBQUFBLGlCQUFpQixFQUFFLFVBQVNDLEtBQVQsRUFBd0I7QUFDMUMsc0JBQUlBLEtBQUssS0FBSyxNQUFkLEVBQXNCO0FBQ3JCLDJCQUFPLFNBQVA7QUFDQTtBQUNEO0FBTG1CLGVBQWIsQ0FBUjtBQU9BLGFBUlMsRUFRUCxHQVJPLENBQVY7QUFTQSxtQkFBTztBQUNOQyxjQUFBQSxJQUFJLEVBQUUsVUFBU0MsTUFBVCxFQUEyQjtBQUNoQ0wsZ0JBQUFBLFFBQVEsR0FBR0ssTUFBWDtBQUNBLHVCQUFPO0FBQ05DLGtCQUFBQSxJQUFJLEVBQUUsWUFBVyxDQUFFO0FBRGIsaUJBQVA7QUFHQTtBQU5LLGFBQVA7QUFRQSxXQW5CRDs7QUFxQkFwRSxVQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsbUJBQU87QUFDTiwrQkFBaUIsUUFEWDtBQUVOLGdDQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVDtBQUZaLGFBQVA7QUFJQSxXQUxEOztBQU1BLGNBQU1lLFFBQVEsR0FBR0MsTUFBTSxDQUFDQyxJQUF4QjtBQUNBLGlCQUFPdkQsUUFBUSxDQUNiRyxjQURLLENBQ1U7QUFDZkMsWUFBQUEsUUFBUSxFQUFFO0FBQ1RLLGNBQUFBLFNBQVMsRUFBRXpCLGNBREY7QUFFVDBCLGNBQUFBLFNBQVMsRUFBRXJCLGNBRkY7QUFHVHNCLGNBQUFBLFlBQVksRUFBRW5CO0FBSEw7QUFESyxXQURWLEVBUUxxQixJQVJLLENBUUEsVUFBU3NCLHFCQUFULEVBQWdDO0FBQ3JDLGdCQUFJSyxjQUFKO0FBQ0EsbUJBQU9MLHFCQUFxQixDQUMxQkMsZ0JBREssQ0FDWSxZQURaLEVBRUx2QixJQUZLLENBRUEsVUFBU3dCLGFBQVQsRUFBd0I7QUFDN0JHLGNBQUFBLGNBQWMsR0FBR0gsYUFBakIsQ0FENkIsQ0FFN0I7O0FBQ0FyRCxjQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsdUJBQU87QUFDTixtQ0FBaUIsUUFEWDtBQUVOLG9DQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVCxDQUZaO0FBR04sb0NBQWtCO0FBSFosaUJBQVA7QUFLQSxlQU5EOztBQU9BLHFCQUFPSCxxQkFBcUIsQ0FBQ08sa0JBQXRCLENBQXlDTCxhQUF6QyxFQUF3RCxZQUF4RCxDQUFQO0FBQ0EsYUFiSyxFQWNMeEIsSUFkSyxDQWNBLFlBQVc7QUFDaEI3QixjQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsdUJBQU87QUFDTixtQ0FBaUIsUUFEWDtBQUVOLG9DQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVDtBQUZaLGlCQUFQO0FBSUEsZUFMRCxDQURnQixDQVFoQjs7O0FBQ0FnQixjQUFBQSxNQUFNLENBQUNDLElBQVAsR0FBY1YsY0FBZDtBQUNBLHFCQUFPVixxQkFBcUIsQ0FBQ0MsZ0JBQXRCLENBQXVDLFlBQXZDLENBQVA7QUFDQSxhQXpCSyxFQTBCTHZCLElBMUJLLENBMEJBLFVBQVM4QixtQkFBVCxFQUE4QjtBQUNuQ2hELGNBQUFBLE1BQU0sQ0FBQ2dELG1CQUFELENBQU4sQ0FBNEI5QyxHQUE1QixDQUFnQ0MsT0FBaEMsQ0FBd0MwQyxjQUF4QyxFQURtQyxDQUNzQjs7QUFDekQ3QyxjQUFBQSxNQUFNLENBQUNnRCxtQkFBRCxDQUFOLENBQTRCN0MsT0FBNUIsQ0FDQywwSEFERCxFQUZtQyxDQUloQzs7QUFDSHdELGNBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxHQUFjRixRQUFkO0FBQ0EsYUFoQ0ssRUFpQ0xyQyxLQWpDSyxDQWlDQyxVQUFTd0MsS0FBVCxFQUFnQjtBQUN0QkYsY0FBQUEsTUFBTSxDQUFDQyxJQUFQLEdBQWNGLFFBQWQ7QUFDQSxhQW5DSyxDQUFQO0FBb0NBLFdBOUNLLENBQVA7QUErQ0EsU0E3RUcsQ0FBSjtBQStFQTNELFFBQUFBLElBQUksQ0FBQywwRkFBRCxFQUE2RixZQUFXO0FBQzNHLGNBQU1NLFFBQVEsR0FBRyxJQUFJSiwwQkFBSixFQUFqQjs7QUFDQSxjQUFNaUQsY0FBYyxHQUFHLFlBQVc7QUFDakMsZ0JBQUlDLFFBQUo7QUFDQUMsWUFBQUEsVUFBVSxDQUFDLFlBQVc7QUFDckJELGNBQUFBLFFBQVEsQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhO0FBQ3BCRSxnQkFBQUEsaUJBQWlCLEVBQUUsVUFBU0MsS0FBVCxFQUF3QjtBQUMxQyxzQkFBSUEsS0FBSyxLQUFLLGVBQWQsRUFBK0I7QUFDOUIsMkJBQU8sMEJBQVA7QUFDQTtBQUNEO0FBTG1CLGVBQWIsQ0FBUjtBQU9BLGFBUlMsRUFRUCxHQVJPLENBQVY7QUFTQSxtQkFBTztBQUNOQyxjQUFBQSxJQUFJLEVBQUUsVUFBU0MsTUFBVCxFQUEyQjtBQUNoQ0wsZ0JBQUFBLFFBQVEsR0FBR0ssTUFBWDtBQUNBLHVCQUFPO0FBQ05DLGtCQUFBQSxJQUFJLEVBQUUsWUFBVyxDQUFFO0FBRGIsaUJBQVA7QUFHQTtBQU5LLGFBQVA7QUFRQSxXQW5CRDs7QUFxQkFwRSxVQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsbUJBQU87QUFDTiwrQkFBaUIsUUFEWDtBQUVOLGdDQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVDtBQUZaLGFBQVA7QUFJQSxXQUxEOztBQU1BLGNBQU1lLFFBQVEsR0FBR0MsTUFBTSxDQUFDQyxJQUF4QjtBQUNBdkQsVUFBQUEsUUFBUSxDQUNORyxjQURGLENBQ2lCO0FBQ2ZDLFlBQUFBLFFBQVEsRUFBRTtBQUNUSyxjQUFBQSxTQUFTLEVBQUV6QixjQURGO0FBRVQwQixjQUFBQSxTQUFTLEVBQUVyQixjQUZGO0FBR1RzQixjQUFBQSxZQUFZLEVBQUVuQjtBQUhMO0FBREssV0FEakIsRUFRRXFCLElBUkYsQ0FRTyxVQUFTc0IscUJBQVQsRUFBZ0M7QUFDckMsZ0JBQUlLLGNBQUo7QUFDQSxtQkFBT0wscUJBQXFCLENBQzFCQyxnQkFESyxDQUNZLFlBRFosRUFFTHZCLElBRkssQ0FFQSxVQUFTd0IsYUFBVCxFQUF3QjtBQUM3QkcsY0FBQUEsY0FBYyxHQUFHSCxhQUFqQixDQUQ2QixDQUU3Qjs7QUFDQXJELGNBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyx1QkFBTztBQUNOLG1DQUFpQixRQURYO0FBRU4sb0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFULENBRlo7QUFHTixvQ0FBa0IsSUFBSUEsSUFBSixDQUFTLFlBQVQ7QUFIWixpQkFBUDtBQUtBLGVBTkQ7O0FBT0EscUJBQU9ILHFCQUFxQixDQUFDTyxrQkFBdEIsQ0FBeUNMLGFBQXpDLEVBQXdELFlBQXhELENBQVA7QUFDQSxhQWJLLEVBY0x4QixJQWRLLENBY0EsWUFBVztBQUNoQjdCLGNBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyx1QkFBTztBQUNOLG1DQUFpQixRQURYO0FBRU4sb0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFUO0FBRlosaUJBQVA7QUFJQSxlQUxELENBRGdCLENBUWhCOzs7QUFDQWdCLGNBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxHQUFjVixjQUFkO0FBQ0EscUJBQU9WLHFCQUFxQixDQUFDQyxnQkFBdEIsQ0FBdUMsWUFBdkMsQ0FBUDtBQUNBLGFBekJLLEVBMEJMdkIsSUExQkssQ0EwQkEsVUFBUzhCLG1CQUFULEVBQThCO0FBQ25DaEQsY0FBQUEsTUFBTSxDQUFDZ0QsbUJBQUQsQ0FBTixDQUE0QjlDLEdBQTVCLENBQWdDQyxPQUFoQyxDQUF3QzBDLGNBQXhDLEVBRG1DLENBQ3NCOztBQUN6RDdDLGNBQUFBLE1BQU0sQ0FBQ2dELG1CQUFELENBQU4sQ0FBNEI3QyxPQUE1QixDQUNDLDJJQURELEVBRm1DLENBSWhDOztBQUNId0QsY0FBQUEsTUFBTSxDQUFDQyxJQUFQLEdBQWNGLFFBQWQ7QUFDQSxhQWhDSyxFQWlDTHJDLEtBakNLLENBaUNDLFVBQVN3QyxLQUFULEVBQWdCO0FBQ3RCRixjQUFBQSxNQUFNLENBQUNDLElBQVAsR0FBY0YsUUFBZDtBQUNBLGFBbkNLLENBQVA7QUFvQ0EsV0E5Q0Y7QUErQ0EsU0E3RUcsQ0FBSjtBQStFQTNELFFBQUFBLElBQUksQ0FBQyx5Q0FBRCxFQUE0QyxZQUFXO0FBQzFELGNBQU1NLFFBQVEsR0FBRyxJQUFJSiwwQkFBSixFQUFqQjs7QUFDQVosVUFBQUEsY0FBYyxDQUFDa0QsUUFBZixHQUEwQixZQUFXO0FBQ3BDLG1CQUFPO0FBQ04sK0JBQWlCLFFBRFg7QUFFTixnQ0FBa0IsSUFBSUksSUFBSixDQUFTLFlBQVQ7QUFGWixhQUFQO0FBSUEsV0FMRDs7QUFNQXRDLFVBQUFBLFFBQVEsQ0FDTkcsY0FERixDQUNpQjtBQUNmQyxZQUFBQSxRQUFRLEVBQUU7QUFDVEssY0FBQUEsU0FBUyxFQUFFekIsY0FERjtBQUVUMEIsY0FBQUEsU0FBUyxFQUFFckIsY0FGRjtBQUdUc0IsY0FBQUEsWUFBWSxFQUFFbkI7QUFITDtBQURLLFdBRGpCLEVBUUVxQixJQVJGLENBUU8sVUFBU3NCLHFCQUFULEVBQWdDO0FBQ3JDLGdCQUFJSyxjQUFKO0FBQ0EsbUJBQU9MLHFCQUFxQixDQUMxQkMsZ0JBREssQ0FDWSxZQURaLEVBRUx2QixJQUZLLENBRUEsVUFBU3dCLGFBQVQsRUFBd0I7QUFDN0JHLGNBQUFBLGNBQWMsR0FBR0gsYUFBakI7QUFDQTFDLGNBQUFBLE1BQU0sQ0FBQzBDLGFBQUQsQ0FBTixDQUFzQnpCLFdBQXRCLEdBRjZCLENBRVE7O0FBQ3JDakIsY0FBQUEsTUFBTSxDQUFDMEMsYUFBRCxDQUFOLENBQXNCdkMsT0FBdEIsQ0FDQywrRkFERCxFQUg2QixDQUsxQjs7QUFDSCxxQkFBT3FDLHFCQUFxQixDQUFDTyxrQkFBdEIsQ0FBeUNMLGFBQXpDLEVBQXdELFlBQXhELENBQVA7QUFDQSxhQVRLLEVBVUx4QixJQVZLLENBVUEsWUFBVztBQUNoQjtBQUNBN0IsY0FBQUEsY0FBYyxDQUFDa0QsUUFBZixHQUEwQixZQUFXO0FBQ3BDLHVCQUFPO0FBQ04sbUNBQWlCLFdBRFg7QUFFTixvQ0FBa0IsSUFBSUksSUFBSixDQUFTLFlBQVQ7QUFGWixpQkFBUDtBQUlBLGVBTEQ7O0FBTUFILGNBQUFBLHFCQUFxQixDQUFDQyxnQkFBdEIsQ0FBdUMsWUFBdkMsRUFBcUR2QixJQUFyRCxDQUEwRCxVQUFTOEIsbUJBQVQsRUFBOEI7QUFDdkZoRCxnQkFBQUEsTUFBTSxDQUFDZ0QsbUJBQUQsQ0FBTixDQUE0QjlDLEdBQTVCLENBQWdDQyxPQUFoQyxDQUF3QzBDLGNBQXhDLEVBRHVGLENBQzlCOztBQUN6RDdDLGdCQUFBQSxNQUFNLENBQUNnRCxtQkFBRCxDQUFOLENBQTRCN0MsT0FBNUIsQ0FDQyxrR0FERCxFQUZ1RixDQUlwRjtBQUNILGVBTEQ7QUFNQSxhQXhCSyxDQUFQO0FBeUJBLFdBbkNGO0FBb0NBLFNBNUNHLENBQUo7QUE4Q0FKLFFBQUFBLElBQUksQ0FBQywyREFBRCxFQUE4RCxZQUFXO0FBQzVFLGNBQU1NLFFBQVEsR0FBRyxJQUFJSiwwQkFBSixFQUFqQjs7QUFDQVosVUFBQUEsY0FBYyxDQUFDa0QsUUFBZixHQUEwQixZQUFXO0FBQ3BDLG1CQUFPO0FBQ04sK0JBQWlCLFFBRFg7QUFFTixnQ0FBa0IsSUFBSUksSUFBSixDQUFTLFlBQVQ7QUFGWixhQUFQO0FBSUEsV0FMRDs7QUFNQSxpQkFBT3RDLFFBQVEsQ0FDYkcsY0FESyxDQUNVO0FBQ2ZDLFlBQUFBLFFBQVEsRUFBRTtBQUNUSyxjQUFBQSxTQUFTLEVBQUV6QixjQURGO0FBRVQwQixjQUFBQSxTQUFTLEVBQUVyQixjQUZGO0FBR1RzQixjQUFBQSxZQUFZLEVBQUVuQjtBQUhMO0FBREssV0FEVixFQVFMcUIsSUFSSyxDQVFBLFVBQVNzQixxQkFBVCxFQUFnQztBQUNyQyxnQkFBSUssY0FBSjtBQUNBLG1CQUFPTCxxQkFBcUIsQ0FDMUJDLGdCQURLLENBQ1ksWUFEWixFQUVMdkIsSUFGSyxDQUVBLFVBQVN3QixhQUFULEVBQXdCO0FBQzdCRyxjQUFBQSxjQUFjLEdBQUdILGFBQWpCO0FBQ0ExQyxjQUFBQSxNQUFNLENBQUMwQyxhQUFELENBQU4sQ0FBc0J6QixXQUF0QixHQUY2QixDQUVROztBQUNyQ2pCLGNBQUFBLE1BQU0sQ0FBQzBDLGFBQUQsQ0FBTixDQUFzQnZDLE9BQXRCLENBQ0MsK0ZBREQsRUFINkIsQ0FLMUI7QUFDSDs7QUFDQWQsY0FBQUEsY0FBYyxDQUFDa0QsUUFBZixHQUEwQixZQUFXO0FBQ3BDLHVCQUFPO0FBQ04sbUNBQWlCLFFBRFg7QUFFTixvQ0FBa0IsSUFBSUksSUFBSixDQUFTLFlBQVQsQ0FGWjtBQUdOLG9DQUFrQjtBQUhaLGlCQUFQO0FBS0EsZUFORDs7QUFPQSxxQkFBT0gscUJBQXFCLENBQUNPLGtCQUF0QixDQUF5Q0wsYUFBekMsRUFBd0QsWUFBeEQsQ0FBUDtBQUNBLGFBakJLLEVBa0JMeEIsSUFsQkssQ0FrQkEsWUFBVztBQUNoQjdCLGNBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyx1QkFBTztBQUNOLG1DQUFpQixRQURYO0FBRU4sb0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFULENBRlo7QUFHTixvQ0FBa0I7QUFIWixpQkFBUDtBQUtBLGVBTkQ7O0FBT0EscUJBQU9ILHFCQUFxQixDQUFDQyxnQkFBdEIsQ0FBdUMsWUFBdkMsRUFBcUR2QixJQUFyRCxDQUEwRCxVQUFTOEIsbUJBQVQsRUFBOEI7QUFDOUZoRCxnQkFBQUEsTUFBTSxDQUFDZ0QsbUJBQUQsQ0FBTixDQUE0QjlDLEdBQTVCLENBQWdDQyxPQUFoQyxDQUF3QzBDLGNBQXhDLEVBRDhGLENBQ3JDOztBQUN6RDdDLGdCQUFBQSxNQUFNLENBQUNnRCxtQkFBRCxDQUFOLENBQTRCN0MsT0FBNUIsQ0FDQyx1SEFERCxFQUY4RixDQUkzRjtBQUNILGVBTE0sQ0FBUDtBQU1BLGFBaENLLENBQVA7QUFpQ0EsV0EzQ0ssQ0FBUDtBQTRDQSxTQXBERyxDQUFKO0FBc0RBSixRQUFBQSxJQUFJLENBQUMsc0RBQUQsRUFBeUQsWUFBVztBQUN2RSxjQUFNTSxRQUFRLEdBQUcsSUFBSUosMEJBQUosRUFBakI7O0FBQ0FaLFVBQUFBLGNBQWMsQ0FBQ2tELFFBQWYsR0FBMEIsWUFBVztBQUNwQyxtQkFBTztBQUNOLCtCQUFpQixRQURYO0FBRU4sZ0NBQWtCLElBQUlJLElBQUosQ0FBUyxZQUFUO0FBRlosYUFBUDtBQUlBLFdBTEQ7O0FBTUF0QyxVQUFBQSxRQUFRLENBQ05HLGNBREYsQ0FDaUI7QUFDZkMsWUFBQUEsUUFBUSxFQUFFO0FBQ1RLLGNBQUFBLFNBQVMsRUFBRXpCLGNBREY7QUFFVDBCLGNBQUFBLFNBQVMsRUFBRXJCLGNBRkY7QUFHVHNCLGNBQUFBLFlBQVksRUFBRW5CO0FBSEw7QUFESyxXQURqQixFQVFFcUIsSUFSRixDQVFPLFVBQVNzQixxQkFBVCxFQUFnQztBQUNyQyxnQkFBSUssY0FBSjtBQUNBTCxZQUFBQSxxQkFBcUIsQ0FDbkJDLGdCQURGLENBQ21CLFlBRG5CLEVBRUV2QixJQUZGLENBRU8sVUFBU3dCLGFBQVQsRUFBd0I7QUFDN0JHLGNBQUFBLGNBQWMsR0FBR0gsYUFBakI7QUFDQTFDLGNBQUFBLE1BQU0sQ0FBQzBDLGFBQUQsQ0FBTixDQUFzQnpCLFdBQXRCLEdBRjZCLENBRVE7O0FBQ3JDakIsY0FBQUEsTUFBTSxDQUFDMEMsYUFBRCxDQUFOLENBQXNCdkMsT0FBdEIsQ0FDQywrRkFERCxFQUg2QixDQUsxQjtBQUNIOztBQUNBZCxjQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsdUJBQU87QUFDTixtQ0FBaUIsUUFEWDtBQUVOLG9DQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVCxDQUZaO0FBR04sb0NBQWtCO0FBSFosaUJBQVA7QUFLQSxlQU5EOztBQU9BLHFCQUFPSCxxQkFBcUIsQ0FBQ08sa0JBQXRCLENBQXlDTCxhQUF6QyxFQUF3RCxZQUF4RCxDQUFQO0FBQ0EsYUFqQkYsRUFrQkV4QixJQWxCRixDQWtCTyxZQUFXO0FBQ2hCc0IsY0FBQUEscUJBQXFCLENBQUNDLGdCQUF0QixDQUF1QyxZQUF2QyxFQUFxRHZCLElBQXJELENBQTBELFVBQVM4QixtQkFBVCxFQUE4QjtBQUN2RmhELGdCQUFBQSxNQUFNLENBQUNnRCxtQkFBRCxDQUFOLENBQTRCOUMsR0FBNUIsQ0FBZ0NDLE9BQWhDLENBQXdDMEMsY0FBeEMsRUFEdUYsQ0FDOUI7O0FBQ3pEN0MsZ0JBQUFBLE1BQU0sQ0FBQ2dELG1CQUFELENBQU4sQ0FBNEI3QyxPQUE1QixDQUFvQyxJQUFwQyxFQUZ1RixDQUU1QztBQUMzQyxlQUhEO0FBSUEsYUF2QkY7QUF3QkEsV0FsQ0Y7QUFtQ0EsU0EzQ0csQ0FBSjtBQTZDQUosUUFBQUEsSUFBSSxDQUFDLHFFQUFELEVBQXdFLFlBQVc7QUFDdEYsY0FBTU0sUUFBUSxHQUFHLElBQUlKLDBCQUFKLEVBQWpCOztBQUNBWixVQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsbUJBQU87QUFDTiwrQkFBaUIsUUFEWDtBQUVOLGdDQUFrQixJQUFJSSxJQUFKLENBQVMsWUFBVDtBQUZaLGFBQVA7QUFJQSxXQUxEOztBQU1BdEMsVUFBQUEsUUFBUSxDQUNORyxjQURGLENBQ2lCO0FBQ2ZDLFlBQUFBLFFBQVEsRUFBRTtBQUNUSyxjQUFBQSxTQUFTLEVBQUV6QixjQURGO0FBRVQwQixjQUFBQSxTQUFTLEVBQUVyQixjQUZGO0FBR1RzQixjQUFBQSxZQUFZLEVBQUVuQjtBQUhMO0FBREssV0FEakIsRUFRRXFCLElBUkYsQ0FRTyxVQUFTc0IscUJBQVQsRUFBZ0M7QUFDckMsZ0JBQUlLLGNBQUo7QUFDQSxtQkFBT0wscUJBQXFCLENBQzFCQyxnQkFESyxDQUNZLFlBRFosRUFFTHZCLElBRkssQ0FFQSxVQUFTd0IsYUFBVCxFQUF3QjtBQUM3QkcsY0FBQUEsY0FBYyxHQUFHSCxhQUFqQjtBQUNBMUMsY0FBQUEsTUFBTSxDQUFDMEMsYUFBRCxDQUFOLENBQXNCekIsV0FBdEIsR0FGNkIsQ0FFUTs7QUFDckNqQixjQUFBQSxNQUFNLENBQUMwQyxhQUFELENBQU4sQ0FBc0J2QyxPQUF0QixDQUNDLCtGQURELEVBSDZCLENBSzFCOztBQUNILHFCQUFPcUMscUJBQXFCLENBQUNPLGtCQUF0QixDQUF5Q0wsYUFBekMsRUFBd0QsWUFBeEQsQ0FBUDtBQUNBLGFBVEssRUFVTHhCLElBVkssQ0FVQSxZQUFXO0FBQ2hCO0FBQ0E3QixjQUFBQSxjQUFjLENBQUNrRCxRQUFmLEdBQTBCLFlBQVc7QUFDcEMsc0JBQU0sSUFBSXVCLEtBQUosQ0FBVSxNQUFWLENBQU47QUFDQSxlQUZEOztBQUdBLHFCQUFPdEIscUJBQXFCLENBQUNDLGdCQUF0QixDQUF1QyxZQUF2QyxFQUFxRHZCLElBQXJELENBQTBELFVBQVM4QixtQkFBVCxFQUE4QjtBQUM5RmhELGdCQUFBQSxNQUFNLENBQUNnRCxtQkFBRCxDQUFOLENBQTRCOUMsR0FBNUIsQ0FBZ0NDLE9BQWhDLENBQXdDMEMsY0FBeEMsRUFEOEYsQ0FDckM7O0FBQ3pEN0MsZ0JBQUFBLE1BQU0sQ0FBQ2dELG1CQUFELENBQU4sQ0FBNEI3QyxPQUE1QixDQUFvQyxJQUFwQyxFQUY4RixDQUVuRDtBQUMzQyxlQUhNLENBQVA7QUFJQSxhQW5CSyxDQUFQO0FBb0JBLFdBOUJGO0FBK0JBLFNBdkNHLENBQUo7QUF5Q0FKLFFBQUFBLElBQUksQ0FBQywyQ0FBRCxFQUE4QyxZQUFXO0FBQzVELGNBQU1NLFFBQVEsR0FBRyxJQUFJSiwwQkFBSixFQUFqQjs7QUFDQVosVUFBQUEsY0FBYyxDQUFDa0QsUUFBZixHQUEwQixZQUFXO0FBQ3BDLG1CQUFPO0FBQ04sK0JBQWlCLFFBRFg7QUFFTixnQ0FBa0IsSUFBSUksSUFBSixDQUFTLFlBQVQ7QUFGWixhQUFQO0FBSUEsV0FMRDs7QUFNQSxpQkFBT3RDLFFBQVEsQ0FDYkcsY0FESyxDQUNVO0FBQ2ZDLFlBQUFBLFFBQVEsRUFBRTtBQUNUSyxjQUFBQSxTQUFTLEVBQUV6QixjQURGO0FBRVQwQixjQUFBQSxTQUFTLEVBQUVyQixjQUZGO0FBR1RzQixjQUFBQSxZQUFZLEVBQUVuQjtBQUhMO0FBREssV0FEVixFQVFMcUIsSUFSSyxDQVFBLFVBQVNzQixxQkFBVCxFQUFnQztBQUNyQyxnQkFBSUssY0FBSjtBQUNBLG1CQUFPTCxxQkFBcUIsQ0FDMUJDLGdCQURLLENBQ1ksWUFEWixFQUVMdkIsSUFGSyxDQUVBLFVBQVN3QixhQUFULEVBQXdCO0FBQzdCRyxjQUFBQSxjQUFjLEdBQUdILGFBQWpCO0FBQ0ExQyxjQUFBQSxNQUFNLENBQUMwQyxhQUFELENBQU4sQ0FBc0J6QixXQUF0QixHQUY2QixDQUVROztBQUNyQ2pCLGNBQUFBLE1BQU0sQ0FBQzBDLGFBQUQsQ0FBTixDQUFzQnZDLE9BQXRCLENBQ0MsK0ZBREQsRUFINkIsQ0FLMUI7O0FBQ0gscUJBQU9xQyxxQkFBcUIsQ0FBQ08sa0JBQXRCLENBQXlDTCxhQUF6QyxFQUF3RCxZQUF4RCxDQUFQO0FBQ0EsYUFUSyxFQVVMeEIsSUFWSyxDQVVBLFlBQVc7QUFDaEI7QUFDQXJCLGNBQUFBLGlCQUFpQixDQUFDQyxXQUFsQixHQUFnQyxZQUFXO0FBQzFDLHVCQUFPO0FBQ04sNkJBQVc7QUFBRUYsb0JBQUFBLFlBQVksRUFBRTtBQUFoQjtBQURMLGlCQUFQO0FBR0EsZUFKRDs7QUFLQSxxQkFBTzRDLHFCQUFxQixDQUFDQyxnQkFBdEIsQ0FBdUMsWUFBdkMsRUFBcUR2QixJQUFyRCxDQUEwRCxVQUFTOEIsbUJBQVQsRUFBOEI7QUFDOUZoRCxnQkFBQUEsTUFBTSxDQUFDZ0QsbUJBQUQsQ0FBTixDQUE0QjlDLEdBQTVCLENBQWdDQyxPQUFoQyxDQUF3QzBDLGNBQXhDLEVBRDhGLENBQ3JDOztBQUN6RDdDLGdCQUFBQSxNQUFNLENBQUNnRCxtQkFBRCxDQUFOLENBQTRCN0MsT0FBNUIsQ0FDQywrRkFERCxFQUY4RixDQUkzRjtBQUNILGVBTE0sQ0FBUDtBQU1BLGFBdkJLLENBQVA7QUF3QkEsV0FsQ0ssQ0FBUDtBQW1DQSxTQTNDRyxDQUFKLENBOXRCcUMsQ0Ewd0JyQztBQUNBLE9BM3dCTyxDQUFSO0FBNHdCQSxLQTcxQk8sQ0FBUjtBQTgxQkEsR0EzM0JPLENBQVIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBDYWNoZSBmcm9tIFwic2FwL3VpL2NvcmUvY2FjaGUvQ2FjaGVNYW5hZ2VyXCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG4vLyBPdmVycmlkZSB0byBtYWtlIHRoZSBDYWNoZU1hbmFnZXIgd29ya3MgZm9yIHNvbWUgdGVzdHNcbihEZXZpY2UgYXMgYW55KS5icm93c2VyLm5hbWUgPSBcImNyXCI7XG4oRGV2aWNlIGFzIGFueSkuYnJvd3Nlci52ZXJzaW9uID0gODA7XG5cbmRlc2NyaWJlKFwiQ2FjaGVIYW5kbGVyRmFjdG9yeVwiLCAoKSA9PiB7XG5cdGNvbnN0IG9GYWtlTWV0YU1vZGVsOiBhbnkgPSB7XG5cdFx0ZmV0Y2hFbnRpdHlDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH0sXG5cdFx0Z2V0SWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFwiZmFrZU1vZGVsSWRcIjtcblx0XHR9XG5cdH07XG5cdGNvbnN0IG9GYWtlQ29tcG9uZW50ID0ge1xuXHRcdGdldFZpZXdEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB7IGR1bW15U2V0dGluZzogXCJkdW1teVwiIH07XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBvRmFrZUFwcENvbXBvbmVudCA9IHtcblx0XHRnZXRNYW5pZmVzdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcInNhcC5hcHBcIjogeyBkdW1teVNldHRpbmc6IFwiZHVtbXlcIiB9XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblxuXHR0ZXN0KFwiY2FuIGJlIGluaXRpYWxpemVkXCIsIGZ1bmN0aW9uKCkge1xuXHRcdGV4cGVjdChDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeSkubm90LnRvRXF1YWwobnVsbCk7IC8vIFwiTGlicmFyeSBoYXMgYmVlbiBsb2FkZWRcIik7XG5cdFx0Y29uc3Qgb1Rlc3RGYWN0b3J5ID0gbmV3IENhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5KCk7XG5cdFx0ZXhwZWN0KG9UZXN0RmFjdG9yeSkubm90LnRvRXF1YWwobnVsbCk7XG5cdH0pO1xuXG5cdGxldCBvRmFjdG9yeSE6IENhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5O1xuXHRkZXNjcmliZShcIkNhY2hlSGFuZGxlciBpbnN0YW5jZSBjcmVhdGlvblwiLCAoKSA9PiB7XG5cdFx0YmVmb3JlRWFjaCgoKSA9PiB7XG5cdFx0XHRvRmFjdG9yeSA9IG5ldyBDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeSgpO1xuXHRcdH0pO1xuXG5cdFx0dGVzdChcImNhbm5vdCBiZSBpbml0aWFsaXplZCB3aXRob3V0IGEgbWV0YW1vZGVsXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgY3JlYXRlRm4gPSAoKSA9PiBvRmFjdG9yeS5jcmVhdGVJbnN0YW5jZSh7IHNldHRpbmdzOiB7fSB9IGFzIGFueSk7XG5cdFx0XHRleHBlY3QoY3JlYXRlRm4pLnRvVGhyb3coKTtcblx0XHR9KTtcblxuXHRcdHRlc3QoXCJjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIGZhaWxpbmcgbWV0YW1vZGVsXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgb09yaWdpbkZuID0gb0Zha2VNZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXI7XG5cdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmZldGNoRW50aXR5Q29udGFpbmVyID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiTm9wZVwiKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb0luc3RhbmNlID0gb0ZhY3RvcnkuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHNldHRpbmdzOiB7IG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsIGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsIGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnQgfVxuXHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdGV4cGVjdChvSW5zdGFuY2UpLnRvQmVEZWZpbmVkKCk7XG5cdFx0XHRcdHJldHVybiBvSW5zdGFuY2Vcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvSW5zdGFuY2VMb2FkZWQpIHtcblx0XHRcdFx0XHRcdGV4cGVjdCh0cnVlKS50b0JlKGZhbHNlKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmZldGNoRW50aXR5Q29udGFpbmVyID0gb09yaWdpbkZuO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRleHBlY3QodHJ1ZSkudG9CZShmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0ZXN0KFwiaXMgaW5pdGlhbGl6ZWQgYXMgYSBnbG9iYWwgaW5zdGFuY2VcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgb0N1cnJlbnRJbnN0YW5jZTogYW55O1xuXHRcdFx0Y29uc3Qgc0Zha2VNZXRhTW9kZWxJZCA9IG9GYWtlTWV0YU1vZGVsLmdldElkKCk7XG5cdFx0XHRjb25zdCBvRmV0Y2hFbnRpdHlDb250YWluZXJTcHkgPSBqZXN0LnNweU9uKG9GYWtlTWV0YU1vZGVsLCBcImZldGNoRW50aXR5Q29udGFpbmVyXCIpO1xuXHRcdFx0ZXhwZWN0KG9GYWN0b3J5Ll9vSW5zdGFuY2VSZWdpc3RyeVtzRmFrZU1ldGFNb2RlbElkXSkudG9CZSh1bmRlZmluZWQpOyAvLywgXCJObyBnbG9iYWwgaW5zdGFuY2UgZXhpc3RzXCIpO1xuXG5cdFx0XHRjb25zdCBvSW5zdGFuY2UgPSBvRmFjdG9yeS5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdHNldHRpbmdzOiB7IG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsIGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsIGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnQgfVxuXHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0ZXhwZWN0KG9JbnN0YW5jZSkudG9CZURlZmluZWQoKTsgLy8gXCJJbnN0YW5jZSBwcm9taXNlIGlzIGNyZWF0ZWRcIik7XG5cdFx0XHRleHBlY3Qob0ZldGNoRW50aXR5Q29udGFpbmVyU3B5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG5cblx0XHRcdHJldHVybiBvSW5zdGFuY2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0luc3RhbmNlTG9hZGVkKSB7XG5cdFx0XHRcdFx0b0N1cnJlbnRJbnN0YW5jZSA9IG9JbnN0YW5jZUxvYWRlZDtcblx0XHRcdFx0XHRleHBlY3Qob0luc3RhbmNlTG9hZGVkKS50b0JlRGVmaW5lZCgpOyAvL2Fzc2VydC5vayhvSW5zdGFuY2VMb2FkZWQgIT0gbnVsbCwgXCJJbnN0YW5jZSBwcm9taXNlIGlzIHJlc29sdmVkXCIpO1xuXHRcdFx0XHRcdGV4cGVjdChvRmFjdG9yeS5fb0luc3RhbmNlUmVnaXN0cnlbc0Zha2VNZXRhTW9kZWxJZF0pLnRvQmVEZWZpbmVkKCk7IC8vIFwiR2xvYmFsIGluc3RhbmNlIGV4aXN0c1wiKTtcblx0XHRcdFx0XHRjb25zdCBvTmV3SW5zdGFuY2UgPSBvRmFjdG9yeS5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9GYWtlTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9GYWtlQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9GYWtlQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdC8vIEluaXQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkIGFnYWluIHNpbmNlIHRoZSBpbnN0YW5jZSBpcyBnbG9iYWwgdG8gdGhlIGZhY3Rvcnlcblx0XHRcdFx0XHRleHBlY3Qob0ZldGNoRW50aXR5Q29udGFpbmVyU3B5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG5cdFx0XHRcdFx0cmV0dXJuIG9OZXdJbnN0YW5jZTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob05ld0luc3RhbmNlTG9hZGVkKSB7XG5cdFx0XHRcdFx0ZXhwZWN0KG9OZXdJbnN0YW5jZUxvYWRlZCkudG9FcXVhbChvQ3VycmVudEluc3RhbmNlKTsgLy8sIFwiQm90aCBpbnN0YW5jZSBhcmUgdGhlIHNhbWVcIik7XG5cdFx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5LmdldEluc3RhbmNlKG9GYWtlTWV0YU1vZGVsIGFzIGFueSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9HbG9iYWxJbnN0YW5jZSkge1xuXHRcdFx0XHRcdGV4cGVjdChvQ3VycmVudEluc3RhbmNlKS50b0VxdWFsKG9HbG9iYWxJbnN0YW5jZSk7IC8vLCBcIlJldHJpZXZpbmcgdGhlIGdsb2JhbCBpbnN0YW5jZSByZXR1cm5zIHRoZSBzYW1lXCIpO1xuXHRcdFx0XHRcdG9DdXJyZW50SW5zdGFuY2UuZXhpdCgpO1xuXHRcdFx0XHRcdGV4cGVjdChvRmFjdG9yeS5fb0luc3RhbmNlUmVnaXN0cnlbc0Zha2VNZXRhTW9kZWxJZF0pLnRvRXF1YWwobnVsbCk7IC8vIFwiR2xvYmFsIGluc3RhbmNlIGlzIHJlbW92ZWRcIik7XG5cdFx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9UaGlyZEluc3RhbmNlTG9hZGVkKSB7XG5cdFx0XHRcdFx0ZXhwZWN0KG9UaGlyZEluc3RhbmNlTG9hZGVkKS50b0JlRGVmaW5lZCgpOyAvLyAhPSBudWxsLCBcIlRoaXJkIGluc3RhbmNlIGNhbiBiZSBjcmVhdGVkXCIpO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGRlc2NyaWJlKFwiQ2FjaGVIYW5kbGVyIGNoZWNrc1wiLCAoKSA9PiB7XG5cdFx0XHRiZWZvcmVFYWNoKCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIENhY2hlLmRlbChcIm15Q2FjaGVLZXlcIik7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGVzdChcIkNhc2UgIzFhLSBjYW4gdmFsaWRhdGUgYSBiYXNpYyBjYWNoZSBrZXlcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNvbnN0IG9GYWN0b3J5ID0gbmV3IENhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5KCk7XG5cdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFwibXlSb290U2VydmljZVwiOiBcIk15RVRhZ1wiXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRyZXR1cm4gb0ZhY3Rvcnlcblx0XHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvRmFrZU1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50OiBvRmFrZUNvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvRmFrZUFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gYXMgYW55KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9DYWNoZUhhbmRsZXJJbnN0YW5jZSkge1xuXHRcdFx0XHRcdFx0b0NhY2hlSGFuZGxlckluc3RhbmNlLnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpLnRoZW4oZnVuY3Rpb24oc1ZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRleHBlY3Qoc1ZhbGlkYXRlZEtleSkudG9CZURlZmluZWQoKTsgLy8gXCJWYWxpZGF0ZWRLZXkgZXhpc3RzXCJcblx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNWYWxpZGF0ZWRLZXkpLnRvRXF1YWwoJ3tcIm15Um9vdFNlcnZpY2VcIjpcIk15RVRhZ1wiLFwibWFuaWZlc3RcIjotMTMzNTg1MDQxNH0nKTsgLy8sIFwiVmFsaWRhdGVkS2V5IGlzIGNvcnJlY3RcIik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0ZXN0KFwiQ2FzZSAjMWEgLSBjYW4gdmFsaWRhdGUgYSBkYXRlIGJhc2VkIGNhY2hlIGtleVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgb0ZhY3RvcnkgPSBuZXcgQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkoKTtcblx0XHRcdFx0b0Zha2VNZXRhTW9kZWwuZ2V0RVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IG5ldyBEYXRlKFwiMjAxOS0wOC0zMVwiKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJldHVybiBvRmFjdG9yeVxuXHRcdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9GYWtlTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9GYWtlQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9GYWtlQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBhcyBhbnkpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0NhY2hlSGFuZGxlckluc3RhbmNlKSB7XG5cdFx0XHRcdFx0XHRvQ2FjaGVIYW5kbGVySW5zdGFuY2UudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIikudGhlbihmdW5jdGlvbihzVmFsaWRhdGVkS2V5KSB7XG5cdFx0XHRcdFx0XHRcdGV4cGVjdChzVmFsaWRhdGVkS2V5KS50b0JlRGVmaW5lZCgpOyAvLyAhPSBudWxsLCBcIlZhbGlkYXRlZEtleSBleGlzdHNcIik7XG5cdFx0XHRcdFx0XHRcdGV4cGVjdChzVmFsaWRhdGVkS2V5KS50b0VxdWFsKCd7XCJteVJvb3RTZXJ2aWNlXCI6XCIyMDE5LTA4LTMxVDAwOjAwOjAwLjAwMFpcIixcIm1hbmlmZXN0XCI6LTEzMzU4NTA0MTR9Jyk7IC8vIFwiVmFsaWRhdGVkS2V5IGlzIGNvcnJlY3RcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGVzdChcIkNhc2UgIzEtYiBjYW5ub3QgdmFsaWRhdGUgYSBjYWNoZSBrZXkgaWYgbm8gbWV0YWRhdGEgaW5jbHVkZSBFVGFnc1wiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgb0ZhY3RvcnkgPSBuZXcgQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkoKTtcblx0XHRcdFx0b0Zha2VNZXRhTW9kZWwuZ2V0RVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IG51bGxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRyZXR1cm4gb0ZhY3Rvcnlcblx0XHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvRmFrZU1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50OiBvRmFrZUNvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvRmFrZUFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gYXMgYW55KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9DYWNoZUhhbmRsZXJJbnN0YW5jZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS52YWxpZGF0ZUNhY2hlS2V5KFwibXlDYWNoZUtleVwiKS50aGVuKGZ1bmN0aW9uKHNWYWxpZGF0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNWYWxpZGF0ZWRLZXkpLnRvRXF1YWwobnVsbCk7IC8vLnRvQmVEZWZpbmVkKCk7IC8vID09IG51bGwsIFwiVmFsaWRhdGVkIGtleSBpcyBudWxsXCIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGVzdChcIkNhc2UgIzEtYiBjYW5ub3QgdmFsaWRhdGUgYSBjYWNoZSBrZXkgaWYgb25lIG1ldGFkYXRhIGRvZXMgbm90IGluY2x1ZGUgRVRhZ3NcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNvbnN0IG9GYWN0b3J5ID0gbmV3IENhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5KCk7XG5cdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFwibXlSb290U2VydmljZVwiOiBcIk15RVRhZ1wiLFxuXHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBudWxsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdG9DYWNoZUhhbmRsZXJJbnN0YW5jZS52YWxpZGF0ZUNhY2hlS2V5KFwibXlDYWNoZUtleVwiKS50aGVuKGZ1bmN0aW9uKHNWYWxpZGF0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNWYWxpZGF0ZWRLZXkpLnRvRXF1YWwobnVsbCk7IC8vID09IG51bGwsIFwiVmFsaWRhdGVkIGtleSBpcyBudWxsXCIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly9pZiAoKERldmljZSBhcyBhbnkpLmJyb3dzZXIubXNpZSB8fCAoRGV2aWNlIGFzIGFueSkuYnJvd3Nlci5jaHJvbWUpIHtcblx0XHRcdHRlc3QoXCJDYXNlICMyYSAtIGNhbiB2YWxpZGF0ZSBhIGJhc2ljIGNhY2hlIGtleSBhbmQgcmV2YWxpZGF0ZSBpZiB0aGUgRVRhZ3MgaGF2ZSBub3QgY2hhbmdlZFwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgb0NhY2hlTWFuYWdlclNweSA9IGplc3Quc3B5T24oQ2FjaGUsIFwic2V0XCIpO1xuXHRcdFx0XHRjb25zdCBvRmFjdG9yeSA9IG5ldyBDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeSgpO1xuXHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdGxldCBzRmlyc3RDYWNoZUtleTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHQudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIilcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1ZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHNGaXJzdENhY2hlS2V5ID0gc1ZhbGlkYXRlZEtleTtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1ZhbGlkYXRlZEtleSkudG9CZURlZmluZWQoKTsgLy8gIT0gbnVsbCwgXCJWYWxpZGF0ZWRLZXkgZXhpc3RzXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzVmFsaWRhdGVkS2V5KS50b0VxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0J3tcIm15Um9vdFNlcnZpY2VcIjpcIk15RVRhZ1wiLFwibXlPdGhlclNlcnZpY2VcIjpcIjIwMTktMDgtMzFUMDA6MDA6MDAuMDAwWlwiLFwibWFuaWZlc3RcIjotMTMzNTg1MDQxNH0nXG5cdFx0XHRcdFx0XHRcdFx0KTsgLy9cIlZhbGlkYXRlZEtleSBpcyBjb3JyZWN0IFwiXG5cdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KG9DYWNoZU1hbmFnZXJTcHkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS5pbnZhbGlkYXRlSWZOZWVkZWQoc1ZhbGlkYXRlZEtleSwgXCJteUNhY2hlS2V5XCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlLnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihzU2Vjb25kVmFsaWRhdGVkS2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KG9DYWNoZU1hbmFnZXJTcHkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1NlY29uZFZhbGlkYXRlZEtleSkudG9FcXVhbChzRmlyc3RDYWNoZUtleSk7IC8vIFwiVmFsaWRhdGVkIEtleSBpcyB0aGUgc2FtZSBhcyB0aGUgc2Vjb25kIHZhbGlkYXRlZCBrZXlcIik7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS5pbnZhbGlkYXRlSWZOZWVkZWQoc1NlY29uZFZhbGlkYXRlZEtleSwgXCJteUNhY2hlS2V5XCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qob0NhY2hlTWFuYWdlclNweSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuXHRcdFx0XHRcdFx0XHRcdG9DYWNoZU1hbmFnZXJTcHkubW9ja1Jlc3RvcmUoKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdG9DYWNoZU1hbmFnZXJTcHkubW9ja1Jlc3RvcmUoKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGVzdChcIkNhc2UgIzJiIC0gY2FuIGRlYWwgd2l0aCBhbiBFVGFnIGVuaGFuY2VtZW50IGluIGEgZ2l2ZW4gc2Vzc2lvblwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgb0ZhY3RvcnkgPSBuZXcgQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkoKTtcblx0XHRcdFx0b0Zha2VNZXRhTW9kZWwuZ2V0RVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcIm15T3RoZXJTZXJ2aWNlXCI6IG5ldyBEYXRlKFwiMjAxOS0wOC0zMVwiKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJldHVybiBvRmFjdG9yeVxuXHRcdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9GYWtlTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9GYWtlQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9GYWtlQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBhcyBhbnkpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0NhY2hlSGFuZGxlckluc3RhbmNlKSB7XG5cdFx0XHRcdFx0XHRsZXQgc0ZpcnN0Q2FjaGVLZXk6IHN0cmluZztcblx0XHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVySW5zdGFuY2Vcblx0XHRcdFx0XHRcdFx0LnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpXG5cdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKHNWYWxpZGF0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRzRmlyc3RDYWNoZUtleSA9IHNWYWxpZGF0ZWRLZXk7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNWYWxpZGF0ZWRLZXkpLnRvQmVEZWZpbmVkKCk7IC8vICE9IG51bGwsIFwiVmFsaWRhdGVkS2V5IGV4aXN0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1ZhbGlkYXRlZEtleSkudG9FcXVhbChcblx0XHRcdFx0XHRcdFx0XHRcdCd7XCJteVJvb3RTZXJ2aWNlXCI6XCJNeUVUYWdcIixcIm15T3RoZXJTZXJ2aWNlXCI6XCIyMDE5LTA4LTMxVDAwOjAwOjAwLjAwMFpcIixcIm1hbmlmZXN0XCI6LTEzMzU4NTA0MTR9J1xuXHRcdFx0XHRcdFx0XHRcdCk7IC8vXCJWYWxpZGF0ZWRLZXkgaXMgY29ycmVjdCBcIlxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2ltdWxhdGUgbW9kZWwgZW5oYW5jZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15VGhpcmRTZXJ2aWNlXCI6IFwiWW9sb1wiXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS5pbnZhbGlkYXRlSWZOZWVkZWQoc1ZhbGlkYXRlZEtleSwgXCJteUNhY2hlS2V5XCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlLnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpLnRoZW4oZnVuY3Rpb24oc1NlY29uZFZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLnRvRXF1YWwoc0ZpcnN0Q2FjaGVLZXkpOyAvL1wiVmFsaWRhdGVkIEtleSBpcyB0aGUgc2FtZSBhcyB0aGUgc2Vjb25kIHZhbGlkYXRlZCBrZXlcIlxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0ZXN0KFwiQ2FzZSAjMmIgKyAyeiAtIHdpbGwgcmVxdWVzdCBFVGFnIHRoYXQgd2VyZSBhZGRlZCBhbmQgd2hpY2ggYXJlIG5vdyBtaXNzaW5nXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCBvRmFjdG9yeSA9IG5ldyBDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeSgpO1xuXHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdGxldCBzRmlyc3RDYWNoZUtleTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHQudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIilcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1ZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHNGaXJzdENhY2hlS2V5ID0gc1ZhbGlkYXRlZEtleTtcblx0XHRcdFx0XHRcdFx0XHQvLyBTaW11bGF0ZSBtb2RlbCBlbmhhbmNlbWVudFxuXHRcdFx0XHRcdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlUaGlyZFNlcnZpY2VcIjogXCJZb2xvXCJcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlLmludmFsaWRhdGVJZk5lZWRlZChzVmFsaWRhdGVkS2V5LCBcIm15Q2FjaGVLZXlcIik7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIilcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlLnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpLnRoZW4oZnVuY3Rpb24oc1NlY29uZFZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLm5vdC50b0VxdWFsKHNGaXJzdENhY2hlS2V5KTsgLy8gXCJWYWxpZGF0ZWQgS2V5IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgc2Vjb25kIHZhbGlkYXRlZCBrZXlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLnRvRXF1YWwobnVsbCk7IC8vID09IG51bGwsIFwiTm8gbW9yZSBjYWNoZVwiKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGVzdChcIkNhc2UgIzJiICsgMmEgLSB3aWxsIHJlcXVlc3QgRVRhZyB0aGF0IHdlcmUgYWRkZWQgYW5kIHdoaWNoIGFyZSB0aGUgc2FtZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgb0ZhY3RvcnkgPSBuZXcgQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkoKTtcblx0XHRcdFx0Y29uc3QgalF1ZXJ5QWpheFN0dWIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRsZXQgZm5Eb25lQ2I6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRmbkRvbmVDYihudWxsLCBudWxsLCB7XG5cdFx0XHRcdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbihwYXJhbTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtID09PSBcIkVUYWdcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiWW9sb1wiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSwgMTAwKTtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZG9uZTogZnVuY3Rpb24oZG9uZUNiOiBGdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0XHRmbkRvbmVDYiA9IGRvbmVDYjtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRmYWlsOiBmdW5jdGlvbigpIHt9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb3JpZ0FqYXggPSBqUXVlcnkuYWpheDtcblx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdGxldCBzRmlyc3RDYWNoZUtleTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHQudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIilcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1ZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHNGaXJzdENhY2hlS2V5ID0gc1ZhbGlkYXRlZEtleTtcblx0XHRcdFx0XHRcdFx0XHQvLyBTaW11bGF0ZSBtb2RlbCBlbmhhbmNlbWVudFxuXHRcdFx0XHRcdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlUaGlyZFNlcnZpY2VcIjogXCJZb2xvXCJcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlLmludmFsaWRhdGVJZk5lZWRlZChzVmFsaWRhdGVkS2V5LCBcIm15Q2FjaGVLZXlcIik7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIilcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuYWpheCA9IGpRdWVyeUFqYXhTdHViO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVySW5zdGFuY2UudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIik7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKHNTZWNvbmRWYWxpZGF0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1NlY29uZFZhbGlkYXRlZEtleSkudG9FcXVhbChzRmlyc3RDYWNoZUtleSk7IC8vIFwiVmFsaWRhdGVkIEtleSBpcyB0aGUgc2FtZSBhcyB0aGUgc2Vjb25kIHZhbGlkYXRlZCBrZXkgXCIgKyBzU2Vjb25kVmFsaWRhdGVkS2V5XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmFqYXggPSBvcmlnQWpheDtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5hamF4ID0gb3JpZ0FqYXg7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRlc3QoXCJDYXNlICMyYiArIDJhIC0gd2lsbCByZXF1ZXN0IEVUYWcgdGhhdCB3ZXJlIGFkZGVkIGFuZCB3aGljaCBhcmUgdGhlIHNhbWUgLSBEYXRlIHZlcnNpb25cIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNvbnN0IG9GYWN0b3J5ID0gbmV3IENhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5KCk7XG5cdFx0XHRcdGNvbnN0IGpRdWVyeUFqYXhTdHViID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0bGV0IGZuRG9uZUNiOiBGdW5jdGlvbjtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0Zm5Eb25lQ2IobnVsbCwgbnVsbCwge1xuXHRcdFx0XHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24ocGFyYW06IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXJhbSA9PT0gXCJMYXN0LU1vZGlmaWVkXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIjIwMTktMDgtMjlUMDA6MDA6MDAuMDAwWlwiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSwgMTAwKTtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZG9uZTogZnVuY3Rpb24oZG9uZUNiOiBGdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0XHRmbkRvbmVDYiA9IGRvbmVDYjtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRmYWlsOiBmdW5jdGlvbigpIHt9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgb3JpZ0FqYXggPSBqUXVlcnkuYWpheDtcblx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdGxldCBzRmlyc3RDYWNoZUtleTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHQudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIilcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1ZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHNGaXJzdENhY2hlS2V5ID0gc1ZhbGlkYXRlZEtleTtcblx0XHRcdFx0XHRcdFx0XHQvLyBTaW11bGF0ZSBtb2RlbCBlbmhhbmNlbWVudFxuXHRcdFx0XHRcdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlUaGlyZFNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTI5XCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS5pbnZhbGlkYXRlSWZOZWVkZWQoc1ZhbGlkYXRlZEtleSwgXCJteUNhY2hlS2V5XCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmFqYXggPSBqUXVlcnlBamF4U3R1Yjtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlLnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihzU2Vjb25kVmFsaWRhdGVkS2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLnRvRXF1YWwoc0ZpcnN0Q2FjaGVLZXkpOyAvL1wiVmFsaWRhdGVkIEtleSBpcyB0aGUgc2FtZSBhcyB0aGUgc2Vjb25kIHZhbGlkYXRlZCBrZXkgXCIgKyBzU2Vjb25kVmFsaWRhdGVkS2V5XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmFqYXggPSBvcmlnQWpheDtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5hamF4ID0gb3JpZ0FqYXg7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRlc3QoXCJDYXNlICMyYiArIDJkIC0gd2lsbCByZXF1ZXN0IEVUYWcgdGhhdCB3ZXJlIGFkZGVkIGFuZCB3aGljaCBhcmUgZGlmZmVyZW50XCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCBvRmFjdG9yeSA9IG5ldyBDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeSgpO1xuXHRcdFx0XHRjb25zdCBqUXVlcnlBamF4U3R1YiA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGxldCBmbkRvbmVDYjogRnVuY3Rpb247XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGZuRG9uZUNiKG51bGwsIG51bGwsIHtcblx0XHRcdFx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKHBhcmFtOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAocGFyYW0gPT09IFwiRVRhZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJOb3RZb2xvXCI7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9LCAxMDApO1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkb25lOiBmdW5jdGlvbihkb25lQ2I6IEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGZuRG9uZUNiID0gZG9uZUNiO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGZhaWw6IGZ1bmN0aW9uKCkge31cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFwibXlSb290U2VydmljZVwiOiBcIk15RVRhZ1wiLFxuXHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIilcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBvcmlnQWpheCA9IGpRdWVyeS5hamF4O1xuXHRcdFx0XHRyZXR1cm4gb0ZhY3Rvcnlcblx0XHRcdFx0XHQuY3JlYXRlSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvRmFrZU1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50OiBvRmFrZUNvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvRmFrZUFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gYXMgYW55KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9DYWNoZUhhbmRsZXJJbnN0YW5jZSkge1xuXHRcdFx0XHRcdFx0bGV0IHNGaXJzdENhY2hlS2V5OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlXG5cdFx0XHRcdFx0XHRcdC52YWxpZGF0ZUNhY2hlS2V5KFwibXlDYWNoZUtleVwiKVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihzVmFsaWRhdGVkS2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0c0ZpcnN0Q2FjaGVLZXkgPSBzVmFsaWRhdGVkS2V5O1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNpbXVsYXRlIG1vZGVsIGVuaGFuY2VtZW50XG5cdFx0XHRcdFx0XHRcdFx0b0Zha2VNZXRhTW9kZWwuZ2V0RVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlSb290U2VydmljZVwiOiBcIk15RVRhZ1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15T3RoZXJTZXJ2aWNlXCI6IG5ldyBEYXRlKFwiMjAxOS0wOC0zMVwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteVRoaXJkU2VydmljZVwiOiBcIllvbG9cIlxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVySW5zdGFuY2UuaW52YWxpZGF0ZUlmTmVlZGVkKHNWYWxpZGF0ZWRLZXksIFwibXlDYWNoZUtleVwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0Zha2VNZXRhTW9kZWwuZ2V0RVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlSb290U2VydmljZVwiOiBcIk15RVRhZ1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15T3RoZXJTZXJ2aWNlXCI6IG5ldyBEYXRlKFwiMjAxOS0wOC0zMVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5hamF4ID0galF1ZXJ5QWpheFN0dWI7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS52YWxpZGF0ZUNhY2hlS2V5KFwibXlDYWNoZUtleVwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1NlY29uZFZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzU2Vjb25kVmFsaWRhdGVkS2V5KS5ub3QudG9FcXVhbChzRmlyc3RDYWNoZUtleSk7IC8vXCJWYWxpZGF0ZWQgS2V5IGlzIHRoZSBzYW1lIGFzIHRoZSBzZWNvbmQgdmFsaWRhdGVkIGtleSBcIiArIHNTZWNvbmRWYWxpZGF0ZWRLZXlcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1NlY29uZFZhbGlkYXRlZEtleSkudG9FcXVhbChcblx0XHRcdFx0XHRcdFx0XHRcdCd7XCJteVJvb3RTZXJ2aWNlXCI6XCJNeUVUYWdcIixcIm15T3RoZXJTZXJ2aWNlXCI6XCIyMDE5LTA4LTMxVDAwOjAwOjAwLjAwMFpcIixcIm1hbmlmZXN0XCI6LTEzMzU4NTA0MTQsXCJteVRoaXJkU2VydmljZVwiOlwiTm90WW9sb1wifSdcblx0XHRcdFx0XHRcdFx0XHQpOyAvL1wiVmFsaWRhdGVkIEtleSBpcyBjb3JyZWN0XCJcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuYWpheCA9IG9yaWdBamF4O1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oZkRvbmUpIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuYWpheCA9IG9yaWdBamF4O1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0ZXN0KFwiQ2FzZSAjMmIgKyAyZCAtIHdpbGwgcmVxdWVzdCBFVGFnIHRoYXQgd2VyZSBhZGRlZCBhbmQgd2hpY2ggYXJlIGRpZmZlcmVudCAtIERhdGUgdmVyc2lvblwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgb0ZhY3RvcnkgPSBuZXcgQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkoKTtcblx0XHRcdFx0Y29uc3QgalF1ZXJ5QWpheFN0dWIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRsZXQgZm5Eb25lQ2I6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRmbkRvbmVDYihudWxsLCBudWxsLCB7XG5cdFx0XHRcdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbihwYXJhbTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHBhcmFtID09PSBcIkxhc3QtTW9kaWZpZWRcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiMjAxOS0wOC0yOFQwMDowMDowMC4wMDBaXCI7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9LCAxMDApO1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkb25lOiBmdW5jdGlvbihkb25lQ2I6IEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGZuRG9uZUNiID0gZG9uZUNiO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGZhaWw6IGZ1bmN0aW9uKCkge31cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFwibXlSb290U2VydmljZVwiOiBcIk15RVRhZ1wiLFxuXHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIilcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBvcmlnQWpheCA9IGpRdWVyeS5hamF4O1xuXHRcdFx0XHRvRmFjdG9yeVxuXHRcdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9GYWtlTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9GYWtlQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9GYWtlQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBhcyBhbnkpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0NhY2hlSGFuZGxlckluc3RhbmNlKSB7XG5cdFx0XHRcdFx0XHRsZXQgc0ZpcnN0Q2FjaGVLZXk6IHN0cmluZztcblx0XHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVySW5zdGFuY2Vcblx0XHRcdFx0XHRcdFx0LnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpXG5cdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKHNWYWxpZGF0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRzRmlyc3RDYWNoZUtleSA9IHNWYWxpZGF0ZWRLZXk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2ltdWxhdGUgbW9kZWwgZW5oYW5jZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15VGhpcmRTZXJ2aWNlXCI6IG5ldyBEYXRlKFwiMjAxOS0wOC0yOVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVySW5zdGFuY2UuaW52YWxpZGF0ZUlmTmVlZGVkKHNWYWxpZGF0ZWRLZXksIFwibXlDYWNoZUtleVwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0Zha2VNZXRhTW9kZWwuZ2V0RVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlSb290U2VydmljZVwiOiBcIk15RVRhZ1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15T3RoZXJTZXJ2aWNlXCI6IG5ldyBEYXRlKFwiMjAxOS0wOC0zMVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5hamF4ID0galF1ZXJ5QWpheFN0dWI7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS52YWxpZGF0ZUNhY2hlS2V5KFwibXlDYWNoZUtleVwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1NlY29uZFZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzU2Vjb25kVmFsaWRhdGVkS2V5KS5ub3QudG9FcXVhbChzRmlyc3RDYWNoZUtleSk7IC8vXCJWYWxpZGF0ZWQgS2V5IGlzIHRoZSBzYW1lIGFzIHRoZSBzZWNvbmQgdmFsaWRhdGVkIGtleSBcIiArIHNTZWNvbmRWYWxpZGF0ZWRLZXlcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1NlY29uZFZhbGlkYXRlZEtleSkudG9FcXVhbChcblx0XHRcdFx0XHRcdFx0XHRcdCd7XCJteVJvb3RTZXJ2aWNlXCI6XCJNeUVUYWdcIixcIm15T3RoZXJTZXJ2aWNlXCI6XCIyMDE5LTA4LTMxVDAwOjAwOjAwLjAwMFpcIixcIm1hbmlmZXN0XCI6LTEzMzU4NTA0MTQsXCJteVRoaXJkU2VydmljZVwiOlwiMjAxOS0wOC0yOFQwMDowMDowMC4wMDBaXCJ9J1xuXHRcdFx0XHRcdFx0XHRcdCk7IC8vXCJWYWxpZGF0ZWQgS2V5IGlzIGNvcnJlY3RcIlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5hamF4ID0gb3JpZ0FqYXg7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbihmRG9uZSkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5hamF4ID0gb3JpZ0FqYXg7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRlc3QoXCJDYXNlICMyYyAtIGNhbiBkZWFsIHdpdGggYW4gRVRhZyBjaGFuZ2VcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNvbnN0IG9GYWN0b3J5ID0gbmV3IENhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5KCk7XG5cdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFwibXlSb290U2VydmljZVwiOiBcIk15RVRhZ1wiLFxuXHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIilcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRvRmFjdG9yeVxuXHRcdFx0XHRcdC5jcmVhdGVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG9GYWtlTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnQ6IG9GYWtlQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9GYWtlQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBhcyBhbnkpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob0NhY2hlSGFuZGxlckluc3RhbmNlKSB7XG5cdFx0XHRcdFx0XHRsZXQgc0ZpcnN0Q2FjaGVLZXk6IHN0cmluZztcblx0XHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVySW5zdGFuY2Vcblx0XHRcdFx0XHRcdFx0LnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpXG5cdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKHNWYWxpZGF0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRzRmlyc3RDYWNoZUtleSA9IHNWYWxpZGF0ZWRLZXk7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNWYWxpZGF0ZWRLZXkpLnRvQmVEZWZpbmVkKCk7IC8vICE9IG51bGwsIFwiVmFsaWRhdGVkS2V5IGV4aXN0c1wiKTtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1ZhbGlkYXRlZEtleSkudG9FcXVhbChcblx0XHRcdFx0XHRcdFx0XHRcdCd7XCJteVJvb3RTZXJ2aWNlXCI6XCJNeUVUYWdcIixcIm15T3RoZXJTZXJ2aWNlXCI6XCIyMDE5LTA4LTMxVDAwOjAwOjAwLjAwMFpcIixcIm1hbmlmZXN0XCI6LTEzMzU4NTA0MTR9J1xuXHRcdFx0XHRcdFx0XHRcdCk7IC8vXCJWYWxpZGF0ZWRLZXkgaXMgY29ycmVjdCBcIlxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVySW5zdGFuY2UuaW52YWxpZGF0ZUlmTmVlZGVkKHNWYWxpZGF0ZWRLZXksIFwibXlDYWNoZUtleVwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2ltdWxhdGUgRVRhZyBjaGFuZ2Vcblx0XHRcdFx0XHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTm90TXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0b0NhY2hlSGFuZGxlckluc3RhbmNlLnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpLnRoZW4oZnVuY3Rpb24oc1NlY29uZFZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLm5vdC50b0VxdWFsKHNGaXJzdENhY2hlS2V5KTsgLy8gXCJWYWxpZGF0ZWQgS2V5IGlzIHRoZSBub3QgdGhlIHNhbWUgYXMgdGhlIHNlY29uZCB2YWxpZGF0ZWQga2V5XCJcblx0XHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzU2Vjb25kVmFsaWRhdGVkS2V5KS50b0VxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQne1wibXlSb290U2VydmljZVwiOlwiTm90TXlFVGFnXCIsXCJteU90aGVyU2VydmljZVwiOlwiMjAxOS0wOC0zMVQwMDowMDowMC4wMDBaXCIsXCJtYW5pZmVzdFwiOi0xMzM1ODUwNDE0fSdcblx0XHRcdFx0XHRcdFx0XHRcdCk7IC8vXCJWYWxpZGF0ZWRLZXkgaXMgY29ycmVjdCBcIlxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0ZXN0KFwiQ2FzZSAjMmQgLSBjYW4gZGVhbCB3aXRoIGFuIEVUYWcgZW5oYW5jZW1lbnQgYW5kIGEgY2hhbmdlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCBvRmFjdG9yeSA9IG5ldyBDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeSgpO1xuXHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdGxldCBzRmlyc3RDYWNoZUtleTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHQudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIilcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1ZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHNGaXJzdENhY2hlS2V5ID0gc1ZhbGlkYXRlZEtleTtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1ZhbGlkYXRlZEtleSkudG9CZURlZmluZWQoKTsgLy8gIT0gbnVsbCwgXCJWYWxpZGF0ZWRLZXkgZXhpc3RzXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzVmFsaWRhdGVkS2V5KS50b0VxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0J3tcIm15Um9vdFNlcnZpY2VcIjpcIk15RVRhZ1wiLFwibXlPdGhlclNlcnZpY2VcIjpcIjIwMTktMDgtMzFUMDA6MDA6MDAuMDAwWlwiLFwibWFuaWZlc3RcIjotMTMzNTg1MDQxNH0nXG5cdFx0XHRcdFx0XHRcdFx0KTsgLy9cIlZhbGlkYXRlZEtleSBpcyBjb3JyZWN0IFwiXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2ltdWxhdGUgbW9kZWwgZW5oYW5jZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15VGhpcmRTZXJ2aWNlXCI6IFwiWW9sb1wiXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS5pbnZhbGlkYXRlSWZOZWVkZWQoc1ZhbGlkYXRlZEtleSwgXCJteUNhY2hlS2V5XCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMwXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15VGhpcmRTZXJ2aWNlXCI6IFwiWW9sb1wiXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS52YWxpZGF0ZUNhY2hlS2V5KFwibXlDYWNoZUtleVwiKS50aGVuKGZ1bmN0aW9uKHNTZWNvbmRWYWxpZGF0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzU2Vjb25kVmFsaWRhdGVkS2V5KS5ub3QudG9FcXVhbChzRmlyc3RDYWNoZUtleSk7IC8vXCJWYWxpZGF0ZWQgS2V5IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgc2Vjb25kIHZhbGlkYXRlZCBrZXlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLnRvRXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCd7XCJteVJvb3RTZXJ2aWNlXCI6XCJNeUVUYWdcIixcIm15T3RoZXJTZXJ2aWNlXCI6XCIyMDE5LTA4LTMwVDAwOjAwOjAwLjAwMFpcIixcIm15VGhpcmRTZXJ2aWNlXCI6XCJZb2xvXCIsXCJtYW5pZmVzdFwiOi0xMzM1ODUwNDE0fSdcblx0XHRcdFx0XHRcdFx0XHRcdCk7IC8vXCJWYWxpZGF0ZWRLZXkgaXMgY29ycmVjdCBcIiArIHNTZWNvbmRWYWxpZGF0ZWRLZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0ZXN0KFwiQ2FzZSAjMnogLSBjYW4gZGVhbCB3aXRoIGFuIGludmFsaWQgRVRhZyBlbmhhbmNlbWVudFwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgb0ZhY3RvcnkgPSBuZXcgQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkoKTtcblx0XHRcdFx0b0Zha2VNZXRhTW9kZWwuZ2V0RVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcIm15T3RoZXJTZXJ2aWNlXCI6IG5ldyBEYXRlKFwiMjAxOS0wOC0zMVwiKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cdFx0XHRcdG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdGxldCBzRmlyc3RDYWNoZUtleTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0b0NhY2hlSGFuZGxlckluc3RhbmNlXG5cdFx0XHRcdFx0XHRcdC52YWxpZGF0ZUNhY2hlS2V5KFwibXlDYWNoZUtleVwiKVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihzVmFsaWRhdGVkS2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0c0ZpcnN0Q2FjaGVLZXkgPSBzVmFsaWRhdGVkS2V5O1xuXHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzVmFsaWRhdGVkS2V5KS50b0JlRGVmaW5lZCgpOyAvLyAhPSBudWxsLCBcIlZhbGlkYXRlZEtleSBleGlzdHNcIik7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNWYWxpZGF0ZWRLZXkpLnRvRXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHQne1wibXlSb290U2VydmljZVwiOlwiTXlFVGFnXCIsXCJteU90aGVyU2VydmljZVwiOlwiMjAxOS0wOC0zMVQwMDowMDowMC4wMDBaXCIsXCJtYW5pZmVzdFwiOi0xMzM1ODUwNDE0fSdcblx0XHRcdFx0XHRcdFx0XHQpOyAvL1wiVmFsaWRhdGVkS2V5IGlzIGNvcnJlY3QgXCJcblx0XHRcdFx0XHRcdFx0XHQvLyBTaW11bGF0ZSBtb2RlbCBlbmhhbmNlbWVudFxuXHRcdFx0XHRcdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJteU90aGVyU2VydmljZVwiOiBuZXcgRGF0ZShcIjIwMTktMDgtMzFcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwibXlUaGlyZFNlcnZpY2VcIjogbnVsbFxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ2FjaGVIYW5kbGVySW5zdGFuY2UuaW52YWxpZGF0ZUlmTmVlZGVkKHNWYWxpZGF0ZWRLZXksIFwibXlDYWNoZUtleVwiKTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0NhY2hlSGFuZGxlckluc3RhbmNlLnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpLnRoZW4oZnVuY3Rpb24oc1NlY29uZFZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLm5vdC50b0VxdWFsKHNGaXJzdENhY2hlS2V5KTsgLy8gXCJWYWxpZGF0ZWQgS2V5IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgc2Vjb25kIHZhbGlkYXRlZCBrZXlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLnRvRXF1YWwobnVsbCk7IC8vLCBcIlZhbGlkYXRlZEtleSBpcyBudWxsIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBhbiBFVGFnXCIpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0ZXN0KFwiQ2FzZSAjeHggLSBjYW4gZGVhbCB3aXRoIGFuIGVycm9yIHRocm93biB3aGlsZSB2YWxpZGF0aW5nIHRoZSBjYWNoZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3Qgb0ZhY3RvcnkgPSBuZXcgQ2FjaGVIYW5kbGVyU2VydmljZUZhY3RvcnkoKTtcblx0XHRcdFx0b0Zha2VNZXRhTW9kZWwuZ2V0RVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XCJteVJvb3RTZXJ2aWNlXCI6IFwiTXlFVGFnXCIsXG5cdFx0XHRcdFx0XHRcIm15T3RoZXJTZXJ2aWNlXCI6IG5ldyBEYXRlKFwiMjAxOS0wOC0zMVwiKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cdFx0XHRcdG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdGxldCBzRmlyc3RDYWNoZUtleTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHQudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIilcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1ZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHNGaXJzdENhY2hlS2V5ID0gc1ZhbGlkYXRlZEtleTtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1ZhbGlkYXRlZEtleSkudG9CZURlZmluZWQoKTsgLy8gIT0gbnVsbCwgXCJWYWxpZGF0ZWRLZXkgZXhpc3RzXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzVmFsaWRhdGVkS2V5KS50b0VxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0J3tcIm15Um9vdFNlcnZpY2VcIjpcIk15RVRhZ1wiLFwibXlPdGhlclNlcnZpY2VcIjpcIjIwMTktMDgtMzFUMDA6MDA6MDAuMDAwWlwiLFwibWFuaWZlc3RcIjotMTMzNTg1MDQxNH0nXG5cdFx0XHRcdFx0XHRcdFx0KTsgLy9cIlZhbGlkYXRlZEtleSBpcyBjb3JyZWN0IFwiXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS5pbnZhbGlkYXRlSWZOZWVkZWQoc1ZhbGlkYXRlZEtleSwgXCJteUNhY2hlS2V5XCIpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBTaW11bGF0ZSBlcnJvclxuXHRcdFx0XHRcdFx0XHRcdG9GYWtlTWV0YU1vZGVsLmdldEVUYWdzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJub3BlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZS52YWxpZGF0ZUNhY2hlS2V5KFwibXlDYWNoZUtleVwiKS50aGVuKGZ1bmN0aW9uKHNTZWNvbmRWYWxpZGF0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzU2Vjb25kVmFsaWRhdGVkS2V5KS5ub3QudG9FcXVhbChzRmlyc3RDYWNoZUtleSk7IC8vIFwiVmFsaWRhdGVkIEtleSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHNlY29uZCB2YWxpZGF0ZWQga2V5XCJcblx0XHRcdFx0XHRcdFx0XHRcdGV4cGVjdChzU2Vjb25kVmFsaWRhdGVkS2V5KS50b0VxdWFsKG51bGwpOyAvLywgXCJWYWxpZGF0ZWRLZXkgaXMgbnVsbCBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgYW4gRVRhZ1wiKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGVzdChcIkNhc2UgIzMgLSBjYW4gZGVhbCB3aXRoIGEgTWFuaWZlc3QgY2hhbmdlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCBvRmFjdG9yeSA9IG5ldyBDYWNoZUhhbmRsZXJTZXJ2aWNlRmFjdG9yeSgpO1xuXHRcdFx0XHRvRmFrZU1ldGFNb2RlbC5nZXRFVGFncyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcIm15Um9vdFNlcnZpY2VcIjogXCJNeUVUYWdcIixcblx0XHRcdFx0XHRcdFwibXlPdGhlclNlcnZpY2VcIjogbmV3IERhdGUoXCIyMDE5LTA4LTMxXCIpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIG9GYWN0b3J5XG5cdFx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb0Zha2VNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudDogb0Zha2VDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudDogb0Zha2VBcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGFzIGFueSlcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbihvQ2FjaGVIYW5kbGVySW5zdGFuY2UpIHtcblx0XHRcdFx0XHRcdGxldCBzRmlyc3RDYWNoZUtleTogc3RyaW5nO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9DYWNoZUhhbmRsZXJJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHQudmFsaWRhdGVDYWNoZUtleShcIm15Q2FjaGVLZXlcIilcblx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oc1ZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHNGaXJzdENhY2hlS2V5ID0gc1ZhbGlkYXRlZEtleTtcblx0XHRcdFx0XHRcdFx0XHRleHBlY3Qoc1ZhbGlkYXRlZEtleSkudG9CZURlZmluZWQoKTsgLy9udWxsLCBcIlZhbGlkYXRlZEtleSBleGlzdHNcIik7XG5cdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNWYWxpZGF0ZWRLZXkpLnRvRXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHQne1wibXlSb290U2VydmljZVwiOlwiTXlFVGFnXCIsXCJteU90aGVyU2VydmljZVwiOlwiMjAxOS0wOC0zMVQwMDowMDowMC4wMDBaXCIsXCJtYW5pZmVzdFwiOi0xMzM1ODUwNDE0fSdcblx0XHRcdFx0XHRcdFx0XHQpOyAvL1wiVmFsaWRhdGVkS2V5IGlzIGNvcnJlY3QgXCJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlLmludmFsaWRhdGVJZk5lZWRlZChzVmFsaWRhdGVkS2V5LCBcIm15Q2FjaGVLZXlcIik7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFNpbXVsYXRlIE1hbmlmZXN0IENoYW5nZVxuXHRcdFx0XHRcdFx0XHRcdG9GYWtlQXBwQ29tcG9uZW50LmdldE1hbmlmZXN0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInNhcC5hcHBcIjogeyBkdW1teVNldHRpbmc6IFwiQ2hhbmdlZFwiIH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlckluc3RhbmNlLnZhbGlkYXRlQ2FjaGVLZXkoXCJteUNhY2hlS2V5XCIpLnRoZW4oZnVuY3Rpb24oc1NlY29uZFZhbGlkYXRlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLm5vdC50b0VxdWFsKHNGaXJzdENhY2hlS2V5KTsgLy9cIlZhbGlkYXRlZCBLZXkgaXMgdGhlIG5vdCB0aGUgc2FtZSBhcyB0aGUgc2Vjb25kIHZhbGlkYXRlZCBrZXlcIlxuXHRcdFx0XHRcdFx0XHRcdFx0ZXhwZWN0KHNTZWNvbmRWYWxpZGF0ZWRLZXkpLnRvRXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCd7XCJteVJvb3RTZXJ2aWNlXCI6XCJNeUVUYWdcIixcIm15T3RoZXJTZXJ2aWNlXCI6XCIyMDE5LTA4LTMxVDAwOjAwOjAwLjAwMFpcIixcIm1hbmlmZXN0XCI6LTE5NTYwMTE4MDJ9J1xuXHRcdFx0XHRcdFx0XHRcdFx0KTsgLy9cIlZhbGlkYXRlZEtleSBpcyBjb3JyZWN0IFwiXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHQvL31cblx0XHR9KTtcblx0fSk7XG59KTtcbiJdfQ==